3. 运动规划基础
各位好,我是老周。今天我们来聊聊OMPL里最基础但也最容易被忽视的一环——采样算法。很多人觉得采样不就是随机撒点吗?有什么好讲的?其实不然。我见过太多项目,规划器参数调了半天没效果,最后发现是采样策略选错了。说白了,采样是规划的"眼睛",你往哪儿看、怎么看,直接决定了能不能找到路。
3.1 均匀采样(Uniform Sampling)
均匀采样是最朴素的采样方式。它在C空间的每个维度上独立地随机取值,最终得到一个在空间内均匀分布的点集。
核心特点:无偏、全覆盖、但效率低。
为什么说它效率低?你想想看,如果环境里障碍物占了90%的空间,均匀采样会有90%的点落在障碍物里,被直接丢弃。这在窄通道场景下尤其致命。我记得有一次做机械臂穿管道任务,管道直径只有臂展的1/10,均匀采样跑了5分钟都没找到一条路径。
均匀采样的数学表达很简单:
// 伪代码:均匀采样
for each dimension d in [0, D):
sample[d] = lower_bound[d] + random() * (upper_bound[d] - lower_bound[d])
适用场景:
- 环境障碍物占比低(<30%)
- C空间维度低(<6维)
- 作为其他采样器的回退方案
3.2 高斯采样(Gaussian Sampling)
高斯采样的思路是:在障碍物附近多采样,在空旷区域少采样。为什么?因为路径往往贴着障碍物走,尤其是窄通道的两侧。
具体做法是:先随机选一个点,如果它在自由空间,就在它周围按高斯分布再采一个点;如果它在障碍物里,也按高斯分布再采一个点,但这次期望落在边界附近。
我的经验:高斯采样对窄通道场景效果显著。我曾经处理过一个6轴机械臂的穿环任务,均匀采样成功率不到5%,换成高斯采样后直接飙到60%以上。但要注意,高斯采样的标准差参数很敏感,设大了等于均匀采样,设小了又容易陷入局部。
高斯采样的关键参数:
| 参数 | 含义 | 推荐范围 |
|---|---|---|
| σ(标准差) | 采样点的散布程度 | C空间范围的1%~5% |
| p_obstacle | 在障碍物附近采样的概率 | 0.3~0.7 |
| max_attempts | 单次采样的最大尝试次数 | 10~50 |
3.3 桥接采样(Bridge Sampling)
桥接采样是我个人最喜欢的一种策略。它的名字很形象——在两个障碍物之间"搭桥"。具体来说,它先采两个点,如果这两个点都在障碍物里,就在它们连线的中点采样。这个中点有很大概率落在自由空间,而且是窄通道的"咽喉"位置。
避坑指南:我曾经在调试一个高维C空间(12维双臂机器人)时,桥接采样反而比均匀采样还慢。后来发现,维度太高时,两个随机点都在障碍物里的概率极低,桥接采样几乎不生效。所以高维场景慎用桥接采样。
桥接采样的流程:
- 随机采样点A,检查是否在障碍物中
- 如果A在障碍物中,再随机采样点B,检查是否也在障碍物中
- 如果A和B都在障碍物中,取中点M = (A + B) / 2
- 如果M在自由空间,保留M;否则丢弃
嗯,这里要注意:桥接采样对低维、窄通道密集的场景特别有效。我做过一个对比测试,在2D迷宫环境中,桥接采样的规划速度是均匀采样的8倍。
3.4 采样效率对规划的影响
采样效率直接决定了规划器的成败。我把它总结为三个维度:
- 时间效率:每秒能产生多少个有效采样点
- 空间效率:采样点对C空间的覆盖程度
- 信息效率:采样点对路径搜索的贡献度
三种采样算法的效率对比:
| 采样算法 | 时间效率 | 空间效率 | 信息效率 | 推荐场景 |
|---|---|---|---|---|
| 均匀采样 | 高 | 高 | 低 | 空旷环境、低维空间 |
| 高斯采样 | 中 | 中 | 中 | 窄通道、障碍物密集 |
| 桥接采样 | 低 | 低 | 高 | 低维窄通道、迷宫 |
为什么信息效率这么重要?因为规划器最终要的是"有用的点",而不是"多的点"。均匀采样虽然每秒能产生上万个点,但90%都是废点。桥接采样虽然慢,但每个点都打在关键位置。
我的建议:实际项目中不要只用一种采样策略。我通常的做法是:前20%的规划时间用均匀采样快速覆盖空间,后面80%的时间切换到高斯或桥接采样来"攻坚"。OMPL的PlannerData接口支持动态切换采样器,这个后面会讲到。
最后,我画了一张图来总结这三种采样算法的核心逻辑和适用边界: