RPP Controller:独立纯 C++ 实现的 Regulated Pure Pursuit 路径跟踪控制器
RPP Controller:独立纯 C++ 实现的 Regulated Pure Pursuit 路径跟踪控制器
项目链接:https://github.com/Robot-Nav/RPP_controller
项目类型:独立纯 C++ 路径跟踪控制器
核心算法:Regulated Pure Pursuit,受控纯追踪算法
适用对象:差速移动机器人、室内服务机器人、小型无人车、清洁机器人、AGV 等
主要特点:去 ROS 化、C++17、CMake 构建、标准接口、带速度调节与碰撞检测
1. 项目简介
RPP_controller 是一个独立纯 C++ 实现的 Regulated Pure Pursuit 路径跟踪控制器。该项目从 ROS 2 Nav2 中的 regulated_pure_pursuit_controller 解耦重构而来,去除了 ROS 节点、话题、TF、参数服务器、pluginlib 等依赖,保留了 RPP 控制器的核心算法逻辑,并提供标准化 C++ 接口,便于集成到不同移动机器人控制系统中。
对于移动机器人、无人车、差速底盘、清洁机器人、室内配送机器人等场景来说,路径跟踪控制器的任务是:给定一条全局路径和机器人当前位姿,实时输出线速度 v 和角速度 ω,使机器人稳定、平滑、安全地沿路径运动。
传统 Pure Pursuit 算法结构简单、计算量低、工程部署方便,但也存在几个明显问题:
- 急转弯时速度不受约束,容易冲出路径;
- 靠近障碍物时缺乏主动减速机制;
- 接近终点时容易速度过大导致过冲;
- 机器人朝向与路径方向偏差过大时,直接跟踪容易震荡;
- 原始 Nav2 版本依赖 ROS 生态,难以直接嵌入非 ROS 工程。
Regulated Pure Pursuit,简称 RPP,在 Pure Pursuit 的几何跟踪框架上加入了速度调节、障碍物代价约束、终点接近减速、朝向旋转、前向碰撞检测等机制,使其更适合真实机器人系统。
本项目的价值在于:把 RPP 从 ROS 插件中抽离出来,形成一个可以直接被 CMake 项目引用的独立 C++ 控制器库。
2. 项目整体架构
RPP Controller 的整体输入包括机器人当前位姿、当前速度、全局路径、目标点、代价地图以及控制器参数。控制器内部完成路径裁剪、坐标变换、前瞻点选取、曲率计算、速度调节和碰撞检测,最终输出底盘可执行的速度指令。

从架构上看,该项目并不依赖 ROS 的消息通信机制,而是将路径跟踪控制器封装成普通 C++ 类。用户只需要提供路径、位姿、速度和代价地图接口,就可以调用控制器计算速度指令。
3. Pure Pursuit 基本原理
Pure Pursuit 是移动机器人路径跟踪中非常经典的一类几何控制方法。它的核心思想不是直接跟踪路径上的最近点,而是在参考路径前方选取一个“前瞻点”,也叫 lookahead point 或 carrot point,然后控制机器人朝这个前瞻点运动。
假设机器人当前位姿为:
P r = ( x r , y r , θ r ) P_r = (x_r, y_r, \theta_r) Pr=(xr,yr,θr)
参考路径上选取的前瞻点为:
P c = ( x c , y c ) P_c = (x_c, y_c) Pc=(xc,yc)
将前瞻点转换到机器人坐标系后,可以根据几何关系计算机器人应该行驶的圆弧曲率:
κ = 2 y c x c 2 + y c 2 \kappa = \frac{2y_c}{x_c^2 + y_c^2} κ=xc2+yc22yc
其中:
- x c x_c xc 表示前瞻点在机器人坐标系下的前向距离;
- y c y_c yc 表示前瞻点在机器人坐标系下的横向偏差;
- κ \kappa κ 表示当前需要跟踪的圆弧曲率。
有了曲率后,控制器可以根据线速度 v v v 计算角速度:
ω = v ⋅ κ \omega = v \cdot \kappa ω=v⋅κ
因此,Pure Pursuit 的基本输出就是:
u = [ v , ω ] u = [v, \omega] u=[v,ω]
其中 v v v 是线速度, ω \omega ω 是角速度。

可以将 Pure Pursuit 理解为:机器人并不是“贴着最近路径点走”,而是始终追踪路径前方一段距离的目标点。前瞻距离越小,机器人越贴近路径,但越容易振荡;前瞻距离越大,运动越平滑,但急弯处容易切弯。
Pure Pursuit 的优点很明显:
- 算法结构简单;
- 几何意义清晰;
- 计算量小;
- 参数少;
- 实时性好;
- 适合差速底盘和低速无人车;
- 工程实现难度低。
但是原始 Pure Pursuit 也有明显短板。它本质上只关心“朝前瞻点走”,并不会主动考虑速度安全性。例如路径前方是急弯时,如果仍然以较高速度前进,机器人就容易产生较大的横向误差,甚至冲出路径。
此外,原始 Pure Pursuit 对障碍物距离、终点减速、朝向误差等因素处理较弱。因此在真实机器人系统中,通常需要对 Pure Pursuit 进行速度调节和安全增强,RPP 就是在这个背景下产生的。
4. RPP 算法核心思想
RPP,全称 Regulated Pure Pursuit,可以理解为“带速度约束和安全调节的纯追踪算法”。
它的整体思路是:
- 仍然使用 Pure Pursuit 计算前瞻点和路径曲率;
- 根据路径曲率对线速度进行约束;
- 根据障碍物代价对线速度进行约束;
- 接近目标点时进行减速;
- 朝向偏差过大时先原地旋转;
- 对当前速度指令进行前向碰撞预测;
- 最终输出更安全的速度指令。

RPP 并没有推翻 Pure Pursuit,而是在 Pure Pursuit 的基础上增加了一套速度调节和安全约束机制。这样既保持了算法轻量的特点,又提升了真实机器人运行时的稳定性和安全性。
5. RPP 中的关键速度调节机制
5.1 曲率速度约束
在路径跟踪中,曲率越大,说明转弯越急。如果机器人在急弯处仍然保持较高线速度,就容易产生较大的离心趋势和横向误差。
RPP 会根据曲率大小自动限制线速度。曲率和转弯半径之间的关系为:
R = 1 ∣ κ ∣ R = \frac{1}{|\kappa|} R=∣κ∣1
其中 R R R 是转弯半径, κ \kappa κ 是路径曲率。转弯越急, R R R 越小。
当转弯半径小于设定阈值 R m i n R_{min} Rmin 时,线速度会被缩放:
v c u r v = v ⋅ R R m i n , R < R m i n v_{curv} = v \cdot \frac{R}{R_{min}}, \quad R < R_{min} vcurv=v⋅RminR,R<Rmin
当 R ≥ R m i n R \geq R_{min} R≥Rmin 时,说明路径相对平缓,可以保持原始速度。
这个机制的作用很直观:
- 直线路径:速度保持较高;
- 小曲率弯道:速度轻微下降;
- 急转弯:明显降低线速度;
- 原地转向附近:避免高速冲弯。
对于小型无人车来说,这个机制非常重要,因为底盘的横向稳定性、轮胎摩擦、控制频率和定位噪声都会影响急弯跟踪效果。曲率速度约束可以显著减少急弯处的路径跟踪误差和振荡。
5.2 障碍物代价速度约束
在导航系统中,代价地图通常用不同的代价值表示机器人与障碍物之间的安全关系。越靠近障碍物,代价值越高;远离障碍物时,代价值较低。
RPP 根据机器人当前位置或前方轨迹附近的代价值对线速度进行调节。基本思想是:
离障碍物远:正常速度行驶
靠近障碍物:降低速度
非常接近障碍物:停止或触发碰撞检测失败
在代价地图膨胀层中,代价值和障碍物距离通常存在指数衰减关系。RPP 可以根据代价值反推出近似障碍物距离:
d m i n = r i n s c r i b e d − ln ( C ) − ln ( 253 ) k i n f l a t i o n d_{min} = r_{inscribed} - \frac{\ln(C) - \ln(253)}{k_{inflation}} dmin=rinscribed−kinflationln(C)−ln(253)
其中:
- C C C 表示代价地图中的代价值;
- r i n s c r i b e d r_{inscribed} rinscribed 表示机器人内切圆半径;
- k i n f l a t i o n k_{inflation} kinflation 表示膨胀层代价缩放因子;
- d m i n d_{min} dmin 表示估计的障碍物距离。
当障碍物距离小于设定的缩放距离 d s c a l e d_{scale} dscale 时,速度会进一步降低:
v c o s t = v ⋅ k g a i n ⋅ d m i n d s c a l e v_{cost} = v \cdot \frac{k_{gain} \cdot d_{min}}{d_{scale}} vcost=v⋅dscalekgain⋅dmin
其中 k g a i n k_{gain} kgain 是速度缩放增益。
这个机制适合机器人在狭窄空间、贴边通行、靠近货架、靠近墙体或靠近动态障碍物时使用。它不是完整的局部避障规划器,但可以作为路径跟踪过程中的安全速度约束。
5.3 接近目标点减速
原始 Pure Pursuit 在接近终点时,如果速度没有额外处理,容易出现过冲。尤其是机器人目标点前方没有足够长的路径时,前瞻点会落在路径末端附近,控制器可能仍然输出较大的速度。
RPP 增加了接近目标点速度缩放机制。当机器人到目标点的剩余路径长度小于设定距离 d a p p r o a c h d_{approach} dapproach 时,线速度会按照剩余距离比例衰减:
v a p p r o a c h = v ⋅ d r e m a i n i n g d a p p r o a c h , d r e m a i n i n g < d a p p r o a c h v_{approach} = v \cdot \frac{d_{remaining}}{d_{approach}}, \quad d_{remaining} < d_{approach} vapproach=v⋅dapproachdremaining,dremaining<dapproach
其中:
- d r e m a i n i n g d_{remaining} dremaining 表示当前位置到目标点的剩余路径长度;
- d a p p r o a c h d_{approach} dapproach 表示开始减速的距离阈值。
同时,为了避免速度过低导致机器人停滞,RPP 通常会设置一个最小接近速度:
v a p p r o a c h ≥ v m i n _ a p p r o a c h v_{approach} \geq v_{min\_approach} vapproach≥vmin_approach
这样可以保证机器人在接近终点时既不会冲过目标,也不会因为速度过低而无法到达目标区域。
5.4 朝向旋转机制
在某些情况下,机器人当前位置朝向与路径方向差异很大。如果此时直接执行 Pure Pursuit 跟踪,机器人可能会一边前进一边大幅转向,导致轨迹不稳定。
RPP 提供了 rotate to heading 机制。当机器人朝向与路径方向偏差超过阈值时,控制器会先让机器人停止前进,然后原地旋转到合适方向。
前瞻点方向角为:
θ p a t h = arctan 2 ( y c , x c ) \theta_{path} = \arctan2(y_c, x_c) θpath=arctan2(yc,xc)
如果满足:
∣ θ p a t h ∣ > θ m i n |\theta_{path}| > \theta_{min} ∣θpath∣>θmin
则控制器输出:
v = 0 v = 0 v=0
ω = ω r o t a t e \omega = \omega_{rotate} ω=ωrotate
该机制适合差速底盘、履带底盘、室内低速机器人等可以原地旋转的机器人。对于 Ackermann 车辆或不能原地旋转的底盘,则需要谨慎开启。
6. 多级速度调节整体逻辑
RPP 的速度调节不是单一规则,而是多种约束共同作用。控制器先得到一个期望线速度,然后依次考虑曲率、障碍物代价、终点接近、速度限制和加速度限制,最终输出一个更安全、更可执行的速度。

可以将 RPP 的线速度调节理解为:
v o u t = c l a m p ( m i n ( v d e s , v c u r v , v c o s t , v a p p r o a c h ) , v m i n , v m a x ) v_{out} = clamp(min(v_{des}, v_{curv}, v_{cost}, v_{approach}), v_{min}, v_{max}) vout=clamp(min(vdes,vcurv,vcost,vapproach),vmin,vmax)
其中:
- v d e s v_{des} vdes 表示期望速度;
- v c u r v v_{curv} vcurv 表示曲率约束后的速度;
- v c o s t v_{cost} vcost 表示障碍物代价约束后的速度;
- v a p p r o a c h v_{approach} vapproach 表示接近目标点约束后的速度;
- v m i n v_{min} vmin 和 v m a x v_{max} vmax 表示速度下限与上限。
这样处理后,机器人在直线区域可以保持较高速度,在急弯、障碍物附近和目标点附近自动降速。
7. 前瞻距离的选择
前瞻距离 L d L_d Ld 是 Pure Pursuit 和 RPP 中非常关键的参数。
如果前瞻距离太小:
- 控制器对路径变化非常敏感;
- 角速度变化大;
- 容易振荡;
- 轨迹可能不平滑。
如果前瞻距离太大:
- 机器人会忽略路径细节;
- 急弯处容易切弯;
- 路径跟踪精度下降。
RPP 支持固定前瞻距离,也支持速度缩放前瞻距离。速度缩放形式为:
L d = c l a m p ( v ⋅ t l o o k a h e a d , L m i n , L m a x ) L_d = clamp(v \cdot t_{lookahead}, L_{min}, L_{max}) Ld=clamp(v⋅tlookahead,Lmin,Lmax)
其中:
- v v v 为当前线速度;
- t l o o k a h e a d t_{lookahead} tlookahead 为前瞻时间;
- L m i n L_{min} Lmin 为最小前瞻距离;
- L m a x L_{max} Lmax 为最大前瞻距离。
这样做的好处是:
- 低速时使用较短前瞻距离,提高跟踪精度;
- 高速时使用较长前瞻距离,提高运动平滑性;
- 不同速度范围下控制表现更稳定。
对于低速小车,可以先使用固定前瞻距离,例如 0.4 m 到 0.8 m。对于速度变化较大的机器人,可以启用速度缩放前瞻距离。
8. 前向碰撞检测
RPP 不只是计算速度,还会对当前速度指令进行前向碰撞预测。
基本方法是:根据当前输出的线速度和角速度,在未来一段时间内模拟机器人运动轨迹,并检查机器人足迹是否与代价地图中的障碍物发生碰撞。
运动学前向预测公式如下:
x t + 1 = x t + v cos ( θ t ) Δ t x_{t+1} = x_t + v \cos(\theta_t)\Delta t xt+1=xt+vcos(θt)Δt
y t + 1 = y t + v sin ( θ t ) Δ t y_{t+1} = y_t + v \sin(\theta_t)\Delta t yt+1=yt+vsin(θt)Δt
θ t + 1 = θ t + ω Δ t \theta_{t+1} = \theta_t + \omega \Delta t θt+1=θt+ωΔt
在每一个预测位姿处,控制器都会调用代价地图接口检查机器人 footprint 是否碰撞。如果检测到碰撞,控制器会认为当前速度指令不可用,进而停止或抛出无效控制异常。

这个机制可以有效避免机器人沿着当前速度继续运动时撞上障碍物,尤其适合狭窄通道、拐角、障碍物边缘等场景。
9. DWPP:动态窗口 Pure Pursuit
项目中还包含 DWPP,即 Dynamic Window Pure Pursuit。
普通 RPP 主要从路径曲率、障碍物代价、终点距离等角度调节速度,但速度变化本身还需要满足机器人运动约束,例如最大加速度、最大减速度、最大角加速度等。
DWPP 的思想是把 Dynamic Window Approach 的速度窗口约束与 Pure Pursuit 的曲率关系结合起来。
其基本流程为:
1. 根据当前速度和加速度约束计算动态速度窗口
2. 根据 RPP 得到期望线速度和曲率
3. 在动态窗口范围内寻找可执行的速度组合
4. 输出满足速度、角速度、加速度限制的控制指令
Pure Pursuit 的角速度关系为:
ω = κ v \omega = \kappa v ω=κv
DWPP 会在机器人可达速度空间内寻找更合理的 v v v 和 ω \omega ω,从而避免控制指令突变,使速度变化更符合底盘动力学约束。

如果机器人底盘对加速度限制比较敏感,例如真实无人车、清洁机器人、服务机器人,那么 DWPP 模式会比普通速度裁剪更平滑。
10. 项目工程结构
该项目采用标准 CMake 工程组织,整体结构清晰,便于阅读和二次开发。
RPP_controller/
├── CMakeLists.txt
├── LICENSE
├── README.md
├── cmake/
│ └── rpp_controllerConfig.cmake.in
├── include/rpp_controller/
│ ├── types.hpp
│ ├── exceptions.hpp
│ ├── controller_config.hpp
│ ├── costmap_interface.hpp
│ ├── goal_checker_interface.hpp
│ ├── geometry_utils.hpp
│ ├── regulation_functions.hpp
│ ├── dynamic_window_pure_pursuit_functions.hpp
│ ├── collision_checker.hpp
│ ├── regulated_pure_pursuit_controller.hpp
│ └── simple_costmap.hpp
├── src/
│ ├── regulated_pure_pursuit_controller.cpp
│ ├── collision_checker.cpp
│ └── geometry_utils.cpp
├── examples/
│ └── example_usage.cpp
└── test/
├── test_regulated_pp.cpp
├── test_dwpp_functions.cpp
├── test_regulation_functions.cpp
├── test_geometry_utils.cpp
└── test_path_utils.cpp
几个核心文件作用如下:
| 文件 | 作用 |
|---|---|
regulated_pure_pursuit_controller.hpp/cpp |
RPP 主控制器实现 |
controller_config.hpp |
控制器参数配置 |
costmap_interface.hpp |
代价地图抽象接口 |
goal_checker_interface.hpp |
目标点检测接口 |
collision_checker.hpp/cpp |
前向碰撞检测 |
regulation_functions.hpp |
曲率、代价、接近速度等调节函数 |
dynamic_window_pure_pursuit_functions.hpp |
DWPP 相关函数 |
geometry_utils.hpp/cpp |
坐标变换、角度归一化、路径处理等几何工具 |
simple_costmap.hpp |
简单代价地图实现,可用于测试和示例 |
11. 编译与运行
11.1 安装依赖
Ubuntu 下可以使用以下命令安装基础依赖:
sudo apt update
sudo apt install build-essential cmake libgtest-dev
项目依赖比较轻量,主要要求:
- C++17;
- CMake 3.10 以上;
- Google Test;
- POSIX Threads。
11.2 编译项目
git clone https://github.com/Robot-Nav/RPP_controller.git
cd RPP_controller
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
11.3 运行测试
ctest --output-on-failure
如果测试通过,可以看到类似输出:
100% tests passed, 0 tests failed out of 40
11.4 安装到系统
sudo make install
安装后,其他 CMake 项目可以通过:
find_package(rpp_controller REQUIRED)
来引用该控制器库。
12. 使用示例
项目提供了标准 C++ 接口,使用流程大致如下:
#include "rpp_controller/regulated_pure_pursuit_controller.hpp"
#include "rpp_controller/simple_costmap.hpp"
#include "rpp_controller/goal_checker_interface.hpp"
using namespace rpp_controller;
int main()
{
// 1. 创建代价地图
SimpleCostmap costmap(20.0, 20.0, 0.05, 0.15, 0.25);
// 2. 配置控制器参数
ControllerConfig config;
config.max_linear_vel = 0.5;
config.lookahead_dist = 0.6;
config.use_collision_detection = true;
config.use_regulated_linear_velocity_scaling = true;
config.use_cost_regulated_linear_velocity_scaling = true;
config.use_rotate_to_heading = true;
// 3. 初始化控制器
RegulatedPurePursuitController controller;
controller.configure(config, &costmap, 20.0);
// 4. 准备路径和目标点
Path global_plan;
PoseStamped global_goal;
// 这里需要用户根据自己的系统填充 global_plan
// global_goal 一般取路径最后一个点
SimpleGoalChecker goal_checker(0.15);
// 5. 当前机器人状态
PoseStamped robot_pose;
Twist2D current_velocity{0.0, 0.0, 0.0};
// 6. 计算速度指令
VelocityCommand cmd = controller.computeVelocityCommands(
robot_pose,
current_velocity,
&goal_checker,
global_plan,
global_goal
);
// 7. 输出控制指令
// cmd.linear_x -> 线速度
// cmd.angular_z -> 角速度
return 0;
}
控制器最终输出的是速度指令:
cmd.linear_x
cmd.angular_z
如果你的底盘是差速底盘,可以将其转换为左右轮速度;如果是其他移动机器人平台,也可以根据自身运动学模型进一步转换。
13. 核心接口说明
13.1 RegulatedPurePursuitController
这是主控制器类,最核心的函数是:
VelocityCommand computeVelocityCommands(
const PoseStamped & robot_pose,
const Twist2D & current_velocity,
GoalCheckerInterface * goal_checker,
const Path & global_plan,
const PoseStamped & global_goal);
该函数输入机器人当前位姿、当前速度、目标检查器、全局路径和目标点,输出速度控制指令。
控制器初始化函数为:
void configure(
const ControllerConfig & config,
CostmapInterface * costmap,
double control_frequency = 20.0);
其中:
config:控制器参数;costmap:代价地图接口;control_frequency:控制频率。
13.2 CostmapInterface
CostmapInterface 是代价地图抽象接口。用户如果想把该控制器接入自己的导航系统,需要实现这个接口。
核心接口包括:
virtual bool worldToMap(
double wx,
double wy,
unsigned int & mx,
unsigned int & my) const = 0;
virtual unsigned char getCost(
unsigned int mx,
unsigned int my) const = 0;
virtual double footprintCostAtPose(
double x,
double y,
double theta,
const std::vector<Point2D> & footprint) const = 0;
其中:
worldToMap用于世界坐标到地图栅格坐标转换;getCost用于获取某个栅格的代价值;footprintCostAtPose用于计算机器人在某个位姿下的 footprint 代价。
如果你的项目中已经有栅格地图、ESDF、代价地图或占据地图,只需要做一层接口适配,就可以接入该控制器。
13.3 GoalCheckerInterface
目标检查接口用于判断机器人是否到达目标位置。
class GoalCheckerInterface {
public:
virtual bool isGoalXYReached(
const Pose2D & robot_pose,
const Pose2D & goal_pose,
const Twist2D & speed,
const Path & transformed_plan) const = 0;
};
项目中提供了 SimpleGoalChecker,可以根据 XY 距离判断是否到达目标点。实际工程中,也可以扩展成同时判断位置误差和航向误差。
14. 常用参数说明
下面是一些比较重要的参数。
| 参数 | 含义 |
|---|---|
max_linear_vel |
最大线速度 |
min_linear_vel |
最小线速度,允许倒车时可为负 |
max_angular_vel |
最大角速度 |
lookahead_dist |
固定前瞻距离 |
min_lookahead_dist |
速度缩放模式下的最小前瞻距离 |
max_lookahead_dist |
速度缩放模式下的最大前瞻距离 |
lookahead_time |
速度缩放前瞻时间 |
use_velocity_scaled_lookahead_dist |
是否启用速度缩放前瞻距离 |
use_collision_detection |
是否启用碰撞检测 |
use_regulated_linear_velocity_scaling |
是否启用曲率速度调节 |
use_cost_regulated_linear_velocity_scaling |
是否启用障碍物代价速度调节 |
regulated_linear_scaling_min_radius |
触发曲率速度调节的最小转弯半径 |
regulated_linear_scaling_min_speed |
速度调节后的最小线速度 |
cost_scaling_dist |
障碍物代价速度缩放距离 |
cost_scaling_gain |
障碍物代价速度缩放增益 |
approach_velocity_scaling_dist |
接近目标点时开始减速的距离 |
min_approach_linear_velocity |
接近目标点时的最小线速度 |
use_rotate_to_heading |
是否启用原地朝向旋转 |
rotate_to_heading_angular_vel |
原地旋转角速度 |
rotate_to_heading_min_angle |
触发朝向旋转的最小角度 |
use_dynamic_window |
是否启用 DWPP 模式 |
allow_reversing |
是否允许倒车 |
15. 参数调试建议
对于小型差速无人车,可以从下面这组参数开始调试:
config.max_linear_vel = 0.5;
config.lookahead_dist = 0.6;
config.use_velocity_scaled_lookahead_dist = false;
config.use_regulated_linear_velocity_scaling = true;
config.regulated_linear_scaling_min_radius = 0.9;
config.regulated_linear_scaling_min_speed = 0.25;
config.use_cost_regulated_linear_velocity_scaling = true;
config.cost_scaling_dist = 0.6;
config.cost_scaling_gain = 1.0;
config.use_collision_detection = true;
config.max_allowed_time_to_collision_up_to_carrot = 1.0;
config.use_rotate_to_heading = true;
config.rotate_to_heading_angular_vel = 1.0;
config.rotate_to_heading_min_angle = 0.785;
调参时可以按照下面顺序进行:
- 先关闭障碍物代价调节,只调路径跟踪效果;
- 调整
lookahead_dist,观察路径横向误差和角速度是否震荡; - 打开曲率速度调节,观察急弯处是否减速;
- 打开接近目标点减速,观察终点是否过冲;
- 打开碰撞检测,检查障碍物附近是否能安全停止;
- 最后根据底盘性能决定是否启用 DWPP。
一般来说:
- 路径跟踪震荡明显:适当增大前瞻距离;
- 急弯切弯严重:适当减小前瞻距离,或增强曲率减速;
- 速度过慢:提高
regulated_linear_scaling_min_speed; - 靠近障碍物太激进:减小
cost_scaling_gain或增大cost_scaling_dist; - 终点过冲:增大
approach_velocity_scaling_dist; - 原地旋转过快:降低
rotate_to_heading_angular_vel。
16. 与普通 Pure Pursuit 的区别
| 对比项 | Pure Pursuit | Regulated Pure Pursuit |
|---|---|---|
| 前瞻点跟踪 | 支持 | 支持 |
| 曲率计算 | 支持 | 支持 |
| 速度调节 | 通常不支持 | 支持 |
| 急弯减速 | 不支持或需要手写 | 支持 |
| 障碍物附近减速 | 不支持 | 支持 |
| 终点接近减速 | 不完善 | 支持 |
| 朝向旋转 | 不支持 | 支持 |
| 前向碰撞检测 | 不支持 | 支持 |
| 工程安全性 | 一般 | 更强 |
| 计算复杂度 | 低 | 仍然较低 |
RPP 的优势在于,它仍然保持了 Pure Pursuit 算法轻量、实时、易部署的特点,同时补足了真实机器人运行中最常见的安全问题。
17. 与 DWA、TEB、MPC 的区别
RPP 严格来说是路径跟踪控制器,不是完整意义上的局部轨迹优化器。
DWA 会在速度空间中采样多组速度,并根据目标朝向、障碍物距离、速度等评价函数选择最优速度。TEB 会在时空轨迹上进行优化,考虑轨迹点、时间间隔、障碍物约束、速度加速度约束等。MPC 则通常基于机器人模型,在预测时域内优化控制序列。
相比这些方法,RPP 的特点是:
- 计算量更小;
- 工程实现更简单;
- 参数更少;
- 实时性更好;
- 更适合已有全局路径的稳定跟踪;
- 不适合复杂动态障碍环境下的大范围局部重规划。
因此,RPP 更适合作为“全局路径跟踪控制器”使用。如果机器人需要在复杂动态障碍环境中主动绕障,通常还需要配合局部规划器、动态障碍物预测或全局路径重规划模块。
18. 适用场景
该项目适合以下场景:
- 差速移动机器人路径跟踪;
- 室内服务机器人导航;
- 清洁机器人沿路径运行;
- 仓储 AGV 路径跟踪;
- 小型无人车低速跟踪;
- 非 ROS 项目中集成 RPP 控制器;
- 需要轻量级 C++ 控制器的嵌入式平台;
- 用于路径跟踪算法学习和二次开发。
不太适合的场景包括:
- 高速自动驾驶车辆;
- 强动态障碍物密集场景;
- 需要复杂轨迹优化的场景;
- 需要严格动力学约束的高速机器人;
- 无全局路径输入的自主探索场景。
19. 项目亮点总结
19.1 独立纯 C++ 实现
项目移除了 ROS 依赖,不再绑定 ROS 节点、TF、参数服务器和插件机制,可以直接作为普通 C++ 库嵌入其他工程。
19.2 保留 RPP 核心算法
项目保留了 Regulated Pure Pursuit 的核心思想,包括前瞻点跟踪、曲率约束、代价约束、接近目标减速、朝向旋转和碰撞检测。
19.3 接口清晰
通过 CostmapInterface 和 GoalCheckerInterface 进行抽象,用户可以很方便地接入自己的代价地图、目标检查器和机器人系统。
19.4 工程结构完整
项目包含源码、头文件、示例程序、单元测试和 CMake 安装导出配置,适合学习、测试和工程集成。
19.5 支持 DWPP
项目支持 Dynamic Window Pure Pursuit,可以在路径跟踪时考虑速度和加速度约束,使速度输出更符合真实底盘运动限制。
20. 总结
RPP_controller 是一个非常适合工程学习和实际部署的路径跟踪控制器项目。它的核心价值不是复杂的优化模型,而是把经典 Pure Pursuit 算法做了工程级增强,并从 ROS Nav2 中解耦为独立 C++ 库。
对于需要“给定路径,然后稳定跟踪”的移动机器人系统来说,RPP 是一个很实用的选择。它相比普通 Pure Pursuit 更安全,相比 DWA、TEB、MPC 等方法更轻量,适合资源受限、控制频率要求较高、路径已经由全局规划器生成的场景。
如果你的机器人项目中已经有全局路径、定位结果和代价地图,那么这个项目可以作为一个独立的路径跟踪模块接入系统。你只需要实现对应的代价地图接口和目标检查接口,就可以获得一个带曲率减速、障碍物减速、终点减速和碰撞检测能力的 RPP 控制器。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)