RVO2-CS 多智能体避障:从跑通 Demo 到自定义策略的 3 个改法
【免费下载链接】leaked-system-promptsCollection of leaked system prompts项目地址: https://gitcode.com/GitHub_Trending/le/leaked-system-prompts
三个智能体在十字路口同时加速,谁该让谁?手工写规则,三个人就是三套 if。RVO2-CS 是一个 C# 多智能体避障库,把"谁让谁"变成一次几何计算。
它到底在解决什么问题
ORCA(最优互惠碰撞避免)的直觉只有一句话:每个智能体只改自己的速度,双方各让一步。对每个邻居,它在速度平面上画出一个"不许撞上"的半平面约束;所有约束取交集,就是安全速度区。最后用线性规划(一类求最优点的数学方法)在安全区里挑最接近原方向的速度。谁也不推谁,自然不推挤,不震荡。
RVO2-CS 多智能体避障的 ORCA 速度约束示意
没有 RVO2-CS,你会怎么手写?邻居搜索、速度约束、线性规划、积分和线程,一样都不少。ORCA 的原始出处是论文加一份 C++ 参考实现,自己啃下来,几个月起步。RVO2-CS 把整条链路封装成可直接调用的 C# 库:仿真循环、邻居搜索、速度求解,开箱即跑。
跑通第一个 Demo(端到端)
整条链路只有三步:拉代码、编译、运行 Circle 示例。一条终端流走完:
git clone https://gitcode.com/GitHub_Trending/le/leaked-system-prompts cd leaked-system-prompts cmake -B build -S . && cmake --build build # 没有 CMake 就打开 RVOCS.slnx cmake --build build --target Circle && ./build/Circle # 示例入口在 Circle/ 目录Circle 是最轻的示例:一圈圆形墙,中间摆几条线段障碍,几十个智能体从中心出发互相让路。它的主入口在Circle/目录下,核心循环就一句话:拿到 Simulator.cs 的实例,AddAgent加人,然后循环调DoStep。
RVO2-CS Circle 示例多智能体避障运行画面
你应该看到什么:黑窗口里,一堆彩色圆点从中心散开。彼此靠近时自动减速、转向;碰到线段障碍就绕行;最后均匀铺满圆形区域,不再移动。全程没有任何一行手写碰撞代码。
一次避障决策的完整旅程
把镜头对准智能体 A:它在 (10, 5),正前方 2 米处是 B (12, 5)。这一帧里,A 的决策分四步走完。
1. 邻居发现。A 先问一句"5 米内还有谁"。答案来自 KdTree(一种空间索引树,把平面切成小块,查询不用扫全场)——范围查询,O(log n) 级。对应 KdTree.cs。
2. 约束构建。B 变成速度平面上的一个半平面:A 朝左偏一点或朝右偏一点,都算安全。每段障碍线也各贡献一个"不许朝线那侧穿越"的半平面。所有半平面取交集,得到一个凸多边形,这就是 A 的安全速度区。约束的组装在 Agent.cs 内部完成。
3. 求解。在凸多边形里找离 A 原本偏好速度最近的点,这是个小规模线性规划。解出的速度往往带侧向分量,绕行动作从这里来。求解同样由 Agent.cs 在每帧调度。
4. 写回。新速度写回 A,下一帧循环用它乘以时间步长更新 A 的位置。A 和 B 各自重复这套流程,双方都偏移一点,碰撞自然消失。"互惠"两个字,就体现在这一步。
三个"如果我想……"扩展场景
A:如果我想让某些智能体优先通行?思路:把让路量摊给对方——低优先的把timeHorizon(碰撞预测时间)调小,避让更急;高优先的调大,更从容。一行改动:
lowPriority.timeHorizon = 0.8f; // 优先级的差异,全靠这一个参数B:如果我要加一个多边形障碍物?思路:多边形拆成首尾相连的线段,每条边注册一次,Simulator.cs 会把它和智能体同等对待。一行注册:
simulator.AddObstacleSegment(new Vector2(x1, y1), new Vector2(x2, y2)); // 多边形 = N 条这样的边C:如果 1000+ 智能体开始掉帧?思路:先把并行度拉满,再检查邻居搜索半径是不是贪心。一行关键:
simulator.SetNumWorkers(8); // 邻居搜索与线性规划并行跑,掉帧先解决一半搜索半径翻倍,KdTree 的查询开销会明显上涨。能压到 5 米,就压到 5 米。
容易踩的坑(3 条)
现象:高速智能体直接穿过障碍再弹回来。原因:时间步长太大,一步位移超过半径,等于穿透。修复:时间步长从 0.5 降到 0.25。
现象:智能体贴脸才转向,像撞了才反应。原因:邻居距离设得太小,2 米外互相"看不见"。修复:邻居距离调到 5 米以上。
现象:速度忽快忽慢,轨迹一顿一顿。原因:偏好速度长期超过最大速度上限,每帧被截断。修复:偏好速度控制在最大速度以内。
延伸阅读
- 项目文档:doc/
- 复杂障碍物示例:Blocks/
- 上游 C++ 实现:RVO2/
【免费下载链接】leaked-system-promptsCollection of leaked system prompts项目地址: https://gitcode.com/GitHub_Trending/le/leaked-system-prompts
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考