是的。Nav2 的 controller_server(节点名,可执行文件为 nav2_controller)就是负责输出速度控制指令的节点:
- 消息类型 :
geometry_msgs/msg/Twist(线速度 + 角速度) - 默认话题 :
/cmd_vel - 输入:订阅 planner_server 发的路径 + 自己维护的局部代价地图(local costmap),由控制插件(如 DWB、MPPI、RPP/Regulated Pure Pursuit)算出跟踪路径的速度指令
- 频率 :默认 20 Hz(
controller_frequency参数)
一个容易踩的坑:在 Nav2 标准的 navigation_launch.py(Humble 及之后)里,controller_server 的输出被 remap 成了 /cmd_vel_nav ,中间会经过 velocity_smoother 平滑后才发布最终的 /cmd_vel 给底盘驱动:
controller_server ──/cmd_vel_nav──▶ velocity_smoother ──/cmd_vel──▶ 机器人底盘/仿真
所以如果你在标准 bringup 下 echo /cmd_vel 没数据,很可能是要看 /cmd_vel_nav(或检查 velocity_smoother 是否启动)。
验证方法:
bash
ros2 node info /controller_server # 看它实际发布的 topic
ros2 topic info /cmd_vel # 确认类型和订阅者
ros2 topic echo /cmd_vel --once
对你的 USV 项目来说:如果你直接订阅 /cmd_vel 转成推进器指令,注意确认仿真端订阅的是 remap 前还是 remap 后的话题,避免出现"Nav2 在跑但船不动"的情况。