Files
mujoco_linkerbot/tools/o30_right_calibration/README_v1.md
T

91 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# O30 右手四组指腹捏合校准
2026-09-21:根据用户提供的食指、中指、无名指、小指四组真实控制值,拟合一套共享的关节零位和行程。用户确认接触方式为“指尖附近的指腹相对并接触”。原始输入保存在 `samples.json`。
当前项目根目录执行:
```bash
./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`。
## 本地复现
以下命令均从项目根目录执行。
只重新生成并校验模型:
```bash
O30_RIGHT_PREPARE_ONLY=1 ./hands/O30/scripts/run_o30_right_mujoco_plan.sh
```
检查生成的模型并渲染四组对比图:
```bash
OPENBLAS_NUM_THREADS=1 venv/bin/python tools/o30_right_calibration/calibrate.py --check --render
```
独立预览某一捏合姿态(可用 `index`、`middle`、`ring`、`pinky`),不需要 ROS 发布命令:
```bash
venv/bin/python tools/o30_right_calibration/calibrate.py --preview middle
```
预览原始模型时加 `--stock`。预览器显示固定的运动学姿态,不进行 PD 接触动力学验收。
运行 ROS 消息回归测试:
```bash
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),随后重新生成实际加载的模型:
```bash
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 启动:
```bash
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` 动力学标定。