Motphys

多束 LiDAR

MotrixSim 0.10.0 新增基于物理碰撞几何体的多束 LiDAR。传感器可输出世界坐标系点云,用于机器人避障、地形感知、定位建图和强化学习观测;实时点云可视化便于检查安装位姿与扫描效果。

视频 1:Go2 挂载 Ouster OS1 LiDAR 的机器人运动示例

在 motrixsim-docs 目录运行:

uv run examples/control/robot_locomotion.py --robot go2 --scene playground --lidar ouster_os1_rev6_32ch_10hz_512res

MJCF 配置

LiDAR 的 MJCF 配置由安装位置、可复用扫描配置和传感器实例三部分组成:body/site 定义安装位置与朝向,asset/lidar 定义型号与扫描几何,sensor/lidar 将传感器挂载到指定 site。

<asset>
  <lidar name="grid_64" cutoff="25" pattern="grid"
         hscan="1024" vscan="64" hrange="-180 180" vrange="-15 15"/>
</asset>
<worldbody>
  <body name="robot">
    <site name="lidar_site" pos="0.25 0 0.20" quat="0.5 0.5 0.5 0.5"/>
  </body>
</worldbody>
<sensor>
  <lidar name="roof_lidar" asset="grid_64" site="lidar_site"
         exclude="parentsubtree"/>
</sensor>
site.pos / site.quat设置 LiDAR 在机器人上的安装位置和朝向。
asset/lidar.name定义可复用的 LiDAR 配置名称,供传感器实例引用。
cutoff设置最大测距,单位为米。
pattern选择扫描方式:grid 为均匀网格扫描,rings 为旋转式多线扫描。
hscan / vscan设置每帧的水平采样数和垂直采样数,决定 Grid 点云分辨率。
hrange / vrange设置水平和垂直扫描角度范围,单位为度。
sensor/lidar.asset引用 asset 中定义的 LiDAR 配置。
sensor/lidar.site指定用于确定射线原点和方向的安装 site。
exclude设置机器人自身碰撞体的过滤方式;多连杆机器人可使用 parentsubtree。
hz可选的完整扫描频率;省略时,每个仿真步生成一次完整扫描。

获取传感器数据

每次 step() 后,可通过 get_sensor_value() 读取点云。以下示例将 Grid 点云整理为 (1024, 64, 3),未命中点为零向量:

model.step(data)
points = model.get_sensor_value("roof_lidar", data).reshape(1024, 64, 3)
hit_points = points[(points != 0).any(axis=-1)]

性能

以下结果来自 playground 场景的端到端 Python benchmark。每个 LiDAR 使用 1024×64 Grid,省略 hz,因此每个仿真步发射 65,536 条射线。测试使用 AMD Ryzen 9 9950X(16 核、32 线程),结果取 3 轮中位数,统计范围包含 model.step() 的完整物理管线,不包含渲染。

MotrixSim 0.10.0 LiDAR 端到端 raycast 吞吐量测试结果

在 1,024 个并行环境、每个环境配置 1 个 LiDAR 的测试中,全部环境合计吞吐量约为每秒 8,065.6 万次 raycast。该数据为上述软硬件配置下的测试结果,并非孤立 raycast kernel 的峰值。

cd motrixsim-python/motrixsim-docs
uv run python examples/bench/lidar.py --case all