91 lines
5.3 KiB
Markdown
91 lines
5.3 KiB
Markdown
# 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` 动力学标定。
|