机器人与无人机路径规划:Dijkstra、A*、RRT/RRT*、Frenet 怎么选与验收
先按地图表示、维度、运动学、动态障碍和参考线判断算法,再用碰撞、长度、曲率、时间和多随机种子重复实验验收;路径规划、轨迹生成和轨迹跟踪不能混为一谈。
先分清:路径、轨迹和跟踪控制不是同一件事
- 路径是一串几何位置或姿态,未必包含时间。
- 轨迹通常带时间、速度、加速度,可能还需满足曲率、转向角或飞行动力学。
- 跟踪控制让真实或仿真系统沿轨迹运动,需要处理误差、扰动和执行器限制。
因此,“A* 找到一条栅格最短路”不能证明无人车能转过去;“RRT 返回无碰撞节点”也不能证明无人机速度、加速度和安全距离合格。本站的轨迹 CSV 体检工具只能检查已有轨迹的时间顺序、速度和异常跳点,不能代替地图碰撞检测或动力学验证。
四类问题的起始选择
| 问题特征 | 优先基线 | 为什么 |
|---|---|---|
| 静态二维栅格、边权非负 | Dijkstra | 作为无启发函数的可复现最短路基线。 |
| 静态栅格、有可采纳启发函数 | A* | 通常减少扩展节点;必须记录启发函数和移动代价。 |
| 连续高维、有复杂障碍或姿态 | RRT,再比较 RRT* | 采样法更容易在连续空间探索;结果随机,需要多次重复。 |
| 已有道路/中心参考线 | Frenet 候选轨迹 | 沿参考线用纵向 s 和横向偏移 d 表达候选,更适合结构化道路。 |
这些只是起点。动态障碍、差速/阿克曼约束、固定翼最小转弯半径或多机冲突会改变问题定义,不能靠更换算法名称自动解决。
统一输入契约:不然算法比较没有意义
- 坐标系、原点、轴方向和单位。
- 地图分辨率、障碍阈值、未知区域处置。
- 机器人/无人机尺寸和安全裕度;碰撞检测应针对膨胀障碍或真实几何体。
- 起终点合法性以及是否要求终点航向/姿态。
- 允许的移动、代价定义和是否含转弯、爬升或能耗惩罚。
- 随机算法的种子、时间预算、迭代上限和成功定义。
坐标、代价与碰撞检测:三个最容易藏住错误的地方
复现实验时,应把栅格行列、地图坐标和世界坐标的转换写成单独函数,并用至少三个已知点做往返测试。图像坐标的纵轴常向下,而笛卡尔坐标纵轴常向上;若再叠加米与格、角度与弧度的混用,动画看似合理也可能对应错误位置。结果文件至少记录坐标系名称、长度单位、角度单位、地图分辨率和时间单位。
“最短”也必须先说明代价。距离、时间、能耗、风险、转弯次数和离障碍距离可以产生完全不同的最优解。多项加权时,要保存每项原始量、归一化方法、权重与总分,避免只留下一个无法解释的总代价。建议先报告不加权的长度、时间、最小净空和最大曲率,再讨论综合目标。
碰撞检测频率不能只由路径节点数量决定。若两节点相距 2 米、障碍只有 0.5 米宽,只检查端点就可能穿障而不自知。应按地图分辨率、障碍尺度和载体尺寸设定线段插值或连续几何检测步长,并在平滑、重采样或坐标转换后重新检查一次。
Dijkstra 与 A*:先把栅格基线做正确
两者应在同一邻接规则和边权下比较。若允许八邻域,斜向代价通常不能与水平移动都设为 1;否则几何长度失真。A* 的启发函数应与移动模型匹配,并明确是否可采纳/一致。验收至少包括:起点终点、每一步邻接合法、所有栅格可通行、代价重新求和一致、在小地图上与手工或 Dijkstra 基线一致。
RRT/RRT*:单次漂亮动画不是证据
采样法需要完整记录采样范围、步长、目标偏置、最近邻、碰撞离散步长、重连半径、终止条件和随机种子。RRT* 的渐近性质不等于有限时间内一定优于 RRT。至少在同一批地图上运行 20–30 个种子,报告成功率、路径代价中位数/P90、碰撞检测次数和运行时间;失败也要进入统计。
Frenet:参考线质量决定候选轨迹质量
Frenet 方法适合已有合理参考线的结构化环境。应检查笛卡尔与 Frenet 转换、参考线曲率、投影是否唯一、候选的横向/纵向边界、障碍预测和从局部坐标回到全局后的碰撞。若道路交叉、参考线自交或偏移过大,s/d 表示可能失去清晰含义。
统一的九项验收表
- 起点、终点和全部中间点位于允许空间。
- 线段/曲线连续碰撞检查通过,而不是只检查离散节点。
- 考虑机器人尺寸与安全裕度,不把点机器人结果直接用于实体。
- 路径长度或总代价由独立函数重新计算一致。
- 最大曲率、转弯半径、速度和加速度满足模型约束。
- 固定数据集比较成功率、运行时间、扩展/采样数量和路径代价。
- 随机方法多种子重复并保留失败案例。
- 地图分辨率、碰撞步长或规划参数改变后,结论不过度跳变。
- 导出的 CSV 包含时间/坐标/单位/坐标系说明,并可从原始配置重跑。
最小可复现实验记录
每次运行至少保存:算法与代码版本、地图文件哈希、起终点、载体外形与安全裕度、全部参数、随机种子、机器与运行环境、开始时间、终止原因、是否成功、路径代价和运行时间。批量比较时不要覆盖失败日志;将每个种子写成独立一行,之后再汇总中位数、分位数和成功率。这样即使后来更换平滑器或碰撞模块,也能判断变化来自哪里。
常见但危险的“优化”
- 先平滑再碰撞检查,导致曲线切过障碍。
- 为了让所有案例成功,偷偷缩小机器人或安全距离。
- 只报告成功种子,忽略失败率。
- 比较算法时给不同时间预算、地图或终止条件。
- 把二维点路径动画称为可直接飞行/驾驶的轨迹。
可公开复核的实现入口
- OMPL 官方文档:采样式运动规划器及基准工具
- PythonRobotics:Dijkstra、A*、RRT/RRT*、Frenet 等教学实现(MIT)
- Frenet 坐标转换与候选轨迹参考实现(MIT)
外部开源项目受各自许可证约束。本指南解释算法选择和验收,不转载、转售或声称拥有这些仓库的代码。