# rl_rvo_nav 核心原理说明

资料来源：

- GitHub 仓库：https://github.com/hanruihua/rl_rvo_nav
- 论文：Reinforcement Learned Distributed Multi-Robot Navigation with Reciprocal Velocity Obstacle Shaped Rewards
- arXiv 页面：https://arxiv.org/abs/2203.10229

## 一句话结论

`rl_rvo_nav` 的核心不是纯强化学习避障，也不是传统 RVO/ORCA 求解器，而是把 **RVO/VO 几何避障先验** 编码进强化学习的状态表示和奖励函数中，让 PPO 训练出的策略在多机器人局部避障中更安全、更高效、更不保守。

可以理解为：

> RVO 负责告诉策略“哪些速度区域有碰撞风险”，强化学习负责学“在这些风险结构下，当前该怎么选一个更好的速度增量”。

## 背景问题

多机器人导航常见有两类方案：

- 中心化调度：全局规划能力强，但机器人数量增加后计算和通信压力上升。
- 分布式避障：每个机器人独立决策，扩展性好，但只能依靠局部观测，容易出现碰撞、震荡、过度保守或互相等待。

传统 VO/RVO/ORCA 方法会在速度空间中构造不可选速度区域，从而实时选择避障速度。它们计算高效、可解释，但在复杂场景中可能保守，对感知误差、非完整约束和长期收益的处理也有限。

纯深度强化学习方法可以通过大量仿真经验学到更激进、更灵活的策略，但如果直接输入位置、速度、距离等原始状态，网络需要自己学会推导碰撞几何关系，样本效率和可控性都不理想。

`rl_rvo_nav` 的设计目标就是结合两者：

- 用 RVO/VO 给强化学习提供结构化避障知识。
- 用 DRL 学出比手写几何规则更灵活的局部控制策略。

## 核心模块

### 1. 分布式多机器人决策

每个机器人独立运行同一个策略，不依赖中心控制器，也不依赖机器人之间的通信。

机器人只使用自身状态和局部感知范围内的其他机器人、障碍物信息进行决策。

自身状态通常包括：

- 当前速度
- 当前朝向
- 期望速度
- 用于避障的虚拟半径

周围环境状态包括：

- 动态机器人产生的 RVO 向量
- 静态障碍物产生的 VO 向量
- 相对距离
- 预计碰撞时间

### 2. 用 RVO/VO 表示碰撞风险

传统 RL 避障常把邻居机器人表示成位置、速度、半径等数据，例如：

```text
other_position, other_velocity, other_radius
```

`rl_rvo_nav` 更进一步，把这些信息转换成速度空间中的 VO/RVO 表示。

VO 表示：

- 如果自身选择某些速度，就会在未来一段时间内撞到障碍物。
- 这些危险速度构成一个速度空间区域。

RVO 表示：

- 对动态机器人，不只假设“我避让它”，而是假设双方都会承担一部分避让责任。
- 这让策略更容易学到互惠避障行为，减少单方过度避让或互相卡住。

因此，网络输入不是单纯的几何坐标，而是更接近“碰撞约束”的状态。

这也是该方案最重要的思想：**把避障问题从物理空间状态学习，转成速度空间风险学习。**

### 3. BiGRU 处理可变数量邻居

周围机器人和障碍物数量是不固定的。普通 MLP 需要固定长度输入，不适合直接处理可变数量的邻居。

该方案把周围对象的 VO/RVO 信息组织成序列，再用 RNN 模块提取特征。

论文强调使用 bidirectional GRU，也就是 BiGRU。仓库代码中的 `policy_rnn_ac.py` 里也能看到 `GRU`、`LSTM`、`biGRU` 模式。

结构大致是：

```text
自身状态
  +
周围对象 VO/RVO 序列
  -> GRU/BiGRU
  -> 固定维度环境特征
  -> Actor 输出动作分布
  -> Critic 输出状态价值
```

BiGRU 的作用是：

- 能处理数量变化的邻居。
- 不只偏向序列末尾对象。
- 在较低计算成本下提取局部交互特征。

### 4. 动作输出是速度增量

很多 RL 避障方法直接输出最终控制速度。

`rl_rvo_nav` 输出的是当前速度的增量，也就是 velocity increment/change rate。

这样做的好处：

- 控制更平滑。
- 不容易出现速度突变。
- 更接近差速机器人实际控制需求。

最终速度再被分解成差速机器人的线速度和角速度。

### 5. 奖励函数由 RVO 区域和预计碰撞时间塑形

该方案的奖励函数不是简单距离奖励。

传统距离奖励大致是：

- 离目标更近，奖励。
- 离障碍更近，惩罚。
- 碰撞，强惩罚。

但 `rl_rvo_nav` 的输入本身是 VO/RVO 表示，不直接以原始位置距离为核心。因此它设计了基于 RVO/VO 区域的奖励。

奖励重点判断：

- 当前选择的速度是否落入 RVO/VO 危险区域。
- 当前速度与期望速度的差距。
- 按当前运动趋势，预计多久会发生碰撞。

预计碰撞时间比单纯距离更有信息量，因为它同时考虑了距离和相对速度。

例如：

- 距离近但相对远离，风险不一定高。
- 距离远但高速相向，风险可能很高。

所以该方案用 expected collision time 来衡量碰撞风险，使策略在拥挤环境里能更合理地权衡安全和效率。

## 训练方式

仓库使用 PPO 训练 actor-critic 策略。

训练流程大致如下：

1. 在仿真环境中让多个机器人运行当前策略。
2. 收集每个机器人的 observation、action、reward。
3. 使用 GAE 计算优势。
4. 用 PPO 更新 actor 和 critic。
5. 在更复杂机器人数量和场景中继续训练。

README 中给出的训练阶段是：

- 第一阶段：4 个机器人 circle 场景。
- 第二阶段：加载已有模型，在 10 个机器人 circle 场景继续训练。

测试场景包括：

- circle scenario
- random scenario

## 与传统 RVO/ORCA 的区别

| 维度 | 传统 RVO/ORCA | rl_rvo_nav |
| --- | --- | --- |
| 决策方式 | 手写几何规则或优化求解 | 神经网络策略 |
| 避障知识 | 显式速度空间约束 | 作为状态和奖励先验 |
| 输出 | 当前最优避障速度 | 速度增量 |
| 优点 | 可解释、稳定、实时 | 更灵活，可从经验中学习效率和风险权衡 |
| 风险 | 可能保守 | 依赖训练覆盖和仿真质量 |

## 与纯强化学习避障的区别

| 维度 | 纯 DRL 避障 | rl_rvo_nav |
| --- | --- | --- |
| 输入 | 位置、速度、距离、传感器数据等 | VO/RVO 风险向量 |
| 学习难度 | 网络需自行推导碰撞几何 | 几何风险已经结构化 |
| 奖励 | 常基于距离和碰撞结果 | 基于 RVO 区域和预计碰撞时间 |
| 可解释性 | 较弱 | 更容易解释为速度空间风险规避 |

## 对 FishROV 的启发

如果把这个方案借鉴到 FishROV 或水下 ROV 局部避障中，最值得吸收的不是直接照搬 PPO 训练，而是以下思想：

1. **把避障风险表达在速度空间中**

   不只判断“障碍在哪里”，而是判断“当前可选速度里哪些会导致未来碰撞”。

2. **把规则避障和学习策略分层**

   几何规则可以生成风险特征，学习策略负责在风险、目标方向、速度平滑性之间做权衡。

3. **优先考虑可解释的 reward/score**

   即使不用 RL，也可以把 RVO 区域、预计碰撞时间、目标速度差异组合成局部避障评分函数。

4. **对动态障碍比静态障碍更有价值**

   如果 FishROV 主要面对静态地形或固定障碍，传统 NavMesh、A*、局部 steering 可能更直接。

   如果未来要处理鱼群、其他 ROV、移动机械臂、动态水流漂浮物等，RVO/RL-RVO 的价值会明显上升。

## 局限和注意点

该方案也有明显门槛：

- 需要高质量仿真环境。
- 策略泛化依赖训练场景覆盖。
- PPO 训练成本高于传统局部避障。
- 真实机器人部署需要考虑感知误差、控制延迟、水动力扰动等 sim-to-real 问题。
- 对游戏或仿真项目来说，直接使用 RL 模型未必划算，抽取其 RVO 风险建模思想可能更实用。

## 简短评价

`rl_rvo_nav` 最核心的价值是提出了一种很清楚的混合范式：

```text
传统几何避障知识
  -> 结构化状态表示
  -> RVO/碰撞时间塑形奖励
  -> PPO 学习连续局部控制策略
```

它适合研究或高复杂度多机器人动态避障。如果当前目标是工程落地，建议优先把它当作“设计参考”：吸收 VO/RVO 风险表达和 expected collision time 评分，而不是第一步就引入完整 RL 训练链路。
