🌡️ 传感器(Sensor)#

通过配置传感器,用户可以更方便的获取物理对象状态信息,如位置,旋转,速度,加速度等。传感器不会影响到物理仿真的结果,可以添加在不同的对象上,如刚体(Body)、参考点(Site)、关节(Joint)等。

📋 传感器概览表#

传感器类型

测量对象

坐标系

返回维度

主要应用

accelerometer

site 线性加速度

site 局部

3

运动感知、跌倒检测

velocimeter

site 线性速度

site 局部

3

速度监测、运动控制

gyro

site 角速度

site 局部

3

姿态控制、运动估计

jointpos

关节位置/角度

关节轴

1

位置控制、限位监测

jointvel

关节速度

关节轴

1

速度控制、运动监控

framepos

对象位置

指定参考系

3

相对定位、路径跟踪

framequat

对象姿态

指定参考系

4

姿态控制、方向监测

framexaxis/yaxis/zaxis

对象轴向

指定参考系

3

方向分析、对准控制

framelinvel

对象线速度

指定参考系

3

速度跟踪、运动分析

frameangvel

对象角速度

指定参考系

3

角速度控制、旋转监测

framelinacc

对象线加速度

指定参考系

3

加速度监测、动态分析

subtreecom

子树质心

全局

3

稳定性分析、质心跟踪

subtreelinvel

子树质心速度

全局

3

动量分析、运动监测

subtreeangmom

子树角动量

全局

3

动量守恒、旋转分析

touch

site 接触法向力

site 局部

1

触觉感知、碰撞检测、力反馈

contact

几何体间接触信息

局部接触系

变长

触地检测、抓取力反馈、碰撞分析

🚀 快速开始#

传感器配置示例#

传感器的配置示例可参考 examples/assets/site_and_sensor.xml

<sensor>
    <!-- 局部坐标系传感器 -->
    <accelerometer name="acc_0" site="imu_0"/>
    <velocimeter name="vel_0" site="imu_0"/>
    <gyro name="gyro_0" site="imu_0"/>

    <!-- 关节传感器 -->
    <jointpos name="joint_pos" joint="shoulder"/>
    <jointvel name="joint_vel" joint="shoulder"/>

    <!-- 参考框传感器 -->
    <framepos name="global_pos" objtype="body" objname="robot" reftype="world"/>

    <!-- 子树传感器 -->
    <subtreecom name="robot_com" body="torso"/>

    <!-- 接触传感器 -->
    <touch name="palm_touch" site="palm_site"/>

    <!-- 接触传感器(详细) -->
    <contact name="box_floor_contact" geom1="bar" geom2="freebox"
             data="found force pos normal tangent" num="4" reduce="none"/>
</sensor>

备注

MotrixSim 限制: 目前不支持 MJCF 标准中的cutoffnoiseuser属性

Python API 使用#

获取指定传感器的数据:

# Get sensor value directly
v0 = (model.get_sensor_value("vel_0", data),)
v1 = (model.get_sensor_value("vel_1", data),)
v2 = (model.get_sensor_value("vel_2", data),)
v3 = (model.get_sensor_value("vel_3", data),)
(print(f"velocimeter values are : {v0}, {v1}, {v2}, {v3}"),)

acc_0 = (model.get_sensor_value("acc_0", data),)
acc_1 = (model.get_sensor_value("acc_1", data),)
acc_2 = (model.get_sensor_value("acc_2", data),)
acc_3 = (model.get_sensor_value("acc_3", data),)
(print(f"accelerometer values are : {acc_0}, {acc_1}, {acc_2}, {acc_3}"),)

gyro_0 = (model.get_sensor_value("gyro_0", data),)
gyro_1 = (model.get_sensor_value("gyro_1", data),)
gyro_2 = (model.get_sensor_value("gyro_2", data),)
gyro_3 = (model.get_sensor_value("gyro_3", data),)
(print(f"gyro values are : {gyro_0}, {gyro_1}, {gyro_2}, {gyro_3}"),)