IMU#

惯性测量单元(IMU) 像板载传感器那样报告刚体连杆的运动:加速度计给出线性加速度,陀螺仪给出角速度,磁力计则可选地给出局部磁场。你可以用它为状态估计器提供输入、在接近真实的本体感知上训练运动策略,或记录真值动力学。

完整脚本是 examples/sensors/imu_franka.py。本页说明该传感器测量什么以及如何配置;所有传感器共用的流水线见 传感器。

最小示例#

IMU 挂载到刚体实体的某一个连杆上。先通过所属实体和连杆的局部索引确定连杆,然后在场景构建完成后读取传感器:

end_effector = franka.get_link("hand")

imu = scene.add_sensor(
    gs.sensors.IMU(
        entity_idx=franka.idx,
        link_idx_local=end_effector.idx_local,
    )
)

scene.build()

for _ in range(1000):
    scene.step()
    data = imu.read()  # IMUReturnType(lin_acc, ang_vel, mag)
    acc = data.lin_acc  # m/s^2, shape ([n_envs,] 3)

read() 返回一个 IMUReturnType 命名元组,包含 lin_acc、ang_vel 和 mag 三个字段,每个都是形状为 ([n_envs,] 3) 的张量,位于传感器本体坐标系中。单位与完整类型见 IMU 参考。

坐标系与约定#

传感器本体坐标系是所挂载连杆的坐标系按 euler_offset 旋转后的结果,因此三个字段都会随连杆旋转而旋转。

加速度计报告的是比力:坐标加速度减去重力。因此静止的传感器读数约为 (0, 0, 9.81) m/s²(沿其局部上轴对重力的反作用),而不是零。这与真实硬件一致,真实硬件无法区分自由落体与失重。

当 pos_offset 把传感器从连杆原点移开时,Genesis World 会加上切向和向心项(α × r 和 ω × (ω × r)),因此旋转的连杆会产生 IMU 在该偏移处实际感受到的加速度。

挂载与偏移传感器#

entity_idx 和 link_idx_local 把传感器放置到某个连杆上;pos_offset 和 euler_offset 则相对该连杆的坐标系移动和旋转它:

imu = scene.add_sensor(
    gs.sensors.IMU(
        entity_idx=franka.idx,
        link_idx_local=end_effector.idx_local,
        pos_offset=(0.0, 0.0, 0.15),  # meters, in the link frame
        # euler_offset=(0, 0, 0),     # extrinsic x-y-z, degrees
        draw_debug=True,              # draw acc/gyro/mag arrows in the viewer
    )
)

当 draw_debug=True 时,查看器会在传感器处显示三个箭头:红色表示加速度,绿色表示角速度,蓝色表示磁场。

建模传感器误差#

默认情况下 IMU 是理想的。它的三个通道(acc_*、gyro_*、mag_*)各自接受同一组逐轴误差参数:

imu = scene.add_sensor(
    gs.sensors.IMU(
        entity_idx=franka.idx,
        link_idx_local=end_effector.idx_local,
        pos_offset=(0.0, 0.0, 0.15),
        # noise parameters
        acc_cross_axis_coupling=(0.0, 0.01, 0.02),
        gyro_cross_axis_coupling=(0.03, 0.04, 0.05),
        acc_noise=(0.01, 0.01, 0.01),
        gyro_noise=(0.01, 0.01, 0.01),
        acc_random_walk=(0.001, 0.001, 0.001),
        gyro_random_walk=(0.001, 0.001, 0.001),
        delay=0.01,
        jitter=0.01,
        draw_debug=True,
    )
)

这组参数包括 *_noise(白噪声标准差)、*_bias(恒定偏置)、*_random_walk(漂移标准差)、*_cross_axis_coupling(轴间错位)和 *_resolution(量化步长),以及共享的 delay 和 jitter 时序。它们的确切含义和默认值见 IMU 参考 和 传感器总览;请根据目标硬件的规格书来设置。

磁力计还会读取一个全局磁场,由 magnetic_field 设置(世界坐标系中的默认值为 (0.0, 0.0, 0.5) T),并以本体坐标系返回。

读取测量值与真值#

read() 返回应用了所有已配置误差后的值。read_ground_truth() 返回同样的量,但不含噪声、偏置、漂移或延迟,适合作为训练目标或用于验证:

print("Ground truth data:")
print(imu.read_ground_truth())
print("Measured data:")
print(imu.read())

两者都接受可选的 envs_idx 来选择一部分环境,并且在一个步内都是幂等的:在同一个控制循环时间步内重复调用会返回相同的值。

另见#

  • 传感器:共用的读取/记录流水线、history_length,以及批处理 read_sensors()。

  • 记录数据:把 IMU 数据流与仿真一起保存。