力传感器测量接触力

1. 力传感器的类型与测量原理

MuJoCo 提供两类共 6 种力传感器,覆盖从简单碰撞检测到复杂多体动力学分析的全场景需求。传感器类型在include/mujoco/mjmodel.h 中定义,核心参数包括测量维度、数据类型和噪声特性。

1.1 接触力传感器

接触力传感器(Contact Sensor)通过监测碰撞约束计算接触点的力和力矩,支持7种数据输出格式(力、力矩、位置等)。其核心原理是通过求解碰撞约束方程:

其中 为接触点雅可比矩阵,为约束力向量。在 test/engine/testdata/sensor/contact.xml 中定义了典型配置:

<sensor>
  <contact name="all"/>                  <!-- 测量所有接触 -->
  <contact name="b1" body1="b1"/>        <!-- 仅测量b1相关接触 -->
  <contact name="g1" geom1="g1"/>        <!-- 仅测量g1相关接触 -->
  <contact name="net" reduce="netforce"/> <!-- 输出合力 -->
</sensor>

1.2 触觉传感器

触觉传感器(Tactile Sensor)基于有符号距离场(Signed Distance Field,SDF)实现面接触分布测量,特别适合柔性体交互场景。在 model/tactile/tactile.xml 中,通过网格采样实现指尖触觉阵列:

<sensor>
  <tactile geom="finger" mesh="box"/>    <!-- 手指触觉阵列 -->
  <tactile geom="ball" mesh="sphere"/>   <!-- 球体触觉阵列 -->
</sensor>

笔记

有符号距离场为每个点存储其到目标形状的最短距离,正负号表示点在形状内部(正)或外部(负)。

1.3 关键技术参数与配置

力传感器的测量精度取决于 3 个核心参数,这些参数在XML中通过sensor标签配置,在代码中通过mjModel结构体访问。

1.4 数据类型与维度

传感器类型 数据类型(mjtDataType) 输出维度 典型应用场景
touch mjDATATYPE_POSITIVE 1 碰撞检测
force mjDATATYPE_REAL 3 力控制
torque mjDATATYPE_REAL 3 力矩平衡
tactile mjDATATYPE_REAL N×M 抓取姿态识别

1.5 噪声与滤波

传感器数据默认添加高斯噪声,通过noise参数配置标准差:

<sensor>
  <force name="gripper_force" site="gripper" noise="0.01"/>
</sensor>

在代码中可通过 mj_sensorPos 等函数获取原始数据后进行滤波处理:

mjtNum* force_data = d->sensordata + m->sensor_adr[force_sensor_id];

2. 实战案例:机器人抓取力控制

以两指抓取任务为例,展示从传感器配置到力反馈控制的完整流程。

2.1 模型配置

在XML模型中定义指尖力传感器和接触检测传感器:

<sensor>
  <!-- 指尖力传感器 -->
  <force name="lf_force" site="left_finger"/>
  <force name="rf_force" site="right_finger"/>

  <!-- 接触检测 -->
  <contact name="object_contact" geom1="object"/>
</sensor>

2.2 数据读取(Python)

通过 mujoco Python API 读取传感器数据:

import mujoco

model = mujoco.MjModel.from_xml_path("model.xml")
data = mujoco.MjData(model)

# 读取力传感器数据
lf_force = data.sensordata[model.sensor("lf_force").adr]
rf_force = data.sensordata[model.sensor("rf_force").adr]

# 读取接触状态
contact_state = data.sensordata[model.sensor("object_contact").adr]

2.3 力控制实现

基于力传感器反馈实现阻抗控制:

desired_force = np.array([0, 0, -5])  # 期望抓取力
Kp = 100.0  # 比例增益
Kd = 5.0    # 阻尼增益

# 计算力误差
force_error = desired_force - lf_force

# 阻抗控制律
ctrl = Kp * force_error - Kd * data.qvel[:2]
data.ctrl[:] = ctrl

2.3 常见问题与解决方案

  • 噪声抑制

    问题:接触力数据包含高频噪声,影响控制稳定性。

    方案:使用滑动平均滤波:

# 滑动平均滤波
window_size = 5
force_buffer = np.zeros((window_size, 3))
force_buffer = np.roll(force_buffer, -1, axis=0)
force_buffer[-1] = raw_force
filtered_force = force_buffer.mean(axis=0)
  • 接触点定位 问题:需要精确获取接触点位置用于路径规划。

    方案:使用带位置输出的接触传感器:

<contact name="with_pos" data="force pos"/>

3. 高级应用与未来趋势

  • 多传感器融合:通过融合力传感器与视觉数据,实现更鲁棒的抓取控制。在 model/humanoid/humanoid.xml 中,全身力传感器网络与IMU数据融合,实现动态平衡控制。

  • GPU加速计算:利用 MJX 实现GPU并行力传感器计算,在 training_apg.ipynb 中,通过CUDA加速实现 thousand-DoF 机器人的实时力控仿真。

参考