加速度计(Accelerometer)#
加速度计传感器用于测量安装点在局部坐标系下的三轴线性加速度。在机器人仿真中,加速度计常用于感知机器人的运动状态,为控制算法提供重要的反馈信息。
🎯 功能描述#
加速度计测量的是传感器安装点在site 局部坐标系下的线性加速度,包括重力加速度的影响。该传感器返回的是一个包含 3 个浮点数的数组,分别表示 X、Y、Z 轴方向上的加速度分量。
📋 返回值格式#
acceleration = model.get_sensor_value("accelerometer_name", data)
# 类型:numpy.ndarray[float32]
# 形状:shape = (*data.shape, 3)
# 单位:m/s²
acceleration[..., 0]: X 轴方向的加速度分量(局部坐标系)
acceleration[..., 1]: Y 轴方向的加速度分量(局部坐标系)
acceleration[..., 2]: Z 轴方向的加速度分量(局部坐标系)
⚙️ MJCF 配置参数#
在 MotrixSim 中,加速度计传感器支持以下 MJCF 配置字段:
基本配置#
<sensor>
<accelerometer name="sensor_name"
site="site_name"/>
</sensor>
支持的属性#
属性名 |
类型 |
必需 |
默认值 |
描述 |
|---|---|---|---|---|
name |
string |
✅ |
- |
传感器的唯一标识名称 |
site |
string |
✅ |
- |
安装传感器的参考点名称 |
注意: MotrixSim 目前暂不支持 MJCF 标准中的cutoff、noise和user属性。
📝 配置示例#
基本加速度计配置#
<!-- 在body中定义安装点 -->
<site name="car_imu" type="sphere" size="0.03" rgba="0 1 0 1" pos="0 0 0"/>
<!-- 定义加速度计传感器 -->
<sensor>
<accelerometer name="car_accelerometer" site="car_imu"/>
</sensor>
多个加速度计配置#
<!-- 为不同位置安装多个加速度计 -->
<site name="imu_base" pos="0 0 0" size="0.02"/>
<site name="imu_end" pos="0 0 1" size="0.02"/>
<sensor>
<accelerometer name="acc_base" site="imu_base"/>
<accelerometer name="acc_end" site="imu_end"/>
</sensor>
🚀 使用示例#
Python API 使用#
import numpy as np
from motrixsim import load_model, SceneData, step
# 加载场景
model = load_model("scene_with_accelerometer.xml")
data = SceneData(model)
# 运行仿真并获取加速度计数据
for step_count in range(1000):
step(model, data)
# 获取加速度计数据
acc_data = model.get_sensor_value("car_accelerometer", data)
# 如果是单环境仿真,数据形状为 (3,)
if acc_data.ndim == 1:
print(f"加速度: [{acc_data[0]:.3f}, {acc_data[1]:.3f}, {acc_data[2]:.3f}] m/s²")
# 计算加速度大小
acc_magnitude = np.linalg.norm(acc_data)
print(f"加速度大小: {acc_magnitude:.3f} m/s²")
else:
# 向量化环境的情况
print(f"加速度数据形状: {acc_data.shape}")
实际应用场景#
# 机器人跌倒检测
def detect_fall(acceleration, threshold=15.0):
"""基于加速度计数据检测跌倒"""
acc_magnitude = np.linalg.norm(acceleration)
return acc_magnitude > threshold
# 静止检测(考虑重力)
def is_stationary(acceleration, gravity_threshold=9.5):
"""检测设备是否静止(考虑重力影响)"""
acc_magnitude = np.linalg.norm(acceleration)
# 静止时加速度大小应接近重力加速度
return abs(acc_magnitude - gravity_threshold) < 0.5
# 计算倾斜角度
def calculate_tilt_angle(acceleration):
"""基于加速度计计算设备的倾斜角度"""
# 假设设备主要受重力影响
gravity = np.array([0, 0, -9.81])
# 归一化向量
acc_norm = acceleration / np.linalg.norm(acceleration)
gravity_norm = gravity / np.linalg.norm(gravity)
# 计算夹角
cos_angle = np.dot(acc_norm, gravity_norm)
angle = np.arccos(np.clip(cos_angle, -1.0, 1.0))
return np.degrees(angle)
📊 物理原理#
加速度计的测量基于牛顿第二定律。在仿真环境中:
局部坐标系测量: 返回的加速度值是在 site 的局部坐标系中表示的
重力影响: 当传感器相对于地面静止时,会测量到重力加速度在局部坐标系中的投影
线性加速度: 测量的是安装点的纯线性加速度,不包括旋转分量
例如,当机器人倾斜时,即使静止,加速度计也会因为重力在局部坐标系中的分量而产生非零读数。
⚠️ 注意事项#
局部坐标系: 返回的加速度值是在 site 的局部坐标系中表示的,不是全局坐标系
重力影响: 静止时加速度计会测量到重力加速度在局部坐标系中的投影
安装位置: 传感器测量的是 site 安装点位置的加速度
不支持高级属性: MotrixSim 目前不支持
cutoff、noise和user属性数据类型: 返回值是
numpy.ndarray类型,形状支持向量化环境