5.3 KiB
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 动力学标定。