指数积公式与正运动学Product of Exponentials & Forward Kinematics
机械臂的每个关节,都是绕着一根空间中固定的轴做螺旋运动。把各个关节的指数映射 Exp(Sᵢθᵢ) 依次乘起来,再乘上零位时的末端位姿 M,就得到末端的位姿。这就是指数积公式:不用逐连杆建系,只需要看着机械臂的零位图写下每个关节轴。 Every joint of a robot arm is a screw motion about an axis that is fixed in space at the home pose. Multiply the joints' exponentials Exp(Sᵢθᵢ) one after another, then the end-effector pose at home, M, and you get the end-effector pose. That is the product-of-exponentials formula: no per-link frame assignment, just look at the arm in its home pose and write down each joint axis.
1为什么机器人需要它Why robots need this
正运动学 (forward kinematics, FK) 回答机械臂最基本的问题:给定每个关节的角度,末端执行器在哪里、朝向哪里?输入是关节向量 \(\boldsymbol\theta = (\theta_1,\dots,\theta_n)\),输出是末端位姿 \(T(\boldsymbol\theta)\in\SE\)。控制器每个周期都要算它;逆运动学(给定末端位姿求关节角)要反复调用它;碰撞检测要用它算出每一节连杆在世界里的位置;运动规划、标定、可视化都离不开它。
传统上,教科书用 Denavit-Hartenberg (DH) 参数:给每个连杆按一套约定建立坐标系,每个关节用 4 个参数描述,再把相邻连杆的 4×4 变换一个个乘起来。它能用,可是建系的约定很多(标准 DH、改进 DH),遇到相邻关节轴平行或相交时约定会有歧义,而且你要在图上一个一个地找公共法线。
另一种写法是指数积公式 (product of exponentials, PoE),它直接使用你在 5.6 节认识的螺旋运动:每个关节就是绕空间中一根固定轴的螺旋运动。只需要一个世界坐标系、一张"零位"(所有关节角为 0)时的图,写出每根关节轴的螺旋轴 \(S_i\) 和零位时末端的位姿 \(M\),就可以直接写出 FK。它的"每个关节一个指数"的结构,还让速度运动学(雅可比,3.4 节)自然地长出来。
Forward kinematics (FK) answers the most basic question about an arm: given every joint angle, where is the end effector and which way does it point? The input is the joint vector \(\boldsymbol\theta = (\theta_1,\dots,\theta_n)\) and the output is the end-effector pose \(T(\boldsymbol\theta)\in\SE\). Controllers evaluate it every cycle; inverse kinematics (joint angles from a desired pose) calls it over and over; collision checking uses it to place every link in the world; planning, calibration and visualization all depend on it.
Textbooks traditionally use Denavit-Hartenberg (DH) parameters: a frame is assigned to every link by a convention, every joint is described by four parameters, and the 4×4 transforms of neighbouring links are multiplied one by one. It works, but there are many conventions (standard DH, modified DH), they become ambiguous when neighbouring joint axes are parallel or intersecting, and you must find the common normals one by one on the drawing.
The alternative is the product of exponentials (PoE) formula, which uses the screw motions you met in Lesson 5.6 directly: every joint is a screw motion about one axis fixed in space. You need one world frame and one picture of the "home" pose (all joint angles zero); write down each joint's screw axis \(S_i\) and the end-effector pose at home, \(M\), and FK follows. Its "one exponential per joint" structure also lets the velocity kinematics (the Jacobian, Lesson 3.4) grow out naturally.
2直觉:关节 = 一根固定的螺旋轴Intuition: a joint is a fixed screw axis
想象把机械臂摆成零位,然后只转动第 \(i\) 个关节,其他关节锁死。第 \(i\) 个关节之后的所有连杆会作为一个整体,绕着关节 \(i\) 的轴转。这是一次纯转动(转动关节),或者一次纯平移(移动关节)。把它写成 5.6 节的螺旋轴 \(S_i = (\boldsymbol\omega_i, \mathbf v_i)\):转动 \(\theta_i\) 弧度的运动就是 \(\Exp(S_i\theta_i)\)。
怎么从零位图上读出 \(S_i\)?只需要两个信息:轴的方向 \(\hat{\boldsymbol\omega}_i\)(单位向量),和轴上任意一点 \(\mathbf q_i\)。5.6 节的螺旋参数公式反过来用:
Put the arm in its home pose and rotate only joint \(i\), with all other joints locked. Everything after joint \(i\) moves as one rigid body about the axis of joint \(i\). That is a pure rotation (for a revolute joint) or a pure translation (for a prismatic joint). Written as a screw axis \(S_i = (\boldsymbol\omega_i, \mathbf v_i)\) from Lesson 5.6, turning by \(\theta_i\) radians is \(\Exp(S_i\theta_i)\).
How do you read \(S_i\) off the home-pose drawing? You need only two things: the direction \(\hat{\boldsymbol\omega}_i\) of the axis (a unit vector) and any point \(\mathbf q_i\) on it. The screw-parameter formula of Lesson 5.6, used backwards:
顺序仍是 \((\boldsymbol\omega,\mathbf v)\)。转动关节要求 \(\|\hat{\boldsymbol\omega}\| = 1\),这样 \(\theta_i\) 的单位就是弧度;移动关节要求 \(\|\hat{\mathbf s}\|=1\),\(\theta_i\) 的单位就是米。最容易搞错的是 \(\mathbf v = -\hat{\boldsymbol\omega}\times\mathbf q\) 这一项:\(\mathbf v\) 不是轴上的点的速度,而是"此刻恰好在世界原点的那个点"的速度(5.8 节);轴离原点越远,\(\mathbf v\) 越大。下面的实验让你自己摆一根轴,看 \(S\) 怎么变。黄色箭头是世界原点那个点的速度 \(\mathbf v\),紫色小球是点 \(\mathbf q\),青色曲线是一个固定在运动物体上的测试点 \(\mathbf p\)(初始在 \((1.5,\,-0.6,\,0.8)\))在 \(\Exp(sS)\) 下走过的路径。
The order is still \((\boldsymbol\omega,\mathbf v)\). A revolute joint needs \(\|\hat{\boldsymbol\omega}\| = 1\) so that \(\theta_i\) is in radians; a prismatic joint needs \(\|\hat{\mathbf s}\|=1\) so that \(\theta_i\) is in metres. The easiest term to get wrong is \(\mathbf v = -\hat{\boldsymbol\omega}\times\mathbf q\): \(\mathbf v\) is not the velocity of a point on the axis but that of "the point currently at the world origin" (Lesson 5.8); the farther the axis is from the origin, the bigger \(\mathbf v\). The lab below lets you place an axis yourself and see how \(S\) changes. The amber arrow is the velocity \(\mathbf v\) of the point at the world origin, the purple ball is \(\mathbf q\), and the teal curve is the path of a test point \(\mathbf p\) fixed to the moving body (starting at \((1.5,\,-0.6,\,0.8)\)) under \(\Exp(sS)\).
- 做一个绕 z 轴、过点 \((1,0,0)\) 的转动关节。读数里的 \(S\) 应该是 \((0,0,1;\ 0,-1,0)\)。把轴平移到过原点,\(\mathbf v\) 变成了什么?Make a revolute joint about the z-axis through the point \((1,0,0)\). The readout should show \(S = (0,0,1;\ 0,-1,0)\). Slide the axis through the origin: what does \(\mathbf v\) become?
- 切换到移动关节,让它沿 x 轴运动:\(S = (0,0,0;\ 1,0,0)\)。这时测试点 \(\mathbf p\) 的路径是什么形状?轴的位置 \(\mathbf q\) 还重要吗?Switch to a prismatic joint moving along the x-axis: \(S = (0,0,0;\ 1,0,0)\). What shape is the test point's path? Does the position \(\mathbf q\) still matter?
3动手玩:把机械臂"展开"Play: unfolding the arm
从最简单的平面二连杆 (2R) 开始:连杆长 \(L_1, L_2\),两个转动关节,轴都垂直纸面(z 方向)。零位时手臂沿 x 轴完全伸直,末端在 \(M = \text{Trans}(L_1+L_2,\,0,\,0)\)。关节 1 在原点,关节 2 在 \(\mathbf q_2 = (L_1, 0, 0)\),所以
Start with the simplest planar two-link arm (2R): link lengths \(L_1, L_2\), two revolute joints with axes perpendicular to the paper (the z direction). At home the arm lies straight along the x-axis and its tip is at \(M = \text{Trans}(L_1+L_2,\,0,\,0)\). Joint 1 is at the origin and joint 2 at \(\mathbf q_2 = (L_1, 0, 0)\), so
读公式的办法是从右往左。先看 \(M\):手臂摆在零位,这是起点。然后施加 \(\Exp(S_2\theta_2)\):绕关节 2 的轴转动第二根连杆。这根轴是零位时的位置 \((L_1,0)\),此刻连杆 1 还没动,轴就在那里。最后施加 \(\Exp(S_1\theta_1)\):绕原点把整条手臂(已经弯好的)转一个 \(\theta_1\)。\(S_2\) 的位置始终取自零位,不会随着关节 1 转动而改变,原因是后面的 \(\Exp(S_1\theta_1)\) 会把它也一起带走。FIG 2 里拖动"阶段"滑块,演示这个展开的过程。
The way to read it is from right to left. Start with \(M\): the arm at home. Then apply \(\Exp(S_2\theta_2)\): rotate the second link about joint 2's axis. That axis is at its home position \((L_1,0)\); link 1 has not moved yet, so the axis is right there. Finally apply \(\Exp(S_1\theta_1)\): rotate the whole (already bent) arm about the origin by \(\theta_1\). \(S_2\) always takes its location from the home pose and does not change as joint 1 turns, because the later \(\Exp(S_1\theta_1)\) carries it along. Drag the "stage" slider in FIG 2 to watch this unfolding.
- 把两个关节角都设成 \(|\theta| > 20^\circ\),再把阶段拖到 2。比较紫点(\(S_2\) 的位置)和真正的肘部:它们为什么不在同一处?Set both joint angles to \(|\theta| > 20^\circ\) and drag the stage to 2. Compare the purple dot (where \(S_2\) sits) with the real elbow: why are they not in the same place?
- 设 \(\theta_1 = 90^\circ\),\(\theta_2 = 90^\circ\),阶段 = 2。由三角公式,末端在 \((L_1\cos\theta_1 + L_2\cos(\theta_1+\theta_2),\ L_1\sin\theta_1 + L_2\sin(\theta_1+\theta_2)) = (-L_2,\ L_1)\)。读数里的 PoE 结果一致吗?Set \(\theta_1 = 90^\circ\), \(\theta_2 = 90^\circ\), stage = 2. The trigonometric formula gives the tip at \((L_1\cos\theta_1 + L_2\cos(\theta_1+\theta_2),\ L_1\sin\theta_1 + L_2\sin(\theta_1+\theta_2)) = (-L_2,\ L_1)\). Does the PoE readout agree?
三维:一条 6 自由度机械臂In 3D: a six-degree-of-freedom arm
同样的做法对任意机械臂都成立。FIG 3 是一条带球形手腕的 6R 臂:关节 1 是腰部转动(绕 z),关节 2 和 3 是肩、肘(绕 \(-y\),使正角度把手臂抬起来),关节 4、5、6 是手腕(绕 x、\(-y\)、x,三根轴交于同一点)。零位时手臂沿 x 轴水平伸直,肩高 \(H\)。每个关节的轴方向 \(\hat{\boldsymbol\omega}_i\) 与轴上一点 \(\mathbf q_i\) 如下,读数面板会实时列出对应的 \(S_i\):
The same recipe works for any arm. FIG 3 is a 6R arm with a spherical wrist: joint 1 is the waist (about z), joints 2 and 3 are the shoulder and elbow (about \(-y\), so that positive angles raise the arm), and joints 4, 5, 6 form the wrist (about x, \(-y\), x, with the three axes meeting in one point). At home the arm lies horizontally along the x-axis at shoulder height \(H\). The axis direction \(\hat{\boldsymbol\omega}_i\) and a point \(\mathbf q_i\) on each axis are listed below; the readout panel lists the resulting \(S_i\) live:
| i | 关节Joint | \(\hat{\boldsymbol\omega}_i\) | \(\mathbf q_i\) |
|---|---|---|---|
| 1 | 腰waist | \((0,0,1)\) | \((0,0,0)\) |
| 2 | 肩shoulder | \((0,-1,0)\) | \((0,0,H)\) |
| 3 | 肘elbow | \((0,-1,0)\) | \((L_1,0,H)\) |
| 4 | 腕 1wrist 1 | \((1,0,0)\) | \((L_1+L_2,0,H)\) |
| 5 | 腕 2wrist 2 | \((0,-1,0)\) | \((L_1+L_2,0,H)\) |
| 6 | 腕 3wrist 3 | \((1,0,0)\) | \((L_1+L_2,0,H)\) |
FIG 3 里取 \(H=0.6\)、\(L_1=1.0\)、\(L_2=0.9\);手腕中心之外还有一段长 \(L_3=0.35\) 的工具,所以零位末端位姿是 \(M=\text{Trans}(L_1+L_2+L_3,\,0,\,H)\),朝向与世界系相同。
FIG 3 uses \(H=0.6\), \(L_1=1.0\), \(L_2=0.9\), plus a tool of length \(L_3=0.35\) beyond the wrist centre, so the home end-effector pose is \(M=\text{Trans}(L_1+L_2+L_3,\,0,\,H)\), aligned with the world frame.
- 先点"零位"。然后只转动手腕三个关节(任一个超过 \(30^\circ\))。手腕中心点(肘部右侧那个三轴交点)动了吗?工具尖怎么动?Press "Home". Then move only the three wrist joints (any one beyond \(30^\circ\)). Does the wrist centre (the point where the three wrist axes meet) move? How does the tool tip move?
- 设 \(\theta_2 = 45^\circ\),\(\theta_3 = -90^\circ\),其余为 0。前臂此时朝斜下方。由 \(z = H + L_1\sin 45^\circ + (L_2+L_3)\sin(-45^\circ)\) 预测末端高度,再和读数核对。Set \(\theta_2 = 45^\circ\), \(\theta_3 = -90^\circ\) and the rest to 0. The forearm now points diagonally down. Predict the tip height from \(z = H + L_1\sin 45^\circ + (L_2+L_3)\sin(-45^\circ)\) and check it against the readout.
4再看数学The math
提示:把鼠标悬停在公式中带底色的符号上,FIG 1 或 FIG 3 中对应的元素会被高亮。Tip: hover the highlighted symbols in the formulas; the matching element in FIG 1 or FIG 3 lights up.
指数积公式The product-of-exponentials formula
其中 \(S_i\) 是第 \(i\) 个关节的螺旋轴,在零位时用世界系写出;\(M\) 是零位时的末端位姿;\(G(\theta)\) 是 5.6 节 \(V\) 矩阵在单位 \(\hat{\boldsymbol\omega}\) 下的写法。对移动关节,\(\Exp(S\theta) = \begin{bmatrix}I & \hat{\mathbf s}\theta\\ 0 & 1\end{bmatrix}\)。
where \(S_i\) is the screw axis of joint \(i\), written in the world frame at the home pose; \(M\) is the end-effector pose at home; and \(G(\theta)\) is the \(V\) matrix of Lesson 5.6 for a unit \(\hat{\boldsymbol\omega}\). For a prismatic joint, \(\Exp(S\theta) = \begin{bmatrix}I & \hat{\mathbf s}\theta\\ 0 & 1\end{bmatrix}\).
为什么公式是对的Why the formula is right
用归纳法。只动关节 \(n\):末端相当于被绕轴 \(S_n\) 转,\(T = \Exp(S_n\theta_n)M\)(轴的位置是零位的)。再让关节 \(n-1\) 动起来:它让"第 \(n-1\) 个关节之后的整体"(包括关节 \(n\) 的轴、末端)绕 \(S_{n-1}\) 做一次刚体运动。对世界系里的一个刚体运动 \(\Exp(S_{n-1}\theta_{n-1})\),作用到已有位姿上就是左乘(5.6 节误区 4),所以 \(T = \Exp(S_{n-1}\theta_{n-1})\Exp(S_n\theta_n)M\)。依此类推。结果的形状是:越靠近基座的关节,越靠左。
By induction. Move only joint \(n\): the end effector is rotated about \(S_n\), \(T = \Exp(S_n\theta_n)M\) (with the axis at its home location). Now let joint \(n-1\) move too: it applies a rigid motion about \(S_{n-1}\) to "everything after joint \(n-1\)" (including joint \(n\)'s axis and the end effector). A rigid motion expressed in the world frame acts on an existing pose by left multiplication (Pitfall 4 of Lesson 5.6), so \(T = \Exp(S_{n-1}\theta_{n-1})\Exp(S_n\theta_n)M\). And so on. The resulting shape: the closer a joint is to the base, the further left it sits.
机体形式The body form
也可以把螺旋轴写在末端坐标系里(零位时)。用 5.8 节的 \(M\,\Exp(B\theta)M^{-1} = \Exp(\operatorname{Ad}_M B\,\theta)\),令 \(S_i = \operatorname{Ad}_M B_i\),把所有 \(M\) 依次挪到最右边,得到:
One can also write the screw axes in the end-effector frame (at home). Using \(M\,\Exp(B\theta)M^{-1} = \Exp(\operatorname{Ad}_M B\,\theta)\) from Lesson 5.8 with \(S_i = \operatorname{Ad}_M B_i\), and moving all the \(M\)'s to one side, gives
两种形式算出同一个 \(T\),只是读轴的坐标系不同(FIG 3 的读数同时算了两个)。对 2R 例子,\(B_1 = (0,0,1;\ 0,\,L_1+L_2,\,0)\),\(B_2 = (0,0,1;\ 0,\,L_2,\,0)\):轴在末端系里分别离末端 \(L_1+L_2\) 和 \(L_2\)。
The two forms give the same \(T\); only the frame in which the axes are read differs (FIG 3's readout computes both). For the 2R example, \(B_1 = (0,0,1;\ 0,\,L_1+L_2,\,0)\) and \(B_2 = (0,0,1;\ 0,\,L_2,\,0)\): the axes are \(L_1+L_2\) and \(L_2\) away from the tip in the end-effector frame.
与 DH 参数对照Comparison with DH parameters
| DH 参数DH parameters | 指数积 (PoE)PoE | |
|---|---|---|
| 坐标系Frames | 每个连杆一个,按约定建立one per link, built by convention | 只要一个世界系和一个末端零位 \(M\)one world frame and one end-effector home pose \(M\) |
| 每个关节的数据Data per joint | \((a,\alpha,d,\theta)\),其中一个是变量\((a,\alpha,d,\theta)\), one of which is the variable | 零位时的轴 \(S_i\),变量是 \(\theta_i\)the home-pose axis \(S_i\); the variable is \(\theta_i\) |
| 轴平行或相交Parallel or intersecting axes | 公共法线不唯一,需要额外约定the common normal is not unique; extra conventions needed | 没有特殊情形no special cases |
| 变体Variants | 标准 DH、改进 DH,符号和顺序都不同standard vs. modified DH, with different signs and orders | 空间形式、机体形式(用 \(\operatorname{Ad}\) 互换)space form, body form (interchanged by \(\operatorname{Ad}\)) |
| 雅可比Jacobian | 另外推导derived separately | 第 \(i\) 列 \(=\operatorname{Ad}_{\Exp(S_1\theta_1)\cdots\Exp(S_{i-1}\theta_{i-1})}S_i\)column \(i\) \(=\operatorname{Ad}_{\Exp(S_1\theta_1)\cdots\Exp(S_{i-1}\theta_{i-1})}S_i\) |
| 优点Strengths | 厂商手册、旧代码里很常见;参数少,表格紧凑common in vendor manuals and legacy code; compact tables | 几何含义直接,容易推广到并联、软体等结构direct geometric meaning; extends easily to parallel and other structures |
两种写法描述的是同一台机器,可以互相换算。机器人描述文件 URDF 对每个关节写的是"父连杆到关节的固定变换 + 轴向量",精神上更接近 PoE 的局部形式,而不是 DH。
Both describe the same machine and can be converted into each other. The URDF robot description lists for each joint "a fixed transform from the parent link plus an axis vector", which is closer in spirit to a local form of PoE than to DH.
通向雅可比Towards the Jacobian
对 \(T(\boldsymbol\theta)\) 求导,第 \(i\) 个关节转动一点,等于对第 \(i\) 个因子的右边所有东西做一次左乘,用 5.8 节的结论,空间雅可比的第 \(i\) 列就是"关节 \(i\) 的轴,在当前位形下的样子":
Differentiating \(T(\boldsymbol\theta)\): turning joint \(i\) a little acts as a left multiplication on everything to its right; by Lesson 5.8 the \(i\)-th column of the space Jacobian is "the axis of joint \(i\) as it looks in the current configuration":
3.4 节已经从几何上造出了同样的列(那里把线速度放在上面、角速度放在下面,与这里的 \((\boldsymbol\omega,\mathbf v)\) 顺序相反);Part II 的 7.4 节会在此基础上讨论雅可比的性质、奇异性和它的用法。
Lesson 3.4 already built the same columns from geometry (stacked with linear velocity on top and angular velocity below, the reverse of the \((\boldsymbol\omega,\mathbf v)\) order used here); Lesson 7.4 in Part II builds on this to discuss the Jacobian, its singularities and its uses.
5机器人中的它:可达工作空间In robotics: the reachable workspace
买一台机械臂、布置一个工作站时,第一个问题是:它够得着吗?够得着的区域叫可达工作空间。最直接的办法就是让 FK 来回答:在关节范围内随机抽很多个 \(\boldsymbol\theta\),每个都算一次 \(T(\boldsymbol\theta)\),把工具尖的位置画成一团点云。这个云就是工作空间的近似,云的边缘就是机械臂的"够得着的极限"。FIG 4 用 FIG 3 同一台 6R 臂做这件事。滑块调的是各个关节的活动范围(关节 2、3 的范围分别以 \(30^\circ\) 和 \(-60^\circ\) 为中心的半宽)。
Buying an arm and laying out a workcell starts with: can it reach? The region it can reach is the reachable workspace, and the most direct way to get it is to let FK answer: sample many random \(\boldsymbol\theta\) within the joint ranges, evaluate \(T(\boldsymbol\theta)\) for each, and plot the tool-tip positions as a point cloud. The cloud approximates the workspace and its edge is the arm's "limit of reach". FIG 4 does this with the same 6R arm as FIG 3. The sliders set each joint's range (the half-widths of the ranges of joints 2 and 3, centred at \(30^\circ\) and \(-60^\circ\)).
- 把腰部范围和手腕范围都设成 0。云变成了什么形状?这和 2R 平面臂的工作空间有什么关系?Set the waist range and the wrist range both to 0. What shape does the cloud take? How is it related to the workspace of a planar 2R arm?
- 调整关节范围和工具长度,使最大水平伸展超过 2.3(读数里的 "最大水平伸展")。伸展上限由哪几个量决定?Adjust the joint ranges and the tool length until the maximum horizontal reach exceeds 2.3 (the "max horizontal reach" in the readout). Which quantities set the upper limit?
逆运动学(Part II)迭代求解 \(T(\boldsymbol\theta) = T_{\text{goal}}\),每一步都要调用 FK 和上面的雅可比。碰撞检测把每个连杆的几何体放到 \(T_i(\boldsymbol\theta)\) 上。标定要把测量到的末端位姿与 FK 的预测比较,反过来调整 \(S_i\) 和 \(M\):PoE 的参数随几何误差平滑变化,相邻轴平行时也不会像 DH 那样出现奇异(一个微小的偏差就让 DH 参数跳变),因此很适合做这种参数辨识。运动规划(MoveIt、OMPL 等)在关节空间里采样,用 FK 把采样转到笛卡尔空间检查约束。URDF/SDF 里的关节原点和轴,加上 Pinocchio、KDL 这类库里的 FK 实现,本质上都是在算同一个乘积。
Inverse kinematics (Part II) iterates to solve \(T(\boldsymbol\theta) = T_{\text{goal}}\), calling FK and the Jacobian above at every step. Collision checking places each link's geometry at \(T_i(\boldsymbol\theta)\). Calibration compares measured end-effector poses with FK predictions and adjusts \(S_i\) and \(M\); PoE parameters change smoothly with small geometric errors and, unlike DH, have no singularity when neighbouring axes are parallel (where a tiny misalignment makes DH parameters jump), so PoE is well suited to such parameter identification. Motion planning (MoveIt, OMPL, ...) samples in joint space and uses FK to check constraints in Cartesian space. The joint origins and axes in URDF/SDF files, together with the FK in libraries such as Pinocchio and KDL, all compute essentially this same product.
6常见误区Common pitfalls
PoE 空间形式里的 \(S_i\) 必须是零位时的轴(FIG 3 的紫色虚线),一个都不能随着手臂移动而更新。关节 1 转动后,关节 2 的轴在世界里确实挪了位置,可是这一点已经由 \(\Exp(S_1\theta_1)\) 左乘处理了。重复更新一次,等于把这个转动算了两遍。
In the space form of PoE, \(S_i\) must be the axis at the home pose (the dashed purple lines in FIG 3), and none of them may be updated as the arm moves. After joint 1 turns, joint 2's axis really has moved in the world, but the left multiplication by \(\Exp(S_1\theta_1)\) already accounts for that. Updating it as well counts the rotation twice.
空间形式:\(\Exp(S_1\theta_1)\cdots\Exp(S_n\theta_n)M\),基座侧的关节在最左边。机体形式:\(M\Exp(B_1\theta_1)\cdots\Exp(B_n\theta_n)\),\(M\) 在最左边,而关节顺序依旧是 1 到 \(n\) 从左到右。把 \(M\) 放错侧,或者把关节顺序倒过来,FK 在 \(\boldsymbol\theta = 0\) 时仍然正确(所有指数都是单位阵),所以单靠零位测试发现不了,必须用非零位形核对。
Space form: \(\Exp(S_1\theta_1)\cdots\Exp(S_n\theta_n)M\), with the base-side joint on the far left. Body form: \(M\Exp(B_1\theta_1)\cdots\Exp(B_n\theta_n)\), with \(M\) on the left and the joints still ordered 1 to \(n\) from left to right. Put \(M\) on the wrong side or reverse the joint order and FK is still correct at \(\boldsymbol\theta = 0\) (all the exponentials are the identity), so a home-pose test cannot catch it; always check against a non-zero configuration.
写成 \(+\hat{\boldsymbol\omega}\times\mathbf q\) 会得到一根镜像到原点另一侧的轴,转动方向不变,位置却错了。\(\mathbf q\) 必须是世界系里、零位时轴上的一个点,任意哪个点都可以,因为沿轴平移 \(\mathbf q\) 时叉积不变。验证办法:用 FIG 1 那样的小实验,检查 \(S\) 在轴上点处的速度是否为零(转动关节)。
Writing \(+\hat{\boldsymbol\omega}\times\mathbf q\) gives an axis mirrored to the other side of the origin: the turning sense is right and the location is wrong. \(\mathbf q\) must be a point on the axis in the world frame at the home pose; any point will do, since the cross product is unchanged when \(\mathbf q\) slides along the axis. To verify, do what FIG 1 does: check that the velocity at a point on the axis is zero (for a revolute joint).
\(M\) 和 \(S_i\) 描述的"零位"必须与控制器里 \(\theta=0\) 对应的机械位置一致。很多商用机械臂的零点不是"完全伸直",甚至有一个固定的偏置。要么把偏置加到 \(\theta_i\) 里,要么按真实的零位重新写 \(M\) 和 \(S_i\)。轴的正方向也要和编码器的计数方向一致,不然关节转一个正角度,仿真里的手臂却往反方向走。
The "home" described by \(M\) and \(S_i\) must match the mechanical position that the controller calls \(\theta=0\). The zero of many commercial arms is not "fully stretched", and may even carry a fixed offset. Either add the offset to \(\theta_i\) or rewrite \(M\) and \(S_i\) for the real zero. The positive direction of each axis must also agree with the encoder's counting direction, or a positive joint command moves the simulated arm the wrong way.
本课的 \(S_i = (\boldsymbol\omega_i,\mathbf v_i)\),和 Modern Robotics 一致;有些库把平移放前面,引用现成的 \(S_i\) 表之前要先对齐。移动关节的 \(\theta_i\) 是长度,要和转动关节的弧度分开处理(尤其是写关节限位、做数值雅可比时)。DH 表与 PoE 的 \(S_i\) 不能直接混着用,转换时要把每个连杆的 DH 变换乘出来,再对照 \(M\) 与各个 \(S_i\)。
This lesson's \(S_i = (\boldsymbol\omega_i,\mathbf v_i)\) matches Modern Robotics; some libraries put translation first, so align the ordering before using an existing table of \(S_i\). A prismatic joint's \(\theta_i\) is a length and must be handled separately from the radians of revolute joints (especially for joint limits and numerical Jacobians). DH tables and PoE \(S_i\) must not be mixed freely; to convert, multiply out each link's DH transform and compare against \(M\) and the \(S_i\).
7小练习Check yourself
8延伸阅读Further reading
- K. Lynch & F. Park, Modern Robotics, Ch. 4 (Forward Kinematics) — 空间形式、机体形式、URDF;本课的记号和 (ω, v) 顺序与它一致space and body forms, URDF; the notation and (ω, v) ordering of this lesson follow it
- R. Brockett, "Robotic manipulators and the product of exponentials formula", in Mathematical Theory of Networks and Systems, Springer LNCIS 58, 1984 — 指数积公式的出处the original source of the PoE formula
- R. Murray, Z. Li, S. Sastry, A Mathematical Introduction to Robotic Manipulation, Ch. 3 — 用螺旋理论系统地推导正运动学和雅可比forward kinematics and the Jacobian derived systematically with screw theory
- B. Siciliano, L. Sciavicco, L. Villani, G. Oriolo, Robotics: Modelling, Planning and Control, Ch. 2 — DH 参数和标准的建系步骤DH parameters and the standard frame-assignment procedure
- J. Craig, Introduction to Robotics: Mechanics and Control, Ch. 3 — 改进 DH 的约定the modified-DH convention