DEEP 14 · 第二辑 · 感知与系统服务 · LEARN NOTES

收进学习手册 · 2026-09-11 · duck.whatled.com

解读 14 · kinematics/head.rs:头部 3 自由度运动学

解读对象:kinematics/src/head.rs(352 行)
需要的前置:解读 13 的 Quat/Pose。

两个常量四元数是一层翻译

MJCF 给出的是 site 位姿,视觉栈说的却是另一套坐标系:cv2 相机系(+x 右、+y 下、+z 前)和 ToF 传感器系(+x 沿光轴、+y 左、+z 上)。SITE_TO_CV2(head.rs:16)与 SENSOR_IN_CV2_Q(head.rs:20)就是这两条翻译规则,数值来自原型运行时对真实图像的调试。注释还指出它们跨机器人版本不变:各版本 site 四元数只差一个绝对系选择,q_site⁻¹ * q_cv2 结果相同。

HeadFk(head.rs:27)构造时把名字解析成索引(HEAD_JOINTS,head.rs:23:neck_pitch/head_pitch/head_yaw/head_roll),此后每帧 FK 不做任何字符串工作。camera_in_trunk_cv2(head.rs:61)给相机在躯干系的位姿;tof_in_trunk(head.rs:74)优先锚在 MJCF 自己的 tof site——真实安装点,离相机几厘米——资产没有该 site 时退回借用相机位姿。site_in_trunk(head.rs:89)开一个 [0.0f64; 32] 角度数组,只填头部四关节、其余取零:头链挂在躯干上,腿动不了"躯干系里的头"。

look_at:2×2 的阻尼高斯-牛顿

凝视 IK(head.rs:118)只解两个关节:head_pitch 与 head_yaw;neck_pitch 是调用者选的姿态,head_roll 保持水平。为什么不逐轴迭代?因为两个关节真耦合——pitch 在 yaw 上游,pitch 会倾斜 yaw 所扫的平面;yaw 接近 ±90° 时 pitch 轴与相机前向对齐,完全失去高度控制权(head.rs:104-111)。

于是正经解 2×2 系统:对真实 FK 做有限差分雅可比(步长 STEP_H = 1e-5,head.rs:121),手写求解 (JᵀJ + λI)Δ = -Jᵀe(head.rs:167-181),Levenberg 阻尼 LAMBDA = 1e-3 用于穿过奇异性。FK 约 50 ns,整个求解几微秒——这个量级的问题不值得引迭代库。

三个工程决定:

你带走的收获

延伸

什么鸭 WHATDUCK · 复刻学习笔记 ← 全部手册 · 首页