nav2_controller
1 概述
1.1 Progress Checker
Progress_checker: 判断机器人在一段时间内是否真的在朝目标前进.
| 插件名 | plugin 类名 | 进度判定依据 | 主要参数(单位) | 典型场景 | 备注 |
|---|---|---|---|---|---|
| SimpleProgressChecker | nav2_controller::SimpleProgressChecker |
位移是否在给定时间内达到最小半径 | required_movement_radius(m)、movement_time_allowance(s) |
直线/曲线前进为主,原地转向不重要的移动机器人 | 实现简单、开销小;原地旋转不计为“进步” |
| PoseProgressChecker | nav2_controller::PoseProgressChecker |
位移或转角是否在给定时间内达到阈值 | required_movement_radius(m)、required_movement_angle(rad)、movement_time_allowance(s) |
频繁原地转向(窄通道、角落对齐)也应被视为“有进步” | 能避免机器人原地找路时被误判为卡住 |
1.2 Goal Checker
goal_checker: 判断机器人是否到达目标.
| 插件名 | plugin 类名 | 判定条件 | 主要参数(单位) | 典型场景 | 备注 |
|---|---|---|---|---|---|
| SimpleGoalChecker | nav2_controller::SimpleGoalChecker |
当前位置到目标的平移距离 ≤ 阈值 且 朝向差 ≤ 阈值 | xy_goal_tolerance(m)、yaw_goal_tolerance(rad)、stateful(是否保留状态) |
通用场景,需要位置与朝向都满足 | 最常用的基础型目标检测器 |
| StoppedGoalChecker | nav2_controller::StoppedGoalChecker |
同 SimpleGoalChecker 条件 且 速度低于阈值 | xy_goal_tolerance(m)、yaw_goal_tolerance(rad)、trans_stopped_velocity(m/s)、rot_stopped_velocity(rad/s)、stateful |
要求机器人到达目标后必须停稳才算完成 | 用于避免“到点不停”问题 |
| PositionGoalChecker | nav2_controller::PositionGoalChecker |
当前位置到目标的平移距离 ≤ 阈值,不要求朝向收敛 | xy_goal_tolerance(m)、stateful |
机械臂基座、搬运机器人等对朝向不敏感的任务 | 可缩短路径时间,但可能朝向不一致 |
1.3 Controller
Nav2 的局部控制器插件清单(也叫”Local Planner”).
它们在 controller_server 中运行:读取全局路径和实时代价地图,按照各自的算法在高频率下计算速度指令 cmd_vel,让机器人沿路径安全、平滑地前进.
你可以在 controller_server.ros__parameters.controller_plugins 下同时加载多个控制器,并通过行为树(ControllerSelector)或在 Action 目标里设置 controller_id 来动态切换.
| 控制器 | plugin 类名(Jazzy) | 作者 | 简介 | 适配底盘 |
|---|---|---|---|---|
| DWB Controller | dwb_core::DWBLocalPlanner |
David Lu!! | 动态窗口法(DWA)的高度可配置实现,支持多种代价插件 | 差速、全向、足式 |
| TEB Controller | teb_local_planner::TebLocalPlannerROS |
Christoph Rösmann | 近似 MPC 的时弹性带方法,优化时间+空间,适合多约束场景 | Ackermann、足式、全向、差速 |
| Regulated Pure Pursuit | nav2_regulated_pure_pursuit_controller::RegulatedPurePursuitController |
Steve Macenski | 纯追踪改进版,自动调节速度/曲率,工业移动机器人常用 | Ackermann、足式、差速 |
| MPPI Controller | nav2_mppi_controller::MPPIController |
Steve Macenski, Aleksei Budyakov | 预测控制(MPPI),采样优化+可插拔 critic,通用性强 | 差速、全向、Ackermann |
| Rotation Shim Controller | nav2_rotation_shim_controller::RotationShimController |
Steve Macenski | “垫片”控制器:先原地对准路径方向,再交给主控制器跟踪 | 差速、全向(能原地旋转的底盘) |
| Graceful Controller | nav2_graceful_controller::GracefulController |
Alberto Tudela | 基于位姿跟随的控制律,轨迹平滑、收敛稳定 | 差速、全向、足式 |
| Vector Pursuit Controller | nav2_vector_pursuit_controller::VectorPursuitController |
Black Coffee Robotics | 向量追踪算法,适合高速且要求高精度的路径跟踪 | 差速、Ackermann、足式 |
2 参数解析
1 | controller_server: |
3 自定义局部规划器
包结构.
1 | nav2_pure_pursuit_controller/ |
头文件.
| 方法名 | 触发时机 / 生命周期 | 作用 | 关键入参 / 返回 | 必须重写 |
|---|---|---|---|---|
configure() |
controller_server 进入 on_configure |
声明参数、初始化成员(拿到 TF、Costmap、日志/时钟等) | 入参:parent(WeakPtr)、name、tf、costmap_ros;返回:void |
是 |
activate() |
进入 on_activate | 启动发布器/定时器、切换到活跃态 | 入参:无;返回:void | 是 |
deactivate() |
进入 on_deactivate | 停止发布器/定时器、退出活跃态 | 入参:无;返回:void | 是 |
cleanup() |
进入 on_cleanup | 释放 configure() 创建的资源、指针置空 |
入参:无;返回:void | 是 |
setPlan() |
全局路径更新时 | 处理并缓存最新的全局路径(常见:变换到机器人坐标系) | 入参:nav_msgs::msg::Path;返回:void |
是 |
computeVelocityCommands() |
控制器需要新速度指令时(每个控制周期) | 计算并返回速度指令以跟随路径 | 入参:pose(当前位姿)、velocity(当前速度)、goal_checker*;返回:geometry_msgs::msg::TwistStamped |
是 |
cancel() |
收到取消请求时 | 可选的“优雅停止”流程;不实现则立即停 | 入参:无;返回:实现体裁(常见 bool) |
可选 |
setSpeedLimit() |
需要限速时 | 以绝对值(m/s)或百分比限制最大线速度(角速度通常按比例限) | 入参:speed_limit、percentage;返回:void |
是 |
1 |
|
源代码.
1 |
|
插件描述.
1 | <library path="nav2_pure_pursuit_controller"> |
package.xml 关键片段.
1 | <export> |
在 yaml 文件加入自己的局部规划器.
1 | controller_server: |
4 References
配置: https://docs.nav2.org/configuration/packages/configuring-controller-server.html
进度检测器插件: https://docs.nav2.org/plugins/index.html#progress-checkers
目标检测器插件: https://docs.nav2.org/plugins/index.html#goal-checkers
局部规划器插件: https://docs.nav2.org/plugins/index.html#controllers
自定义控制器插件: https://docs.nav2.org/plugin_tutorials/docs/writing_new_nav2controller_plugin.html
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.