优化warp动态物体采样
对比不同方法下采样动态物体的耗时:
- 每个环境的每个geom都创建一个mesh,在update_dynamic_mesh时对每个mesh都更新point和调用refit
[WarpHeightQuery] Timing Statistics (after 200 queries): Total query time: 9.091 ms Update mesh: 8.739 ms (96.1%) Launch kernel: 0.084 ms (0.9%) Synchronize: 0.070 ms (0.8%) Post-process: 0.198 ms (2.2%) Throughput: 70398 rays/sec - 每个环境的所有geom创建一个合并的mesh,在update_dynamic_mesh时对每个环境的合并mesh更新point和调用refit
[WarpHeightQuery] Timing Statistics (after 300 queries): Total query time: 8.017 ms Update mesh: 7.648 ms (95.4%) Launch kernel: 0.120 ms (1.5%) Synchronize: 0.072 ms (0.9%) Post-process: 0.175 ms (2.2%) Throughput: 79832 rays/sec - 所有环境的所有geom合并为一个mesh,在update_dynamic_mesh对合并的mesh更新point和调用refit
[WarpHeightQuery] Timing Statistics (after 300 queries): Total query time: 3.949 ms Update mesh: 1.120 ms (28.4%) Launch kernel: 2.126 ms (53.8%) Synchronize: 0.532 ms (13.5%) Post-process: 0.170 ms (4.3%) Throughput: 162050 rays/sec - 使用capture_launch的方法来调用kernel的计算,而不是每次都launch一个kernel这种性能下开启train.py, 4096个环境,每个环境添加1个box,一个ite耗时40s左右。 1024个环境,每个环境添加1个box,一个ite耗时3s左右。
[WarpHeightQuery] Timing Statistics (after 300 queries): Total query time: 1.309 ms Update mesh: 1.157 ms (88.4%) Launch kernel: 0.017 ms (1.3%) Synchronize: 0.000 ms (0.0%) Post-process: 0.133 ms (10.2%) Throughput: 489029 rays/sec - 修改了判断dynamic_mesh的bug,将terrain的mesh从dynamic_mesh中去除这种性能下开启train.py, 4096个环境,每个环境添加1个box,一个ite耗时20s左右。 1024个环境,每个环境添加1个box,一个ite耗时2.3s左右。
[WarpHeightQuery] Timing Statistics (after 300 queries): Total query time: 0.999 ms Update mesh: 0.831 ms (83.2%) Launch kernel: 0.017 ms (1.7%) Synchronize: 0.000 ms (0.0%) Post-process: 0.150 ms (15.0%) Throughput: 640487 rays/sec
- kernel中使用的参数不能改变引用,只能改变这个参数的值。也就是可以使用self.a[:] = b[:]这种操作,但是不能使用self.a = b这种操作,因为会改变self.a的引用。
- opencode中使用tecent coding plan的Kimi K2.5模型,context达到40%以上之后回复会变得特别慢
20260526(优化动态越障任务)
修复了bug后,机器人现在可以在静态地形下追踪静态目标点。但是直接转到动态地形后效果不好,考虑添加课程学习。
构建动态障碍的课程学习机制:
- 障碍运动速度课程,以episode结束时机器人是否到达障碍上(距离误差<0.2m)为指标,初始运动速度为0,当成功的环境数高于80%时,提升障碍运动速度
- 障碍距平台距离课程,与第一条同样的指标,一开始障碍边缘距平台边缘0m,当成功的环境数高于80%时,增大边缘距离。
- 障碍运动幅度课程,与第一条同样的指标,这一条课程要以第二条为条件,因为障碍运动模式为正弦波,当障碍边缘与平台边缘距离为0时无法执行运动,而当障碍边缘与平台边缘距离增大时,正弦波的幅值需要相应增大,确保不会让障碍边缘与平台边缘相碰撞 直接使用考虑了动态物体的raycasting训练太慢了,使用workaround,AI提出了方案1和方案2,我觉得还可以借鉴Ziwen Zhuang在robot parkour中提出的虚拟障碍物的思路,需要看它的源代码。
| 方案 1: 状态注入 | 方案 2: 虚拟高度叠加 | |
|---|---|---|
| 观测维度 | 570 (+9) | 561 (不变) |
| 策略输入格式 | 变化 | 不变 |
| 实现复杂度 | 低 | 中 |
| 预估加速 | 30-50% | 40-60% |
| 部署兼容性 | 需要外部传感器 | 完全兼容 |
| 备注 | raycasting只考虑静态物体,给policy额外输入moving box的状态(相对位置、速度、边长) | 保持 height query 的 17×17 网格格式不变,但移除动态物体的 raycasting。改为用 AABB 包围盒判定每个 query point 是否落在障碍物内,如果是则直接用障碍物顶面高度替代地形高度。策略输入格式不变,障碍物在高度图中表现为一个"凸起"。 |
使用状态注入方案训练,不到10个iteration就报Invalid constraint forces causing 'nan'错误,可能是掉下去导致的? | ||
| 使用虚拟高度叠加方案训练,速度得到了显著降低。 |
但是之前给box加gravity_compensation+设定非常大的rho(密度)后,训练中会报Invalid constraint forces causing 'nan'错误,将box改为fixed,同样也能修改其位置。fixed=True将box从仿真的计算中剔除了出去。