Files
mujoco_linkerbot/tools/o30_right_calibration/README_v5.md
T

96 lines
5.6 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 右手 V5:保留对指的单关节端点修正
在 V4 基础上,针对无名指指根/指尖、小指指根/中间/指尖、中指指尖,修正输入 255 时的端点。原四组对指指令以及实测零位的全部关节角保持 V4 不变。
## 使用
```bash
./hands/O30/scripts/run_o30_right_mujoco_plan.sh
```
默认模型为 `linkerhand_o30_right_endpoint_calibrated.urdf`。仍订阅 `/cb_right_hand_control_cmd`,20 路顺序与消息类型不变。
本版同时包含 **URDF 行程上限 + 分段 SDK 到关节弧度映射**。URDF 的 `o30_sdk_mapping` 自定义扩展保存节点,启动脚本转入 MJCF `custom/numeric`,桥接在读取模型时加载。若只将 URDF 拿到另一个使用线性 SDK 映射的程序中,不能保证原对指不变;须同时使用本项目映射。
## 已知信息和估计
用户确认:
- 每一对真机/仿真照片使用同一套指令。
- 六个测试关节的输入均为 255。
- 无名指、小指、中指的指尖测试,同一手指的中间关节也为 255。
完整数组已无法确认,其他通道值、相机参数及真机精确角度未知。照片中相关连杆接近垂直,本版暂以 **90°、估计不确定性约 ±8°** 作为六个端点的目标。这是人工视觉估计,不是测量精度、置信区间或图像自动拟合结果。
已知零位和其余通道全 0 两种背景都在 MuJoCo 中测试;两者均属于假设,没有声称恢复了原始指令。以后有更明确的照片/实测值,可在 `endpoint_constraints.json` 中替换目标角度后重新生成。
## 改动与对指保护
包含原有零位偏移的模型端点角度:
- 无名指指根:102.80° → 90°。
- 无名指指尖:68.40° → 90°。
- 小指指根:116.20° → 90°。
- 小指中间:77.64° → 90°。
- 小指指尖:61.05° → 90°。
- 中指指尖:43.82° → 90°。
线性缩放整段行程会改变原对指,因此为六个关节分别保留 0 和已校准对指输入处的角度,再连接新的 255 端点。对应保留的非零输入依次为 140、61、166、150、107、79。映射连续且单调,只有这些节点之后的斜率改变。关节 origin、其他关节、网格、连杆不变;这六个关节的未测中间行程采用插值,尚未经过真机标定。
`fit_endpoints.py` 使用三个初始端点假设进行有界搜索,以近似角度目标和 MuJoCo 碰撞增量作为目标。对指保持通过映射结构强制满足。此轮不是强化学习训练,也没有从照片精确识别角度。
## 检查结果
- 四组对指和零位的全部关节角保持原值,已与保存的 V4 MJCF 映射对照。
- 实际启动模型共 49 组输入的导出/映射验证通过,连杆位置误差最大约 3.85e-10 m。
- 1,021 组密集输入检查映射单调及端点范围。
- 六项回归测试通过,包括四组真实类型控制消息的对指、六组端点消息、旧模型切换、非法映射原子拒绝。
- 四组对指的网格距离维持约 −0.057、+0.018、+0.136、+0.027 mm。
- 已知零位背景下,六组端点未检测到穿透。
- 全 0 背景原本存在约 1.81~6.00 mm 手指间穿透,新版未加重。它不是推荐张开指令;该检查只证明没有新增最大穿透,不证明此姿态可用于真机。
上述接触距离是仿真指标,不是硬件精度证明。随机输入只验证导出与映射一致;没有证明整个运动路径无碰撞。
## 对比与复现
`reports/o30_right_endpoint_calibration/`:
- `measured_zero_comparison.png`:其余通道采用已知零位,六组对比;上排 V4,下排暂定 V5。
- `all_zero_comparison.png`:其余通道全 0 的假设对比;上排 V4,下排暂定 V5。
- `validation.json`:端点、分段节点、已确认与未知信息、搜索过程和验证结果。
每列使用同一相机;仿真视图没有与真机照片做精确相机配准。
```bash
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/fit_endpoints.py --check --render
```
单独查看中指指尖测试(默认其余通道为已知零位,不发 ROS 控制消息):
```bash
venv/bin/python tools/o30_right_calibration/fit_endpoints.py --preview middle_dip
```
可替换为 `ring_mcp_pitch`、`ring_dip`、`pinky_mcp_pitch`、`pinky_pip`、`pinky_dip`;`--background all_zero` 可查看另一背景假设。
```bash
OPENBLAS_NUM_THREADS=1 venv/bin/python tools/o30_right_calibration/fit_endpoints.py --fit
O30_RIGHT_PREPARE_ONLY=1 ./hands/O30/scripts/run_o30_right_mujoco_plan.sh
venv/bin/python tools/o30_right_calibration/fit_endpoints.py --check --render
source /opt/ros/jazzy/setup.bash
PYTHONPATH="$PWD/venv/lib/python3.12/site-packages:$PYTHONPATH" python3 tools/o30_right_calibration/test_calibration.py
```
## 回退与后续精调
V4 URDF/JSON 保留,另保存实际模型 `linker_hand_o30_right_pinky_v4.xml`。历史说明见 `README_v4.md`。
```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_pinky_calibrated.urdf" ./hands/O30/scripts/run_o30_right_mujoco_plan.sh
```
旧模型没有分段节点,加载时自动清除分段映射并恢复旧线性映射。
继续精调时无需找回历史数组:先发送已知零位数组,再只修改待测通道,记录完整数组并拍摄近似正侧面照片;指尖测试明确是否叠加中间关节 255。增加一个中间输入(例如 128 或 192)可以检验当前插值是否符合真机。没有这些新测量也能使用本版,但不应称为精确全行程标定。