资讯动态

ROS导航调优中的冷门陷阱与反直觉现象

发布时间:2026/9/29 7:40:46 来源:尧图企业网站定制
写在前面导航调试过程中很多问题不是参数不对而是对组件之间交互方式的理解有偏差。这篇文章整理了一些在实践中容易踩坑、但文档中很少提及的细节。不追求面面俱到只讲那些“知道了就能省下一天时间”的事情。一、足迹模型你真的知道你设的是什么吗1.1 两个footprint只有一个生效TEB的配置文件中可以设置footprint_model代价地图的配置文件中也可以设置footprint或robot_radius。这两个东西名字相似但作用不同代价地图中的footprint用于全局代价地图的膨胀计算也用于base_local_planner的最终碰撞检测。TEB中的footprint_model仅用于TEB内部优化时的轨迹代价计算。关键点如果两者不一致可能出现的情况是——TEB规划出一条“看起来安全”的轨迹但送到move_base后被代价地图的碰撞检测否决导致轨迹被拒绝机器人原地不动。此时终端会打印Trajectory is not feasible但原因不是TEB算不出来而是碰撞检测没通过。解决办法两个文件中的机器人外形参数保持严格一致。如果使用多边形确保顶点坐标完全相同。1.2 多边形顶点顺序有讲究定义多边形顶点时ROS要求按顺时针或逆时针顺序连续排列。如果顺序错乱例如交叉排列多边形形状会变成自交的星形导致碰撞检测完全失效。ROS不会报错但机器人会频繁“莫名”撞墙。验证方法在RViz中打开“RobotModel”显示勾选“Show Footprint”肉眼确认轮廓形状正确。1.3 点模型的“简洁”代价很多人图省事用type: point然后在min_obstacle_dist里把机器人半径加进去。这种方法在小车上确实能跑但有两个隐蔽问题第一代价地图的膨胀计算仍然基于一个点膨胀区域是以该点为圆心的圆形。而真实机器人有形状当机器人旋转时实际轮廓扫过的空间远大于这个圆。这意味着在某些角度下机器人可能刮蹭到障碍物而规划器认为安全。第二min_obstacle_dist同时承担了“机器人半径”和“安全间隙”两个角色。调整这个值时无法单独控制两者调试时容易顾此失彼。对于有固定形状的机器人建议直接使用多边形或双圆模型。二、膨胀层的几个反直觉行为2.1 膨胀半径“变大”反而让路径更贴墙前面提到过膨胀代价的衰减公式从inscribed_radius开始。当你增大inflation_radius时真正扩大的是低代价区域外围而满代价区域inscribed_radius以内的大小不变。结果就是障碍物周围出现一个较宽的“浅代价”缓冲区规划器为了缩短路径长度可能选择贴着这个缓冲区的内缘走——看起来就是机器人更靠近障碍物了。实测案例某机器人inscribed_radius0.25inflation_radius从0.5改为0.8后全局路径在走廊中反而更靠近墙壁。原因是路径总长度变短了走中线需要绕更远实际上不是需要具体分析。关键是不要以为增大膨胀半径就一定让机器人更安全需要实际观察路径变化。2.2 cost_scaling_factor的“正常”取值范围很多教程建议cost_scaling_factor取5到10之间。但如果你使用的是costmap_2d的默认参数inscribed_radius通常较小0.1-0.3米此时cost_scaling_factor5意味着代价从254降到1大约需要0.8-1.0米的距离。这个衰减非常缓慢会导致整个通道都变成高代价区域窄道被“封死”。实际建议对于狭窄环境可以尝试将cost_scaling_factor提高到15-20让高代价区域集中在障碍物附近留出中间的低代价通道。这听起来反直觉提高系数反而打开通道但数学上确实如此。2.3 静态地图与传感器障碍物的叠加效应当静态地图如预先建好的gmapping地图和激光雷达实时障碍物同时存在时膨胀层会对两者分别膨胀然后取最大值。如果一个区域在静态地图中标记为障碍物但激光雷达当前没有扫到比如被遮挡该区域仍然保持高代价。这会导致机器人“害怕”实际已经不存在的障碍物。解决办法合理设置observation_sources中的clearing参数让激光雷达能够清除静态地图中已不存在的障碍物。但注意不要过度清除否则会删除真正的固定墙壁。三、TEB中那些文档没写清楚的事3.1allow_init_with_backwards_motion的实际效果设为true时TEB允许以倒车姿态开始规划。但注意这并不意味着机器人一定会倒车。它只是允许优化器生成的初始轨迹中包含后退运动。如果全局路径的第一个点就在机器人后方这个参数很有用。但如果全局路径方向正确这个参数没有副作用。常见误解有人以为设为true会让机器人随时可以倒车实际上倒车行为还受max_vel_x_backwards和weight_kinematics_forward_drive共同影响。后者设得高会强烈抑制倒车。3.2weight_kinematics_nh与min_turning_radius的关系对于差速机器人min_turning_radius0表示可以原地旋转。此时weight_kinematics_nh约束的是轨迹的曲率连续性而不是转弯半径。如果这个权重过低优化器可能生成“折线”轨迹——相邻两个位姿朝向突变这在物理上不可行需要无限大的角速度。一个诊断方法在RViz中显示TEB的局部轨迹如果轨迹看起来有很多尖锐折角说明weight_kinematics_nh不够大。差速机器人建议至少500阿克曼建议1000以上。3.3obstacle_poses_affected不是越大越好这个参数决定每个障碍物影响多少个轨迹点。设得越大障碍物的影响范围越广轨迹越平滑。但设得过大如超过50会导致两个问题计算量显著增加每个障碍物要与更多轨迹点计算距离。远处的障碍物会“拉扯”近处的轨迹导致避障行为反常。例如机器人为了躲避一个远处的障碍物提前很久就开始偏离路径。经验值对于10-30个轨迹点的典型TEB轨迹obstacle_poses_affected取20-30足够。3.4dt_ref与轨迹点数量的隐式关系teb_autosizeTrue时轨迹点的数量由dt_ref和预测时域max_global_plan_lookahead_dist / max_vel_x共同决定。dt_ref越小轨迹点越密集。但轨迹点太多会导致优化变量暴增计算变慢。一个容易被忽视的副作用轨迹点密集时min_obstacle_dist的约束会被更严格地执行因为更多点需要满足距离条件。这可能导致原本可以通行的窄道变得“不可行”——不是因为宽度不够而是因为采样太密优化器找不到一条所有点都满足距离约束的轨迹。调试提示如果机器人在窄道前反复规划失败尝试增大dt_ref如0.3→0.5减少轨迹点数量有时反而能成功通过。四、DWA与TEB的选择不是精度问题很多对比文章说TEB比DWA“更先进”但在实际应用中选择哪一个往往不是精度问题而是以下因素4.1 参数可调性的差异DWA的参数较少调起来快但能力有限。TEB参数多调好了上限高但调不好下限也低。一个常见的错误是把TEB的参数调得“四不像”性能还不如默认参数的DWA。建议如果你没有充足的时间几天到一周专门调TEB或者项目周期紧张先用DWA跑通。DWA默认参数在大多数室内环境中表现尚可。4.2 对全局路径质量的敏感度TEB高度依赖初始轨迹。如果全局路径不平滑例如经过costmap时被“拉”成锯齿状TEB会在这个锯齿路径上优化结果轨迹也很奇怪。DWA则不同它每一步都重新采样速度对全局路径的依赖较小即使全局路径很烂DWA也能基于当前局部代价图走出合理的路线。经验如果全局规划器如global_planner或navfn的路径质量不好用DWA比用TEB更稳定。4.3 计算资源的实际消耗在一个主频1.5GHz的ARM嵌入式平台上TEB多边形模型单同伦类的CPU占用约15-25%DWA约5-10%。如果同时运行建图、定位、其他节点TEB可能导致整体负载过高引起规划超时。一个实测数据某ARM Cortex-A53平台TEB单次优化耗时约30-60ms加上代价地图更新20ms和传感器处理10ms总周期接近100ms勉强满足10Hz。如果开启同伦类规划耗时翻倍直接掉到5Hz以下机器人反应明显变慢。五、几个常见故障的具体排查步骤5.1 机器人原地打转不前进可能原因及排查顺序检查max_vel_x是否设为零或极小比如0.01。检查全局路径是否为空在RViz中查看/plan话题如果没有路径问题在全局规划器。检查TEB是否一直返回feasibility_check failed查看终端输出。如果是尝试增大min_obstacle_dist是的增大不是减小因为过小的安全距离可能导致没有可行解。检查costmap中的膨胀半径是否过大把起点包围成了“禁区”。5.2 机器人频繁急停然后慢慢恢复这是典型的“规划-执行-再规划”不同步现象。常见原因是controller_frequencymove_base参数设置过高如20Hz而TEB计算一次需要50ms导致每次调用时TEB还没算完返回空轨迹触发急停。解决办法降低controller_frequency到10Hz以下或者优化TEB参数减少计算时间。5.3 机器人过弯时画大弧撞到弯道外侧原因是weight_optimaltime过高TEB倾向于高速过弯但速度受限于max_vel_theta实际转不过来导致轨迹外飘。降低weight_optimaltime如从2降到1或降低max_vel_theta可以缓解。六、调试工具的使用习惯6.1rqt_reconfigure不是用来“碰运气”的正确用法先确定一个想要改变的现象比如“机器人离墙太近”然后思考这个现象与哪个参数最相关inflation_radius、weight_obstacle还是min_obstacle_dist每次只改变这个参数观察效果。同时记录每次修改的值和效果避免重复试错。6.2rviz中必须显示的内容至少同时显示全局规划路径/plan局部规划路径/local_plan代价地图Costmap显示模式选“Cost”机器人足迹RobotModel中的Show Footprint缺少任何一个都很难判断问题出在哪一层。6.3 日志中的有用信息启动TEB时如果配置文件中存在未知参数会在日志中输出警告但不会导致节点崩溃。这些警告很容易被忽略。建议每次修改配置后用rosparam list | grep teb检查参数是否真正加载成功。结语导航调优本质上是一个排除法的过程。系统由多个模块串联任何一个环节的问题都可能表现为同样的现象机器人不动、乱转、撞墙。理解每个模块的真实行为比记忆参数数值更重要。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑