Files
mujoco_linkerbot/tools/o30_right_calibration/README_v1.md
T

5.3 KiB
Raw Blame History

O30 右手四组指腹捏合校准

2026-09-21:根据用户提供的食指、中指、无名指、小指四组真实控制值,拟合一套共享的关节零位和行程。用户确认接触方式为“指尖附近的指腹相对并接触”。原始输入保存在 samples.json。

当前项目根目录执行:

./hands/O30/scripts/run_o30_right_mujoco_plan.sh

默认读取包内 linkerhand_o30_right_pinch_calibrated.urdf,订阅 /cb_right_hand_control_cmd。SDK 的 20 路顺序不变。启动时重新生成 MJCF,并从实际 MJCF 读取控制行程,避免启动覆盖校准或仍然使用旧的固定映射。

本次调整

  • 原有连杆长度、关节轴、网格不变。原始 URDF 和 MJCF 保存在同目录的 *_stock.urdf、*_stock.xml。
  • 对每个关节拟合一个零位偏移和一个正的行程比例。零位通过 原 origin 旋转 × 绕关节轴的偏移旋转 写入 URDF;关节上限体现行程比例,下限保留。
  • 运行时 SDK 0~255 线性映射到新关节上下限。零位已经写入 origin,不能再在控制值上重复添加偏移。
  • 使用有边界、有原值正则约束的多起点非线性最小二乘,在 MuJoCo 中反复计算正运动学和碰撞;这是参数标定,不是训练强化学习策略。
  • 目标同时包含指腹接触位置、法向相对、手指之间和手掌的穿透约束。接触点可以在指尖附近的有限指腹区域内移动;这些接触点没有真机测量。
  • 使用 STL 凸包拟合指腹曲面;曲面近似的最大采样误差约为拇指 0.13 mm、其余手指 0.06 mm。验收另外计算实际 MuJoCo 碰撞网格距离,不只看曲面拟合结果。

验证结果

四组指腹之间实际凸碰撞网格的有符号距离(正值为间隙,负值为穿透):

  • 食指:原始 −5.249 mm → 校准后 +0.029 mm。
  • 中指:原始 +0.834 mm → 校准后 −0.064 mm。
  • 无名指:原始 +9.130 mm → 校准后 +0.038 mm。
  • 小指:原始 +6.716 mm → 校准后 −0.010 mm。

校准后的四组姿态中,整个模型最大接触穿透小于 0.07 mm;拟合指腹法向的相对误差小于 1.3°。这是模型内部结果,不能解释成真机达到 0.07 mm 精度。

检查了四组输入、张开预设、全 0、全 255 和 30 组固定随机输入,共 37 组。导出的 URDF/MJCF 与拟合模型所有连杆的位置最大差异约 3.9e-10 m。这只验证变换和控制映射一致,不表示随机姿态或行程端点已与真机验证,也不表示所有中间姿态均无碰撞。

使用 ROS 的真实 sensor_msgs/msg/JointState 类型和实际桥接回调,验证四组输入经过渐变控制后到达对应姿态、状态消息输出正确。测试中的 Node 以本地对象代替,不向真实控制话题发消息。另已在独立 ROS 域(173)中通过原启动脚本运行 20 步无窗口仿真,确认 ROS 节点能够正常启动并退出。

渲染对比:reports/o30_right_pinch_calibration/before_after.png(上排原始,下排校准);详细参数在模型目录的 o30_right_pinch_calibration.json,验证数据在报告目录的 validation.json。

本地复现

以下命令均从项目根目录执行。

只重新生成并校验模型:

O30_RIGHT_PREPARE_ONLY=1 ./hands/O30/scripts/run_o30_right_mujoco_plan.sh

检查生成的模型并渲染四组对比图:

OPENBLAS_NUM_THREADS=1 venv/bin/python tools/o30_right_calibration/calibrate.py --check --render

独立预览某一捏合姿态(可用 index、middle、ring、pinky),不需要 ROS 发布命令:

venv/bin/python tools/o30_right_calibration/calibrate.py --preview middle

预览原始模型时加 --stock。预览器显示固定的运动学姿态,不进行 PD 接触动力学验收。

运行 ROS 消息回归测试:

source /opt/ros/jazzy/setup.bash
PYTHONPATH="$PWD/venv/lib/python3.12/site-packages:$PYTHONPATH" python3 tools/o30_right_calibration/test_calibration.py

重新拟合(会更新校准 URDF 和参数 JSON),随后重新生成实际加载的模型:

OPENBLAS_NUM_THREADS=1 venv/bin/python tools/o30_right_calibration/calibrate.py --fit --starts 3 --max-nfev 300
O30_RIGHT_PREPARE_ONLY=1 ./hands/O30/scripts/run_o30_right_mujoco_plan.sh
venv/bin/python tools/o30_right_calibration/calibrate.py --check --render

临时使用原始 URDF 启动:

O30_RIGHT_URDF="$PWD/src/linkerhand-sim/linker_hand_mujoco_ros2/linker_hand_mujoco_ros2/urdf/O30/linker_hand_o30_right/linkerhand_o30_right_stock.urdf" ./hands/O30/scripts/run_o30_right_mujoco_plan.sh

之后正常执行 ./hands/O30/scripts/run_o30_right_mujoco_plan.sh 就会重新使用校准模型。

适用范围

这是一版由四组接触数据约束的拟合候选。四组接触不足以唯一确定 20 个关节的全部零位和行程;例如食指 DIP 在四组输入里始终为 0,无法据此测得其行程。因此保留原值先验,并限制零位偏移在 ±0.4 rad、行程比例在 0.5~1.5 之间。解的末次局部优化到达迭代预算,接触验收通过;不声称找到了唯一或全局最优解。

还需要真机张开姿态、各关节 0/255 端点角度或有尺度的照片,以及额外的不同弯曲程度捏合样本,才能进一步验证全行程和未知姿态。当前未进行真机对照验收或 --pd-drive 动力学标定。