
1. 「能到但不稳」往往是互相补偿
全局路径贴墙擦过、局部控制器疯狂减速抖振——调大 global costmap 的 inflation_radius 后路径离墙远了,跟踪却更飘;再拧 FollowPath 的 critic 权重,路径又开始贴障。这是规划与控制互相补偿:两个子系统各吃一半错,报表上成功率还行,真机却既慢又不稳。分开评价之前,任何「手感调参」都不可证伪。
2. 分工与数据流
planner_server 订阅 global costmap,输出 nav_msgs/Path;controller_server 订阅 local costmap + path,输出 geometry_msgs/Twist 到 /cmd_vel。全局管拓扑(能不能到),局部管动力学(怎么跟、怎么避)。两者参数空间独立,但共用 costmap 世界模型——地图错了,两边一起错。
planner_server:
ros__parameters:
planner_plugins: ["GridBased"]
GridBased:
plugin: "nav2_navfn_planner/NavfnPlanner"
tolerance: 0.5
controller_server:
ros__parameters:
controller_plugins: ["FollowPath"]
FollowPath:
plugin: "dwb_core::DWBLocalPlanner"
max_vel_x: 0.5
max_vel_theta: 1.03. 选型看底盘约束与算力
| 控制器 | 特点 | 适用 |
|---|---|---|
| DWB | 采样轨迹 + critic 评分,可配差速 | 通用室内,算力中等 |
| Regulated Pure Pursuit | 路径跟踪直观,动态避障弱 | 开阔场地 + 可靠 local costmap |
| MPPI | 优化采样,算力需求高 | 动态障碍多、GPU/强 CPU |
差速底盘不能侧移——用假设全向的局部规划,会出现「路径漂亮、跟踪失败」。仿真延迟低、地面理想,增益照搬真机必抖或必怯。选型先看 cmd_vel 接口约束(),再看 CPU 预算。
4. 分开评价的三列指标
禁止用一张「总分数」——它会重新鼓励互相补偿:
| 维度 | 指标 | 谁负责 |
|---|---|---|
| 路径质量 | 长度、最小间隙、拐弯苛刻度 | planner + global costmap |
| 跟踪质量 | 横向误差、速度跟踪、振荡幅度 | controller + local costmap |
| 任务结果 | 到点成功率、耗时、碰撞次数 | 端到端 |
同一地图固定 10 个目标点,先冻结 controller 调 planner(只看路径质量列),再冻结 planner 调 controller(只看跟踪列)。跨子系统同 PR 禁止。
5. 膨胀与速度的取舍
更保守的全局路径(更大 inflation_radius)降低局部难度,但增加绕路和时间。更激进的控制器(更高 max_vel_x)缩短时间,但对 costmap 噪声敏感——残影一格,激进控制器就撞。经验顺序:先让 costmap 诚实,再调 planner tolerance,最后才动 controller 速度界限。
6. 实验协议
记录:假设、改动项(单簇)、观测(路径截图/误差曲线/成败)、结论。成功标准量化——例如 10 次 ≥9 成功、碰撞 0、最大横向误差 < 0.15 m。真机先降速验证通过性与安全,再逐步放开 max_vel_x;仿真只验证顺序,不验证绝对增益。
ros2 topic echo /plan --once # 看全局路径
ros2 topic echo /local_plan --once # 看局部轨迹
ros2 topic hz /cmd_vel # 看控制输出频率7. 验收
- 系统测试输出路径间隙与跟踪误差两列,禁止只输出成功率。
- planner 与 controller 参数 PR 分开;跨子系统改动需双列对比。
- 真机降速验证通过后再抬速;仿真增益不得原样上车。
- 最小间隙 < footprint 裕量时,先查 costmap 再查 controller。
规划管「路对不对」,控制管「跟不跟得上」——分开评价,补偿无处躲。
8. critic 权重与轨迹采样
DWB 每周期采样多条轨迹,用 critic 加权评分。常见 critic:PathAlign、PathDist、GoalDist、ObstacleFootprint、Oscillation。调权重前先确认 costmap 诚实——ObstacleFootprint 在残影格上会否决所有轨迹,表现为「不动」而非「跟踪差」。sim_time 与 vx_samples/vtheta_samples 决定采样密度;算力不足时减样本数,不是盲目加 critic。
MPPI 用优化采样,对动态障碍更鲁棒,但 CPU/GPU 开销大。RPP 几乎不算力,但遇突发障碍依赖 local costmap 更新及时——costmap 延迟大时 RPP 先撞。
9. 案例:仿真 DWB 增益上车抖振
仿真里 path_dist_scale: 32.0 跟踪完美;真机同样值横向振荡 ±15 cm。根因:仿真 costmap 更新无延迟、地面无滑移。真机降到 path_dist_scale: 24.0 并加 transform_tolerance: 0.2,路径质量列未变,跟踪列振荡消失。不是 DWB 不行,是增益不能跨环境复制。
相关
也可以看看
johan's blog