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 来选择一部分环境,并且在一个步内都是幂等的:在同一个控制循环时间步内重复调用会返回相同的值。