Part II · 第 7 章 结构与运动学 · 7.4Part II · Ch. 7 Structure & Kinematics · 7.4

速度运动学:twist 与雅可比Velocity Kinematics: Twists & Jacobians

手爪的速度是 6 个数:角速度加线速度,合起来叫 twist。关节速度怎样变成这 6 个数?靠雅可比,而它的每一列,都是一根关节轴被前面的关节带到当前位置之后的螺旋轴。看懂这一点,空间雅可比、机体雅可比、奇异位形和笛卡尔速度控制就成了同一个故事。 The hand's velocity is six numbers: an angular velocity and a linear velocity, together a twist. How do joint rates turn into those six numbers? Through the Jacobian, whose every column is a joint's screw axis, carried to its present place by the joints before it. See that, and the space Jacobian, the body Jacobian, singularities and Cartesian velocity control become one story.

约 32 分钟~32 min 前置:3.4 机器人雅可比 · 5.8 伴随 · 5.10 指数积 · 7.3 正运动学Prereqs: 3.4 Robot Jacobian · 5.8 Adjoint · 5.10 PoE · 7.3 Forward Kinematics 5 个交互5 interactives

    1为什么机器人需要它Why robots need this

    用 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\) 根螺旋轴在当前位形下的样子。

    Teleoperating an arm with a SpaceMouse, keeping a hand-eye camera on a target, steering clear of singular postures in a cramped workcell, pressing on a workpiece with 5 N: all these tasks say the same thing, "the hand should move like this", while the motors only understand "turn each joint this fast". The translator from the first sentence to the second is the Jacobian.

    Lesson 3.4 built it in the plane: each column is "the lever arm from joint to hand, rotated by 90°", and the hand's velocity is the superposition of the columns. In 3D, "the hand's velocity" is no longer a vector. Every point of a rigid body moves differently, and the whole velocity field is fixed by six numbers: the angular velocity \(\boldsymbol\omega\) and the linear velocity \(\mathbf v\), together the twist \(\boldsymbol\xi=(\boldsymbol\omega,\mathbf v)\) of Lesson 5.8 (angular part first). So

    • Velocity kinematics: \(\boldsymbol\xi = J(\boldsymbol\theta)\,\dot{\boldsymbol\theta}\), with \(J\) a \(6\times n\) matrix. Joint rates → the hand's twist.
    • Cartesian velocity control and inverse kinematics: solve for \(\dot{\boldsymbol\theta}\) the other way round (every iteration of Lesson 7.5 does it once). An operator's command is often written in the tool frame and a planner's in the base frame, and those two statements need different Jacobians.
    • Singularities: in which postures does \(J\) lose a direction? Is what's lost a translation, a rotation, or a mixture?
    • Force and statics: \(\boldsymbol\tau=J^\top\mathbf F\) (Lesson 3.4); in 3D, \(\mathbf F\) is a wrench (torque plus force), the topic of the next lesson, 7.6.

    The lever-arm picture of the plane is not enough in 3D: joint axes can point anywhere, and two axes can be skew. The PoE of Lesson 5.10 supplies a better language: every joint is a screw axis. This lesson has one new idea: column \(i\) of the Jacobian is the \(i\)-th screw axis as it looks in the current configuration.

    2直觉:速度场,与螺旋运动的叠加Intuition: a velocity field, and the sum of screw motions

    先回顾 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 节):

    Recall Lesson 5.8. When a rigid body moves, the velocity of the body point \(\mathbf p\) is \(\mathbf u(\mathbf p)=\mathbf v+\boldsymbol\omega\times\mathbf p\): knowing \(\boldsymbol\omega\) and the velocity \(\mathbf v\) of "the body point that is at the world origin right now" fixes the whole field. Those six numbers are the space twist \(\boldsymbol\xi_s\). As long as \(\boldsymbol\omega\ne0\), the field is an instantaneous screw motion about a line (Chasles' theorem, Lesson 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\))时,两个纯转动之和是一个有螺距的螺旋运动:边绕边沿轴前进,像拧螺丝。

    At the point \(\mathbf q_c\) on the axis the velocity is exactly \(h\boldsymbol\omega\), purely along the axis: that is the "screw". A revolute joint turning alone is the simplest twist: \(S_i=(\hat{\boldsymbol\omega}_i,\,-\hat{\boldsymbol\omega}_i\times\mathbf q_i)\), with pitch 0 and every point on the axis at rest.

    Now let several joints turn at once. The key fact: velocity fields are linear. Adding the velocity fields of several rigid motions point by point gives again the velocity field of a rigid motion, so twists simply add: the hand's twist is the sum, over joints, of "the joint's screw axis at its present place" times the joint rate. The lab below shows it with two joints: axis A is the vertical z-axis, axis B is a horizontal axis you can shift and turn. Both are pure rotations (pitch 0), yet when they are skew (B is a distance \(r\) away from the z-axis), the sum of two pure rotations is a screw motion with pitch: it turns and slides along its axis at the same time, like driving a screw.

    FIG 1两个关节的 twist 相加,得到一根有螺距的螺旋轴Two joints' twists add into a screw axis with pitch
    拖动画面旋转视角drag to orbit
    红色虚线是关节 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\)。 The dashed red line is joint A (the vertical z-axis), the dashed green line is joint B (horizontal, azimuth \(\psi\), height \(\zeta\), offset \(r\) from the z-axis). The small arrows are the velocity field \(\mathbf u(\mathbf p)\) on a \(3\times3\times2\) grid, coloured by the selected field (A red, B green, A+B amber); "A / B / A+B" picks which field is shown. The thick purple line is the instantaneous screw axis of A+B. The box carries its own frame (pose \(T\)); the thick arrow at the box origin is its velocity. The side panel gives the space twist \(\boldsymbol\xi_s\) (first three numbers \(\boldsymbol\omega\), last three \(\mathbf v\)) and the body twist \(\boldsymbol\xi_b=\operatorname{Ad}_{T^{-1}}\boldsymbol\xi_s\), and checks \(\operatorname{Ad}_T\boldsymbol\xi_b=\boldsymbol\xi_s\).
    试一试Try this
    • 选"A+B",让螺距 \(h\ge0.25\)。读数里的闭式 \(h=-abr/(a^2+b^2)\) 说:\(a,b,r\) 的符号要怎样搭配?为什么 \(r=0\) 时 \(h\) 一定为 0?Pick "A+B" and make the pitch \(h\ge0.25\). The closed form \(h=-abr/(a^2+b^2)\) in the readout says how the signs of \(a,b,r\) must combine. Why is \(h\) always 0 when \(r=0\)?
    • 先做出一个有螺距的运动,再把 \(r\) 拉回 0(\(|a|,|b|\ge0.4\))。两根轴相交了,合成运动变成纯转动:螺旋轴是否穿过交点?First make a motion with pitch, then pull \(r\) back to 0 (with \(|a|,|b|\ge0.4\)). The two axes now intersect and the sum is a pure rotation: does the screw axis go through the intersection point?
    • 把盒子移到离原点远一点(\(b_x>1\))并转个角度(\(|\text{yaw}|>30^\circ\))。空间 twist 与机体 twist 的 6 个数完全不同,核对误差却仍是 \(10^{-16}\):它们是同一个运动的两种读法。Move the box away from the origin (\(b_x>1\)) and turn it (\(|\text{yaw}|>30^\circ\)). The six numbers of the space and body twists look nothing alike, yet the check stays at \(10^{-16}\): they are two readings of one motion.
    核心洞见Key insight

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

    The Jacobian of an arm is this experiment done \(n\) times: each joint contributes its screw axis \(S_i\) (at its present place), times its rate \(\dot\theta_i\), and all the twists add. Lesson 3.4's "lever arm rotated by 90°" is the special case where every axis is perpendicular to the page.

    3动手玩:一台 6R 臂的雅可比,一列一列看Play: the Jacobian of a 6R arm, column by column

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

    Take a six-degree-of-freedom arm of the kind in Lesson 5.10: J1 about the vertical z-axis (waist), J2 and J3 the shoulder and elbow (about the y-axis), and J4, J5, J6 three wrist joints whose axes meet in the wrist centre (about x, y, x). The screw axis \(S_i\) of every joint is known at home. After joint 1 has turned by \(\theta_1\), joint 2's axis has been carried to a new place, and this "carried axis" is the second column of the Jacobian. In general:

    $$ 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 draws every column \(J_{s,i}\) as a line: the joint axis, carried to its present place, in the joint's own colour. "Focus" on one joint and the readout gives its six numbers and checks one thing: a point on the axis has zero velocity, \(\mathbf v_i+\boldsymbol\omega_i\times\mathbf p_i=0\), where \(\mathbf p_i\) is a point on the axis (the joint centre). Then give joint rates: each joint's contribution \(\dot\theta_i(\mathbf v_i+\boldsymbol\omega_i\times\mathbf p_{\text{tool}})\) to the velocity at the hand (the tool point) is chained head to tail, ending at the total linear velocity \(\mathbf u\), and the total angular velocity \(\boldsymbol\omega\) is drawn too. Finally the readout compares the analytic \(J_s\) entry by entry with a Jacobian obtained by finite-differencing FK.

    FIG 2雅可比的列 = 被搬运到当前位置的关节轴Jacobian columns = joint axes carried to the present posture
    拖动画面旋转视角drag to orbit
    线段是 \(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\)。 The line segments are the joint axes represented by the columns of \(J_s\) (their length is cosmetic); the six colours are J1–J6. The thin coloured arrows are each joint's contribution to the velocity at the tool point, chained head to tail; the thick amber arrow is the total linear velocity \(\mathbf u\) (of the tool point) and the plain neutral-coloured arrow is the total angular velocity \(\boldsymbol\omega\). Toggle "joint angles / joint rates" to edit the posture or the rates. The "finite-difference check" is \(\max|J_s-J_{\text{fd}}|\), where column \(i\) of \(J_{\text{fd}}\) is \(\log\!\big(T(\boldsymbol\theta+\delta\mathbf e_i)T(\boldsymbol\theta-\delta\mathbf e_i)^{-1}\big)/2\delta\).
    试一试Try this
    • 聚焦 J5,然后把 \(\theta_1\) 转动 \(60^\circ\) 以上。J5 的轴绕着竖直轴转了,J1 自己的轴却纹丝不动:第一列永远是 \(S_1\),而第 \(i\) 列受前 \(i-1\) 个关节影响。Focus on J5, then turn \(\theta_1\) by more than \(60^\circ\). J5's axis swings around the vertical, while J1's own axis does not move: column 1 is always \(S_1\), and column \(i\) depends on the first \(i-1\) joints.
    • 在"关节速度"里只让 J6 转(其余为 0,\(|\dot\theta_6|\ge0.4\))。工具点的线速度 \(\mathbf u\) 是多少?为什么?(提示:J6 的轴穿过哪一点?)In "joint rates" turn only J6 (the rest 0, \(|\dot\theta_6|\ge0.4\)). What is the linear velocity \(\mathbf u\) of the tool point, and why? (Hint: which point does J6's axis pass through?)

    4第二、第三视角:奇异位形,与"哪个坐标系"Second and third views: singularities, and "which frame?"

    奇异位形:雅可比丢掉一个方向Singularities: the Jacobian loses a direction

    \(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\)。

    When \(J\) has rank below 6 the posture is singular: some twist direction cannot be produced however the joints move. Lesson 3.4 met the stretched and folded arm in the plane. A 6R arm has three typical families:

    • Shoulder singularity: the wrist centre lies on the J1 axis. Turning J1 then does not move the wrist centre, which loses the direction perpendicular to the arm's plane.
    • Elbow singularity: the arm is fully stretched (\(\theta_3=0\)) or fully folded. The wrist centre loses the velocity along the arm; the two-link arm of Lesson 3.4 is exactly this.
    • Wrist singularity: \(\theta_5=0\), the axes of J4 and J6 are collinear, the two joints can only produce the same rotation and one direction of rotation is lost.

    FIG 3 lets you walk through one family: the slider \(s\) runs from \(-1\) to \(1\), and \(s=0\) is exactly the singular posture. Watch the six singular values \(\sigma_i\) (the last one drops to 0), the sign of the determinant (it flips when you cross, the "jump" between two branches of inverse kinematics), the lost direction (arrows), and the linear-velocity ellipsoid: \(J_v\) is the linear-velocity block of \(J\), and the unit ball of joint rates maps to the ellipsoid of \(J_vJ_v^\top\), whose semi-axes are the singular values of \(J_v\).

    Two details deserve attention. First, being singular does not depend on how the six numbers are mixed, but the singular values do: the top half of \(J\) is in m/rad and the bottom half in rad/rad, and an SVD of such a matrix depends on the "characteristic length" \(L\) by which you scale the three rotation rows (Pitfall 4 of Lesson 3.4). The slider \(L\) multiplies the rotation rows by \(L\): the rank stays, but \(\sigma_{\min}\) and the lost direction change. Second, the reference point: the same twist gives different linear velocities at different points. By default the reference is the wrist centre, which makes the lost directions of the shoulder and elbow families clean linear velocities; switch to the tool tip and a \(\boldsymbol\omega\times\mathbf r\) term mixes in.

    FIG 3穿过 6R 臂的三族奇异位形Walking through the three singularity families of a 6R arm
    拖动画面旋转视角drag to orbit
    青色线框是线速度椭球(单位关节速度球在 \(J_v\) 下的像,形状矩阵为 \(J_vJ_v^\top\),缩放系数 0.4)。琥珀色箭头是丢失方向中的线速度部分,紫色箭头是其中的转动部分,长度分别是单位向量里这两部分的大小(双向画出,因为方向只定到正负号)。丢失方向取自 \(J\)(转动行乘 \(L\))的最小左奇异向量。侧栏的奇异值条按同一刻度画出;"秩"用阈值 \(10^{-6}\sigma_1\) 判定。 The cyan wireframe is the linear-velocity ellipsoid (the image of the unit ball of joint rates under \(J_v\), whose shape matrix is \(J_vJ_v^\top\), scaled by 0.4). The amber arrow is the linear part of the lost direction and the purple arrow its rotational part; their lengths are the sizes of these two parts in the unit vector (drawn both ways, since the direction is only defined up to sign). The lost direction is the smallest left-singular vector of \(J\) (rotation rows multiplied by \(L\)). The singular-value bars share one scale; the "rank" uses the threshold \(10^{-6}\sigma_1\).
    试一试Try this
    • 选"肘",让 \(s=0\)。秩变成 5,椭球被压成一个圆盘,丢失的方向沿手臂。把 \(s\) 向两侧各拉一点:行列式的符号翻了吗?Pick "elbow" and set \(s=0\). The rank becomes 5, the ellipsoid is squashed into a disc, and the lost direction is along the arm. Pull \(s\) a little to both sides: does the sign of the determinant flip?
    • 选"腕",让 \(s=0\)。秩同样是 5,可是线速度椭球并没有被压成一个盘,\(J_v\) 和 \(J_\omega\) 两块各自仍然满秩。奇异性只出现在"6 行合在一起"时:丢失的方向是线速度与角速度的混合。Pick "wrist" and set \(s=0\). The rank is 5 again, yet the linear-velocity ellipsoid is not squashed flat and the blocks \(J_v\) and \(J_\omega\) are each still full rank. The singularity shows up only when "all six rows" are taken together: the lost direction is a mixture of linear and angular velocity.
    • 选"腕"并停在 \(s=0\),把 \(L\) 从 1 拉到 0.5 以下或 1.5 以上:秩不变,丢失方向里"转动 / 平移"的比例变了。哪个才是"真正的"丢失方向?(对"肘"和"肩",参考点取手腕中心时,丢失方向是纯平移,与 \(L\) 无关;把参考点换成工具点再试一次。)Pick "wrist", stay at \(s=0\) and move \(L\) below 0.5 or above 1.5: the rank stays, but the rotation/translation split of the lost direction changes. Which one is "the real" lost direction? (For "elbow" and "shoulder" with the wrist centre as reference, the lost direction is a pure translation whatever \(L\) is; switch the reference to the tool tip and try again.)

    哪个坐标系?同一组关节速度,三种雅可比Which frame? One set of joint rates, three Jacobians

    同一组关节速度 \(\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\) 完全正常。画面里的三根轴是欧拉角的三根转轴:偏航(蓝)、俯仰(绿)、滚转(红);万向节锁时红轴与蓝轴合成一根。

    The same joint rates \(\dot{\boldsymbol\theta}\) can be written down with different "readings" of the hand's motion. The three common ones:

    • Space Jacobian \(J_s\): \(\boldsymbol\xi_s=(\boldsymbol\omega_s,\mathbf v_s)\), reference point the world origin, axes of the world frame.
    • Body Jacobian \(J_b\): \(\boldsymbol\xi_b=\operatorname{Ad}_{T^{-1}}\boldsymbol\xi_s\), reference point the tool origin, axes of the tool frame. "Go another 2 cm along the gripper's own axis" is said in this language.
    • Analytic Jacobian \(J_a\): the derivative of some parametrization of the pose, e.g. the position \(\mathbf p\) plus ZYX Euler angles \((\psi,\theta,\varphi)\): \(\dot{\mathbf x}=(\dot{\mathbf p},\dot\psi,\dot\theta,\dot\varphi)\). The angular velocity is not the derivative of the Euler angles; they differ by a matrix \(E(\psi,\theta,\varphi)\): \(\boldsymbol\omega_s=E\,(\dot\psi,\dot\theta,\dot\varphi)^\top\). For ZYX, \(\det E=-\cos\theta\), and \(E\) is singular at pitch \(\theta=\pm90^\circ\) (gimbal lock).

    FIG 4 fixes \(\theta_4=0\), where the hand's orientation is exactly \(R=R_z(\theta_1)R_y(\vartheta)R_x(\theta_6)\) with \(\vartheta=\theta_2+\theta_3+\theta_5\), so the ZYX angles are \((\theta_1,\vartheta,\theta_6)\). Change the hand's pitch \(\vartheta\) with the slider, choose a set of joint rates, and the side panel lists \(\boldsymbol\xi_s\), \(\boldsymbol\xi_b\) and \(\dot{\mathbf x}\) together. Watch what happens to the Euler rates computed from the same joint rates as the pitch approaches \(\pm90^\circ\), while the arm's own \(J_s\) and \(J_b\) stay perfectly healthy. The three axes in the picture are the Euler rotation axes: yaw (blue), pitch (green), roll (red); at gimbal lock the red and blue axes merge into one line.

    FIG 4同一组关节速度:ξs、ξb 与欧拉角速度One set of joint rates: ξs, ξb and Euler-angle rates
    拖动画面旋转视角drag to orbit
    手爪的朝向由 \(\theta_1\)(偏航)、\(\vartheta\)(俯仰)、\(\theta_6\)(滚转)给出。单关节预设的关节速度均为 1 rad/s("混合"预设是一组不同的速度)。"θ̇₄"预设下 J4 的轴(前臂轴)与手爪轴并不重合,因此它会同时转动三个欧拉角。欧拉角速度条的刻度是 ±10 rad/s,超出的条被截断并标红。侧栏的最后一项 \(1/\sigma_{\min}(E)\) 是"单位角速度最多需要多大的欧拉角速度"。 The hand's orientation is given by \(\theta_1\) (yaw), \(\vartheta\) (pitch), \(\theta_6\) (roll). Every single-joint preset sets its joint rate to 1 rad/s (the "mix" preset uses a set of different rates). Under the "θ̇₄" preset the axis of J4 (the forearm axis) does not coincide with the hand's axis, so it turns all three Euler angles at once. The Euler-rate bars have a scale of ±10 rad/s; bars beyond it are clipped and turn red. The last item of the panel, \(1/\sigma_{\min}(E)\), is "the largest Euler rate needed per unit angular velocity".
    试一试Try this
    • 选"θ̇₄"预设,把俯仰角 \(\vartheta\) 拉到 \(\ge85^\circ\):欧拉角速度冲出刻度,而手臂的 \(\sigma_{\min}(J_s)\) 离 0 很远(60° 到 90° 之间几乎不变)。再找出手臂自己奇异的那个 \(\vartheta\)(\(\theta_5=0\),\(\sigma_{\min}(J_s)\) 掉到 0),它与万向节锁是同一回事吗?Pick the "θ̇₄" preset and pull the pitch \(\vartheta\) to \(\ge85^\circ\): the Euler rates shoot off the scale while the arm's \(\sigma_{\min}(J_s)\) stays well away from 0 (it barely changes between 60° and 90°). Then find the \(\vartheta\) where the arm itself is singular (\(\theta_5=0\), \(\sigma_{\min}(J_s)\) drops to 0): is it the same thing as gimbal lock?
    一个运动,几种写法One motion, several notations

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

    \(J_s\), \(J_b\), the hybrid Jacobian and \(J_a\) are not four different pieces of "physics" but the matrices of one linear map \(\dot{\boldsymbol\theta}\mapsto\) (the hand's motion) under different reference points, different axes and different parametrizations. The first three differ only by an adjoint matrix, so their singularities (the rank) are identical; \(J_a\) picks up an extra matrix \(E^{-1}\) from the parametrization, and with it a representation singularity (gimbal lock) that does not exist in the robot, only in the numbers you chose.

    5再看数学The math

    提示:把鼠标悬停在公式中带底色的符号上,FIG 1 或 FIG 2 中对应的元素会被高亮。Tip: hover the highlighted symbols in the formulas; the matching element in FIG 1 or FIG 2 lights up.

    空间 twist 与机体 twistSpace and body twists

    设手爪的位姿是 \(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 节):

    Let the hand's pose be \(T(t)\). A body-fixed point \(\mathbf p_b\) is \(\mathbf p=T\mathbf p_b\) in the world, with velocity \(\dot{\mathbf p}=\dot TT^{-1}\mathbf p\). Write \(\dot TT^{-1}\) and \(T^{-1}\dot T\) as the \(4\times4\) matrices of twists (Lesson 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 的空间向量也是角度在前。

    Hence \(\dot{\mathbf p}=\mathbf v_s+\boldsymbol\omega_s\times\mathbf p\) (the velocity field above), while the body twist has \(\boldsymbol\omega_b=R^\top\boldsymbol\omega_s\) and \(\mathbf v_b=R^\top(\mathbf v_s+\boldsymbol\omega_s\times\mathbf t)\): the velocity of the tool origin, read on the tool frame's axes. In this lesson the twist is always ordered \((\boldsymbol\omega,\mathbf v)\), angular part first, which gives \(\operatorname{Ad}\) the block layout above (a library that puts the linear part first swaps the blocks). Modern Robotics writes the twist as \(\mathcal V\), and Featherstone's spatial vectors are also angular-first.

    对指数积求导:空间雅可比Differentiating the PoE: the space Jacobian

    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}\),所以

    The PoE of Lesson 5.10 (revisited in 7.3) is \(T(\boldsymbol\theta)=e^{[S_1]\theta_1}\cdots e^{[S_n]\theta_n}M\). Write \(P_{i-1}=e^{[S_1]\theta_1}\cdots e^{[S_{i-1}]\theta_{i-1}}\), so that \(T=P_{i-1}\,e^{[S_i]\theta_i}\,R_i\), where \(R_i\) collects all factors to the right of the \(i\)-th exponential (including \(M\)). \(\theta_i\) appears only in the middle exponential, with \(\partial e^{[S_i]\theta_i}/\partial\theta_i=[S_i]\,e^{[S_i]\theta_i}\), so

    $$ \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\),读出向量就是

    The last step is Lesson 5.8: \(P[S]P^{-1}=[\operatorname{Ad}_PS]\). Summing over \(i\) (chain rule), \(\dot TT^{-1}=\sum_i\big[\operatorname{Ad}_{P_{i-1}}S_i\big]\dot\theta_i\), and reading off the vector:

    $$ \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 的轴永远不动的原因)。

    Whatever the joints before joint \(i\) do to this axis is what the column is; the joints after joint \(i\) do not influence column \(i\) (which is why J1's axis never moves in FIG 2).

    机体雅可比与反向乘积The body Jacobian and the reversed product

    \(\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}\) 求导,得到

    \(\boldsymbol\xi_b=\operatorname{Ad}_{T^{-1}}\boldsymbol\xi_s\) gives \(J_b=\operatorname{Ad}_{T^{-1}}J_s\). One can also differentiate the body form \(T=Me^{[B_1]\theta_1}\cdots e^{[B_n]\theta_n}\) directly, which gives

    $$ 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\) 的轴相对工具系不会动;只有手爪侧的关节,才会改变前面关节的轴在工具系里的样子。

    The product now runs the other way: column \(i\) is determined by the joints after joint \(i\), and the last column is always \(B_n\). That is natural: the tool frame rides on the hand, so joint \(n\)'s axis never moves relative to it; only the joints on the hand's side change how the earlier joints' axes look in the tool frame.

    点的速度:与 3.4 节的杠杆臂对上Velocity of a point: matching Lesson 3.4's lever arm

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

    A point \(\mathbf p\) on the hand (world coordinates) has linear velocity \(\dot{\mathbf p}=\mathbf v_s+\boldsymbol\omega_s\times\mathbf p\). Splitting \(J_s\) into its rotation block \(J_\omega\) (top three rows) and translation block \(J_v^{(0)}\) (bottom three), we get the point's linear-velocity Jacobian and the hybrid Jacobian (reference point at \(\mathbf p\), axes of the world frame):

    $$ 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 教材里的"几何雅可比"就是这个混合雅可比。

    For a revolute joint, column \(i\)'s linear part is \(\mathbf v_i+\boldsymbol\omega_i\times\mathbf p=\boldsymbol\omega_i\times(\mathbf p-\mathbf q_i)\) (using \(\mathbf v_i=-\boldsymbol\omega_i\times\mathbf q_i\)): the axis crossed with the lever arm. If every axis is \(\hat{\mathbf z}\), this is Lesson 3.4's \(\hat{\mathbf z}\times(\mathbf p_{\text{tip}}-\mathbf p_i)\) and the angular row is all ones: the planar formula, recovered in full. The "geometric Jacobian" of Siciliano's textbook is this hybrid Jacobian.

    四种雅可比一览The four Jacobians at a glance

    产生的速度Velocity it produces参考点 / 轴Reference point / axes公式Formula典型用途Typical use
    \(J_s\)\((\boldsymbol\omega_s,\mathbf v_s)\)世界原点 / 世界轴world origin / world axes\(\operatorname{Ad}_{P_{i-1}}S_i\)推导、wrench 变换、理论分析derivations, wrench transforms, theory
    \(J_b\)\((\boldsymbol\omega_b,\mathbf v_b)\)工具原点 / 工具轴tool origin / tool axes\(\operatorname{Ad}_{T^{-1}}J_s\)工具系命令、相机/力传感器在工具上tool-frame commands, sensors mounted on the tool
    \(J_h\)\((\boldsymbol\omega_s,\dot{\mathbf p})\)工具原点 / 世界轴tool origin / world axes\(\operatorname{diag}(R,R)J_b\)基座系笛卡尔命令(手柄、规划器)base-frame Cartesian commands (joystick, planner)
    \(J_a\)\((\dot{\mathbf p},\dot{\boldsymbol\varphi})\)位姿参数的导数derivative of pose parameters\(\operatorname{diag}(I,E^{-1})J_h\)*以欧拉角为变量的优化、轨迹optimization and trajectories in Euler angles

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

    * \(J_h\) is ordered (angular, linear) and \(J_a\) is ordered (position, Euler angles); in practice swap the two three-row blocks accordingly.

    角速度不是欧拉角的导数;四元数的 ½Angular velocity is not the Euler-angle derivative; the ½ of quaternions

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

    For ZYX angles, \(R=R_z(\psi)R_y(\theta)R_x(\varphi)\). Each angle's rotation rate must be placed along its own axis before they are added:

    $$ \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 个自由度,积分时要重新归一化。

    As \(\theta\to\pm90^\circ\) the first and third columns become parallel (the red and blue axes merge in FIG 4), \(E\) loses rank and the entries of \(E^{-1}\) grow like \(1/\cos\theta\). A unit quaternion \(\mathbf q\) has no such problem: \(\dot{\mathbf q}=\tfrac12(0,\boldsymbol\omega_s)\otimes\mathbf q=\tfrac12\,\mathbf q\otimes(0,\boldsymbol\omega_b)\); left and right multiplication correspond to the spatial and body angular velocities. The \(\tfrac12\) comes from quaternions being half-angle objects: a rotation by \(\alpha\) corresponds to \(\cos(\alpha/2)\). A quaternion uses four numbers for three degrees of freedom, so renormalize after integrating.

    秩、零空间、度量与奇异性Rank, null space, measures, and singularity

    \(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 不依赖任何选择。

    The rank \(r\) of \(J\in\R^{6\times n}\) is the number of independent velocity directions the hand can produce in this posture. \(r<6\) (for \(n\ge6\)) is a singular posture. The null space has dimension \(n-r\): these joint motions leave the hand's pose unchanged and are called self-motions. A 7-joint arm (such as the Franka Panda) has a one-dimensional self-motion in a non-singular posture, usable for dodging obstacles or staying away from joint limits (Lesson 3.4's null-space formula \(\dot{\boldsymbol\theta}=J^+\boldsymbol\xi+(I-J^+J)\mathbf z\) applies unchanged).

    Singularity and the wrench duality: the null space of \(J^\top\) is non-empty, i.e. there is \(\boldsymbol\lambda\ne0\) with \(J^\top\boldsymbol\lambda=0\). Read \(\boldsymbol\lambda\) as a wrench on the hand (torque plus force, Lesson 7.6), then \(\boldsymbol\tau=J^\top\boldsymbol\lambda=0\): this wrench is carried entirely by the link structure and needs no joint torque. This is the general 3D form of Lesson 3.4's "a stretched arm can hold a heavy weight", and the direction of the same \(\boldsymbol\lambda\) is the direction in which the hand cannot be moved however the joints turn.

    Three common scalars: Yoshikawa's manipulability \(w=\sqrt{\det(JJ^\top)}=\prod_i\sigma_i\) (\(=|\det J|\) for square \(J\)); the smallest singular value \(\sigma_{\min}\), a "distance" to a singularity; and the condition number \(\kappa=\sigma_1/\sigma_{\min}\), a measure of isotropy. Units are a trap: mix the top half of \(J\) (rotation, rad/rad) with the bottom half (translation, m/rad) and the singular values depend on the length unit. Three remedies: analyze \(J_\omega\) and \(J_v\) separately; multiply the rotation rows by a characteristic length \(L\) (what FIG 3 does); or use a weighted metric whose weights come from the task's tolerances. Rank is unit-free: whether a determinant is zero depends on no choice at all.

    从速度到加速度,只是预告From velocity to acceleration, a preview

    对 \(\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\)。

    Differentiating \(\boldsymbol\xi=J(\boldsymbol\theta)\dot{\boldsymbol\theta}\) once more gives \(\dot{\boldsymbol\xi}=J\ddot{\boldsymbol\theta}+\dot J\dot{\boldsymbol\theta}\); every column of \(\dot J\) changes as the joints before it turn. A controller needs it to make the hand follow a given acceleration (operational-space control in Part IV), and the dynamics of Chapter 8 meets \(J\) and \(\dot J\) again.

    6机器人中的它:笛卡尔速度控制(resolved-rate)In robotics: Cartesian velocity control (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\) 可调)保持有界,代价是慢下来、偏离。

    Teleoperation, kinesthetic teaching, wiping along a surface, giving a camera a "move toward the target" command... all end up in the same pipeline: each control cycle read the joint angles, compute the Jacobian, solve \(\dot{\boldsymbol\theta}=J^{+}\boldsymbol\xi_{\text{cmd}}\) (or damped least squares), integrate, and send the result to the motors. This is resolved-rate control. The lab below runs it on the 6R arm with three goals:

    • Which frame is the command in? A "base-frame" command goes through the hybrid Jacobian, a "tool-frame" command through \(J_b\). Choose "mismatched" and you feed the numbers of one frame to the Jacobian of the other, and the hand heads off in a strange direction.
    • Open-loop integration drifts. \(J\) is only valid instantaneously, and discrete integration (FIG 5 uses \(\Delta t=0.02\) s) carries a first-order error: with the pseudo-inverse, the end error in the readout comes from here; damped least squares adds a bias of its own from the damping (at the default \(\lambda=0.05\) that bias is actually the larger part). Real controllers add pose feedback, \(\boldsymbol\xi=\boldsymbol\xi_{\text{ff}}+K\mathbf e\).
    • What about near a singularity? Turn the speed up and drive the hand toward the limit of the arm's reach: the pseudo-inverse demands joint rates that shoot to the sky, damped least squares (adjustable \(\lambda\)) stays bounded, at the price of slowing down and deviating.
    FIG 5笛卡尔速度命令:基座系 vs 工具系Cartesian velocity command: base frame vs tool frame
    拖动画面旋转视角drag to orbit
    命令是一个常值 twist(3 s):6 个数里只有一个非零,由"命令"选择是平移还是转动,由"命令所在的坐标系"选择是基座系还是工具系。紫色粗线是理想路径,琥珀色线是真实走出的路径,淡色的小坐标系是理想的终点位姿。速度滑块的单位:平移是 m/s,转动命令是 2×该值 rad/s。关节速度每个周期被限幅到 3 rad/s(真实控制器的做法),读数里的"需求峰值"是限幅之前的最大 \(|\dot\theta_i|\)。拖动"时间"滑块或点播放来回放。 The command is a constant twist (3 s): of the six numbers only one is non-zero, "command" picks translation or rotation and "command frame" picks base or tool. The thick purple line is the ideal path, the amber line the path actually travelled, and the faint small frame the ideal end pose. The speed slider is in m/s for translations and 2× that value in rad/s for rotations. Joint rates are clamped to 3 rad/s every cycle (as real controllers do); the "peak demand" readout is the largest \(|\dot\theta_i|\) before clamping. Drag the "time" slider or press play to replay.
    试一试Try this
    • 命令选"沿 +x 平移",坐标系选"工具系",雅可比选"不匹配",让终点位置误差超过 0.3 m。再改回"匹配"并换成"伪逆",误差降到多少?为什么不是 0?Choose the command "translate along +x", frame "tool", Jacobian "mismatched", and make the end position error exceed 0.3 m. Switch back to "matched" with the pseudo-inverse: how small does the error become, and why is it not 0?
    • 选基座系的"沿 +x 平移",方法"伪逆",把速度调到 0.5 m/s 以上,让需求峰值超过 20 rad/s。换成"阻尼最小二乘"再看一遍:末端停在了哪里?Choose the base-frame "translate along +x", method "pseudo-inverse", turn the speed to 0.5 m/s or more so that the peak demand exceeds 20 rad/s. Switch to "damped least squares" and look again: where does the tip end up?
    真实系统里In real systems

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

    Cartesian velocity interfaces: UR's speedl and Franka's (libfranka) Cartesian-velocity interface take a "tool-point velocity" and multiply by a (damped) Jacobian inverse inside the controller; ROS 2 MoveIt Servo takes a TwistStamped with a named frame, transforms it to the planning frame, converts it to joint velocities, and slows down automatically when the condition number passes a threshold and stops when it gets closer ("singularity scaling"). Teleoperation: SpaceMouse and VR-controller inputs are usually hybrid twists (base-frame axes, tool-point reference). Visual servoing (Part III): the image error gives a twist in the camera frame, and turning it into joint rates needs \(J_b\) (plus the hand-eye calibration); the "image Jacobian" there multiplies the robot Jacobian here. Redundant arms (7 joints): the null space handles elbow posture, joint limits, manipulability as secondary tasks. Planning: check \(\sigma_{\min}\) or manipulability along the path so as not to cross singular regions.

    7常见误区Common pitfalls

    误区 1:只看坐标轴,忘了参考点Pitfall 1: looking only at the axes and forgetting the reference point

    "坐标系"包含两件事:用哪套轴读数,以及线速度是哪一点的速度。\(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\) 就是在补这一项。

    A "frame" means two things: which axes you read on, and which point's velocity the linear part is. \(J_s\)'s linear part is that of "the point at the world origin", \(J_b\)'s is the tool origin's read on the tool axes, and the hybrid Jacobian's is the tool origin's read on the world axes. Feed a joystick command like "forward at 5 cm/s" directly as \(\mathbf v_s\) to \(J_s\) and, whenever a rotation is present, the tool point acquires an extra \(\boldsymbol\omega\times\mathbf p\); the farther the reference is from the world origin, the worse it gets. The conversion \(\mathbf v_s=\dot{\mathbf p}-\boldsymbol\omega\times\mathbf p\) in FIG 5's "base-frame command" supplies exactly this term.

    误区 2:把角速度当成欧拉角(或旋转向量)的导数Pitfall 2: treating angular velocity as the derivative of Euler angles (or of a rotation vector)

    \(\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\),漏掉它,姿态积分会以两倍的速度转,而且看起来仍然合理,因为四元数仍是单位的。

    \(\boldsymbol\omega\ne(\dot\psi,\dot\theta,\dot\varphi)\): they differ by a posture-dependent matrix \(E\), which is singular at pitch \(\pm90^\circ\) (FIG 4). Likewise, the derivative of a rotation vector \(\boldsymbol\phi=\theta\hat{\mathbf n}\) is not the angular velocity (it differs by the inverse left Jacobian \(J_l^{-1}\), Lesson 5.7). With quaternions, remember the \(\tfrac12\) in \(\dot{\mathbf q}=\tfrac12\boldsymbol\omega\otimes\mathbf q\); forget it and the orientation integrates at twice the speed while still looking plausible, since the quaternion stays unit-length.

    误区 3:对 6 行混合量纲的矩阵直接做 SVDPitfall 3: taking an SVD of a six-row matrix of mixed units

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

    The values of \(\sigma_{\min}\), the condition number and the manipulability of \(J\) depend on whether you use metres or millimetres (the \(L\) slider in FIG 3). A threshold such as "\(\sigma_{\min}<0.05\) means close to singular" makes sense only under one fixed convention. It is safer to look at \(J_v\) and \(J_\omega\) separately (each is dimensionally consistent but, as the "wrist" case of FIG 3 shows, they miss mixed directions) or to pick a characteristic length that fits the task. Whether the arm is singular (the rank) is unaffected.

    误区 4:奇异位形只在工作空间的边缘Pitfall 4: singularities occur only at the edge of the workspace

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

    The elbow singularity (stretched or folded) is on the boundary, but the shoulder singularity (the wrist centre crossing J1's axis) and the wrist singularity (\(\theta_5=0\)) lie in the interior of the workspace. A hand that has to pass "over the robot's head" or keep the tool pointing straight down while \(\theta_5\) crosses 0 runs right into them. Planning a Cartesian straight line therefore cannot check only the start and the goal; the sign flip of the determinant in FIG 3 is a warning: crossing a singularity often means the IK solution changes branch and the joints jump.

    误区 5:把 \(J\) 当成常数Pitfall 5: treating \(J\) as a constant

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

    Every column of \(J(\boldsymbol\theta)\) changes with the configuration, and \(\boldsymbol\xi=J\dot{\boldsymbol\theta}\) is an instantaneous relation. With the pseudo-inverse, the end error of the "matched" Jacobian in FIG 5 is not 0 precisely because \(J\) changes during each 20 ms cycle (with damped least squares the damping adds a bias on top). The remedies are a shorter cycle, closing the loop with pose feedback, or recomputing \(J\) at every step in IK (Lesson 7.5). Likewise, to "measure" the hand's velocity from two poses divided by the time step, use \(\log\) to get the twist rather than subtracting the \(4\times4\) matrices element by element.

    8小练习Check yourself

    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)\) 是?1. A spatial 2R arm: joint 1 about \(\hat{\mathbf z}\) (through the origin), joint 2 about \(\hat{\mathbf y}\) (through the point \((0,0,0.5)\)). At home \(S_2=(0,1,0;\,-0.5,0,0)\). At \(\theta_1=90^\circ\), what is the second column \(J_{s,2}=(\boldsymbol\omega;\mathbf v)\) of the space Jacobian?
    \(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\)。\(J_{s,2}=\operatorname{Ad}_{e^{[S_1]\theta_1}}S_2\). \(e^{[S_1]\theta_1}\) is a rotation by \(90^\circ\) about the \(z\)-axis through the origin, \(R=R_z(90^\circ)\), \(\mathbf t=0\), so \(\operatorname{Ad}=\operatorname{diag}(R,R)\): \(R(0,1,0)=(-1,0,0)\) and \(R(-0.5,0,0)=(0,-0.5,0)\). Check: the point \((0,0,0.5)\) on the axis has velocity \(\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\). Option A forgets to carry the axis (the home \(S_2\)); C has the wrong sign of \(\mathbf v\), so a point on the axis would move; D rotated the wrong way, by \(-90^\circ\).
    2. 操作员推 SpaceMouse,意思是"沿夹爪自己的接近轴(工具 \(z\) 轴)以 0.1 m/s 前进,不转动"。控制器应该解哪个方程?2. The operator pushes a SpaceMouse meaning "advance along the gripper's own approach axis (tool \(z\)) at 0.1 m/s, no rotation". Which equation should the controller solve?
    机体 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\) 把力映到力矩,不是速度的逆。The linear part of the body twist \(\boldsymbol\xi_b\) is the tool origin's velocity read on the tool axes, so "0.1 m/s along tool \(z\)" is \(\boldsymbol\xi_b=(0,0,0;0,0,0.1)\) and goes with \(J_b\). Feed it to \(J_s\) and it means "the point at the world origin moves along world \(z\)", unrelated to the operator's intent. To use \(J_s\) you must change frame first: \(\boldsymbol\xi_s=\operatorname{Ad}_T\boldsymbol\xi_b\). \(J_b^\top\) maps forces to torques; it is not the inverse for velocities.
    3. 6R 臂处于一个奇异位形。下列哪个说法正确?3. A 6R arm is in a singular posture. Which statement is correct?
    秩 \(<6\) 意味着 \(J\) 的列空间不是整个 \(\R^6\)(丢了一个 twist 方向),同时 \(J^\top\) 有非平凡零空间(\(J^\top\boldsymbol\lambda=0\) 的 wrench \(\boldsymbol\lambda\))。手臂照常能动,只是少了一个自由度;FK 在奇异点处完全正常;反过来,正因为秩亏,存在非零的关节速度(\(J\) 的零空间)使手爪不动,所以选项 D 也是错的。Rank \(<6\) means the column space of \(J\) is not all of \(\R^6\) (a twist direction is missing) and \(J^\top\) has a non-trivial null space (a wrench \(\boldsymbol\lambda\) with \(J^\top\boldsymbol\lambda=0\)). The arm moves as usual, only with one degree of freedom less; FK is perfectly fine at a singularity; and because of the rank drop there are non-zero joint rates (the null space of \(J\)) that leave the hand still, so D is false as well.
    4. 手爪以 \(\boldsymbol\omega_s=(1,0,0)\) rad/s(绕世界 \(x\) 轴)转动,ZYX 欧拉角 \(\psi=0\),俯仰角 \(\theta=89^\circ\)。需要的欧拉角速度 \((\dot\psi,\dot\theta,\dot\varphi)\) 约为?4. The hand rotates with \(\boldsymbol\omega_s=(1,0,0)\) rad/s (about the world \(x\)-axis); the ZYX Euler angles are \(\psi=0\) and pitch \(\theta=89^\circ\). The Euler-angle rates \((\dot\psi,\dot\theta,\dot\varphi)\) needed are about
    令 \(\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 反向"拉扯",合成一个小转动:这就是万向节锁。With \(\psi=0\): \(E=\begin{bmatrix}0&0&\cos\theta\\0&1&0\\1&0&-\sin\theta\end{bmatrix}\); solve \(E(\dot\psi,\dot\theta,\dot\varphi)^\top=(1,0,0)^\top\): row 2 gives \(\dot\theta=0\), row 1 gives \(\dot\varphi=1/\cos\theta\approx57.3\), row 3 gives \(\dot\psi=\dot\varphi\sin\theta=\tan\theta\approx57.3\). A true rotation of 1 rad/s needs two Euler angles to "pull against each other" at 57 rad/s each: that is gimbal lock.
    5. 一台臂的 \(6\times6\) 雅可比,长度单位用米时 \(\sigma_{\min}=0.2\)。同事用毫米重算(转动行不变,平移行乘 1000)。哪个说法对?5. The \(6\times6\) Jacobian of an arm has \(\sigma_{\min}=0.2\) with lengths in metres. A colleague recomputes it in millimetres (rotation rows unchanged, translation rows multiplied by 1000). Which is true?
    乘以一个可逆的对角矩阵(行缩放)不改变秩,所以奇异与否不依赖单位;但它不是正交变换,奇异值会改变,条件数也会。这正是 FIG 3 的 \(L\) 滑块要演示的,也是为什么阈值判断要先约定单位或分块分析。Multiplying by an invertible diagonal matrix (row scaling) leaves the rank alone, so whether the arm is singular does not depend on units; but the scaling is not orthogonal, so the singular values change, and so does the condition number. This is what the \(L\) slider in FIG 3 shows, and why a threshold test needs agreed units or a block-wise analysis.

    9延伸阅读Further reading

    • K. Lynch & F. Park, Modern Robotics, Ch. 5 (Velocity Kinematics and Statics) — 空间/机体雅可比、奇异位形、可操作度椭球;本课的符号与顺序以它为准space and body Jacobians, singularities, manipulability ellipsoids; this lesson's notation and ordering follow it
    • R. Murray, Z. Li, S. Sastry, A Mathematical Introduction to Robotic Manipulation, Ch. 3 (Manipulator Kinematics) — 用螺旋理论推导机械臂雅可比与冗余、奇异性the manipulator Jacobian, redundancy and singularities via screw theory
    • B. Siciliano, L. Sciavicco, L. Villani, G. Oriolo, Robotics: Modelling, Planning and Control, Ch. 3 (Differential Kinematics and Statics) — 几何(混合)雅可比与解析雅可比,欧拉角的表示奇异the geometric (hybrid) and analytic Jacobians, and representation singularities of Euler angles
    • R. Featherstone, Rigid Body Dynamics Algorithms, Springer, 2008, Ch. 2 — 空间向量(运动向量与力向量)记号,是后面动力学章节的预告spatial vector notation (motion and force vectors), a preview of the dynamics chapters
    • T. Yoshikawa, "Manipulability of Robotic Mechanisms", Int. J. Robotics Research 4(2), 1985 — 可操作度指标与椭球的出处the source of the manipulability measure and ellipsoid
    • J. Solà, Quaternion kinematics for the error-state Kalman filter, arXiv:1711.02508, 2017 — 四元数导数与角速度(含 ½ 因子)的两种约定quaternion derivatives and angular velocity (with the ½ factor) under both conventions