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 算法结构简单、计算量低、工程部署方便,但也存在几个明显问题:

  1. 急转弯时速度不受约束,容易冲出路径;
  2. 靠近障碍物时缺乏主动减速机制;
  3. 接近终点时容易速度过大导致过冲;
  4. 机器人朝向与路径方向偏差过大时,直接跟踪容易震荡;
  5. 原始 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,可以理解为“带速度约束和安全调节的纯追踪算法”。

它的整体思路是:

  1. 仍然使用 Pure Pursuit 计算前瞻点和路径曲率;
  2. 根据路径曲率对线速度进行约束;
  3. 根据障碍物代价对线速度进行约束;
  4. 接近目标点时进行减速;
  5. 朝向偏差过大时先原地旋转;
  6. 对当前速度指令进行前向碰撞预测;
  7. 最终输出更安全的速度指令。

请添加图片描述

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=vRminR,R<Rmin

R ≥ R m i n R \geq R_{min} RRmin 时,说明路径相对平缓,可以保持原始速度。

这个机制的作用很直观:

  • 直线路径:速度保持较高;
  • 小曲率弯道:速度轻微下降;
  • 急转弯:明显降低线速度;
  • 原地转向附近:避免高速冲弯。

对于小型无人车来说,这个机制非常重要,因为底盘的横向稳定性、轮胎摩擦、控制频率和定位噪声都会影响急弯跟踪效果。曲率速度约束可以显著减少急弯处的路径跟踪误差和振荡。


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=rinscribedkinflationln(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=vdscalekgaindmin

其中 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=vdapproachdremaining,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} vapproachvmin_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(vtlookahead,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;

调参时可以按照下面顺序进行:

  1. 先关闭障碍物代价调节,只调路径跟踪效果;
  2. 调整 lookahead_dist,观察路径横向误差和角速度是否震荡;
  3. 打开曲率速度调节,观察急弯处是否减速;
  4. 打开接近目标点减速,观察终点是否过冲;
  5. 打开碰撞检测,检查障碍物附近是否能安全停止;
  6. 最后根据底盘性能决定是否启用 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. 适用场景

该项目适合以下场景:

  1. 差速移动机器人路径跟踪;
  2. 室内服务机器人导航;
  3. 清洁机器人沿路径运行;
  4. 仓储 AGV 路径跟踪;
  5. 小型无人车低速跟踪;
  6. 非 ROS 项目中集成 RPP 控制器;
  7. 需要轻量级 C++ 控制器的嵌入式平台;
  8. 用于路径跟踪算法学习和二次开发。

不太适合的场景包括:

  1. 高速自动驾驶车辆;
  2. 强动态障碍物密集场景;
  3. 需要复杂轨迹优化的场景;
  4. 需要严格动力学约束的高速机器人;
  5. 无全局路径输入的自主探索场景。

19. 项目亮点总结

19.1 独立纯 C++ 实现

项目移除了 ROS 依赖,不再绑定 ROS 节点、TF、参数服务器和插件机制,可以直接作为普通 C++ 库嵌入其他工程。

19.2 保留 RPP 核心算法

项目保留了 Regulated Pure Pursuit 的核心思想,包括前瞻点跟踪、曲率约束、代价约束、接近目标减速、朝向旋转和碰撞检测。

19.3 接口清晰

通过 CostmapInterfaceGoalCheckerInterface 进行抽象,用户可以很方便地接入自己的代价地图、目标检查器和机器人系统。

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 控制器。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐