核心内容摘要
拥抱曲线:BBBBBB,不止是数字,更是自信的宣言
RDP 算法是自动驾驶和地图处理中最基础、最常用的算法之一。
你可以把它理解为**“给轨迹做瘦身”或者“去噪滤镜”**。
RDP抽稀(减少直线段冗余点)
为什么需要“抽稀”痛点想象一下地图里的车道中心线Reference Line原本是由无数个密密麻麻的点组成的。
原始数据假设一条100米长的笔直大马路。
如果地图做得太细每隔 10厘米 就有一个点。
那你就会收到1000个点(x_1, y_
, (x_2, y_
... (x_{1000}, y_{1000})。
问题传不动Navigation发给Planning的消息包太大了。
算不动你的Planning节点拿到这 1000 个点OSQP 求解器会算得很慢。
没必要对于一条直线我其实只需要起点和终点两个点就够了中间那 998 个点都是**“冗余点”**。
RDP 算法的作用就是把这 998 个没用的点扔掉只保留关键的拐弯点。
RDP 算法是怎么工作的原理全称Ramer-Douglas-Peucker Algorithm (拉默-道格拉斯-普克算法)它的核心思想是设置一个容忍度阈值 $\epsilon$如果一条线上的点离“直线”的偏差很小就把这些点当成直线的一部分忽略掉。
傻瓜式步骤演示连线先把轨迹的起点 A和终点 B连一条直线虚线。
找刺头在 A 和 B 之间的所有点里找出一个离这条虚线最远的点 C距离为 d。
判断情况 1很直如果这个最大距离 d 小于你设定的阈值 \epsilon比如
1米。
结论说明 A 到 B 之间基本是直的。
操作扔掉 A 和 B 之间所有的点。
保留 A, B。
情况 2有弯如果这个最大距离 d 大于阈值 epsilon。
结论说明 C 点是一个显著的拐弯不能扔。
操作保留 C 点。
把原本的线段切成两段A到C和C到B。
递归对A到C和C到B这两段路重复上面的步骤直到所有剩下的点都足够“直”。
那个神秘参数 epsilon我在之前的回答里让你关注这个参数它决定了你的路径是“精细”还是“粗糙”。
epsilon 设得很大比如 5米效果只有超级急的大弯才会被保留。
结果路径变成了僵硬的折线像用尺子画的。
风险车子可能会切弯Cut Corner压到路沿石。
epsilon 设得很小比如
01米效果几乎保留了所有细节。
结果点还是很多起不到“瘦身”的效果。
epsilon 适中通常
1米 -
5米效果直路上只留两端弯道上保留几个关键点。
既省资源又保真。
对你的代码Planning Node意味着什么既然上游用了 RDP 算法那你收到的MapTrajectory就有以下特征直路点很少车在直行时你收到的路径点可能相隔几十米才有一个。
注意你的局部规划器如果依赖密集点来计算曲率可能会出错。
你可能需要在局部规划里自己做插值Interpolation把稀疏点重新加密。
弯道点较多在转弯处点会密集起来为了拟合弯道的形状。
它是折线严格来说RDP 输出的是一段段首尾相连的直线段不是平滑曲线。
你的 OSQP 优化器的一个重要工作就是把这些生硬的折线磨圆Smoothing让车开起来顺滑。
一句话
总结RDP 就是一个“去直存弯”的过滤器。
它告诉 Planning 节点“别管那些细枝末节我只告诉你哪里该转弯剩下的直路你自己看着办。
”