传感器#
传感器从场景中提取信息,而不改变场景的物理状态。它建模的是机器人控制视角下的板载设备:把它挂到某个连杆上,推进仿真,然后读回一个张量。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() 返回类型和形状。
页面 |
选项类( |
测量内容 |
|---|---|---|
线性加速度、角速度、磁场 |
||
接触状态、合力、关节作用力 |
||
|
每个探针的接触状态/深度,每个 taxel 的力/力矩与位移 |
|
|
射线命中点与距离 |
|
|
渲染出的 RGB 图像 |
|
探针到被跟踪网格表面的最近距离 |
||
体素网格中每个单元的温度 |
每种传感器的可运行示例都位于 examples/sensors/ 下。
单个传感器之外#
记录数据 介绍如何在仿真运行过程中把传感器输出流式写入磁盘,自定义传感器 介绍每个传感器都经历的逐步流水线,以及如何添加未内置的传感器类型。