Files
mujoco_linkerbot/tools/o30_right_calibration/README_v5.md
T

5.6 KiB
Raw Blame History

O30 右手 V5:保留对指的单关节端点修正

在 V4 基础上,针对无名指指根/指尖、小指指根/中间/指尖、中指指尖,修正输入 255 时的端点。原四组对指指令以及实测零位的全部关节角保持 V4 不变。

使用

./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:端点、分段节点、已确认与未知信息、搜索过程和验证结果。

每列使用同一相机;仿真视图没有与真机照片做精确相机配准。

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 控制消息):

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 可查看另一背景假设。

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。

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)可以检验当前插值是否符合真机。没有这些新测量也能使用本版,但不应称为精确全行程标定。