导航卡住或绕路时,别急着改参数。Robostral Navigate 的失败原因一般来自三层:全局规划是否生成了路径、局部规划是否在执行、底层传感器和地图是否一致。先把日志按这三层切开,只调整真正有问题的参数。
排查导航失败,先看日志是否有全局路径;没有则查地图和起点终点。有路径但机器人停住,再看局部规划的速度与状态。根据日志定位到膨胀半径或速度限制,再修改参数文件。用 rosbag 记录失败现场,参数调整前后各录一次,回放对比轨迹和 cmd_vel,能有效减少重复调试。参数组合依赖实际环境,调整后需重新验证。
先从导航日志判断全局规划是否成功
启动导航后,打开机器人日志终端回看 move_base 或调度节点输出。全局规划成功时,日志里通常会输出类似 “Got global plan” 或 “global plan received” 的关键字;失败时多会出现 “Failed to get a plan” 或 “Could not find a legal path”。Robostral Navigate 的日志前缀可能不同,但关键在于“有没有拿到一条从起点到目标点的路径”。没有路径,后面局部规划不会执行。
如果确认全局规划失败,按顺序检查:地图话题是否由 /map 正常发布;机器人在 map 坐标系里的初始位姿是否落在地图可通行区域;目标点坐标是否在代价地图边界内;全局代价地图的膨胀层是否把狭窄通道全部标记为障碍。可以先在 RViz 里关闭障碍层看底图是否干净,再确认参数。
再从局部规划日志分析卡住原因
全局路径存在但机器人原地不动,问题转到局部规划。观察 /cmd_vel 话题,速度持续为零,说明局部规划器一直在避障或认为目标不可达。日志里出现 “Robot is stuck” 时,常见原因有三类:局部目标点落在膨胀区内,机器人距离障碍过近导致避障让横向速度一直归零,或者恢复行为不断原地旋转抢占控制权。
判断侧重点在速度指令的形状:cmd_vel 有速度但轨迹绕远,是碰撞风险触发避障;cmd_vel 完全为 0,且局部规划日志反复切换 planner,多半是目标不可达或代价地图把目标点圈住。此时不要只调速度,还要看局部代价地图的传感器数据来源是否异常。
对照参数文件调整膨胀半径和速度限制
Robostral Navigate 的参数文件一般放在 config 目录,常见名字是 costmap_common_params.yaml、planner_settings.yaml。修改前先备份,别在运行中直接改。
膨胀半径(inflation_radius)决定路径与障碍间的最小距离。膨胀半径设得大,路径远离障碍,但窄通道会被认为不可通行;设得小,路径贴近障碍,容易触发局部避障。日志显示“目标不可达”,先检查目标点是否在膨胀区域内,适当调小膨胀半径。频繁避障则尝试增大 cost_scaling_factor 让代价衰减更快。
速度限制包括 max_vel_x、max_vel_trans、acc_lim_x。速度上限过高会使局部规划器难以在短距离内刹车,表现为靠近障碍时急刹;加速度限制过低会让机器人反应慢,表现为局部规划器不断重新规划。若日志中大量出现 “aborting” 且有足够刹车距离,可以适当降低 max_vel_x;若机器人明显顿挫,则提高 acc_lim_x 的允许范围。调整幅度要小,每次只改一个参数并记录日志。
用rosbag录制失败场景进行复盘
录包是定位导航问题最直接的方式。先确定需要的话题,用 rostopics list 查看,再执行类似下面的录制命令:
rosbag record -O nav_fail.bag /map /tf /tf_static /odom /cmd_vel /move_base/status /move_base/result /move_base/global_costmap/costmap /move_base/local_costmap/costmap
回放时用 rosbag info nav_fail.bag 确认话题完整后,执行 rosbag play nav_fail.bag,再打开 RViz 和 rqt_bag。先看全局路径是否连接起点和终点,再看 cmd_vel 的时间曲线和地图障碍层变化。
对比方法:参数调整前后各录一次包,依次回放,把两次的 cmd_vel 曲线和局部路径叠加在同一个地图坐标系中。若调整后的机器人能通过同一段狭窄通道且没有频繁急刹,说明方向有效。注意录包时保持起点、终点和障碍物位置一致,否则对比不成立。