You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化含大量IF ELSE的机器人避障检测代码?

机器人障碍物检测代码优化方案

针对你这段机器人障碍物检测代码的问题,以下是几个实用的优化方向,能大幅提升可读性和扩展性,适配后续新增的左右距离判断、更多检测逻辑需求:

1. 用常量定义替代魔法数字

把代码中硬编码的阈值和目标值替换成有意义的常量,既提升可读性,后续修改阈值也不用到处查找数字:

// 定义距离阈值常量
const int OBSTACLE_CLOSE_THRESHOLD = 100;  // 近距离障碍物触发阈值
const int OBSTACLE_WARNING_THRESHOLD = 300; // 预警距离阈值

// 定义目标值常量
const int TARGET_STOP = 0;
const int TARGET_SLOW_FORWARD = 4000;
const int TARGET_FULL_FORWARD = 6000;

2. 封装传感器数据处理逻辑

把传感器距离获取、关键值计算(比如最小距离、左右距离对比)封装成独立函数,减少主逻辑冗余,后续新增传感器或计算规则只需修改函数:

// 封装传感器数据:包含左右中距离、最小距离、左右距离对比结果
struct FrontDistanceData {
  int left;
  int middle;
  int right;
  int min;
  bool isLeftCloser; // 标记左侧是否比右侧障碍物更近
};

FrontDistanceData getFrontDistanceData() {
  FrontDistanceData data;
  data.left = left_LOX.distance();
  data.middle = middle_LOX.distance();
  data.right = right_LOX.distance();
  
  data.min = min(min(data.left, data.middle), data.right);
  data.isLeftCloser = (data.left < data.right);
  return data;
}

3. 用结构化规则替代if-else与switch

把距离区间、对应行为、目标值封装成规则数组,新增规则只需添加数组元素,无需修改核心判断逻辑,扩展性极强:

// 定义行为规则结构体
struct DistanceRule {
  int threshold;          // 距离阈值
  bool isUpperLimit;      // true表示"小于阈值"触发,false表示"大于等于阈值"触发
  bool (*extraCondition)(FrontDistanceData&); // 额外判断条件(比如左右距离)
  void (*action)();       // 触发的行为函数
  int targetValue;        // 对应的target值
};

// 实现具体行为函数
void stopAndWait() {
  robot.Stop();
  delay(2000);
}

void slowForward() {
  robot.Forward();
}

void fullForward() {
  robot.Forward();
}

void turnRightToAvoid() { // 新增:左侧有障碍物时右转避让
  robot.TurnRight();
}

// 额外条件判断函数
bool leftObstacleCloser(FrontDistanceData &data) {
  return data.isLeftCloser && data.left < OBSTACLE_WARNING_THRESHOLD;
}

// 初始化规则数组(按优先级从高到低排列)
DistanceRule distanceRules[] = {
  {OBSTACLE_CLOSE_THRESHOLD, true, nullptr, stopAndWait, TARGET_STOP},
  {OBSTACLE_WARNING_THRESHOLD, true, leftObstacleCloser, turnRightToAvoid, TARGET_STOP},
  {OBSTACLE_WARNING_THRESHOLD, true, nullptr, slowForward, TARGET_SLOW_FORWARD},
  {0, false, nullptr, fullForward, TARGET_FULL_FORWARD} // 默认规则
};

简化后的主逻辑:

FrontDistanceData frontData = getFrontDistanceData();

// 遍历规则数组,匹配后执行对应逻辑
for (auto &rule : distanceRules) {
  bool isThresholdMatch = rule.isUpperLimit ? (frontData.min < rule.threshold) : (frontData.min >= rule.threshold);
  bool isConditionMatch = (rule.extraCondition == nullptr || rule.extraCondition(frontData));
  
  if (isThresholdMatch && isConditionMatch) {
    target = rule.targetValue;
    rule.action();
    break;
  }
}

这些优化方案从可读性、扩展性、可维护性三个维度入手,完全适配你后续新增左右距离判断、更多检测逻辑的需求。

内容的提问来源于stack exchange,提问作者Teebow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:00:56