如何优化含大量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
相关产品推荐
相关产品推荐

