# O30 右手 V10:新零位约束下的保守修正 本轮先调整右手。左手 V9、`exports/O30_V9_left_right/` 及其左右手副本均未更新。 ## 启动与新零位 ```bash ./hands/O30/scripts/run_o30_right_mujoco_plan.sh ``` 默认加载 `linkerhand_o30_right_zero_v10_calibrated.urdf`。重启窗口后,启动/张开预设采用用户本次给出的零位: ``` [0,0,255,197,110,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ``` 话题仍为 `/cb_right_hand_control_cmd`,20 个 SDK 0~255 值,按 URDF lower~upper 纯线性换算。零位偏移写在 URDF origin,不存在新增分段或特殊指令分支。 ## 修改范围与照片依据 照片显示四指接近并行、侧面接近伸直,但未提供相机内外参或实测角度。本轮使用“接近并行/伸直”的几何先验,不声称做了精确照片测角或逐像素配准。渲染对比两版使用同一组新零位指令和相同视角,避免以改变相机掩盖模型差异。 仅修改以下六个关节的 origin 旋转和 limit upper: - 四指侧摆:`index_mcp_roll`、`middle_mcp_roll`、`ring_mcp_roll`、`pinky_mcp_roll`。 - 食指弯曲:`index_mcp_pitch`、`index_pip`。 其余 14 个关节参数、关节轴、网格、质量、惯量、连杆长度、拇指全部保持 V9。四指侧摆在新零位下的原始模型角度约 −0.126°、0.232°、0.477°、1.105° 调到 0°;食指指根及中间关节由约 1.632°、3.145° 调到 0°。 这里的 0° 是原始模型中的几何伸直先验,不是从照片精确量出的真机角度。不是所有 20 个指令或 URDF qpos 都为 0。 食指指尖 SDK 值在零位和食指捏合时均为 0。如果同时要求捏合完整姿态不变,就不能单独改变该点的映射。因此保留其约 2.309° 的原始偏移,避免破坏之前的食指捏合;本轮不声称所有手指已完全符合真机全行程。 ## 搜索方法与原约束 进行 21 组从 V9 到几何伸直目标的有界尝试。在每组中,通过两个线性锚点计算各关节 origin/行程:新零位目标,以及该手指原有捏合指令的原角度。用 MuJoCo 评估接触、穿透和已测单关节姿态,选择满足约束且零位先验误差最小的一组。这是有约束的参数搜索,并非训练了强化学习策略。 - 四组捏合的**拇指和目标手指全部关节角度完全保留**,因此对应完整连杆姿态、指腹接触位置保持。 - 其他未参与捏合手指的零位/侧摆可能小幅变化,不能声称四个场景的整只手每个连杆均不变。 - 原中指捏合仍用 216;小指仍用 V8/V9 已确认的对指数组。 - 已校准的中指指根、无名指指根、小指指根、中指中间关节、小指中间关节、拇指指尖、中指/无名指/小指指尖 255 角度保持 V9。 - 之前完整指令的中指单关节测试,所属手指连杆原点最大变化约 0.022 mm(来自侧摆);拇指测试所属手指姿态不变。这里并非保证全部非目标手指姿态不变。 - 食指指根 255 从约 98.505° 变为 99.411°;食指中间关节 255 从约 81.678° 变为 84.303°。这两项此前没有独立的真机端点校准约束。四指侧摆的其他输入角度也随线性斜率小幅改变。 ## 验证 40 组命令验证原生 URDF、启动生成的 MJCF 与参考运动学一致;纯线性映射验证通过。四组捏合满足 0.2 mm 接触容差,新旧零位指令均无检测到的网格穿透。原有 11 项回归测试通过,包括新启动零位、四组对指及中指指根/拇指指尖端点。 报告:`reports/o30_right_zero_v10_calibration/validation.json`。 渲染:同目录 `comparison.png`,上排 V9,下排 V10,左列正面、右列侧面。 模型参数记录:模型目录 `o30_right_zero_v10_calibration.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_zero_v10.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 ``` 以上检查不向真机发布命令。历史单关节测试中的既有掌部/拇指近节网格问题不在本轮改动范围内。 ## 迁移与回退 新右手迁移包 `exports/O30_right_V10_linear.zip`,包含 URDF、meshes、关节顺序、新零位与四组对指命令。仅需按关节名称读取 URDF 限位线性换算,不依赖拟合脚本。 V9 备份:`backups/o30_v9_before_zero_20260922_103038/`。旧 V9 及左右手 V9 导出副本未覆盖,历史说明见 `README_v9.md`。旧运行 XML 快照为 `linker_hand_o30_right_middle_v9.xml`。 临时切回 V9 模型运行 `./hands/O30/legacy/run_o30_right_v9_linear.sh`。注意启动预设现在采用新零位数组;如需完全复现旧 V9 零位,请发送旧 `[0,0,255,195,100,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0]` 指令。