伴随表示The Adjoint
同一个刚体运动,在世界系里看和在机体系里看,twist 的六个数不一样。伴随矩阵 Ad_T 就是两种看法之间的换算表:它把 twist 从一个坐标系搬到另一个坐标系,也把左扰动换成右扰动。机器人身上的传感器和控制器各用各的坐标系,没有它,数据就对不上。 The same rigid motion produces different six numbers when you read it in the world frame and in the body frame. The adjoint matrix Ad_T is the conversion table between the two views: it carries a twist from one frame to another and turns left perturbations into right ones. Sensors and controllers on a robot each live in their own frame, and without it the data would not line up.
1为什么机器人需要它Why robots need this
一台移动操作机器人身上有一串坐标系:世界系、底盘系、机械臂基座系、法兰盘系、相机系、工具系。每个传感器和每个控制器各讲各的坐标系:IMU 的陀螺仪测的是 IMU 系里的角速度,轮式里程计给的是底盘系里的速度,视觉伺服说"相机往右挪两厘米",是相机系里的指令,而机械臂控制器要的是基座系里的末端速度,腕部力传感器报告的力和力矩又在传感器系里。
如果只是位置向量,换系很简单:左乘一个旋转加上平移。可是速度不一样。一个刚体的速度不是一个向量,而是 6 个数 \((\boldsymbol\omega,\mathbf v)\),而且其中的线速度 \(\mathbf v\) 取决于"你问的是哪个点的速度"。把 twist 换到另一个坐标系,不仅要旋转,还要把"参考点"也换掉,中间多出一项由杠杆臂产生的 \(\mathbf t\times\boldsymbol\omega\)。完成这个换算的 6×6 矩阵,就是伴随矩阵 \(\operatorname{Ad}_T\)。
它还有两个更隐蔽的用处:把 5.7 节的左扰动换成右扰动,以及把一个坐标系里的协方差换到另一个坐标系里(5.9 节)。几乎每个涉及多坐标系的估计器或控制器里,都有一个 \(\operatorname{Ad}\)。
A mobile manipulator carries a string of frames: world, chassis, arm base, flange, camera, tool. Every sensor and every controller speaks its own frame. A gyro reports angular velocity in the IMU frame; wheel odometry gives the chassis-frame velocity; visual servoing says "move the camera two centimetres to the right", a command in the camera frame, while the arm controller wants an end-effector velocity in the base frame; and the wrist force sensor reports force and torque in the sensor frame.
For position vectors, changing frames is easy: one rotation and one translation. Velocity is different. The velocity of a rigid body is not a single vector but six numbers \((\boldsymbol\omega,\mathbf v)\), and the linear part \(\mathbf v\) depends on "which point's velocity are you asking about". Moving a twist to another frame means rotating it and also changing the reference point, which adds a lever-arm term \(\mathbf t\times\boldsymbol\omega\). The 6×6 matrix that does this conversion is the adjoint matrix \(\operatorname{Ad}_T\).
It has two quieter uses as well: converting the left perturbations of Lesson 5.7 into right ones, and moving a covariance from one frame to another (Lesson 5.9). Almost every estimator or controller that touches several frames has an \(\operatorname{Ad}\) hiding in it.
2直觉:同一个速度场,两种读法Intuition: one velocity field, two ways to read it
把一个正在运动的刚体想成一整片"橡皮板":板上每个点都有自己的速度,所有速度合起来是一个速度场。刚体运动的速度场很规整:\(\mathbf u(\mathbf x) = \mathbf u_0 + \boldsymbol\omega\times(\mathbf x-\mathbf x_0)\),只要知道角速度 \(\boldsymbol\omega\) 和某一个参考点 \(\mathbf x_0\) 的速度 \(\mathbf u_0\),整个场就确定了。twist 就是这 6 个数。区别只在于选哪个点做参考点,用哪套坐标轴读数:
- 机体 twist \(\boldsymbol\xi_b = (\boldsymbol\omega_b,\mathbf v_b)\):参考点是机体原点,数值在机体系的坐标轴上读出。这是机载传感器天然看到的:陀螺仪给 \(\boldsymbol\omega_b\),轮速给 \(\mathbf v_b\)。
- 空间 twist \(\boldsymbol\xi_s = (\boldsymbol\omega_s,\mathbf v_s)\):参考点是"此刻恰好位于世界原点的那个机体点"(想象橡皮板延伸到世界原点),数值在世界系的坐标轴上读出。这是 5.6 节里 \(\Exp(s\boldsymbol\xi)\) 的 \(\boldsymbol\xi\)。
下面先在平面上看,twist 只有三个数 \((\omega, v_x, v_y)\)。机器人在世界里有位姿 \(T\),正绕着某个瞬时转动中心 \(C\) 以角速度 \(\omega\) 转动。拖动机器人、它的朝向手柄和中心 \(C\),看两种读法如何变。青色小箭头就是整个速度场。
Think of a moving rigid body as a whole rubber sheet: every point on it has its own velocity, and together they form a velocity field. The field of a rigid motion is very regular, \(\mathbf u(\mathbf x) = \mathbf u_0 + \boldsymbol\omega\times(\mathbf x-\mathbf x_0)\): knowing the angular velocity \(\boldsymbol\omega\) and the velocity \(\mathbf u_0\) of one reference point \(\mathbf x_0\) fixes the entire field. A twist is those six numbers. What differs is which point is the reference, and which axes you read the numbers on:
- The body twist \(\boldsymbol\xi_b = (\boldsymbol\omega_b,\mathbf v_b)\): the reference point is the body origin, and the numbers are read on the body frame's axes. This is what on-board sensors naturally see: the gyro gives \(\boldsymbol\omega_b\), the wheel encoders give \(\mathbf v_b\).
- The spatial twist \(\boldsymbol\xi_s = (\boldsymbol\omega_s,\mathbf v_s)\): the reference point is "the body point that happens to sit at the world origin right now" (imagine the sheet extending to the world origin), and the numbers are read on the world frame's axes. This is the \(\boldsymbol\xi\) in \(\Exp(s\boldsymbol\xi)\) of Lesson 5.6.
Let us look at it in the plane first, where a twist has just three numbers \((\omega, v_x, v_y)\). A robot with pose \(T\) in the world is rotating at angular velocity \(\omega\) about an instantaneous centre \(C\). Drag the robot, its heading handle and the centre \(C\) and watch how the two readings change. The small cyan arrows are the entire velocity field.
- 把转动中心 \(C\) 拖到世界原点。\(\mathbf v_s\) 变成了什么?为什么?Drag the centre \(C\) onto the world origin. What does \(\mathbf v_s\) become, and why?
- 把 \(C\) 拖到机器人自己的原点(原地打转)。\(\mathbf v_b = 0\),但 \(\mathbf v_s\) 还是 0 吗?Drag \(C\) onto the robot's own origin (spinning in place). Then \(\mathbf v_b = 0\), but is \(\mathbf v_s\) still 0?
- 保持 \(C\) 和 \(\omega\) 不动,把机器人拖到离出发点 2 个单位以外。\(\boldsymbol\xi_b\) 和 \(\boldsymbol\xi_s\) 哪一个变了?Keep \(C\) and \(\omega\) fixed and drag the robot more than 2 units from where it started. Which of \(\boldsymbol\xi_b\) and \(\boldsymbol\xi_s\) changed?
你应该看到:\(\boldsymbol\xi_s\) 只取决于"世界里的运动本身"(转动中心和角速度),和机器人此刻在哪儿无关;\(\boldsymbol\xi_b\) 则取决于机器人的位姿,因为同一个运动,机器人站得不同,机体原点的速度就不同。\(\boldsymbol\xi_b\) 和 \(\boldsymbol\xi_s\) 之间的换算,是读数里的那个 3×3 矩阵 \(\operatorname{Ad}_T\)。注意它左下角的那一列 \((t_y,\,-t_x)\):这是杠杆臂,机器人离世界原点越远,两个读数差得越多。
You should see that \(\boldsymbol\xi_s\) depends only on "the motion itself in the world" (the centre and the angular velocity), not on where the robot happens to be, while \(\boldsymbol\xi_b\) depends on the robot's pose: the same motion gives the body origin a different velocity depending on where the robot stands. The conversion between \(\boldsymbol\xi_b\) and \(\boldsymbol\xi_s\) is the 3×3 matrix \(\operatorname{Ad}_T\) in the readout. Note its lower-left column \((t_y,\,-t_x)\): that is the lever arm, and the farther the robot is from the world origin, the more the two readings differ.
3动手玩:同一根螺旋轴,换个坐标系Play: the same screw axis in another frame
三维里也一样。在 5.6 节我们看到,每个 twist 都对应一根螺旋轴(轴线、转角、螺距)。机体 twist \(\boldsymbol\xi_b\) 在机体系里描述了一根轴;把机器人放到世界里的位姿 \(T\) 上,这根轴就跟着机器人一起搬到了世界里的某个位置,朝向某个方向。而空间 twist \(\boldsymbol\xi_s = \operatorname{Ad}_T\boldsymbol\xi_b\) 直接在世界系里描述螺旋轴。两者描述的是同一根轴:伴随矩阵只是改了读法。
FIG 2 验证这一点。宽而半透明的紫色实线带是"把机体系里的轴用 \(T\) 搬进世界"得到的轴(机体量,实线);紫色细虚线是用 \(\operatorname{Ad}_T\boldsymbol\xi_b\) 算出来的轴(空间量,虚线)。如果虚线始终落在实线带里(实线带只在两端露出头),说明 \(\operatorname{Ad}_T\) 做对了。读数还会显示螺距 \(h\) 和转角 \(\theta\):它们在换系时不变。
The same holds in 3D. Lesson 5.6 showed that every twist corresponds to a screw axis (a line, an angle and a pitch). The body twist \(\boldsymbol\xi_b\) describes an axis in the body frame; put the robot at pose \(T\) in the world and that axis is carried along to some place and direction in the world. The spatial twist \(\boldsymbol\xi_s = \operatorname{Ad}_T\boldsymbol\xi_b\) describes the screw axis directly in the world frame. Both describe the same axis: the adjoint only changes the reading.
FIG 2 checks this. The wide translucent solid purple band is the axis obtained by "carrying the body-frame axis into the world with \(T\)" (a body quantity, solid); the thin dashed purple line is the axis computed from \(\operatorname{Ad}_T\boldsymbol\xi_b\) (a spatial quantity, dashed). If the dashes stay inside the band (the band pokes out only at the ends), \(\operatorname{Ad}_T\) is doing its job. The readout also shows the pitch \(h\) and the angle \(\theta\): they do not change when the frame changes.
- 选"绕机体 z 轴自转"预设,把盒子移到离世界原点 1 个单位以外。机体 twist 的线速度是 0,空间 twist 的 \(\mathbf v_s\) 却不是 0(\(\|\mathbf v_s\| > 0.5\))。\(\mathbf v_s\) 等于什么?Pick the "spin about body z" preset and move the box more than 1 unit from the world origin. The body twist has zero linear part, yet the spatial \(\mathbf v_s\) does not (\(\|\mathbf v_s\| > 0.5\)). What is \(\mathbf v_s\) equal to?
- 选"纯平移"预设。\(\boldsymbol\omega = 0\) 时,\(\operatorname{Ad}_T\) 对 \(\mathbf v\) 做的只是旋转:\(\mathbf v_s = R\mathbf v_b\)。螺旋轴到哪儿去了?Pick the "pure translation" preset. With \(\boldsymbol\omega = 0\), \(\operatorname{Ad}_T\) only rotates \(\mathbf v\): \(\mathbf v_s = R\mathbf v_b\). Where did the screw axis go?
4再看数学The math
提示:把鼠标悬停在公式中带底色的符号上,FIG 1 的箭头或 FIG 2 的轴线会被高亮。Tip: hover the highlighted symbols in the formulas; the matching arrow in FIG 1 or axis in FIG 2 lights up.
共轭:把一个运动"搬到"另一个坐标系Conjugation: moving a motion into another frame
设 \(T=(R,\mathbf t)\),\(\boldsymbol\xi^\wedge\) 是 twist 的 4×4 矩阵(5.5 节)。直接做矩阵乘法:
Let \(T=(R,\mathbf t)\) and let \(\boldsymbol\xi^\wedge\) be the 4×4 matrix of a twist (Lesson 5.5). Multiplying out:
用到 \(R\skew{\boldsymbol\omega}R\T = \skew{R\boldsymbol\omega}\)(1.8 节、1.10 节)。右边仍然是一个 twist 的 hat,它的向量是 \((R\boldsymbol\omega,\ R\mathbf v + \skew{\mathbf t}R\boldsymbol\omega)\)。把这个线性映射写成 6×6 矩阵,就是伴随矩阵。对矩阵指数取共轭,指数符号里面的 twist 就换成 \(\operatorname{Ad}_T\boldsymbol\xi\):
using \(R\skew{\boldsymbol\omega}R\T = \skew{R\boldsymbol\omega}\) (Lessons 1.8 and 1.10). The right-hand side is again the hat of a twist, with vector \((R\boldsymbol\omega,\ R\mathbf v + \skew{\mathbf t}R\boldsymbol\omega)\). Writing this linear map as a 6×6 matrix gives the adjoint matrix. Conjugating the matrix exponential just replaces the twist inside \(\Exp\) by \(\operatorname{Ad}_T\boldsymbol\xi\):
对 \(\SO\) 只剩旋转部分:\(R\,\Exp(\boldsymbol\omega)R\T = \Exp(R\boldsymbol\omega)\),也就是 5.7 节用到的那条。直观含义:把"绕 \(\boldsymbol\omega\) 转"这个动作,由 \(R\) 描述的坐标系看过去,转轴变成 \(R\boldsymbol\omega\)。
On \(\SO\) only the rotation block remains: \(R\,\Exp(\boldsymbol\omega)R\T = \Exp(R\boldsymbol\omega)\), the identity used in Lesson 5.7. Its meaning: seen through the frame described by \(R\), the action "turn about \(\boldsymbol\omega\)" has the axis \(R\boldsymbol\omega\).
空间 twist 与机体 twistSpatial and body twists
设机体系 \(\{b\}\) 在世界系 \(\{s\}\) 中的位姿 \(T(t)\) 随时间变化。两种速度分别是 \(\hat{\boldsymbol\xi}_b = T^{-1}\dot T\) 与 \(\hat{\boldsymbol\xi}_s = \dot T T^{-1}\)(取 vee 得到 6 维向量)。展开:
Let the pose \(T(t)\) of the body frame \(\{b\}\) in the world frame \(\{s\}\) change with time. The two velocities are \(\hat{\boldsymbol\xi}_b = T^{-1}\dot T\) and \(\hat{\boldsymbol\xi}_s = \dot T T^{-1}\) (take vee to get 6-vectors). Expanding:
读法:\(\mathbf v_b = R\T\dot{\mathbf t}\) 是机体原点的速度,用机体轴读;\(\mathbf v_s = \dot{\mathbf t} + \mathbf t\times\boldsymbol\omega_s\) 是"位于世界原点的那个机体点"的速度(刚体速度场在 \(\mathbf x = \mathbf 0\) 处取值:\(\dot{\mathbf t} + \boldsymbol\omega_s\times(\mathbf 0 - \mathbf t)\)),用世界轴读。两者相差的就是杠杆臂 \(\mathbf t\times\boldsymbol\omega_s\)。
Reading: \(\mathbf v_b = R\T\dot{\mathbf t}\) is the velocity of the body origin read on the body axes; \(\mathbf v_s = \dot{\mathbf t} + \mathbf t\times\boldsymbol\omega_s\) is the velocity of "the body point at the world origin" read on the world axes (the rigid velocity field evaluated at \(\mathbf x = \mathbf 0\): \(\dot{\mathbf t} + \boldsymbol\omega_s\times(\mathbf 0 - \mathbf t)\)). They differ by the lever arm \(\mathbf t\times\boldsymbol\omega_s\).
左扰动与右扰动Left and right perturbations
共轭公式移项就是 5.7 节留下的承诺:
Rearranging the conjugation formula pays off the promise of Lesson 5.7:
最后一个式子说的是:如果右扰动的协方差是 \(\Sigma_r\),换成左扰动后协方差是 \(\operatorname{Ad}_T\Sigma_r\operatorname{Ad}_T\T\)(5.9 节会用)。
The last formula says: if the right-perturbation covariance is \(\Sigma_r\), the left-perturbation covariance is \(\operatorname{Ad}_T\Sigma_r\operatorname{Ad}_T\T\) (used in Lesson 5.9).
性质与 wrenchProperties and wrenches
| 性质Property | 公式Formula | 含义Meaning |
|---|---|---|
| 复合Composition | \(\operatorname{Ad}_{T_1T_2} = \operatorname{Ad}_{T_1}\operatorname{Ad}_{T_2}\) | 沿坐标系链一路换算convert along a chain of frames |
| 逆Inverse | \(\operatorname{Ad}_T^{-1} = \operatorname{Ad}_{T^{-1}} = \begin{bmatrix}R\T & 0\\ -R\T\skew{\mathbf t} & R\T\end{bmatrix}\) | 反方向换算,不用求 6×6 的逆convert back without inverting a 6×6 |
| 不变量Invariants | \(\|\boldsymbol\omega\|,\ h = \tfrac{\boldsymbol\omega\cdot\mathbf v}{\|\boldsymbol\omega\|^2}\) | 转角和螺距不随坐标系改变angle and pitch do not depend on the frame |
| wrench | \(\mathbf F_b = \operatorname{Ad}_T\T\,\mathbf F_s\) | 力矩与力 \((\mathbf m,\mathbf f)\) 与 twist 对偶,用转置换系torque and force \((\mathbf m,\mathbf f)\) are dual to twists and use the transpose |
| 无穷小形式Infinitesimal form | \(\operatorname{Ad}_{\Exp(\boldsymbol\xi)} = \exp(\operatorname{ad}_{\boldsymbol\xi}),\ \operatorname{ad}_{\boldsymbol\xi} = \begin{bmatrix}\skew{\boldsymbol\omega} & 0\\ \skew{\mathbf v} & \skew{\boldsymbol\omega}\end{bmatrix}\) | 李括号 \([\boldsymbol\xi_1,\boldsymbol\xi_2] = \operatorname{ad}_{\boldsymbol\xi_1}\boldsymbol\xi_2\)the Lie bracket \([\boldsymbol\xi_1,\boldsymbol\xi_2] = \operatorname{ad}_{\boldsymbol\xi_1}\boldsymbol\xi_2\) |
wrench 那一行的来源是功率不变:功率 \(\mathbf F\T\boldsymbol\xi\) 是标量,换系后不能变,\(\mathbf F_b\T\boldsymbol\xi_b = \mathbf F_s\T\operatorname{Ad}_T\boldsymbol\xi_b\),所以 \(\mathbf F_b = \operatorname{Ad}_T\T\mathbf F_s\)。这里 wrench 的顺序是(力矩,力),与 twist(角速度,线速度)对应。
The wrench row comes from power invariance: the power \(\mathbf F\T\boldsymbol\xi\) is a scalar and cannot change with the frame, so \(\mathbf F_b\T\boldsymbol\xi_b = \mathbf F_s\T\operatorname{Ad}_T\boldsymbol\xi_b\), hence \(\mathbf F_b = \operatorname{Ad}_T\T\mathbf F_s\). The wrench ordering here is (torque, force), matching the twist's (angular, linear).
5机器人中的它:手眼速度与腕力传感器In robotics: hand-eye velocities and the wrist force sensor
场景一:视觉伺服里的"相机系指令"Scenario 1: a camera-frame command in visual servoing
手眼相机装在机械臂末端。视觉伺服律说:"目标在相机系里的位置是 \(\mathbf p_c\),所以相机应该以 \(\mathbf v_c = k\,\mathbf p_c\) 朝目标走,同时转向它。"这是相机系里的 twist \(\boldsymbol\xi_c\)。机械臂控制器却要基座系里的末端速度。正确的转换是 \(\boldsymbol\xi_s = \operatorname{Ad}_{T_{bc}}\boldsymbol\xi_c\),其中 \(T_{bc}\) 由当前关节角和手眼标定共同给出。如果把 \(\boldsymbol\xi_c\) 当成基座系里的 twist 直接执行,相机就会朝错误的方向走。
下面的平面机械臂上,相机用一个固定的手眼变换装在末端。两支琥珀色箭头与 FIG 1 同义:实线是相机(机体)原点的速度 \(\mathbf v_c\),虚线是空间 twist 的 \(\mathbf v_s\)。绿色是"用 \(\operatorname{Ad}\) 换系后执行"(即 \(T_{bc}\Exp(\tau\boldsymbol\xi_c)\))预期到达的相机位姿,红色是"没换系直接当基座系 twist 执行"(\(\Exp(\tau\boldsymbol\xi_c)T_{bc}\))到达的位姿;\(\tau = 0.6\)。
A hand-eye camera is mounted at the end of the arm. The visual-servoing law says: "the target is at \(\mathbf p_c\) in the camera frame, so the camera should move toward it with \(\mathbf v_c = k\,\mathbf p_c\) while turning to face it." That is a twist \(\boldsymbol\xi_c\) in the camera frame. The arm controller, however, wants the end-effector velocity in the base frame. The correct conversion is \(\boldsymbol\xi_s = \operatorname{Ad}_{T_{bc}}\boldsymbol\xi_c\), where \(T_{bc}\) comes from the current joint angles and the hand-eye calibration. Execute \(\boldsymbol\xi_c\) as if it were a base-frame twist and the camera heads off in the wrong direction.
In the planar arm below the camera sits on the end link through a fixed hand-eye transform. The two amber arrows mean the same as in FIG 1: solid is the velocity \(\mathbf v_c\) of the camera (body) origin, dashed is the spatial twist's \(\mathbf v_s\). Green is the camera pose reached by executing the command with the \(\operatorname{Ad}\) conversion (\(T_{bc}\Exp(\tau\boldsymbol\xi_c)\)); red is the pose reached by treating \(\boldsymbol\xi_c\) as a base-frame twist (\(\Exp(\tau\boldsymbol\xi_c)T_{bc}\)); \(\tau = 0.6\).
- 调整关节角和目标位置,使"换系后执行"让相机更接近目标,而"没换系"让相机离目标更远。这说明直接把 \(\boldsymbol\xi_c\) 当作基座系 twist 会造成什么?Adjust the joint angles and the target so that the converted motion brings the camera closer to the target while the unconverted one takes it farther away. What does that say about using \(\boldsymbol\xi_c\) as a base-frame twist?
- 把目标拖到相机原点附近(距离 < 0.15)。\(\boldsymbol\xi_c\) 和 \(\boldsymbol\xi_s\) 怎么了?Drag the target to within 0.15 of the camera origin. What happens to \(\boldsymbol\xi_c\) and \(\boldsymbol\xi_s\)?
场景二:腕力传感器的 wrenchScenario 2: the wrist force sensor's wrench
腕部六维力传感器报告的是传感器系里的 wrench \((\mathbf m_b,\mathbf f_b)\):作用在传感器原点上的合力矩和合力。要判断末端对世界施加了多大的力和力矩,或者做阻抗控制(Part IV),就要把它换到世界系或基座系。换系用的是 \(\operatorname{Ad}\) 的转置。平面里这是一个 3×3 矩阵。关键物理:力不变,只是把"力矩的参考点"从世界原点挪到了传感器原点,改变的是杠杆臂。
A six-axis wrist force sensor reports a wrench \((\mathbf m_b,\mathbf f_b)\) in the sensor frame: the net torque and force acting at the sensor origin. To know how much force and torque the end effector applies to the world, or to do impedance control (Part IV), you must convert it to the world or base frame, using the transpose of \(\operatorname{Ad}\). In the plane that is a 3×3 matrix. The key physics: the force itself does not change; only the reference point of the torque moves from the world origin to the sensor origin, changing the lever arm.
- 沿着力的作用线把 \(P\) 滑动 1 个单位以上。力矩 \(m_s\)、\(m_b\) 变了吗?为什么?Slide \(P\) more than 1 unit along the line of action. Do \(m_s\) and \(m_b\) change? Why not?
- 拖动传感器(或转动力的方向),让传感器原点落在力的作用线上(杠杆臂 \(d_b < 0.1\),\(\|\mathbf f\| > 0.5\))。传感器测到的是什么?Drag the sensor (or swing the force) so that the sensor origin lies on the line of action (lever arm \(d_b < 0.1\), \(\|\mathbf f\| > 0.5\)). What does the sensor measure then?
机械臂的空间雅可比的第 \(i\) 列是 \(\operatorname{Ad}_{e^{[S_1]\theta_1}\cdots e^{[S_{i-1}]\theta_{i-1}}}S_i\),机体雅可比与它只差一个 \(\operatorname{Ad}_{T^{-1}}\)(3.4 节、5.10 节)。手眼标定求出的 \(T_{ec}\),每次用到相机速度或位姿误差时,都通过 \(\operatorname{Ad}_{T_{ec}}\) 进入机械臂的控制回路。阻抗/导纳控制和接触估计里,力传感器的 wrench 要用 \(\operatorname{Ad}^{\!\top}\) 换到工具坐标系或世界系。在状态估计器里,协方差 \(\Sigma\) 在左右两种约定之间转换,用的是 \(\operatorname{Ad}\,\Sigma\operatorname{Ad}\T\)。
The space Jacobian of an arm has \(i\)-th column \(\operatorname{Ad}_{e^{[S_1]\theta_1}\cdots e^{[S_{i-1}]\theta_{i-1}}}S_i\), and the body Jacobian differs from it by one \(\operatorname{Ad}_{T^{-1}}\) (Lessons 3.4 and 5.10). The hand-eye calibration \(T_{ec}\) enters the arm's control loop through \(\operatorname{Ad}_{T_{ec}}\) every time a camera velocity or pose error is used. In impedance/admittance control and contact estimation, the force sensor's wrench is moved to the tool or world frame with \(\operatorname{Ad}^{\!\top}\). In state estimators, covariances are converted between the left and right conventions with \(\operatorname{Ad}\,\Sigma\operatorname{Ad}\T\).
6常见误区Common pitfalls
把 twist 当成两个普通向量,各自乘 \(R\),得到的是 \(\operatorname{diag}(R,R)\boldsymbol\xi\),丢了 \(\skew{\mathbf t}R\boldsymbol\omega\) 一项。只在 \(\mathbf t = 0\)(两个坐标系原点重合)或 \(\boldsymbol\omega = 0\) 时才碰巧正确。症状:直线行驶(\(\boldsymbol\omega = 0\))没问题,一旦转弯,哪怕是原地转,偏离原点安装的传感器的速度就会多出或少掉一个横向的 \(\boldsymbol\omega\times\mathbf t\) 分量。
Treating a twist as two ordinary vectors and multiplying each by \(R\) gives \(\operatorname{diag}(R,R)\boldsymbol\xi\), which drops the \(\skew{\mathbf t}R\boldsymbol\omega\) term. It happens to be right only when \(\mathbf t = 0\) (the origins coincide) or \(\boldsymbol\omega = 0\). Symptom: driving straight (\(\boldsymbol\omega = 0\)) is fine, but as soon as the robot turns, even in place, the velocity of an offset-mounted sensor is off by a sideways \(\boldsymbol\omega\times\mathbf t\) term.
\(\boldsymbol\xi_s = \operatorname{Ad}_{T_{sb}}\boldsymbol\xi_b\):用"机体在世界里的位姿"把机体 twist 换成空间 twist。反过来要用 \(\operatorname{Ad}_{T_{sb}}^{-1} = \operatorname{Ad}_{T_{bs}}\)。写成 \(T_{sb}\) 还是 \(T_{bs}\) 是最常见的符号错误;给每个变换标明"谁在谁里",让下标像链条一样首尾相接,能避免大部分错误。
\(\boldsymbol\xi_s = \operatorname{Ad}_{T_{sb}}\boldsymbol\xi_b\): use "the pose of the body in the world" to turn a body twist into a spatial twist. The reverse needs \(\operatorname{Ad}_{T_{sb}}^{-1} = \operatorname{Ad}_{T_{bs}}\). Writing \(T_{sb}\) instead of \(T_{bs}\) is the most common sign-convention bug; labelling every transform "who in whom" and letting the subscripts chain head to tail prevents most of them.
本课 \(\operatorname{Ad}_T = \begin{bmatrix}R&0\\ \skew{\mathbf t}R&R\end{bmatrix}\) 对应 twist \((\boldsymbol\omega,\mathbf v)\)。把平移放在前面的库,\(\operatorname{Ad}\) 是 \(\begin{bmatrix}R&\skew{\mathbf t}R\\ 0&R\end{bmatrix}\),块的位置对调。wrench 的顺序要跟 twist 的顺序保持一致,不然 \(\mathbf F\T\boldsymbol\xi\) 就不是功率了。
With this lesson's twist \((\boldsymbol\omega,\mathbf v)\), \(\operatorname{Ad}_T = \begin{bmatrix}R&0\\ \skew{\mathbf t}R&R\end{bmatrix}\). In libraries that put translation first, \(\operatorname{Ad}\) is \(\begin{bmatrix}R&\skew{\mathbf t}R\\ 0&R\end{bmatrix}\), with the blocks swapped. The wrench ordering must follow the twist ordering, or \(\mathbf F\T\boldsymbol\xi\) is no longer power.
\(\mathbf v_s\) 是"位于世界原点的那个机体点"的速度,不是机体原点的速度。机体原点在世界系里的线速度是 \(\dot{\mathbf t} = \mathbf v_s + \boldsymbol\omega_s\times\mathbf t\)。想要末端点的速度,要自己减去(或加上)这一项。
\(\mathbf v_s\) is the velocity of "the body point at the world origin", not the velocity of the body origin. The body origin's linear velocity in the world is \(\dot{\mathbf t} = \mathbf v_s + \boldsymbol\omega_s\times\mathbf t\). To get the end point's velocity you must add that correction yourself.
7小练习Check yourself
8延伸阅读Further reading
- K. Lynch & F. Park, Modern Robotics, Sec. 3.3.2 & 3.4 — 空间 twist 与机体 twist、伴随表示、wrench 的换系;本课的 (ω, v) 顺序与它一致spatial and body twists, the adjoint representation and wrench transformation; same (ω, v) ordering as this lesson
- R. Murray, Z. Li, S. Sastry, A Mathematical Introduction to Robotic Manipulation, Ch. 2 — 刚体速度、伴随变换与螺旋理论的经典叙述the classic treatment of rigid-body velocity, the adjoint transformation and screw theory
- J. Solà, J. Deray, D. Atchuthan, "A micro Lie theory for state estimation in robotics", arXiv:1812.01537 — 伴随矩阵与左右扰动、协方差换系(平移在前)the adjoint, left/right perturbations and covariance conversion (translation first)
- T. Barfoot, State Estimation for Robotics, Ch. 7 — SE(3) 的伴随以及不确定性的变换the adjoint of SE(3) and the transformation of uncertainty