Part II · 第 7 章 结构与运动学 · 7.4

速度运动学:twist 与雅可比

手爪的速度是 6 个数:角速度加线速度,合起来叫 twist。关节速度怎样变成这 6 个数?靠雅可比,而它的每一列,都是一根关节轴被前面的关节带到当前位置之后的螺旋轴。看懂这一点,空间雅可比、机体雅可比、奇异位形和笛卡尔速度控制就成了同一个故事。

约 32 分钟 前置:3.4 机器人雅可比 · 5.8 伴随 · 5.10 指数积 · 7.3 正运动学 5 个交互

    1为什么机器人需要它

    用 SpaceMouse 遥操作机械臂、让手眼相机盯着一个目标、在狭窄的工位里躲开奇异位形、让末端以 5 N 的力压住工件……这些任务都在说同一句话:"手爪应该这样动",而电机只听得懂"每个关节转多快"。把前一句翻译成后一句的,是雅可比。

    3.4 节在平面里造出了它:每一列是"关节到手爪的杠杆臂转 90°",手爪的速度是各列的叠加。到了三维,"手爪的速度"不再是一个向量。刚体上每个点的速度都不同,整个速度场由 6 个数决定:角速度 \(\boldsymbol\omega\) 和线速度 \(\mathbf v\),合起来就是 5.8 节的 twist \(\boldsymbol\xi=(\boldsymbol\omega,\mathbf v)\)(角速度在前)。于是

    • 速度运动学:\(\boldsymbol\xi = J(\boldsymbol\theta)\,\dot{\boldsymbol\theta}\),\(J\) 是 \(6\times n\) 的矩阵。关节速度 → 手爪的 twist。
    • 笛卡尔速度控制与逆运动学:反过来解 \(\dot{\boldsymbol\theta}\)(7.5 节每一步迭代都要解一次)。操作员给的命令常常写在工具系里,规划器给的写在基座系里,这两种说法要用不同的雅可比。
    • 奇异位形:\(J\) 在哪些姿态下丢掉一个方向?丢掉的是平移、转动,还是两者的混合?
    • 力与静力学:\(\boldsymbol\tau=J^\top\mathbf F\)(3.4 节),三维里的 \(\mathbf F\) 是力矩加力的 wrench,下一课 7.6 讲。

    平面里的杠杆臂图景到三维不够用了:关节轴可以指向任意方向,轴与轴之间还可以是异面的。5.10 节的 PoE 给出了更好的语言:每个关节是一根螺旋轴。这一课只有一个新想法:雅可比的第 \(i\) 列,就是第 \(i\) 根螺旋轴在当前位形下的样子。

    2直觉:速度场,与螺旋运动的叠加

    先回顾 5.8 节。刚体运动时,体上每个点 \(\mathbf p\) 的速度是 \(\mathbf u(\mathbf p)=\mathbf v+\boldsymbol\omega\times\mathbf p\):只要知道 \(\boldsymbol\omega\) 和"此刻恰在世界原点的那个点"的速度 \(\mathbf v\),整个场就定了。这 6 个数就是空间 twist \(\boldsymbol\xi_s\)。只要 \(\boldsymbol\omega\ne0\),这个速度场就是一次绕某条直线的螺旋运动(Chasles 定理,5.6 节):

    $$ \mathbf u(\mathbf p)=\hl{v}{\mathbf v}+\hl{w}{\boldsymbol\omega}\times\mathbf p,\qquad \text{axis: direction }\hat{\boldsymbol\omega},\ \ \text{through }\ \mathbf q_c=\frac{\boldsymbol\omega\times\mathbf v}{\|\boldsymbol\omega\|^2},\qquad \hl{h}{h}=\frac{\boldsymbol\omega\cdot\mathbf v}{\|\boldsymbol\omega\|^2}\ \ (\text{pitch, m/rad}). $$

    在轴上的点 \(\mathbf q_c\),速度恰好是 \(h\boldsymbol\omega\),只沿轴方向:这就是"螺旋"。每个转动关节单独转时,是最简单的 twist:\(S_i=(\hat{\boldsymbol\omega}_i,\,-\hat{\boldsymbol\omega}_i\times\mathbf q_i)\),螺距为 0,轴上所有点速度为零。

    现在让几个关节同时转。关键事实:速度场是线性的。几个刚体运动的速度场逐点相加,得到的还是一个刚体运动的速度场,所以twist 可以直接相加:手爪的 twist 就是每个关节"在当前位置的螺旋轴"乘以关节速度之和。下面的实验用两个关节看清这件事:A 轴是竖直的 z 轴,B 轴是水平的、可以平移和转向的一根轴。两根轴都是纯转动(螺距 0),可是当它们异面(B 轴离开 z 轴一段距离 \(r\))时,两个纯转动之和是一个有螺距的螺旋运动:边绕边沿轴前进,像拧螺丝。

    FIG 1两个关节的 twist 相加,得到一根有螺距的螺旋轴
    拖动画面旋转视角
    红色虚线是关节 A(竖直的 z 轴),绿色虚线是关节 B(水平,方位角 \(\psi\),高度 \(\zeta\),离 z 轴的偏移 \(r\))。小箭头是速度场 \(\mathbf u(\mathbf p)\),画在一个 \(3\times3\times2\) 的网格点上,颜色随所选的场而定(A 红、B 绿、A+B 琥珀色);"A / B / A+B"切换显示哪个场。紫色粗线是 A+B 的瞬时螺旋轴。盒子带着自己的坐标系(位置 \(T\)),盒子原点处的粗箭头是它的速度;侧栏同时给出空间 twist \(\boldsymbol\xi_s\)(前三个数:\(\boldsymbol\omega\),后三个:\(\mathbf v\))与机体 twist \(\boldsymbol\xi_b=\operatorname{Ad}_{T^{-1}}\boldsymbol\xi_s\),并核对 \(\operatorname{Ad}_T\boldsymbol\xi_b=\boldsymbol\xi_s\)。
    试一试
    • 选"A+B",让螺距 \(h\ge0.25\)。读数里的闭式 \(h=-abr/(a^2+b^2)\) 说:\(a,b,r\) 的符号要怎样搭配?为什么 \(r=0\) 时 \(h\) 一定为 0?
    • 先做出一个有螺距的运动,再把 \(r\) 拉回 0(\(|a|,|b|\ge0.4\))。两根轴相交了,合成运动变成纯转动:螺旋轴是否穿过交点?
    • 把盒子移到离原点远一点(\(b_x>1\))并转个角度(\(|\text{yaw}|>30^\circ\))。空间 twist 与机体 twist 的 6 个数完全不同,核对误差却仍是 \(10^{-16}\):它们是同一个运动的两种读法。
    核心洞见

    机械臂的雅可比,不过是把这个实验做了 \(n\) 次:每个关节贡献一个螺旋轴 \(S_i\)(在当前位置),乘上关节速度 \(\dot\theta_i\),所有 twist 相加。3.4 节的"杠杆臂转 90°"是这件事在"所有轴都垂直于纸面"时的特例。

    3动手玩:一台 6R 臂的雅可比,一列一列看

    用 5.10 节那类六自由度臂:肩上的 J1 绕竖直 z 轴(腰),J2、J3 是肩和肘(绕 y 轴),J4、J5、J6 是三个相交于手腕中心的腕关节(绕 x、y、x)。零位时每个关节的螺旋轴 \(S_i\) 都已知。关节 1 转过 \(\theta_1\) 之后,关节 2 的轴被带到了新的位置,这根"被搬运过的轴"就是雅可比的第二列。一般地:

    $$ J_s(\boldsymbol\theta)=\begin{bmatrix}\ci{S_1} & \cj{\operatorname{Ad}_{e^{[S_1]\theta_1}}S_2} & \ck{\operatorname{Ad}_{e^{[S_1]\theta_1}e^{[S_2]\theta_2}}S_3} & \cdots\end{bmatrix},\qquad \boldsymbol\xi_s=\hl{col}{J_s(\boldsymbol\theta)}\,\dot{\boldsymbol\theta}=\sum_{i=1}^{n}\dot\theta_i\,J_{s,i}. $$

    FIG 2 把每一列 \(J_{s,i}\) 画成一条线:线是被搬运到当前位置的关节轴,颜色与关节一一对应。选一个关节"聚焦",读数会给出它的 6 个数,并核对一件事:轴上的点速度为零,即 \(\mathbf v_i+\boldsymbol\omega_i\times\mathbf p_i=0\),\(\mathbf p_i\) 是轴上的点(关节中心)。再给出关节速度,各关节在手爪(工具点)处产生的速度 \(\dot\theta_i(\mathbf v_i+\boldsymbol\omega_i\times\mathbf p_{\text{tool}})\) 首尾相连,终点就是总的线速度 \(\mathbf u\),同时画出总的角速度 \(\boldsymbol\omega\)。最后,读数把解析的 \(J_s\) 与"对 FK 做有限差分"得到的雅可比逐项比较。

    FIG 2雅可比的列 = 被搬运到当前位置的关节轴
    拖动画面旋转视角
    线段是 \(J_s\) 的各列所代表的关节轴(长度只是为了好看),6 种颜色对应 J1–J6。彩色细箭头是各关节在工具点产生的线速度,首尾相接;琥珀色粗箭头是总线速度 \(\mathbf u\)(工具点),中性色(文字色)箭头是总角速度 \(\boldsymbol\omega\)。切换"关节角 / 关节速度"来编辑姿态或速度。读数里的"差分对照"是 \(\max|J_s-J_{\text{fd}}|\),其中 \(J_{\text{fd}}\) 的第 \(i\) 列是 \(\log\!\big(T(\boldsymbol\theta+\delta\mathbf e_i)T(\boldsymbol\theta-\delta\mathbf e_i)^{-1}\big)/2\delta\)。
    试一试
    • 聚焦 J5,然后把 \(\theta_1\) 转动 \(60^\circ\) 以上。J5 的轴绕着竖直轴转了,J1 自己的轴却纹丝不动:第一列永远是 \(S_1\),而第 \(i\) 列受前 \(i-1\) 个关节影响。
    • 在"关节速度"里只让 J6 转(其余为 0,\(|\dot\theta_6|\ge0.4\))。工具点的线速度 \(\mathbf u\) 是多少?为什么?(提示:J6 的轴穿过哪一点?)

    4第二、第三视角:奇异位形,与"哪个坐标系"

    奇异位形:雅可比丢掉一个方向

    \(J\) 的秩小于 6,就是奇异位形:存在一个 twist 方向,无论关节怎么转都产生不了。3.4 节在平面里看到了伸直和折回。6R 臂有三族典型的奇异位形:

    • 肩奇异:手腕中心落在 J1 的轴上。此时 J1 转动不会使手腕中心移动,手腕中心失去了垂直于手臂平面的那个方向。
    • 肘奇异:手臂完全伸直(\(\theta_3=0\))或完全折回。手腕中心失去沿手臂方向的那个速度,3.4 节的二连杆就是它。
    • 腕奇异:\(\theta_5=0\),J4 与 J6 的轴共线,两个关节只能产生同一种转动,一个方向的转动丢失了。

    FIG 3 让你沿着三族中的一族"穿过"奇异点:滑块 \(s\) 从 \(-1\) 走到 \(1\),\(s=0\) 恰在奇异位形上。观察六个奇异值 \(\sigma_i\)(最后一个降到 0)、行列式的符号(穿过时翻号:对应逆运动学两个分支之间的"跨越")、丢失的方向(箭头),以及线速度椭球:\(J_v\) 是 \(J\) 的线速度分块,单位关节速度球映到 \(J_vJ_v^\top\) 的椭球,半轴是 \(J_v\) 的奇异值。

    有两个细节值得注意。第一,奇异位形与 6 个数怎么混合无关,奇异值却有关:\(J\) 的上半是 m/rad,下半是 rad/rad,对这样的矩阵做 SVD,结果取决于你给转动那三行乘了多大的"特征长度" \(L\)(3.4 节误区 4)。滑块 \(L\) 把转动行乘上 \(L\):秩不变,\(\sigma_{\min}\) 与丢失方向却会变。第二,参考点:同一个 twist,在不同的点上读线速度是不同的数。默认把参考点放在手腕中心,那样肩、肘两族的丢失方向是干净的线速度;换成工具点,线速度里会混进 \(\boldsymbol\omega\times\mathbf r\)。

    FIG 3穿过 6R 臂的三族奇异位形
    拖动画面旋转视角
    青色线框是线速度椭球(单位关节速度球在 \(J_v\) 下的像,形状矩阵为 \(J_vJ_v^\top\),缩放系数 0.4)。琥珀色箭头是丢失方向中的线速度部分,紫色箭头是其中的转动部分,长度分别是单位向量里这两部分的大小(双向画出,因为方向只定到正负号)。丢失方向取自 \(J\)(转动行乘 \(L\))的最小左奇异向量。侧栏的奇异值条按同一刻度画出;"秩"用阈值 \(10^{-6}\sigma_1\) 判定。
    试一试
    • 选"肘",让 \(s=0\)。秩变成 5,椭球被压成一个圆盘,丢失的方向沿手臂。把 \(s\) 向两侧各拉一点:行列式的符号翻了吗?
    • 选"腕",让 \(s=0\)。秩同样是 5,可是线速度椭球并没有被压成一个盘,\(J_v\) 和 \(J_\omega\) 两块各自仍然满秩。奇异性只出现在"6 行合在一起"时:丢失的方向是线速度与角速度的混合。
    • 选"腕"并停在 \(s=0\),把 \(L\) 从 1 拉到 0.5 以下或 1.5 以上:秩不变,丢失方向里"转动 / 平移"的比例变了。哪个才是"真正的"丢失方向?(对"肘"和"肩",参考点取手腕中心时,丢失方向是纯平移,与 \(L\) 无关;把参考点换成工具点再试一次。)

    哪个坐标系?同一组关节速度,三种雅可比

    同一组关节速度 \(\dot{\boldsymbol\theta}\),手爪的运动可以用不同的"读法"写下来。三种常见的读法:

    • 空间雅可比 \(J_s\):\(\boldsymbol\xi_s=(\boldsymbol\omega_s,\mathbf v_s)\),参考点是世界原点,轴取世界系。
    • 机体雅可比 \(J_b\):\(\boldsymbol\xi_b=\operatorname{Ad}_{T^{-1}}\boldsymbol\xi_s\),参考点是工具原点,轴取工具系。"沿夹爪自己的轴再走 2 cm"就是在这里说的。
    • 解析雅可比 \(J_a\):对位姿的某种参数化求导,如位置 \(\mathbf p\) 加 ZYX 欧拉角 \((\psi,\theta,\varphi)\):\(\dot{\mathbf x}=(\dot{\mathbf p},\dot\psi,\dot\theta,\dot\varphi)\)。角速度不是欧拉角的导数,两者差一个矩阵 \(E(\psi,\theta,\varphi)\):\(\boldsymbol\omega_s=E\,(\dot\psi,\dot\theta,\dot\varphi)^\top\)。ZYX 时 \(\det E=-\cos\theta\),俯仰角 \(\theta=\pm90^\circ\)(万向节锁)时 \(E\) 奇异。

    FIG 4 固定 \(\theta_4=0\),这时手爪的朝向恰好是 \(R=R_z(\theta_1)R_y(\vartheta)R_x(\theta_6)\),\(\vartheta=\theta_2+\theta_3+\theta_5\),ZYX 角就是 \((\theta_1,\vartheta,\theta_6)\)。用滑块改变手爪俯仰角 \(\vartheta\),选一组关节速度,侧栏同时列出 \(\boldsymbol\xi_s\)、\(\boldsymbol\xi_b\) 和 \(\dot{\mathbf x}\)。看俯仰角靠近 \(\pm90^\circ\) 时,同一组关节速度算出的欧拉角速度如何爆炸,而手臂自己的雅可比 \(J_s\) 与 \(J_b\) 完全正常。画面里的三根轴是欧拉角的三根转轴:偏航(蓝)、俯仰(绿)、滚转(红);万向节锁时红轴与蓝轴合成一根。

    FIG 4同一组关节速度:ξs、ξb 与欧拉角速度
    拖动画面旋转视角
    手爪的朝向由 \(\theta_1\)(偏航)、\(\vartheta\)(俯仰)、\(\theta_6\)(滚转)给出。单关节预设的关节速度均为 1 rad/s("混合"预设是一组不同的速度)。"θ̇₄"预设下 J4 的轴(前臂轴)与手爪轴并不重合,因此它会同时转动三个欧拉角。欧拉角速度条的刻度是 ±10 rad/s,超出的条被截断并标红。侧栏的最后一项 \(1/\sigma_{\min}(E)\) 是"单位角速度最多需要多大的欧拉角速度"。
    试一试
    • 选"θ̇₄"预设,把俯仰角 \(\vartheta\) 拉到 \(\ge85^\circ\):欧拉角速度冲出刻度,而手臂的 \(\sigma_{\min}(J_s)\) 离 0 很远(60° 到 90° 之间几乎不变)。再找出手臂自己奇异的那个 \(\vartheta\)(\(\theta_5=0\),\(\sigma_{\min}(J_s)\) 掉到 0),它与万向节锁是同一回事吗?
    一个运动,几种写法

    \(J_s\)、\(J_b\)、混合雅可比和 \(J_a\) 不是四种不同的"物理",而是同一个线性映射 \(\dot{\boldsymbol\theta}\mapsto\)(手爪的运动)在不同参考点、不同坐标轴、不同参数化下的矩阵。前三者之间只差一个伴随矩阵,所以奇异位形(秩)完全一样;\(J_a\) 多出一个参数化带来的矩阵 \(E^{-1}\),它会引入表示奇异(万向节锁):这个奇异性在机器人身上并不存在,只存在于你选的数字里。

    5再看数学

    提示:把鼠标悬停在公式中带底色的符号上,FIG 1 或 FIG 2 中对应的元素会被高亮。

    空间 twist 与机体 twist

    设手爪的位姿是 \(T(t)\)。体上固定的点 \(\mathbf p_b\) 在世界里是 \(\mathbf p=T\mathbf p_b\),速度 \(\dot{\mathbf p}=\dot TT^{-1}\mathbf p\)。把 \(\dot TT^{-1}\) 与 \(T^{-1}\dot T\) 分别写成 twist 的 \(4\times4\) 矩阵(5.5 节):

    $$ \dot TT^{-1}=[\boldsymbol\xi_s]^{\wedge}=\begin{bmatrix}\skew{\boldsymbol\omega_s}&\mathbf v_s\\ \mathbf 0\T&0\end{bmatrix},\qquad T^{-1}\dot T=[\boldsymbol\xi_b]^{\wedge},\qquad \boldsymbol\xi_b=\operatorname{Ad}_{T^{-1}}\boldsymbol\xi_s,\quad \operatorname{Ad}_T=\begin{bmatrix}R&0\\ \skew{\mathbf t}R&R\end{bmatrix}. $$

    于是 \(\dot{\mathbf p}=\mathbf v_s+\boldsymbol\omega_s\times\mathbf p\)(与上文的速度场一致),而机体 twist 里的 \(\boldsymbol\omega_b=R^\top\boldsymbol\omega_s\),\(\mathbf v_b=R^\top(\mathbf v_s+\boldsymbol\omega_s\times\mathbf t)\):工具原点的速度,读在工具系的轴上。本课的 twist 顺序始终是 \((\boldsymbol\omega,\mathbf v)\),角速度在前,\(\operatorname{Ad}\) 的分块因此是上面这个样子(若某个库把线速度放前面,分块对调)。Modern Robotics 把 twist 记作 \(\mathcal V\),Featherstone 的空间向量也是角度在前。

    对指数积求导:空间雅可比

    5.10 节(7.3 节再展开)的 PoE 是 \(T(\boldsymbol\theta)=e^{[S_1]\theta_1}\cdots e^{[S_n]\theta_n}M\)。记 \(P_{i-1}=e^{[S_1]\theta_1}\cdots e^{[S_{i-1}]\theta_{i-1}}\),则 \(T=P_{i-1}\,e^{[S_i]\theta_i}\,R_i\),其中 \(R_i\) 是第 \(i\) 个指数右边的所有因子(包括 \(M\))。\(\theta_i\) 只出现在中间的指数里,\(\partial e^{[S_i]\theta_i}/\partial\theta_i=[S_i]\,e^{[S_i]\theta_i}\),所以

    $$ \frac{\partial T}{\partial\theta_i}T^{-1}=P_{i-1}[S_i]\,e^{[S_i]\theta_i}R_i\;R_i^{-1}e^{-[S_i]\theta_i}P_{i-1}^{-1}=P_{i-1}[S_i]P_{i-1}^{-1}=\big[\operatorname{Ad}_{P_{i-1}}S_i\big]^{\wedge}. $$

    最后一步就是 5.8 节的结论:\(P[S]P^{-1}=[\operatorname{Ad}_PS]\)。把所有 \(i\) 加起来(链式法则),\(\dot TT^{-1}=\sum_i\big[\operatorname{Ad}_{P_{i-1}}S_i\big]\dot\theta_i\),读出向量就是

    $$ \boldsymbol\xi_s=J_s\dot{\boldsymbol\theta},\qquad J_{s,i}=\operatorname{Ad}_{P_{i-1}}S_i\quad(J_{s,1}=S_1). $$

    关节 \(i\) 之前的关节把这根轴搬到哪里,列就是什么;关节 \(i\) 之后的关节不影响第 \(i\) 列(这也是 FIG 2 里 J1 的轴永远不动的原因)。

    机体雅可比与反向乘积

    \(\boldsymbol\xi_b=\operatorname{Ad}_{T^{-1}}\boldsymbol\xi_s\) 给出 \(J_b=\operatorname{Ad}_{T^{-1}}J_s\)。也可以直接对机体形式 \(T=Me^{[B_1]\theta_1}\cdots e^{[B_n]\theta_n}\) 求导,得到

    $$ J_{b,i}=\operatorname{Ad}_{\left(e^{[B_{i+1}]\theta_{i+1}}\cdots e^{[B_n]\theta_n}\right)^{-1}}B_i,\qquad J_{b,n}=B_n. $$

    现在乘积是反向的:第 \(i\) 列由关节 \(i\) 之后的关节决定,最后一列永远是 \(B_n\)。这很自然:工具系跟着手爪走,关节 \(n\) 的轴相对工具系不会动;只有手爪侧的关节,才会改变前面关节的轴在工具系里的样子。

    点的速度:与 3.4 节的杠杆臂对上

    手爪上一点 \(\mathbf p\)(世界系坐标)的线速度是 \(\dot{\mathbf p}=\mathbf v_s+\boldsymbol\omega_s\times\mathbf p\),把 \(J_s\) 拆成转动块 \(J_\omega\)(上三行)与平移块 \(J_{v}^{(0)}\)(下三行),就得到这个点的线速度雅可比和混合雅可比(参考点在 \(\mathbf p\)、轴取世界系):

    $$ J_v(\mathbf p)=J_v^{(0)}-\skew{\mathbf p}J_\omega,\qquad \begin{bmatrix}\boldsymbol\omega_s\\ \dot{\mathbf p}\end{bmatrix}=\underbrace{\begin{bmatrix}I&0\\ -\skew{\mathbf p}&I\end{bmatrix}}_{\text{change the reference point}}\boldsymbol\xi_s,\qquad J_h=\begin{bmatrix}J_\omega\\ J_v(\mathbf p)\end{bmatrix}=\begin{bmatrix}R&0\\0&R\end{bmatrix}J_b. $$

    对转动关节,第 \(i\) 列的线速度部分是 \(\mathbf v_i+\boldsymbol\omega_i\times\mathbf p=\boldsymbol\omega_i\times(\mathbf p-\mathbf q_i)\)(用到 \(\mathbf v_i=-\boldsymbol\omega_i\times\mathbf q_i\)):轴方向叉乘杠杆臂。若所有轴都是 \(\hat{\mathbf z}\),它就是 3.4 节的 \(\hat{\mathbf z}\times(\mathbf p_{\text{tip}}-\mathbf p_i)\),角速度那一行全是 1,完整地回到平面公式。Siciliano 教材里的"几何雅可比"就是这个混合雅可比。

    四种雅可比一览

    产生的速度参考点 / 轴公式典型用途
    \(J_s\)\((\boldsymbol\omega_s,\mathbf v_s)\)世界原点 / 世界轴\(\operatorname{Ad}_{P_{i-1}}S_i\)推导、wrench 变换、理论分析
    \(J_b\)\((\boldsymbol\omega_b,\mathbf v_b)\)工具原点 / 工具轴\(\operatorname{Ad}_{T^{-1}}J_s\)工具系命令、相机/力传感器在工具上
    \(J_h\)\((\boldsymbol\omega_s,\dot{\mathbf p})\)工具原点 / 世界轴\(\operatorname{diag}(R,R)J_b\)基座系笛卡尔命令(手柄、规划器)
    \(J_a\)\((\dot{\mathbf p},\dot{\boldsymbol\varphi})\)位姿参数的导数\(\operatorname{diag}(I,E^{-1})J_h\)*以欧拉角为变量的优化、轨迹

    * \(J_h\) 的行序是(角速度,线速度),\(J_a\) 的行序是(位置,欧拉角),实际使用时要对调两个三行块。

    角速度不是欧拉角的导数;四元数的 ½

    对 ZYX 角,\(R=R_z(\psi)R_y(\theta)R_x(\varphi)\)。三个角各自的转动速度,要先沿各自的轴方向放好,再相加:

    $$ \boldsymbol\omega_s=\dot\psi\,\hat{\mathbf z}+\dot\theta\,R_z(\psi)\hat{\mathbf y}+\dot\varphi\,R_z(\psi)R_y(\theta)\hat{\mathbf x}=\underbrace{\begin{bmatrix}0&-\sin\psi&\cos\psi\cos\theta\\0&\cos\psi&\sin\psi\cos\theta\\1&0&-\sin\theta\end{bmatrix}}_{E(\psi,\theta)}\begin{bmatrix}\dot\psi\\ \dot\theta\\ \dot\varphi\end{bmatrix},\qquad \det E=-\cos\theta. $$

    \(\theta\to\pm90^\circ\) 时第一列与第三列平行(FIG 4 里红轴与蓝轴合一),\(E\) 失去秩,\(E^{-1}\) 的元素按 \(1/\cos\theta\) 增长。用单位四元数 \(\mathbf q\) 表示朝向就没有这个问题:\(\dot{\mathbf q}=\tfrac12(0,\boldsymbol\omega_s)\otimes\mathbf q=\tfrac12\,\mathbf q\otimes(0,\boldsymbol\omega_b)\),左右两种乘法对应空间与机体角速度。那个 \(\tfrac12\) 来自四元数是半角:把 \(\mathbf q\) 的旋转角 \(\alpha\) 对应 \(\cos(\alpha/2)\)。四元数用 4 个数表示 3 个自由度,积分时要重新归一化。

    秩、零空间、度量与奇异性

    \(J\in\R^{6\times n}\) 的秩 \(r\) 是手爪在这个姿态下能独立产生的速度方向数。\(r<6\)(\(n\ge6\) 时)就是奇异位形。零空间有 \(n-r\) 维:这些关节运动不改变手爪的位姿,叫自运动。\(n=7\)(如 Franka Panda)的臂在非奇异位形有一维自运动,可以用它去躲障碍或避开关节限位(3.4 节的零空间公式 \(\dot{\boldsymbol\theta}=J^+\boldsymbol\xi+(I-J^+J)\mathbf z\) 原样适用)。

    奇异性与 wrench 对偶:\(J^\top\) 的零空间不为空,即存在 \(\boldsymbol\lambda\ne0\) 使 \(J^\top\boldsymbol\lambda=0\)。把 \(\boldsymbol\lambda\) 看成手爪上的 wrench(力矩加力,7.6 节),\(\boldsymbol\tau=J^\top\boldsymbol\lambda=0\):这个 wrench 完全由连杆结构承受,不需要任何关节力矩。这就是 3.4 节"伸直的手臂能举重物"在三维的一般形式;同一个 \(\boldsymbol\lambda\) 的方向也是"无论怎么转关节,手爪都走不动"的方向。

    三个常用的标量:Yoshikawa 可操作度 \(w=\sqrt{\det(JJ^\top)}=\prod_i\sigma_i\)(方阵时 \(=|\det J|\));最小奇异值 \(\sigma_{\min}\),到奇异位形的"距离";条件数 \(\kappa=\sigma_1/\sigma_{\min}\),各向同性程度。量纲是个陷阱:\(J\) 的上半(转动,rad/rad)和下半(平移,m/rad)混在一起,奇异值就依赖于长度单位。办法有三:分别分析 \(J_\omega\) 和 \(J_v\);给转动行乘一个特征长度 \(L\)(FIG 3 的做法);或者用"带权"的度量,权重来自任务的容许误差。秩与单位无关,行列式是否为 0 不依赖任何选择。

    从速度到加速度,只是预告

    对 \(\boldsymbol\xi=J(\boldsymbol\theta)\dot{\boldsymbol\theta}\) 再求一次导:\(\dot{\boldsymbol\xi}=J\ddot{\boldsymbol\theta}+\dot J\dot{\boldsymbol\theta}\),\(\dot J\) 的每一列都随着前面的关节转动而变化。控制器要让手爪走出指定的加速度时就要用到它(Part IV 的操作空间控制),第 8 章的动力学也会再遇到 \(J\) 和 \(\dot J\)。

    6机器人中的它:笛卡尔速度控制(resolved-rate)

    遥操作、示教拖动、贴着表面擦拭、给相机一个"往目标靠近"的命令……最终都落在同一条流水线上:每个控制周期读出当前关节角,算雅可比,解 \(\dot{\boldsymbol\theta}=J^{+}\boldsymbol\xi_{\text{cmd}}\)(或阻尼最小二乘),积分后发给电机。这叫 resolved-rate 控制。下面的实验把它搬到 6R 臂上,目的有三:

    • 命令在哪个坐标系里?"基座系"命令走混合雅可比,"工具系"命令走 \(J_b\)。选"不匹配",就是把一个坐标系里的数字喂给另一个坐标系的雅可比,手爪会朝奇怪的方向走。
    • 开环积分会漂。\(J\) 只是瞬时有效,离散积分(FIG 5 用 \(\Delta t=0.02\) s)有一阶误差:用伪逆时,读数里的末端误差就来自这里;阻尼最小二乘还会再加上一份由阻尼带来的偏差(默认 \(\lambda=0.05\) 时它反而是主要部分);真实控制器会加位姿反馈 \(\boldsymbol\xi=\boldsymbol\xi_{\text{ff}}+K\mathbf e\)。
    • 奇异位形附近怎么办?把速度调大,让手爪冲向手臂伸展的极限:伪逆要求的关节速度冲上天,阻尼最小二乘(\(\lambda\) 可调)保持有界,代价是慢下来、偏离。
    FIG 5笛卡尔速度命令:基座系 vs 工具系
    拖动画面旋转视角
    命令是一个常值 twist(3 s):6 个数里只有一个非零,由"命令"选择是平移还是转动,由"命令所在的坐标系"选择是基座系还是工具系。紫色粗线是理想路径,琥珀色线是真实走出的路径,淡色的小坐标系是理想的终点位姿。速度滑块的单位:平移是 m/s,转动命令是 2×该值 rad/s。关节速度每个周期被限幅到 3 rad/s(真实控制器的做法),读数里的"需求峰值"是限幅之前的最大 \(|\dot\theta_i|\)。拖动"时间"滑块或点播放来回放。
    试一试
    • 命令选"沿 +x 平移",坐标系选"工具系",雅可比选"不匹配",让终点位置误差超过 0.3 m。再改回"匹配"并换成"伪逆",误差降到多少?为什么不是 0?
    • 选基座系的"沿 +x 平移",方法"伪逆",把速度调到 0.5 m/s 以上,让需求峰值超过 20 rad/s。换成"阻尼最小二乘"再看一遍:末端停在了哪里?
    真实系统里

    笛卡尔速度接口:UR 的 speedl、Franka(libfranka)的笛卡尔速度控制接口,都接收"工具点速度",再在控制器内部乘以(阻尼)雅可比逆;ROS 2 的 MoveIt Servo 接收带坐标系名的 TwistStamped,把它变换到规划坐标系、转成关节速度,并在条件数超过阈值时自动减速、在更近时停下("奇异位形缩放")。遥操作:SpaceMouse 与 VR 手柄的输入通常是混合 twist(基座系轴,工具点参考点)。视觉伺服(Part III):图像误差给出的是相机系里的 twist,要用 \(J_b\)(加手眼标定)才能变成关节速度,那里的"图像雅可比"和这里的机器人雅可比相乘。冗余臂(7 轴):用零空间做肘部姿态、关节限位、可操作度的次要任务。规划:沿路径检查 \(\sigma_{\min}\) 或可操作度,避免穿过奇异区域。

    7常见误区

    误区 1:只看坐标轴,忘了参考点

    "坐标系"包含两件事:用哪套轴读数,以及线速度是哪一点的速度。\(J_s\) 的线速度是"世界原点处那个点"的,\(J_b\) 的是工具原点的、读在工具轴上,混合雅可比是工具原点的、读在世界轴上。把"向前 5 cm/s"这种手柄命令直接当作 \(\mathbf v_s\) 喂给 \(J_s\),只要同时有转动,工具点就会多走一项 \(\boldsymbol\omega\times\mathbf p\);参考点离世界原点越远,偏得越厉害。FIG 5 的"基座系命令"里做的转换 \(\mathbf v_s=\dot{\mathbf p}-\boldsymbol\omega\times\mathbf p\) 就是在补这一项。

    误区 2:把角速度当成欧拉角(或旋转向量)的导数

    \(\boldsymbol\omega\ne(\dot\psi,\dot\theta,\dot\varphi)\),两者差一个随姿态变化的矩阵 \(E\),它在俯仰角 \(\pm90^\circ\) 处奇异(FIG 4)。同理,旋转向量 \(\boldsymbol\phi=\theta\hat{\mathbf n}\) 的导数也不是角速度(差左雅可比 \(J_l^{-1}\),5.7 节)。用四元数时记得 \(\dot{\mathbf q}=\tfrac12\boldsymbol\omega\otimes\mathbf q\) 里的 \(\tfrac12\),漏掉它,姿态积分会以两倍的速度转,而且看起来仍然合理,因为四元数仍是单位的。

    误区 3:对 6 行混合量纲的矩阵直接做 SVD

    \(J\) 的 \(\sigma_{\min}\)、条件数、可操作度的数值取决于你用米还是毫米(FIG 3 的 \(L\) 滑块)。"\(\sigma_{\min}<0.05\) 就算接近奇异"这类阈值,只在一套固定约定下才有意思。更稳妥的做法是分别看 \(J_v\) 与 \(J_\omega\)(它们各自量纲一致,但如 FIG 3 的"腕"所示,会漏掉混合方向),或者选一个贴合任务的特征长度。判断是否奇异(秩)则不受影响。

    误区 4:奇异位形只在工作空间的边缘

    肘奇异(伸直或折回)在边界上,可是肩奇异(手腕中心经过 J1 的轴)和腕奇异(\(\theta_5=0\))都在工作空间的内部。手爪恰好要从机器人正前方穿过自己的"头顶"、或者要保持工具笔直向下同时转 \(\theta_5\) 经过 0,都会撞上。笛卡尔直线运动的路径规划因此不能只检查起点和终点;FIG 3 里的行列式翻号提醒你:穿过奇异点,常常意味着逆运动学的解换了一个分支,关节会剧烈变化。

    误区 5:把 \(J\) 当成常数

    \(J(\boldsymbol\theta)\) 每一列都随位形变化,\(\boldsymbol\xi=J\dot{\boldsymbol\theta}\) 只是瞬时关系。FIG 5 里"匹配"雅可比用伪逆时的终点误差不是 0,就是因为每个 20 ms 的周期里 \(J\) 其实在变(阻尼最小二乘的误差还另含阻尼造成的偏差)。解决办法是缩短周期、用位姿反馈闭环,或者在 IK 中每步重新算 \(J\)(7.5 节)。同样,用两帧位姿做差再除以时间来"测"手爪速度时,要用 \(\log\) 得到 twist,而不是把 \(4\times4\) 矩阵逐元素相减。

    8小练习

    1. 一台 2R 空间臂:关节 1 绕 \(\hat{\mathbf z}\)(过原点),关节 2 绕 \(\hat{\mathbf y}\)(过点 \((0,0,0.5)\))。零位时 \(S_2=(0,1,0;\,-0.5,0,0)\)。当 \(\theta_1=90^\circ\) 时,空间雅可比的第 2 列 \(J_{s,2}=(\boldsymbol\omega;\mathbf v)\) 是?
    \(J_{s,2}=\operatorname{Ad}_{e^{[S_1]\theta_1}}S_2\)。\(e^{[S_1]\theta_1}\) 是绕过原点的 \(z\) 轴转 \(90^\circ\),\(R=R_z(90^\circ)\),\(\mathbf t=0\),所以 \(\operatorname{Ad}=\operatorname{diag}(R,R)\):\(R(0,1,0)=(-1,0,0)\),\(R(-0.5,0,0)=(0,-0.5,0)\)。检验:轴上的点 \((0,0,0.5)\) 的速度 \(\mathbf v+\boldsymbol\omega\times\mathbf q=(0,-0.5,0)+(-1,0,0)\times(0,0,0.5)=(0,-0.5,0)+(0,0.5,0)=0\)。选项 A 是忘了搬运(零位的 \(S_2\));C 的 \(\mathbf v\) 符号错,轴上的点速度不为零;D 是反方向转了 \(-90^\circ\)。
    2. 操作员推 SpaceMouse,意思是"沿夹爪自己的接近轴(工具 \(z\) 轴)以 0.1 m/s 前进,不转动"。控制器应该解哪个方程?
    机体 twist \(\boldsymbol\xi_b\) 的线速度是工具原点的速度,读在工具轴上,"沿工具 \(z\) 轴 0.1 m/s"就是 \(\boldsymbol\xi_b=(0,0,0;0,0,0.1)\),对应 \(J_b\)。把它喂给 \(J_s\),意思变成"世界原点处的那个点沿世界 \(z\) 轴走",与操作员的意图无关。若要用 \(J_s\),必须先换系:\(\boldsymbol\xi_s=\operatorname{Ad}_T\boldsymbol\xi_b\)。\(J_b^\top\) 把力映到力矩,不是速度的逆。
    3. 6R 臂处于一个奇异位形。下列哪个说法正确?
    秩 \(<6\) 意味着 \(J\) 的列空间不是整个 \(\R^6\)(丢了一个 twist 方向),同时 \(J^\top\) 有非平凡零空间(\(J^\top\boldsymbol\lambda=0\) 的 wrench \(\boldsymbol\lambda\))。手臂照常能动,只是少了一个自由度;FK 在奇异点处完全正常;反过来,正因为秩亏,存在非零的关节速度(\(J\) 的零空间)使手爪不动,所以选项 D 也是错的。
    4. 手爪以 \(\boldsymbol\omega_s=(1,0,0)\) rad/s(绕世界 \(x\) 轴)转动,ZYX 欧拉角 \(\psi=0\),俯仰角 \(\theta=89^\circ\)。需要的欧拉角速度 \((\dot\psi,\dot\theta,\dot\varphi)\) 约为?
    令 \(\psi=0\):\(E=\begin{bmatrix}0&0&\cos\theta\\0&1&0\\1&0&-\sin\theta\end{bmatrix}\),解 \(E(\dot\psi,\dot\theta,\dot\varphi)^\top=(1,0,0)^\top\):第 2 行给 \(\dot\theta=0\),第 1 行给 \(\dot\varphi=1/\cos\theta\approx57.3\),第 3 行给 \(\dot\psi=\dot\varphi\sin\theta=\tan\theta\approx57.3\)。1 rad/s 的真实转动要两个欧拉角各自以 57 rad/s 反向"拉扯",合成一个小转动:这就是万向节锁。
    5. 一台臂的 \(6\times6\) 雅可比,长度单位用米时 \(\sigma_{\min}=0.2\)。同事用毫米重算(转动行不变,平移行乘 1000)。哪个说法对?
    乘以一个可逆的对角矩阵(行缩放)不改变秩,所以奇异与否不依赖单位;但它不是正交变换,奇异值会改变,条件数也会。这正是 FIG 3 的 \(L\) 滑块要演示的,也是为什么阈值判断要先约定单位或分块分析。

    9延伸阅读

    • K. Lynch & F. Park, Modern Robotics, Ch. 5 (Velocity Kinematics and Statics) — 空间/机体雅可比、奇异位形、可操作度椭球;本课的符号与顺序以它为准
    • R. Murray, Z. Li, S. Sastry, A Mathematical Introduction to Robotic Manipulation, Ch. 3 (Manipulator Kinematics) — 用螺旋理论推导机械臂雅可比与冗余、奇异性
    • B. Siciliano, L. Sciavicco, L. Villani, G. Oriolo, Robotics: Modelling, Planning and Control, Ch. 3 (Differential Kinematics and Statics) — 几何(混合)雅可比与解析雅可比,欧拉角的表示奇异
    • R. Featherstone, Rigid Body Dynamics Algorithms, Springer, 2008, Ch. 2 — 空间向量(运动向量与力向量)记号,是后面动力学章节的预告
    • T. Yoshikawa, "Manipulability of Robotic Mechanisms", Int. J. Robotics Research 4(2), 1985 — 可操作度指标与椭球的出处
    • J. Solà, Quaternion kinematics for the error-state Kalman filter, arXiv:1711.02508, 2017 — 四元数导数与角速度(含 ½ 因子)的两种约定