传感器#

传感器从场景中提取信息,而不改变场景的物理状态。它建模的是机器人控制视角下的板载设备:把它挂到某个连杆上,推进仿真,然后读回一个张量。Genesis World 内置了用于接触与力、惯性测量、测距、渲染、表面距离和温度的传感器。

挂载与读取模型#

通过 scene.add_sensor() 创建传感器,并传入 gs.sensors 中的选项对象。该调用返回一个传感器句柄,你需要在每一步读取它。大多数传感器通过 entity_idx 和 link_idx_local 挂载到刚体连杆上;少数传感器是静态的,或绑定到整个实体。

import genesis as gs

gs.init(backend=gs.gpu)
scene = gs.Scene()
scene.add_entity(gs.morphs.Plane())
robot = scene.add_entity(gs.morphs.URDF(file="urdf/go2/urdf/go2.urdf"))

contact = scene.add_sensor(
    gs.sensors.Contact(
        entity_idx=robot.idx,
        link_idx_local=robot.get_link("FL_foot").idx_local,
        history_length=4,  # keep the last 4 snapshots; omit for the current one only
        draw_debug=True,
    )
)

scene.build(n_envs=16)
for _ in range(1000):
    scene.step()

    measured = contact.read()               # with imperfections, shape (16, 4, 1)
    ground_truth = contact.read_ground_truth()  # noiseless, same shape

每个传感器都提供两种读取方式:

  • read() 返回测量值,其中已应用传感器的各种误差(延迟和抖动始终生效;噪声、偏置和漂移在传感器建模了它们时生效,正如 IMU 所做的那样)。

  • read_ground_truth() 返回同样形状的无噪声值。

在一个步内读取是幂等的:在同一个控制循环时间步内调用两次会返回相同的值,因为该值在每个 scene.step() 中只计算一次。

在选项上设置 history_length=N 可以保留最近 N 个快照,它们沿一条插入在批次轴之后的新轴堆叠(索引 0 是当前步)。每个快照都保留捕获时所处的误差状态,因此带延迟的读取在物理上仍然自洽。

并行与异构环境#

传感器可以跨并行环境运行。返回的张量带有一个前导批次轴,写作 ([n_envs,] ...):当场景以多个环境构建时存在 [n_envs,] 这一维,否则不存在。上面的示例读到的形状是 (16, 4, 1):16 个环境、4 个历史步、1 个接触单元。

若用于高吞吐训练或日志记录,可以用 scene.read_sensors() 一次读取某一类的所有传感器(或使用 entity.read_sensors() 将范围限定在一个实体内)。每个调用返回一个 dict,以传感器类型标签 gs.sensors.types.<Name> 为键,映射到该类的一个批处理张量。最后一个轴是该类中每个传感器的扁平拼接;对于返回 NamedTuple 的传感器,各字段按字段顺序打包(一个 IMU 贡献 lin_acc + ang_vel + mag = 9 个标量)。只要该类中任一传感器创建时 history_length > 0,就会存在历史轴。

data = scene.read_sensors()  # dict[sensor-type tag, tensor]

# No history on the IMU class: shape ([n_envs,] n_imus * 9).
imu_batch = data[gs.sensors.types.IMU]

# history_length=4 on the Contact sensor above: shape ([n_envs,] 4, n_contacts).
contact_batch = data[gs.sensors.types.Contact]

传感器类型#

每一类传感器都有自己的页面。按你需要测量的量来选择;传感器参考 列出了所有 read() 返回类型和形状。

页面

选项类(gs.sensors.*)

测量内容

IMU

IMU

线性加速度、角速度、磁场

接触与力传感器

Contact、ContactForce、JointTorque

接触状态、合力、关节作用力

触觉传感器

ContactProbe、ContactDepthProbe、KinematicTaxel、ElastomerTaxel、ProximityTaxel

每个探针的接触状态/深度,每个 taxel 的力/力矩与位移

光线投射传感器

Lidar(Raycaster 的别名)、DepthCamera

射线命中点与距离

相机传感器

RasterizerCameraOptions、RaytracerCameraOptions、BatchRendererCameraOptions

渲染出的 RGB 图像

表面距离

SurfaceDistanceProbe

探针到被跟踪网格表面的最近距离

温度网格

TemperatureGrid

体素网格中每个单元的温度

每种传感器的可运行示例都位于 examples/sensors/ 下。

单个传感器之外#

记录数据 介绍如何在仿真运行过程中把传感器输出流式写入磁盘,自定义传感器 介绍每个传感器都经历的逐步流水线,以及如何添加未内置的传感器类型。