4. 速度障碍法(VO)原理
速度障碍法,英文叫 Velocity Obstacle,简称 VO。这玩意儿在动态避障里,可以说是最经典的方法之一了。我当年刚入行做机器人导航时,第一个接触的避障算法就是它。说实话,理解 VO 的核心,就是搞懂三个东西:数学定义、碰撞锥、还有几何解释。
4.1 速度障碍法的数学定义
先别急着看公式。咱们先想想一个场景:你控制一个机器人往前走,对面也来了一个移动的障碍物。怎么判断会不会撞上?
VO 的思路很直接——把机器人和障碍物都看成质点,然后考虑它们的相对速度。如果相对速度的方向指向对方,那就危险了。
数学上,VO 的定义是这样的:
VO = { v_robot | (v_robot - v_obs) ∈ CC }
其中:
- v_robot 是机器人的速度向量
- v_obs 是障碍物的速度向量
- CC 是碰撞锥(Collision Cone)
说白了,VO 就是所有会导致碰撞的机器人速度的集合。只要你的速度落在这个集合里,那就一定会撞上。
核心要点:VO 是一个速度空间中的区域。机器人要做的,就是选择不在这个区域里的速度。
我在项目中遇到过一个问题:一开始只考虑了圆形机器人,后来换成矩形机器人,VO 的计算就复杂了很多。嗯,这里要注意,VO 的数学定义依赖于机器人和障碍物的形状假设。
4.2 碰撞锥(Collision Cone)的构建
碰撞锥是 VO 的基础。怎么构建?我习惯分三步走:
- 膨胀处理:把机器人和障碍物都膨胀成圆。机器人半径 r_robot,障碍物半径 r_obs,合并成一个半径为 R = r_robot + r_obs 的圆。
- 构建锥形区域:以障碍物中心为顶点,向机器人方向画两条切线。这两条切线之间的区域,就是碰撞锥。
- 平移处理:把碰撞锥的顶点平移到机器人位置,得到最终的碰撞锥。
你想想看,为什么叫「锥」?因为从机器人视角看,障碍物占据了一个角度范围。只要相对速度的方向落在这个角度范围内,就会撞上。
个人经验:构建碰撞锥时,障碍物的速度估计很关键。我曾经因为障碍物速度测量不准,导致避障失败。建议用卡尔曼滤波做速度估计,能提高鲁棒性。
下面我用 SVG 画了一张碰撞锥的示意图,帮你直观理解:
这张图里,红色虚线圆是膨胀后的障碍物。两条虚线之间的红色半透明区域,就是碰撞锥。绿色箭头是相对速度,它指向了锥内——嗯,这种情况就会撞上。
4.3 速度障碍法的几何解释
几何上,VO 其实就是一个平移操作。把碰撞锥从障碍物位置平移到机器人位置,就得到了 VO。
为什么这么做?因为我们要在机器人的速度空间里做决策。碰撞锥是在位置空间里定义的,而 VO 把它映射到了速度空间。
具体来说:
- 碰撞锥:在位置空间,描述「哪些相对速度方向会导致碰撞」
- 速度障碍:在速度空间,描述「哪些机器人速度会导致碰撞」
两者的关系很简单:VO = 碰撞锥 + 障碍物速度。说白了,就是把碰撞锥沿着障碍物速度方向平移一下。
注意:VO 是一个凸区域。如果障碍物不止一个,每个障碍物都有自己的 VO。机器人需要避开所有 VO 的并集。我曾经在密集场景中遇到过 VO 重叠的情况,这时候需要做优先级排序。
我建议你在实际应用中,把 VO 可视化出来。调试时看着速度空间里的 VO 区域,选速度就直观多了。我自己写过一个可视化工具,每次选速度前先看看 VO 长什么样,心里就有底了。
最后总结一下 VO 的核心思想:
| 概念 | 空间 | 含义 |
|---|---|---|
| 碰撞锥 (CC) | 位置空间 | 相对速度方向落在锥内 → 碰撞 |
| 速度障碍 (VO) | 速度空间 | 机器人速度落在 VO 内 → 碰撞 |
| 避障策略 | 速度空间 | 选择 VO 之外的速度 |
嗯,VO 的原理其实不复杂。但真正用好它,需要理解背后的几何直觉。下一节我们会讲 VO 的变种和实际应用,到时候再聊怎么处理多障碍物和动态环境。
一句话记住:VO 就是把「会不会撞」这个问题,从位置空间转换到了速度空间。转换之后,选速度就变成了在速度空间里「躲开红色区域」的游戏。