4. RRT算法原理
RRT(Rapidly-exploring Random Tree,快速扩展随机树)算法由Steven M. LaValle于1998年提出,是一种基于随机采样的运动规划算法。其核心思想是在状态空间中通过随机采样点引导搜索树向未知区域扩展,从而在无需显式构建障碍物边界的情况下,快速探索高维空间。RRT算法以概率完备性著称——当采样点数量趋于无穷时,找到可行路径的概率趋近于1。本章将深入剖析RRT算法的五个核心要素:树结构、随机采样、最近邻搜索、扩展步长与碰撞检测,并结合工程实践说明其实现要点与常见误区。
上图展示了RRT算法在二维平面中的一次典型扩展过程。树从起点开始生长,每次迭代随机生成一个采样点,在树中寻找最近邻节点,沿最近邻到采样点的方向以固定步长扩展出新节点,并检测新节点与路径是否与障碍物碰撞。若碰撞则放弃该次扩展,否则将新节点加入树中。这一过程不断重复,直到树接近目标区域或达到最大迭代次数。
4.1 树结构与状态空间表示
RRT算法的树结构是一种无环的有向图,每个节点代表状态空间中的一个有效位形(Configuration),每条边代表两个位形之间的无碰撞路径段。树的根节点为起始位形,叶节点为尚未被扩展的末端位形。在机器人运动规划中,状态空间可以是机器人的关节角度空间(C-space)、工作空间中的位置坐标,或包含位置与姿态的SE(2)/SE(3)空间。
树的数据结构设计直接影响算法效率。工程实现中通常采用以下两种方式:
- 邻接表结构:每个节点存储其父节点指针和子节点列表,便于从目标回溯路径。适用于路径查询频繁的场景。
- KD树或空间哈希:用于加速最近邻搜索,将节点按空间位置组织,将最近邻查询复杂度从O(n)降至O(log n)量级。
树节点的数据结构至少应包含:状态向量(如[x, y, θ])、父节点索引、从起点到该节点的路径代价(可选)、以及该节点被加入树时的迭代序号。对于高维空间(如7自由度机械臂),状态向量长度即为维度数,树节点的内存占用需谨慎设计。
4.2 随机采样策略
随机采样是RRT算法探索空间的核心驱动力。采样函数从状态空间中均匀随机地抽取一个点,作为树扩展的方向指引。然而,纯均匀采样在高维空间中效率低下,因为大部分采样点落在远离障碍物边界的自由空间内部,无法有效引导树绕过狭窄通道。
工程中常用的采样策略包括:
| 采样策略 | 描述 | 适用场景 |
|---|---|---|
| 均匀随机采样 | 在整个状态空间内等概率采样 | 低维空间、无障碍物或障碍物稀疏 |
| 目标偏置采样 | 以一定概率(如5%-10%)直接采样目标点 | 目标点已知且可达,加速收敛 |
| 边界采样 | 在障碍物边界附近采样 | 狭窄通道场景,需先获取障碍物信息 |
| 高斯采样 | 以障碍物附近为中心进行高斯分布采样 | 障碍物密集、通道狭窄的环境 |
目标偏置采样是最简单有效的改进策略。设偏置概率为p_bias,则每次迭代以概率p_bias将采样点设为目标点,以概率(1-p_bias)进行均匀采样。p_bias通常取0.05~0.1,过大会导致树过度向目标方向生长而丧失探索能力,过小则收敛速度慢。
4.3 最近邻搜索与距离度量
最近邻搜索的目标是在当前树中找到距离采样点最近的节点。距离度量方式必须与状态空间的拓扑结构相匹配。对于欧几里得空间(如二维平面位置),使用L2范数(欧氏距离);对于包含旋转角度的SE(2)空间,需将角度差映射到[-π, π]区间后再计算加权距离。
距离度量公式可表示为:
d(q1, q2) = sqrt( w_p * ||p1 - p2||² + w_r * d_angle(θ1, θ2)² )
其中p为位置分量,θ为姿态角,w_p和w_r为位置与姿态的权重系数。权重系数的选取需根据实际任务调整——若机器人对姿态变化不敏感,可减小w_r以加快搜索速度。
最近邻搜索的工程实现要点:
- 当树节点数小于500时,线性扫描即可满足实时性要求。
- 节点数超过1000时,应使用KD树或FLANN库进行加速。
- 对于高维空间(维度>10),KD树性能退化严重,可考虑使用局部敏感哈希(LSH)或近似最近邻搜索。
4.4 扩展步长与碰撞检测
扩展步长ε决定了每次迭代树向前生长的距离。步长过大会导致路径穿越障碍物或丢失细节,步长过小则增加迭代次数和计算开销。步长的选取需综合考虑状态空间的尺度、障碍物尺寸和机器人本体大小。
扩展过程如下:设最近邻节点为q_near,采样点为q_rand,则新节点q_new的计算公式为:
方向向量: dir = (q_rand - q_near) / ||q_rand - q_near||
新节点: q_new = q_near + ε * dir
碰撞检测是RRT算法中最耗时的环节。对于二维平面中的点状机器人,只需检测线段q_near→q_new是否与障碍物多边形相交。对于有体积的机器人,需将机器人几何模型放置在路径上的多个中间位形,逐一检测是否与障碍物发生干涉。
工程实践建议:碰撞检测可采用“先粗后精”的两级策略。粗检测使用包围盒(AABB或OBB)快速排除明显无碰撞的路径段;精检测使用精确几何求交或距离场查询。对于复杂环境,可预计算障碍物的距离场(Distance Field),将碰撞检测转化为查表操作,大幅提升效率。
4.5 案例拆解:二维平面移动机器人的RRT路径规划
以一款差速驱动移动机器人为例,其工作空间为10m×10m的室内环境,包含4个矩形障碍物。机器人简化为半径0.3m的圆形,起始位置(0.5, 0.5),目标位置(9.0, 9.0)。
参数设置:步长ε=0.5m,目标偏置概率p_bias=0.08,最大迭代次数5000,碰撞检测采用“包围盒+精确圆-矩形相交检测”。
运行过程:
- 初始化树,将起点加入树根节点。
- 第1~50次迭代:树在自由空间内均匀扩展,节点分布较为分散。
- 第51~200次迭代:部分采样点落在障碍物附近,碰撞检测失败导致扩展被拒绝,树在障碍物周围形成“绕行”分支。
- 第300次迭代:目标偏置采样生效,树向目标方向快速生长。
- 第420次迭代:树成功连接到目标点,算法终止。
结果对比:使用均匀采样(无目标偏置)时,平均需要780次迭代才能找到路径;加入目标偏置后,平均迭代次数降至450次,效率提升约42%。路径总长度为12.3m,与理论最短路径10.8m相比,多出约14%的绕行距离,这是随机采样算法的固有代价。
风险与代价:步长设为0.5m时,在狭窄通道(宽度1.2m)中,有15%的概率因步长过大导致新节点越过通道另一侧而碰撞失败。将步长调整为0.3m后,该概率降至3%,但迭代次数增加约30%。
复盘经验:步长选取应小于最小通道宽度的1/3;目标偏置概率不宜超过0.15,否则树会过早收敛到局部区域而丧失全局探索能力;碰撞检测的精度直接影响路径可行性,建议在仿真环境中加入5%的检测误差容忍度以模拟真实传感器噪声。
4.6 常见误区与总结复盘
RRT算法虽然原理简单,但在实际应用中存在若干常见误区:
误区一:步长越大效率越高。步长过大虽然减少了迭代次数,但增加了碰撞检测失败率和路径的“锯齿”程度。正确做法是根据环境尺度与障碍物密度综合确定步长。
误区二:忽略距离度量的权重。在包含旋转自由度的空间中,位置与角度的量纲不同,若权重设置不当,最近邻搜索会偏向某一维度,导致树在另一维度上探索不足。
误区三:碰撞检测只检测终点。新节点与最近邻之间的整条路径段都必须进行碰撞检测,仅检测新节点位置会遗漏路径穿越障碍物的情况。
总结而言,RRT算法的核心优势在于其无需对障碍物进行显式建模,仅通过碰撞检测即可处理任意复杂环境。其概率完备性保证了在足够多的采样下必然找到可行路径(若存在)。然而,RRT算法生成的路径通常不是最优的,且具有随机性——同一环境下多次运行可能得到不同路径。后续章节将介绍RRT*算法,通过重连机制逐步优化路径代价,以及RRT Connect算法通过双向树加速收敛。
在实际工程部署中,建议将RRT作为全局规划器,输出路径后使用平滑算法(如B样条或贝塞尔曲线)进行后处理,再交由局部规划器(如DWA或TEB)执行。这种分层架构兼顾了全局探索能力与局部避障的实时性。