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

静力学与 wrenchStatics & Wrenches

机器人的活儿都干在接触里:拧螺丝、打磨、插孔、搬东西。接触靠力,而刚体上的"一个力"远不止三个数:同样 10 N,推在门把手上和推在门轴上,转动效果天差地别。把力矩和力打包成一个六维向量,就是 wrench,它与 twist 互为对偶,功率正是两者的内积。有了它,换坐标系只要用伴随的转置,关节力矩就是 τ = g(q) + JᵀF,手臂在哪里有力、哪里无力,一个力椭球就说清楚了。 Robots do their jobs in contact: driving screws, polishing, inserting pegs, carrying loads. Contact means force, and "a force" on a rigid body is more than three numbers: the same 10 N pushed on a door handle or on the hinge turns the door very differently. Pack the moment and the force into one six-dimensional vector and you get a wrench, the dual of the twist: their inner product is power. With it, changing frames needs only the transpose of the adjoint, the joint torques are τ = g(q) + JᵀF, and one force ellipsoid tells you where an arm is strong and where it is helpless.

约 32 分钟~32 min 前置:3.4 机器人雅可比 · 5.8 伴随 · 1.8 叉积 · 7.4 速度运动学Prereqs: 3.4 Robot Jacobian · 5.8 Adjoint · 1.8 Cross Product · 7.4 Velocity Kinematics 6 个交互6 interactives

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

    拧螺丝要沿轴向压、同时绕轴转;打磨要贴着曲面维持一个恒定的法向力;插孔对不准时,要让接触力把零件"引"进去;搬箱子时,手腕要承受箱子的重量,以及重量对手腕的力矩。这些任务里,机器人和世界之间交换的不是位置,而是力。可是作用在刚体上的力不只是三个数。作用点不同,同一个力对物体的转动效果就不同,所以描述接触,必须把力和它对参考点的力矩放在一起,成为一个六维量:wrench(力旋量)。

    它与 7.4 节的 twist 是一对。twist 说刚体怎么动(角速度、线速度),wrench 说外界怎么推它(力矩、力),两者配对得到功率。本课要回答四个问题:

    • 怎样用一个 6 维向量描述接触力,并在传感器系、工具尖端系和世界系之间换算?(FIG 1、FIG 2)
    • 手爪处的 wrench 需要多大的关节力矩去支撑?连杆和负载自己的重量又要多少?(FIG 3)
    • 给定电机力矩上限,手臂在工作空间的哪里最有力,哪里最弱?(FIG 4、FIG 5)
    • 腕部力传感器的读数里混着工具的重力,怎样把它扣掉,留下真正的接触力?(FIG 6)

    3.4 节已经在平面里用虚功原理推出过 \(\boldsymbol\tau=J^\top\mathbf F\),还画了力椭圆。这一课是它的三维续篇,不再重复那些推导,而是补上三件新东西:力矩成了向量(它有方向,也有参考点)、换坐标系要用伴随的转置、以及一旦手臂不水平躺在桌上,重力就成了静力学里最大的"外力"。

    Driving a screw means pressing along its axis while turning about it; polishing means holding a constant normal force on a curved surface; inserting a misaligned peg means letting the contact force "guide" it in; carrying a box means the wrist must bear the box's weight and the moment that weight exerts on the wrist. In these tasks what the robot exchanges with the world is not position but force. Yet a force on a rigid body is more than three numbers: the same force applied at different points turns the body differently. So describing contact requires putting the force together with its moment about a reference point into one six-dimensional quantity: a wrench.

    It is the partner of the twist from Lesson 7.4. A twist says how a rigid body moves (angular and linear velocity), a wrench says how the world pushes on it (moment and force), and pairing the two gives power. This lesson answers four questions:

    • How do we describe a contact force with one 6D vector, and convert it between the sensor frame, the tool-tip frame and the world frame? (FIG 1, FIG 2)
    • What joint torques hold up a wrench at the gripper, and how much more do the weights of the links and the payload cost? (FIG 3)
    • Given the motors' torque limits, where in the workspace is the arm strongest and where weakest? (FIG 4, FIG 5)
    • A wrist force sensor's reading includes the weight of the tool. How do we subtract it and keep the true contact force? (FIG 6)

    Lesson 3.4 already derived \(\boldsymbol\tau=J^\top\mathbf F\) in the plane by virtual work and drew the force ellipse. This lesson is its 3D sequel and does not repeat those derivations. It adds three new things: the moment becomes a vector (it has a direction and a reference point), changing frames uses the transpose of the adjoint, and once the arm is not lying flat on a table, gravity becomes the largest "external force" in statics.

    2直觉:wrench = 力 + 相对一点的力矩Intuition: a wrench is a force plus its moment about a point

    推一扇门。力的大小方向都一样,推在门把手上,门轻松打开;推在门轴上,门纹丝不动。差别在于杠杆臂:力沿作用线可以滑动而效果不变,但作用线离转轴越远,转动效果越大。要记录"外界对这个刚体做了什么",就先选一个参考点 \(O\),然后记下两样东西:总力 \(\mathbf f\),以及所有力对 \(O\) 的总力矩 \(\mathbf m\)(\(\mathbf m=\sum\mathbf x_i\times\mathbf f_i\),叉积见 1.8)。这一对就是 \(O\) 处的 wrench。

    参考点换到 \(O'\),总力不变,力矩却变了,因为每个力的杠杆臂变了:若 \(\mathbf r\) 是从 \(O\) 指向 \(O'\) 的向量,则 \(\mathbf m'=\sum(\mathbf x_i-\mathbf r)\times\mathbf f_i=\mathbf m-\mathbf r\times\mathbf f\)。注意是减号:参考点向力的作用线靠近,力矩变小;落在作用线上,力矩恰好为零。再看两个特殊情形。一对大小相等方向相反、不共线的力叫力偶:总力为零,力矩 \(\mathbf m\) 与参考点无关(拧瓶盖时双手的作用),所以力偶是"自由向量",可以放在刚体上任何地方。一般的 wrench 是力加力偶,总存在一条中心轴:参考点落在这条线上时,力矩与力平行,大小为 \(|h|\,\|\mathbf f\|\),\(h\) 叫螺距。它正是 twist 的螺旋轴(5.6)在力学里的镜像。

    Push a door. The force has the same size and direction, yet pushed at the handle the door swings open, pushed at the hinge it does not budge. The difference is the lever arm: a force may slide along its line of action without changing its effect, but the farther that line is from the axis, the stronger the turning effect. To record "what the world does to this rigid body", first choose a reference point \(O\), then write down two things: the total force \(\mathbf f\) and the total moment \(\mathbf m\) of all forces about \(O\) (\(\mathbf m=\sum\mathbf x_i\times\mathbf f_i\); cross product in 1.8). That pair is the wrench at \(O\).

    Move the reference point to \(O'\) and the total force is unchanged, yet the moment changes, because every lever arm changes: if \(\mathbf r\) points from \(O\) to \(O'\), then \(\mathbf m'=\sum(\mathbf x_i-\mathbf r)\times\mathbf f_i=\mathbf m-\mathbf r\times\mathbf f\). Note the minus sign: moving the reference point toward the force's line shrinks the moment, and a point on the line of action gives exactly zero. Two special cases. Two equal and opposite non-collinear forces form a couple: the total force is zero and the moment \(\mathbf m\) does not depend on the reference point (think of both hands turning a bottle cap), so a couple is a "free vector" that can sit anywhere on the body. A general wrench is a force plus a couple, and always has a central axis: for a reference point on that line the moment is parallel to the force, of size \(|h|\,\|\mathbf f\|\), where \(h\) is called the pitch. It is the mechanical mirror of the twist's screw axis (5.6).

    约定:moment 在前,force 在后Convention: moment first, force second

    本课(和整个课程)的 wrench 写作 \(\mathbf F=(\mathbf m,\mathbf f)\in\mathbb R^6\),力矩在前、力在后,与 twist \(\boldsymbol\xi=(\boldsymbol\omega,\mathbf v)\)(角速度在前)一一对应,这样功率就是 \(P=\boldsymbol\xi^\top\mathbf F=\boldsymbol\omega\cdot\mathbf m+\mathbf v\cdot\mathbf f\)。单位:力矩 N·m,力 N,功率 W。

    Throughout this lesson (and the course) a wrench is written \(\mathbf F=(\mathbf m,\mathbf f)\in\mathbb R^6\), moment first, force second, matching the twist \(\boldsymbol\xi=(\boldsymbol\omega,\mathbf v)\) (angular first) entry by entry, so that power is \(P=\boldsymbol\xi^\top\mathbf F=\boldsymbol\omega\cdot\mathbf m+\mathbf v\cdot\mathbf f\). Units: moment N·m, force N, power W.

    下图是一个刚体。选择"力""力偶"或"力+力偶",拖动滑块改变力和力偶,再移动参考点 \(O'\)(青色点):看 \(O'\) 处的力矩(紫色箭头)怎样随杠杆臂变化,而力(琥珀色)纹丝不动。绿色虚线是中心轴。

    Below is a rigid body. Choose "force", "couple" or "force + couple", drag the sliders to change them, then move the reference point \(O'\) (the cyan dot): watch the moment at \(O'\) (purple arrow) change with the lever arm while the force (amber) stays put. The green dashed line is the central axis.

    FIG 1wrench = 力 + 对一点的力矩A wrench: force plus its moment about a point
    拖动画面旋转视角drag to orbit
    琥珀色:力 \(\mathbf f\)(0.35 m/N),作用在方块上表面的一点 \(P\),虚线是作用线。紫色:参考点处的力矩 \(\mathbf m'\)(0.5 m 对应 1 N·m,过长时截短)。青色点是参考点 \(O'\),虚线是从原点指向它的 \(\mathbf r\)。力偶用弯曲的紫色箭头画在方块中心。绿色虚线是中心轴;读数里"直接求和"是按定义 \(\sum(\mathbf x_i-\mathbf r)\times\mathbf f_i+\mathbf c\) 算出的力矩,与公式 \(\mathbf m-\mathbf r\times\mathbf f\) 之差应在 \(10^{-15}\) 量级。 Amber: the force \(\mathbf f\) (0.35 m per N) at a point \(P\) on the top face of the block; the dashed line is its line of action. Purple: the moment \(\mathbf m'\) at the reference point (0.5 m per N·m, shortened when too long). The cyan dot is the reference point \(O'\) and the dotted line the vector \(\mathbf r\) from the origin to it. A couple is drawn as a curved purple arrow at the block's center. The green dashed line is the central axis. In the readout, "direct sum" is the moment from the definition \(\sum(\mathbf x_i-\mathbf r)\times\mathbf f_i+\mathbf c\); its difference from the formula \(\mathbf m-\mathbf r\times\mathbf f\) should be around \(10^{-15}\).
    试一试Try this
    • 在"力"模式下把参考点 \(O'\) 移开原点 1 m 以上,观察 \(\mathbf m'\) 的变化,同时留意 \(\mathbf f\) 是否变了。In "force" mode move the reference point \(O'\) more than 1 m from the origin. Watch \(\mathbf m'\) change, and check whether \(\mathbf f\) changes.
    • 用"移到作用线上"按钮(或滑块)让 \(O'\) 落在力的作用线上:\(\|\mathbf m'\|<0.06\)。力矩去哪了?Use the "snap to line of action" button (or the sliders) to put \(O'\) on the force's line of action: \(\|\mathbf m'\|<0.06\). Where did the moment go?
    • 切换到"力偶"(\(\|\mathbf c\|>0.3\) N·m),把 \(O'\) 拖到离原点 1.5 m 以外。\(\mathbf m'\) 变了吗?为什么力偶叫"自由向量"?Switch to "couple" (with \(\|\mathbf c\|>0.3\) N·m) and put \(O'\) more than 1.5 m from the origin. Did \(\mathbf m'\) change? Why is a couple called a "free vector"?
    • 切换到"力+力偶"(保持 \(|h|>0.25\) m,默认值即可),按"移到中心轴上"。此时 \(\mathbf m'\) 与 \(\mathbf f\) 平行,且 \(\mathbf m'=h\mathbf f\)。螺距 \(h\) 是多少?Switch to "force + couple" (keep \(|h|>0.25\) m; the defaults do) and press "snap to central axis". Now \(\mathbf m'\) is parallel to \(\mathbf f\), with \(\mathbf m'=h\mathbf f\). What is the pitch \(h\)?
    核心洞见Key insight

    wrench 不是"一个力",而是"力 + 参考点"。换参考点,力不变、力矩按 \(\mathbf m'=\mathbf m-\mathbf r\times\mathbf f\) 变。有一个量不随参考点变:\(\mathbf f\cdot\mathbf m\)(力在力矩方向上的投影),它就是螺距 \(h=\mathbf f\cdot\mathbf m/\|\mathbf f\|^2\) 的分子。读数里可以验证。

    A wrench is not "a force" but "a force plus a reference point". Move the point and the force stays, while the moment changes by \(\mathbf m'=\mathbf m-\mathbf r\times\mathbf f\). One quantity does not depend on the reference point: \(\mathbf f\cdot\mathbf m\) (the component of the moment along the force), the numerator of the pitch \(h=\mathbf f\cdot\mathbf m/\|\mathbf f\|^2\). You can check it in the readout.

    3动手玩:同一个 wrench,换三个坐标系Play: one wrench, three frames

    真实机器人里 wrench 总要换坐标系:腕部力传感器报告的是传感器系 {s} 里的读数,你关心的是工具尖端接触点 {c} 处的力,控制器又想要世界系 {w} 里的量。物理上是同一个相互作用,只是换了参考点和坐标轴。规则只有一条,来自功率不变(5.8 已经推过,推导见第 5 节)。设 \(T_{ab}\) 是 {b} 在 {a} 中的位姿:

    In a real robot a wrench always has to change frames: a wrist force sensor reports in the sensor frame {s}, what you care about is the force at the tool-tip contact {c}, and the controller wants quantities in the world frame {w}. Physically it is one and the same interaction; only the reference point and the axes differ. There is one rule, which follows from power invariance (derived in 5.8, and again in Section 5). Let \(T_{ab}\) be the pose of {b} in {a}:

    $$ \underbrace{\boldsymbol\xi_a=\operatorname{Ad}_{T_{ab}}\,\boldsymbol\xi_b}_{\text{twist: }b\to a},\qquad \underbrace{\mathbf F_b=\operatorname{Ad}_{T_{ab}}^{\!\top}\,\mathbf F_a}_{\text{wrench: }a\to b},\qquad\text{so}\qquad \mathbf F_s=\operatorname{Ad}_{T_{cs}}^{\!\top}\,\mathbf F_c. $$

    一句话记法:twist 用 \(\operatorname{Ad}\) 往"父系"搬,wrench 用 \(\operatorname{Ad}^\top\) 往"子系"搬;换成 \(\mathbf F_s\) 时,要用"{s} 在 {c} 里的位姿" \(T_{cs}\)。下面的实验里,接触点 {c} 在工具尖端,传感器 {s} 在手腕,工具相对传感器歪着。设一个接触 wrench \(\mathbf F_c\),看传感器和世界系的读数。最后一行是功率检查:取同一个刚体运动在三个系里的 twist,三个功率 \(\boldsymbol\xi^\top\mathbf F\) 必须相等。把"变换"切到"Ad(错误)",看它怎么崩溃。

    A mnemonic: twists move to the "parent" frame with \(\operatorname{Ad}\), wrenches move to the "child" frame with \(\operatorname{Ad}^\top\); for \(\mathbf F_s\) you need the pose of {s} in {c}, \(T_{cs}\). In the lab below the contact {c} sits at the tool tip, the sensor {s} at the wrist, and the tool is slanted relative to the sensor. Set a contact wrench \(\mathbf F_c\) and read it in the sensor and world frames. The last row is the power check: take one rigid-body motion expressed as a twist in all three frames, and the three powers \(\boldsymbol\xi^\top\mathbf F\) must agree. Switch "transform" to "Ad (wrong)" and watch it fail.

    FIG 2换坐标系:F_s = Ad_{T_cs}ᵀ F_cChanging frames: F_s = Ad_{T_cs}ᵀ F_c
    拖动画面旋转视角drag to orbit
    三个坐标系:世界 {w}(大)、传感器 {s}(手腕处的圆盘)、接触 {c}(工具尖端)。每个系里都画了琥珀色的力和紫色的力矩(都换算到世界方向画出,力矩 0.12 m 对应 1 N·m,力 0.035 m 对应 1 N):力是同一个向量,只是出现在三个不同的参考点上,力矩却各不相同:杠杆臂不同。选"Ad(错误)"后箭头变红,指向了不存在的方向。读数的最后两行是功率检查与用 \(\operatorname{Ad}\) 算错时的偏差。 Three frames: world {w} (large), sensor {s} (the disc at the wrist), contact {c} (the tool tip). Each frame shows the amber force and purple moment (all drawn in world orientation; moment 0.12 m per N·m, force 0.035 m per N): the force is the same vector, just attached at three different reference points, while the moments differ: the lever arms differ. With "Ad (wrong)" the arrows turn red and point somewhere that does not exist. The last two readout lines are the power check and the error you get with \(\operatorname{Ad}\) in place of \(\operatorname{Ad}^\top\).
    • 令接触 wrench 是一个纯法向力(\(f_{cx}=f_{cy}=0\),\(f_{cz}>5\) N,三个力矩为 0)。传感器却读到了力矩 \(\|\mathbf m_s\|>0.5\) N·m。这个力矩是哪来的?Make the contact wrench a pure normal force (\(f_{cx}=f_{cy}=0\), \(f_{cz}>5\) N, all three moments 0). The sensor still reads a moment \(\|\mathbf m_s\|>0.5\) N·m. Where does it come from?
    • 把"变换"切到"Ad(错误)",看功率检查的偏差变成多大。换回"Adᵀ",偏差应回到 \(10^{-15}\)。Switch "transform" to "Ad (wrong)" and see how large the power mismatch becomes. Switch back to "Adᵀ": it should return to \(10^{-15}\).

    4第二、第三视角:关节力矩、负载地图与力椭球Second and third views: joint torques, payload maps and force ellipsoids

    六轴臂的静力学:τ = g(q) + JᵀFStatics of a six-axis arm: τ = g(q) + JᵀF

    现在把 wrench 加到手臂上(用 7.3 和 7.4 里同一条 6R 臂)。设手爪对环境施加 wrench \(\mathbf F\)(环境反推 \(-\mathbf F\))。让手臂静止不动,每个关节电机需要提供的力矩是

    Now put a wrench on the arm (the same 6R arm as in 7.3 and 7.4). Let the gripper apply a wrench \(\mathbf F\) to the environment (which pushes back with \(-\mathbf F\)). To hold the arm still, each joint motor must supply

    $$ \boldsymbol\tau \;=\; \underbrace{\mathbf g(\mathbf q)}_{\text{weights of links and payload}} \;+\; \underbrace{J_s(\mathbf q)^{\top}\mathbf F_s}_{\text{the tool's wrench}} \;=\; \mathbf g(\mathbf q)+J_b(\mathbf q)^{\top}\mathbf F_b . $$

    两种写法给出完全相同的 \(\boldsymbol\tau\):\(\mathbf F_b\) 是在工具系里、以工具原点为参考点的 wrench;\(\mathbf F_s\) 是在基座系里、以基座原点为参考点的 wrench,二者差一个 \(\operatorname{Ad}^\top\),而 \(J_b\) 与 \(J_s\) 差一个 \(\operatorname{Ad}\),两个正好抵消(第 5 节)。FIG 3 里切换"wrench 的坐标轴",滑块的数值会被换算成另一个系里的同一个 wrench,力矩条一动不动。

    重力项 \(\mathbf g(\mathbf q)=\partial U/\partial\mathbf q\) 是位能的梯度。本课的模型:三根连杆各是一个质点,放在连杆中点(质量 5、3、1.5 kg,最后一个包含腕部和工具),外加负载质点(离工具原点沿工具 y 轴偏出 \(d\))。关节力矩上限 150、200、100、50、60、25 N·m 只是示意数字。先玩一下:用"举起 5 kg"预设,把手臂水平伸直(\(q_2\)、\(q_3\) 都接近 0),哪个关节离上限最近?再加大负载,直到某根条变红:是哪个关节?再试"拧螺丝":除了向下压 30 N,还在工具轴上加 8 N·m 的力矩,为什么关节 1、4、6 都要出力?

    The two forms give exactly the same \(\boldsymbol\tau\): \(\mathbf F_b\) is the wrench in the tool frame with the tool origin as reference point; \(\mathbf F_s\) is the wrench in the base frame with the base origin as reference point; they differ by an \(\operatorname{Ad}^\top\), while \(J_b\) and \(J_s\) differ by an \(\operatorname{Ad}\), and the two cancel (Section 5). In FIG 3, switching the "wrench axes" converts the slider values to the same wrench in the other frame, and the torque bars do not move.

    The gravity term \(\mathbf g(\mathbf q)=\partial U/\partial\mathbf q\) is the gradient of potential energy. The model here: each of the three links is a point mass at the link's midpoint (5, 3 and 1.5 kg; the last includes the wrist and the tool), plus a payload point mass offset by \(d\) from the tool origin along the tool's y-axis. The joint torque limits 150, 200, 100, 50, 60, 25 N·m are only illustrative. Play first: with the "hold 5 kg" preset, stretch the arm out level (\(q_2\) and \(q_3\) near 0); which joint comes closest to its limit? Then raise the payload until a bar turns red: which joint is it? Then try "drive a screw": besides pressing down 30 N there is an 8 N·m moment about the tool axis, yet joints 1, 4 and 6 all work. Why?

    FIG 36R 臂的静力学:τ = g(q) + JᵀFStatics of the 6R arm: τ = g(q) + JᵀF
    拖动画面旋转视角drag to orbit
    琥珀色箭头是手爪施加的力 \(\mathbf f\)(0.012 m/N),紫色箭头是力矩 \(\mathbf m\)(0.04 m/(N·m)),都画在工具原点上。右侧每条力矩条:红色竖线是上限,条底部的细线是其中重力 \(g(\mathbf q)\) 的部分,整条是总力矩 \(\boldsymbol\tau\);超限的条变红,对应关节在手臂上出现红圈。读数里 \(J_b^\top\mathbf F_b-J_s^\top\mathbf F_s\) 是两种写法的差,应在 \(10^{-13}\) 量级。 The amber arrow is the force \(\mathbf f\) the gripper applies (0.012 m per N), the purple arrow the moment \(\mathbf m\) (0.04 m per N·m), both drawn at the tool origin. Each torque bar on the right: the red tick is the limit, the thin line along the bottom of the bar is the gravity part \(g(\mathbf q)\), the whole bar is the total torque \(\boldsymbol\tau\); a bar over its limit turns red and the joint gets a red ring on the arm. In the readout, \(J_b^\top\mathbf F_b-J_s^\top\mathbf F_s\) is the difference between the two forms, which should be around \(10^{-13}\).
    • 让某个关节的力矩超过上限(条变红)。再想办法让它回到限内:改变姿态、减小负载偏心,哪一种最有效?Push some joint's torque over its limit (the bar turns red). Then bring it back in range by changing posture or reducing the payload offset: which works best?
    • 加一个非零 wrench,然后切换"wrench 的坐标轴"(工具 ↔ 基座)。滑块数值变了,力矩条变了吗?Apply a nonzero wrench, then switch the "wrench axes" (tool ↔ base). The slider values change; do the torque bars?

    手臂在哪里有力?负载地图Where is the arm strong? A payload map

    重力项对每个关节都是姿态的函数,所以"这条臂能举多重"没有一个数字的答案,而是一张地图。对垂直平面(\(q_1=0\))里的每个手爪位置,用解析逆运动学(肘部朝上、工具俯仰角 \(\psi\) 固定)求出姿态,再解出使所有六个关节力矩都不超限的最大负载。力矩对负载质量是线性的,\(\tau_i=a_i+m\,b_i\),所以答案是闭式的。哪个关节先到上限,也一并标出。

    The gravity term is a function of posture at every joint, so "how much can this arm lift" has no single-number answer; it is a map. For every tool position in the vertical plane (\(q_1=0\)), solve analytic inverse kinematics (elbow up, tool pitch \(\psi\) fixed) and then find the largest payload for which all six joint torques stay within their limits. Torque is linear in the payload mass, \(\tau_i=a_i+m\,b_i\), so the answer is closed-form. Which joint hits its limit first is marked as well.

    FIG 4最大负载地图(垂直剖面)Maximum-payload map (vertical slice)
    横轴是离基座轴线的水平距离 \(r\),纵轴是高度 \(z\);基座在左侧。色块的青色越浓,负载越大;没有色块的地方不可达或关节超出转角限位。拖动圆圈选择手爪位置,手臂以侧视图画出。负载质点偏离工具原点 \(d\)(沿工具 y 轴,水平时这就是垂直于纸面的方向,所以偏心只让滚转关节 4、6 受力,不改变平面内的力矩)。"电机规格"把所有关节力矩上限一起乘上一个系数。 The horizontal axis is the radial distance \(r\) from the base axis, the vertical axis the height \(z\); the base is on the left. A stronger cyan cell means a larger payload; no cell means unreachable or beyond a joint-angle limit. Drag the circle to choose the tool position; the arm is drawn in side view. The payload sits \(d\) away from the tool origin (along the tool's y-axis, which for a horizontal tool points out of the page, so the offset loads only the roll joints 4 and 6 and does not change the in-plane torques). "Motor size" multiplies all joint torque limits.
    • 找到两个位置:一个由关节 2(肩)先到上限,另一个由关节 3(肘)先到上限。读数里会写出限制关节。它们在地图上大致怎么分布?Find two positions: one where joint 2 (shoulder) saturates first, one where joint 3 (elbow) does. The readout names the limiting joint. How are they distributed over the map?

    三维的力椭球与对偶Force ellipsoids in 3D and the duality

    3.4 节在平面里画过:关节速度的单位球 \(\|\dot{\boldsymbol\theta}\|\le1\) 经 \(J\) 映成手爪速度椭圆(半轴 \(\sigma_i\)),单位关节力矩球 \(\|\boldsymbol\tau\|\le1\) 经 \(J^\top\) 的"逆"映成力椭圆(半轴 \(1/\sigma_i\),方向相同)。三维里把 \(J\) 换成线速度部分 \(J_v\in\mathbb R^{3\times6}\)(点 \(\mathbf p\) 的速度:\(J_v=J_{s,\text{lin}}-[\mathbf p]_\times J_{s,\text{ang}}\)),得到两个椭球:速度椭球(琥珀)和力椭球(紫)。两者主轴相同,但一个的长轴正是另一个的短轴:手爪容易动的方向出不了大力,难动的方向顶得住大力。手臂拉直时 \(\sigma_{\min}\to0\):速度椭球被压成一个盘,力椭球拉成一根针,沿手臂方向,结构本身承担载荷,电机几乎不出力(3.4 节"速度与力")。

    切换到"转动":用 \(J_\omega\)(角速度部分)得到角速度椭球和力矩椭球。注意单位:\(J_v\) 是 m/rad,\(J_\omega\) 是无量纲,不能把两块拼成 6×6 再做 SVD(3.4 节误区 4),所以平动与转动要分开看,或者先用一个特征长度做归一化。

    Lesson 3.4 drew this in the plane: the unit ball of joint rates \(\|\dot{\boldsymbol\theta}\|\le1\) maps through \(J\) to a tip-velocity ellipse (semi-axes \(\sigma_i\)), and the unit ball of joint torques \(\|\boldsymbol\tau\|\le1\) maps through the "inverse" of \(J^\top\) to a force ellipse (semi-axes \(1/\sigma_i\), same directions). In 3D replace \(J\) by its linear-velocity part \(J_v\in\mathbb R^{3\times6}\) (velocity of the point \(\mathbf p\): \(J_v=J_{s,\text{lin}}-[\mathbf p]_\times J_{s,\text{ang}}\)) and you get two ellipsoids: the velocity ellipsoid (amber) and the force ellipsoid (purple). They share principal axes, but the long axis of one is the short axis of the other: along the direction where the tip moves easily it cannot push hard, and along the direction where it barely moves it holds a large force. When the arm is stretched out, \(\sigma_{\min}\to0\): the velocity ellipsoid is squashed into a disc and the force ellipsoid stretched into a needle along the arm; the structure itself carries the load and the motors hardly work (the "velocity and force" callout of Lesson 3.4).

    Switch to "rotation": use \(J_\omega\) (the angular part) to get the angular-velocity and moment ellipsoids. Mind the units: \(J_v\) is in m/rad and \(J_\omega\) is dimensionless, so you cannot stack them into a 6×6 and take one SVD (Pitfall 4 of Lesson 3.4). Look at translation and rotation separately, or normalize with a characteristic length first.

    FIG 5速度椭球与力椭球Velocity and force ellipsoids
    拖动画面旋转视角drag to orbit
    预设姿态Posture presets
    琥珀色线框:速度椭球 \(\{J\dot{\boldsymbol\theta}:\|\dot{\boldsymbol\theta}\|\le1\}\)(半轴 \(\sigma_i\) 乘 0.35 m 绘制)。紫色线框:力椭球 \(\{\mathbf f:\|J^\top\mathbf f\|\le1\}\)(半轴 \(1/\sigma_i\) 乘 0.3 m 绘制,超过 1.3 m 的部分截断,实际长度见读数)。两者共享同一组主轴,实线段标出主轴方向。 Amber wireframe: the velocity ellipsoid \(\{J\dot{\boldsymbol\theta}:\|\dot{\boldsymbol\theta}\|\le1\}\) (semi-axes \(\sigma_i\) drawn at 0.35 m per unit). Purple wireframe: the force ellipsoid \(\{\mathbf f:\|J^\top\mathbf f\|\le1\}\) (semi-axes \(1/\sigma_i\) drawn at 0.3 m per unit, clipped at 1.3 m; true values in the readout). They share the same principal axes, marked by the solid segments.
    • 在"平动"模式下,把手臂拉到近乎伸直(\(\sigma_{\min}<0.12\),用"拉直"预设,或把 \(q_3\) 和 \(q_5\) 都调到接近 0,让工具也与手臂对齐)。力椭球变成了什么形状?沿哪个方向?In "translation" mode stretch the arm out almost straight (\(\sigma_{\min}<0.12\); use the "stretched" preset, or set both \(q_3\) and \(q_5\) near 0 so the tool lines up with the arm too). What shape does the force ellipsoid take, and along which direction?
    一个 wrench,三种看法One wrench, three views

    几何:一条作用线上的力,加上一个力偶,画成箭头(FIG 1)。代数:一个 6 维向量 \((\mathbf m,\mathbf f)\),随坐标系用 \(\operatorname{Ad}^\top\) 变换(FIG 2)。能量:一个把 twist 变成功率的线性泛函 \(\boldsymbol\xi\mapsto\boldsymbol\xi^\top\mathbf F\)。第三种看法最深:twist 是"向量",wrench 是"余向量"(对偶空间里的元素)。向量和余向量变换时用互逆转置的矩阵(\(\operatorname{Ad}\) 与 \(\operatorname{Ad}^{-\top}\)),就像速度 \(J\dot{\boldsymbol\theta}\) 用 \(J\)、力矩 \(J^\top\mathbf F\) 用 \(J^\top\)。凡是看到"转置",想想"功率要保持不变"。

    Geometry: a force on a line of action plus a couple, drawn as arrows (FIG 1). Algebra: a 6-vector \((\mathbf m,\mathbf f)\) that changes frame by \(\operatorname{Ad}^\top\) (FIG 2). Energy: a linear functional \(\boldsymbol\xi\mapsto\boldsymbol\xi^\top\mathbf F\) that turns twists into power. The third view is the deepest: a twist is a "vector", a wrench is a "covector" (an element of the dual space). Vectors and covectors transform with inverse-transpose matrices (\(\operatorname{Ad}\) versus \(\operatorname{Ad}^{-\top}\)), just as velocity uses \(J\) in \(J\dot{\boldsymbol\theta}\) and torque uses \(J^\top\) in \(J^\top\mathbf F\). Whenever you see a transpose, think "power must stay the same".

    5再看数学The math

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

    wrench 的定义,以及为什么是(力矩,力)The definition, and why (moment, force)

    设刚体上有一组力 \(\mathbf f_i\),作用在点 \(\mathbf x_i\)(都在坐标系 {a} 里写)。{a} 原点处的 wrench 是

    Let a rigid body carry forces \(\mathbf f_i\) at points \(\mathbf x_i\) (all written in frame {a}). The wrench at the origin of {a} is

    $$ \mathbf F_a=\begin{bmatrix}\hl{m}{\cw{\mathbf m}}\\ \hl{f}{\cv{\mathbf f}}\end{bmatrix},\qquad \cv{\mathbf f}=\sum_i\mathbf f_i,\qquad \cw{\mathbf m}=\sum_i\mathbf x_i\times\mathbf f_i . $$

    刚体的 twist \(\boldsymbol\xi=(\boldsymbol\omega,\mathbf v)\),其中 \(\mathbf v\) 是刚体上此刻位于 {a} 原点的那个点的速度(5.8 节),点 \(\mathbf x_i\) 的速度是 \(\mathbf v+\boldsymbol\omega\times\mathbf x_i\)。所有力做功的功率:

    The body's twist is \(\boldsymbol\xi=(\boldsymbol\omega,\mathbf v)\), where \(\mathbf v\) is the velocity of the point of the body currently at the origin of {a} (Lesson 5.8); the point \(\mathbf x_i\) moves with velocity \(\mathbf v+\boldsymbol\omega\times\mathbf x_i\). The power of all the forces:

    $$ P=\sum_i\mathbf f_i\cdot(\mathbf v+\boldsymbol\omega\times\mathbf x_i)=\mathbf v\cdot\sum_i\mathbf f_i+\boldsymbol\omega\cdot\sum_i\mathbf x_i\times\mathbf f_i=\boldsymbol\omega\cdot\mathbf m+\mathbf v\cdot\mathbf f=\boldsymbol\xi^\top\mathbf F, $$

    其中用到标量三重积 \(\mathbf f\cdot(\boldsymbol\omega\times\mathbf x)=\boldsymbol\omega\cdot(\mathbf x\times\mathbf f)\)(1.8 节)。这就说明了顺序:为了让功率是两个 6 维向量的普通内积,wrench 必须按 twist 的 \((\boldsymbol\omega,\mathbf v)\) 排成 \((\mathbf m,\mathbf f)\)。

    using the scalar triple product \(\mathbf f\cdot(\boldsymbol\omega\times\mathbf x)=\boldsymbol\omega\cdot(\mathbf x\times\mathbf f)\) (Lesson 1.8). This explains the ordering: for the power to be an ordinary inner product of two 6-vectors, the wrench must be arranged as \((\mathbf m,\mathbf f)\) to match the twist's \((\boldsymbol\omega,\mathbf v)\).

    换参考点与换坐标系:AdᵀMoving the reference point and changing frames: Adᵀ

    只换参考点(坐标轴不变),\(\mathbf r\) 为从旧点指向新点的向量,就是 FIG 1 里的公式。写成矩阵:

    Moving only the reference point (axes unchanged), with \(\mathbf r\) pointing from the old point to the new one, is the formula in FIG 1. As a matrix:

    $$ \begin{bmatrix}\cw{\mathbf m'}\\ \mathbf f\end{bmatrix}=\begin{bmatrix}I & -\hl{lever}{[\mathbf r]_\times}\\ 0 & I\end{bmatrix}\begin{bmatrix}\mathbf m\\ \mathbf f\end{bmatrix},\qquad \cw{\mathbf m'}=\mathbf m-\hl{lever}{\mathbf r\times\mathbf f}. $$

    再让坐标轴也转过去。设 {b} 在 {a} 中的位姿是 \(T_{ab}=(R,\mathbf p)\)。twist 变换是 \(\boldsymbol\xi_a=\operatorname{Ad}_{T_{ab}}\boldsymbol\xi_b\)。功率是标量,不随坐标系变:\(\boldsymbol\xi_a^\top\mathbf F_a=\boldsymbol\xi_b^\top\mathbf F_b\)。代入,对任意 \(\boldsymbol\xi_b\) 成立,所以

    Now rotate the axes too. Let the pose of {b} in {a} be \(T_{ab}=(R,\mathbf p)\). Twists transform by \(\boldsymbol\xi_a=\operatorname{Ad}_{T_{ab}}\boldsymbol\xi_b\). Power is a scalar and cannot depend on the frame: \(\boldsymbol\xi_a^\top\mathbf F_a=\boldsymbol\xi_b^\top\mathbf F_b\). Substituting, and demanding it for every \(\boldsymbol\xi_b\):

    $$ \mathbf F_b=\operatorname{Ad}_{T_{ab}}^{\!\top}\mathbf F_a=\begin{bmatrix}R^\top & -R^\top[\mathbf p]_\times\\ 0 & R^\top\end{bmatrix}\begin{bmatrix}\mathbf m_a\\ \mathbf f_a\end{bmatrix}=\begin{bmatrix}R^\top(\mathbf m_a-\mathbf p\times\mathbf f_a)\\ R^\top\mathbf f_a\end{bmatrix}. $$

    最后一个等号一目了然:先按 \(\mathbf m-\mathbf p\times\mathbf f\) 换参考点(\(\mathbf p\) 是新点相对旧点的位置),再用 \(R^\top\) 把两个向量转到新轴上。所以 wrench 的换系 = FIG 1 的公式 + 一次旋转。反过来 \(\mathbf F_a=\operatorname{Ad}_{T_{ba}}^{\!\top}\mathbf F_b\),因为 \(\operatorname{Ad}_{T_{ab}}^{-1}=\operatorname{Ad}_{T_{ba}}\)。把 wrench 链式地从接触点搬到传感器再搬到世界,只需连乘 \(\operatorname{Ad}^\top\)(顺序与位姿相反)。

    The last form is plain to read: first move the reference point by \(\mathbf m-\mathbf p\times\mathbf f\) (with \(\mathbf p\) the new point relative to the old one), then rotate both vectors onto the new axes with \(R^\top\). So changing the frame of a wrench = the formula of FIG 1 + one rotation. Going back, \(\mathbf F_a=\operatorname{Ad}_{T_{ba}}^{\!\top}\mathbf F_b\), since \(\operatorname{Ad}_{T_{ab}}^{-1}=\operatorname{Ad}_{T_{ba}}\). To carry a wrench from the contact to the sensor to the world, just multiply the \(\operatorname{Ad}^\top\) factors (in the reverse order of the poses).

    twist \(\boldsymbol\xi=(\boldsymbol\omega,\mathbf v)\)wrench \(\mathbf F=(\mathbf m,\mathbf f)\)
    换系Change of frame\(\boldsymbol\xi_a=\operatorname{Ad}_{T_{ab}}\boldsymbol\xi_b\)\(\mathbf F_b=\operatorname{Ad}_{T_{ab}}^{\!\top}\mathbf F_a\)
    换参考点 \(\mathbf r\)Move reference point by \(\mathbf r\)\(\mathbf v'=\mathbf v-\mathbf r\times\boldsymbol\omega\)\(\mathbf m'=\mathbf m-\mathbf r\times\mathbf f\)
    不随点变的部分Part independent of the point\(\boldsymbol\omega\)\(\mathbf f\)
    不变量与螺距Invariant and pitch\(\boldsymbol\omega\cdot\mathbf v\);\ \(h=\tfrac{\boldsymbol\omega\cdot\mathbf v}{\|\boldsymbol\omega\|^2}\)\(\mathbf f\cdot\mathbf m\);\ \(h=\tfrac{\mathbf f\cdot\mathbf m}{\|\mathbf f\|^2}\)
    特殊情形Special case纯平移(\(\boldsymbol\omega=0\)):自由向量pure translation (\(\boldsymbol\omega=0\)): a free vector力偶(\(\mathbf f=0\)):自由向量couple (\(\mathbf f=0\)): a free vector

    中心轴与螺距The central axis and the pitch

    要找参考点 \(\mathbf c\) 使 \(\mathbf m_c=\mathbf m-\mathbf c\times\mathbf f\) 平行于 \(\mathbf f\)。取 \(\mathbf c_0=\mathbf f\times\mathbf m/\|\mathbf f\|^2\),用 \(\mathbf c_0\times\mathbf f=\big[\mathbf m\|\mathbf f\|^2-\mathbf f(\mathbf f\cdot\mathbf m)\big]/\|\mathbf f\|^2\)(双重叉积公式)得到

    We want a reference point \(\mathbf c\) with \(\mathbf m_c=\mathbf m-\mathbf c\times\mathbf f\) parallel to \(\mathbf f\). Take \(\mathbf c_0=\mathbf f\times\mathbf m/\|\mathbf f\|^2\); by the double cross product identity \(\mathbf c_0\times\mathbf f=\big[\mathbf m\|\mathbf f\|^2-\mathbf f(\mathbf f\cdot\mathbf m)\big]/\|\mathbf f\|^2\), so

    $$ \mathbf m_{c_0}=\mathbf m-\mathbf c_0\times\mathbf f=\hl{axis}{h}\,\mathbf f,\qquad h=\frac{\mathbf f\cdot\mathbf m}{\|\mathbf f\|^2},\qquad \text{axis}=\{\mathbf c_0+s\,\mathbf f\}. $$

    沿 \(\mathbf f\) 方向平移参考点不改变 \(\mathbf c\times\mathbf f\),所以整条直线都是中心轴;在这条线上力矩最小(\(\|\mathbf m\|\) 取最小值 \(|h|\,\|\mathbf f\|\))。与 twist 的螺旋轴 \((\boldsymbol\omega,\mathbf v)\)(5.6 节)逐项对应,只是把 \((\boldsymbol\omega,\mathbf v)\) 换成 \((\mathbf f,\mathbf m)\)。顺带一个重要的概念:若 \(\boldsymbol\xi^\top\mathbf F=0\),称两者互易,该 wrench 沿这个运动不做功。铰链提供的约束 wrench 与它允许的 twist 互易:这是 8.4 节描述接触约束的语言。

    Sliding the reference point along \(\mathbf f\) does not change \(\mathbf c\times\mathbf f\), so the whole line is the central axis; on it the moment is smallest (\(\|\mathbf m\|\) takes its minimum \(|h|\,\|\mathbf f\|\)). It mirrors the twist's screw axis \((\boldsymbol\omega,\mathbf v)\) (Lesson 5.6) term by term, with \((\boldsymbol\omega,\mathbf v)\) replaced by \((\mathbf f,\mathbf m)\). A related idea: if \(\boldsymbol\xi^\top\mathbf F=0\), the two are called reciprocal: the wrench does no work along that motion. The constraint wrenches of a hinge are reciprocal to the twists it allows, which is the language of contact constraints in Lesson 8.4.

    虚功:为什么是 JᵀF(三维版)Virtual work: why JᵀF (the 3D version)

    3.4 节在平面里推过。三维里完全一样,只需把"力×位移"换成"wrench×twist"。关节虚位移 \(\delta\mathbf q\) 使手爪产生虚位移 twist \(\delta\boldsymbol\xi=J\delta\mathbf q\)(\(J\) 是 7.4 节的空间或机体雅可比,\(\mathbf F\) 取同一个系里的 wrench)。手爪对环境做的虚功必须由电机提供(扣除位能的增加 \(\delta U\)):

    Lesson 3.4 did this in the plane. In 3D it is the same with "force × displacement" replaced by "wrench × twist". A virtual joint displacement \(\delta\mathbf q\) gives the gripper a virtual twist \(\delta\boldsymbol\xi=J\delta\mathbf q\) (with \(J\) the space or body Jacobian of Lesson 7.4 and \(\mathbf F\) the wrench in the same frame). The virtual work the gripper does on the environment must be supplied by the motors (minus the gain in potential energy \(\delta U\)):

    $$ \boldsymbol\tau^\top\delta\mathbf q=\delta U+\mathbf F^\top\delta\boldsymbol\xi=\Big(\tfrac{\partial U}{\partial\mathbf q}\Big)^{\!\top}\delta\mathbf q+\mathbf F^\top J\,\delta\mathbf q\quad\forall\,\delta\mathbf q\ \Longrightarrow\ \boldsymbol\tau=\mathbf g(\mathbf q)+J^\top\mathbf F . $$

    \(J_s^\top\mathbf F_s=J_b^\top\mathbf F_b\) 的验证:\(J_b=\operatorname{Ad}_{T_{bs}}J_s\),\(\mathbf F_b=\operatorname{Ad}_{T_{sb}}^{\!\top}\mathbf F_s\),故 \(J_b^\top\mathbf F_b=J_s^\top\operatorname{Ad}_{T_{bs}}^{\!\top}\operatorname{Ad}_{T_{sb}}^{\!\top}\mathbf F_s=J_s^\top(\operatorname{Ad}_{T_{sb}}\operatorname{Ad}_{T_{bs}})^{\top}\mathbf F_s=J_s^\top\mathbf F_s\)。位能 \(U=\sum_k m_kg\,z_k(\mathbf q)\),所以 \(\mathbf g=\sum_k m_kg\,J_{v,k}^\top\hat{\mathbf z}\),其中 \(J_{v,k}\) 是第 \(k\) 个质点的线速度雅可比,只有靠近基座一侧、会移动这个质点的关节才有非零列。(FIG 3 的重力项、FIG 4 的负载地图都是这样算的。这里的 \(\mathbf g(\mathbf q)\) 是静止时的保持力矩;速度不为零时还有惯性与科氏项,那是第 8 章动力学的内容,8.3。)

    To check \(J_s^\top\mathbf F_s=J_b^\top\mathbf F_b\): \(J_b=\operatorname{Ad}_{T_{bs}}J_s\) and \(\mathbf F_b=\operatorname{Ad}_{T_{sb}}^{\!\top}\mathbf F_s\), so \(J_b^\top\mathbf F_b=J_s^\top\operatorname{Ad}_{T_{bs}}^{\!\top}\operatorname{Ad}_{T_{sb}}^{\!\top}\mathbf F_s=J_s^\top(\operatorname{Ad}_{T_{sb}}\operatorname{Ad}_{T_{bs}})^{\top}\mathbf F_s=J_s^\top\mathbf F_s\). The potential energy is \(U=\sum_k m_kg\,z_k(\mathbf q)\), hence \(\mathbf g=\sum_k m_kg\,J_{v,k}^\top\hat{\mathbf z}\), where \(J_{v,k}\) is the linear-velocity Jacobian of the \(k\)-th point mass; only joints on the base side of that mass, which can move it, have nonzero columns. (This is how the gravity term of FIG 3 and the payload map of FIG 4 are computed. \(\mathbf g(\mathbf q)\) is the holding torque at rest; when moving there are also inertial and Coriolis terms, the subject of Chapter 8, 8.3.)

    一节连杆的平衡:递推(8.2 预告)Equilibrium of one link: the recursion (a preview of 8.2)

    不用 \(J\) 也能算关节力矩:从末端往基座逐节做力和力矩的平衡。设 \(\mathbf F_i\) 是连杆 \(i-1\) 通过关节 \(i\) 施加给连杆 \(i\) 的 wrench(在 {i} 系里),\(\mathbf F_{n+1}\) 是手爪施加给环境的 wrench。静止时连杆 \(i\) 受 \(\mathbf F_i\)、反作用 \(-\mathbf F_{i+1}\)(换到 {i} 系)和重力,三者平衡:

    The joint torques can also be computed without \(J\): balance forces and moments link by link from the tip to the base. Let \(\mathbf F_i\) be the wrench that link \(i-1\) applies to link \(i\) through joint \(i\) (in frame {i}), and \(\mathbf F_{n+1}\) the wrench the gripper applies to the environment. At rest link \(i\) feels \(\mathbf F_i\), the reaction \(-\mathbf F_{i+1}\) (moved into frame {i}) and gravity, and the three balance:

    $$ \mathbf F_i=\operatorname{Ad}_{T_{i+1,i}}^{\!\top}\mathbf F_{i+1}+\mathbf F^{\text{g}}_i,\qquad \tau_i=\mathbf F_i^\top\mathbf A_i,\qquad i=n,\dots,1 . $$

    其中 \(\mathbf F^{\text{g}}_i\) 是支撑连杆 \(i\) 自重所需的 wrench(重力 wrench 的反号);\(\mathbf A_i\) 是关节 \(i\) 在 {i} 系里的螺旋轴,\(\tau_i=\mathbf F_i^\top\mathbf A_i\) 取的是关节能传递的那个分量:电机只承担 wrench 在自己轴上的投影,其余五个分量由轴承的约束反力承担(与上面的"互易"同一回事)。这就是牛顿–欧拉逆动力学的静态特例,8.2 加上加速度项就是完整算法。

    where \(\mathbf F^{\text{g}}_i\) is the wrench needed to support link \(i\)'s weight (minus gravity's wrench on it) and \(\mathbf A_i\) is joint \(i\)'s screw axis in frame {i}, and \(\tau_i=\mathbf F_i^\top\mathbf A_i\) picks the one component the joint can transmit: the motor carries only the projection of the wrench onto its own axis, while the other five components are carried by the bearing's constraint forces (the same thing as "reciprocal" above). This is the static special case of Newton-Euler inverse dynamics; 8.2 adds the acceleration terms to get the full algorithm.

    雅可比降秩时:Jᵀ 的零空间When the Jacobian loses rank: the null space of Jᵀ

    \(\boldsymbol\tau=J^\top\mathbf F\):若 \(\mathbf F\in\ker J^\top=(\operatorname{im}J)^\perp\),则 \(\boldsymbol\tau=0\)。六轴臂在非奇异位形下 \(J\) 是可逆的 6×6,\(\ker J^\top=\{0\}\),任何非零 wrench 都需要关节出力。奇异位形下 \(\ker J^\top\neq\{0\}\):存在非零 wrench(FIG 5 里的"针")完全由结构承担,电机出力为零。反过来估计接触力:\(\hat{\mathbf F}=J^{-\top}(\boldsymbol\tau_{\text{meas}}-\mathbf g)\),测量误差被放大 \(1/\sigma_{\min}\) 倍,在奇异方向上估计会崩溃。

    With \(\boldsymbol\tau=J^\top\mathbf F\): if \(\mathbf F\in\ker J^\top=(\operatorname{im}J)^\perp\), then \(\boldsymbol\tau=0\). A six-axis arm away from singularities has an invertible 6×6 \(J\), \(\ker J^\top=\{0\}\), and any nonzero wrench needs joint effort. At a singularity \(\ker J^\top\neq\{0\}\): some nonzero wrenches (the "needle" in FIG 5) are carried entirely by the structure, at zero motor effort. Estimating a contact force the other way round, \(\hat{\mathbf F}=J^{-\top}(\boldsymbol\tau_{\text{meas}}-\mathbf g)\), amplifies the measurement error by \(1/\sigma_{\min}\), and the estimate breaks down along singular directions.

    预告:摩擦锥与抓取方程Previews: the friction cone and the grasp equation

    摩擦(8.4):点接触能传递的 wrench 不是任意的。在接触系里(\(z\) 沿法向)是 \((\mathbf m,\mathbf f)=(0,\ f_x,f_y,f_z)\),且 \(f_z\ge0\)、\(\sqrt{f_x^2+f_y^2}\le\mu f_z\):六维 wrench 空间里的一个圆锥,称摩擦锥。抓取(9.3):\(k\) 个接触把各自的 wrench 用 \(\operatorname{Ad}^\top\) 搬到物体系再相加,\(\mathbf w=\sum_iG_i\mathbf f_i=G\mathbf f_c\),静止要求 \(G\mathbf f_c=-\mathbf w_{\text{ext}}\)(例如重力)且每个 \(\mathbf f_i\) 都在摩擦锥内。接触力能不能"顶住"任意方向的外力,就是力封闭的问题。

    Friction (8.4): a point contact cannot transmit an arbitrary wrench. In the contact frame (\(z\) along the normal) it is \((\mathbf m,\mathbf f)=(0,\ f_x,f_y,f_z)\) with \(f_z\ge0\) and \(\sqrt{f_x^2+f_y^2}\le\mu f_z\): a circular cone in the 6D wrench space, the friction cone. Grasping (9.3): \(k\) contacts move their wrenches to the object frame with \(\operatorname{Ad}^\top\) and add them, \(\mathbf w=\sum_iG_i\mathbf f_i=G\mathbf f_c\); equilibrium requires \(G\mathbf f_c=-\mathbf w_{\text{ext}}\) (for instance gravity) with every \(\mathbf f_i\) inside its friction cone. Whether the contacts can "resist" an external wrench in any direction is the question of force closure.

    6机器人中的它:腕部力传感器与重力补偿In robotics: the wrist force sensor and gravity compensation

    腕部六维力/力矩传感器(F/T sensor)把应变片的信号标定成传感器系里的 wrench。把它装在手腕与工具之间,它测的却是工具对传感器的总 wrench:接触力,再加上工具自重。工具歪着时重力在传感器各轴上的分量都不为零,即使没碰到任何东西,读数也不是零。重力方向固定在世界系里,随着手腕转动,它在传感器系里的分量随之变化,必须在线扣除:用工具质量 \(m_t\)、质心 \(\mathbf c_t\)(在传感器系里)和当前姿态算出重力 wrench,再相减:

    A six-axis wrist force/torque sensor calibrates its strain-gauge signals into a wrench in the sensor frame. Mounted between the wrist and the tool, it measures the total wrench the tool exerts on the sensor: the contact wrench plus the weight of the tool. With the tool slanted, gravity has components on every sensor axis, so even when touching nothing the reading is not zero. Gravity's direction is fixed in the world, so as the wrist turns its components in the sensor frame change, and must be removed online: use the tool mass \(m_t\), the center of mass \(\mathbf c_t\) (in the sensor frame) and the current orientation to compute the gravity wrench and subtract it:

    $$ \mathbf F_{\text{contact}}^{s}=\mathbf F_{\text{raw}}^{s}-\underbrace{\begin{bmatrix}\mathbf c_t\times\mathbf f_g^{s}\\ \mathbf f_g^{s}\end{bmatrix}}_{\text{gravity wrench}},\qquad \mathbf f_g^{s}=R_{ws}^\top\begin{bmatrix}0\\0\\-m_tg\end{bmatrix} . $$

    这里的 \(\mathbf c_t\times\mathbf f_g^s\) 就是 FIG 1 的 \(\mathbf r\times\mathbf f\):重力作用在质心而不是传感器原点。下图是侧视图。把传感器倾斜,看原始读数怎么随角度变;再给一个接触力;最后故意把质量参数标错 10%,看补偿后的残差。

    The term \(\mathbf c_t\times\mathbf f_g^s\) is the \(\mathbf r\times\mathbf f\) of FIG 1: gravity acts at the center of mass, not at the sensor origin. The figure is a side view. Tilt the sensor and watch the raw reading change with the angle; add a contact force; finally mis-set the mass parameter by 10% on purpose and look at the residual after compensation.

    FIG 6F/T 传感器:重力偏置与补偿The F/T sensor: gravity bias and compensation
    侧视图(x–z 平面)SIDE VIEW (x–z plane)
    原始读数 = 接触 + 重力(传感器系,参考点为传感器原点)。四列依次是原始读数、重力模型、补偿后的读数、真实的接触 wrench;力的条满幅为 ±20 N,力矩的条满幅为 ±3 N·m。侧视图里中性色(与工具同色)的箭头是重力(0.04 m/N),琥珀色是环境推在工具尖端上的力,红蓝线是传感器的 x、z 轴。图只画了倾角,"滚转"绕工具轴转动,只改变 \(f_x,f_y\) 的分配。 Raw reading = contact + gravity (sensor frame, reference point at the sensor origin). The four columns are the raw reading, the gravity model, the compensated reading and the true contact wrench; force bars are full-scale ±20 N and moment bars ±3 N·m. In the side view the neutral arrow (the tool's own color) is gravity (0.04 m per N), amber is the force the environment exerts on the tool tip, and the red and blue lines are the sensor's x and z axes. The drawing shows only the tilt; "roll" turns about the tool axis and only redistributes \(f_x\) and \(f_y\).
    • 把接触力调到 0,再把工具倾斜到接近水平,让原始读数里的力矩超过 1.5 N·m。什么也没碰到,传感器却读到了力矩:重力作用在质心上,质心离传感器原点有一段杠杆臂(FIG 1)。Set the contact force to 0, then tilt the tool toward horizontal until the raw moment exceeds 1.5 N·m. Nothing is touching, yet the sensor reads a moment: gravity acts at the center of mass, which sits a lever arm away from the sensor origin (FIG 1).
    真实系统里In real systems

    六维力/力矩传感器:ATI(Mini/Gamma/Nano 系列)、Robotiq FT 300、OnRobot HEX 等装在腕部,报告传感器系里的 wrench,使用前要先"去皮"(tare)并做重力补偿。关节力矩传感:Franka Emika Panda 的每个关节都有力矩传感器,KUKA LBR iiwa 同样;控制器用 \(\hat{\mathbf F}_{\text{ext}}=J^{-\top}(\boldsymbol\tau_{\text{meas}}-\mathbf g-\dots)\) 估计末端受到的外力(libfranka 把估计值放在机器人状态里,顺序为先力后力矩)。电机电流估计:没有力矩传感器的臂(例如 UR 的 CB3 一代)靠电流估计关节力矩,再用 \(J^\top\) 反推,精度受齿轮摩擦限制(9.4 节)。重力补偿 + 手把手示教:控制器输出 \(\boldsymbol\tau=\mathbf g(\mathbf q)\),人推一下手臂就能轻松移动,这是示教与数据采集的基础。阻抗/导纳控制(Hogan 1985;Part IV):把 \(\mathbf F=K\,\delta\mathbf x+\dots\) 做成控制律,插孔、打磨、人机协作都靠它。遥操作与力反馈:力觉手柄(如 Phantom、Omega 系列)把远端测到的 wrench 经 \(J^\top\) 变成手柄电机力矩。足式机器人:脚底接触 wrench 经 \(J^\top\) 变成腿部关节力矩,全身控制把它们当约束来优化(9.2 节)。

    Six-axis F/T sensors: ATI (Mini, Gamma, Nano series), Robotiq FT 300, OnRobot HEX and others sit at the wrist and report a wrench in the sensor frame; they must be tared and gravity-compensated before use. Joint torque sensing: every joint of the Franka Emika Panda has a torque sensor, as does the KUKA LBR iiwa; the controller estimates the external wrench \(\hat{\mathbf F}_{\text{ext}}=J^{-\top}(\boldsymbol\tau_{\text{meas}}-\mathbf g-\dots)\) (libfranka exposes the estimate in the robot state, ordered force first, then torque). Motor-current estimation: arms without torque sensors (for example the UR CB3 generation) estimate joint torques from motor current and invert with \(J^\top\), limited by gear friction (Lesson 9.4). Gravity compensation + hand guiding: the controller outputs \(\boldsymbol\tau=\mathbf g(\mathbf q)\), so a light push moves the arm freely, the basis of kinesthetic teaching and demonstration collection. Impedance/admittance control (Hogan 1985; Part IV): make \(\mathbf F=K\,\delta\mathbf x+\dots\) the control law; peg-in-hole insertion, polishing and human-robot collaboration depend on it. Teleoperation with force feedback: haptic devices (the Phantom and Omega series, for instance) turn the wrench measured at the remote side into handle motor torques through \(J^\top\). Legged robots: foot contact wrenches become leg joint torques through \(J^\top\), and whole-body controllers optimize over them as constraints (Lesson 9.2).

    7常见误区Common pitfalls

    误区 1:把 wrench 当 twist 来换系(用 Ad 而不是 Adᵀ)Pitfall 1: transforming a wrench like a twist (Ad instead of Adᵀ)

    Ad 和 Adᵀ 的块结构看起来很像,只差一个转置,代码里最容易写错,而且不会报错:数字照样算出来,只是错的。FIG 2 的功率检查就是用来抓这个错误的。一个反例:传感器在世界系里的位置是 \(\mathbf p=(1,0,0)\),朝向与世界相同,施加纯力 \(\mathbf f=(0,0,1)\) N(力矩为零)。正确答案 \(\mathbf F_s=\operatorname{Ad}^\top\mathbf F_w\) 给出力矩 \(-\mathbf p\times\mathbf f=(0,1,0)\) N·m,而用 Ad 得到的是 \((0,0,0,\ 0,0,1)\):杠杆臂造成的力矩整个丢了。写完换系的函数,永远用 \(\boldsymbol\xi_a^\top\mathbf F_a=\boldsymbol\xi_b^\top\mathbf F_b\) 做单元测试。

    Ad and Adᵀ have nearly the same block structure, differing by one transpose, so this is the easiest thing to get wrong in code, and it raises no error: you still get numbers, just wrong ones. The power check in FIG 2 exists to catch it. A counterexample: the sensor sits at \(\mathbf p=(1,0,0)\) in the world, with the world's orientation, and the world wrench is a pure force \(\mathbf f=(0,0,1)\) N (zero moment). The correct \(\mathbf F_s=\operatorname{Ad}^\top\mathbf F_w\) gives the moment \(-\mathbf p\times\mathbf f=(0,1,0)\) N·m, while using Ad gives \((0,0,0,\ 0,0,1)\): the moment due to the lever arm is lost entirely. After writing any frame-change function, unit-test it with \(\boldsymbol\xi_a^\top\mathbf F_a=\boldsymbol\xi_b^\top\mathbf F_b\).

    误区 2:(m, f) 与 (f, m) 的顺序,以及 Ad 的块顺序Pitfall 2: (m, f) versus (f, m), and the block order of Ad

    不同库的约定不同:本课、Modern Robotics、Featherstone 的空间向量、Drake 都是(角/力矩在前,线/力在后);ROS 的 geometry_msgs/Twist 是先 linear 后 angular,Wrench 是分开的 force、torque 两个字段;Pinocchio 的 6 维向量先线性后角;libfranka 的外力估计也是先力后力矩。顺序一变,Ad 的块也要对调(\(\begin{bmatrix}R&0\\ [\mathbf p]_\times R&R\end{bmatrix}\) 变成 \(\begin{bmatrix}R&[\mathbf p]_\times R\\ 0&R\end{bmatrix}\))。接别人的数据或库时,先用 \(\boldsymbol\xi^\top\mathbf F\) 的一个已知例子验证顺序。

    Libraries disagree: this lesson, Modern Robotics, Featherstone's spatial vectors and Drake put angular/moment first and linear/force second; ROS's geometry_msgs/Twist has linear first then angular, and Wrench has separate force and torque fields; Pinocchio's 6-vectors are linear first, then angular; libfranka's external-force estimate is force first, then torque. When the order changes, the blocks of Ad must swap (\(\begin{bmatrix}R&0\\ [\mathbf p]_\times R&R\end{bmatrix}\) becomes \(\begin{bmatrix}R&[\mathbf p]_\times R\\ 0&R\end{bmatrix}\)). When you plug in someone else's data or library, check the order with one known example of \(\boldsymbol\xi^\top\mathbf F\).

    误区 3:换了参考点却忘了杠杆臂Pitfall 3: moving the reference point and forgetting the lever arm

    "我只在工具尖端推了 10 N 的力,传感器怎么读到了力矩?"因为传感器的参考点在手腕,尖端在 0.4 m 外:\(\mathbf m_s=\mathbf p\times\mathbf f\),4 N·m 的力矩纯粹是杠杆臂造成的,没有人"扭"过工具。反过来,若控制器要的是尖端的接触力,直接用传感器原点的 \(\mathbf f\) 虽然数值对(力不随点变),但算接触力矩时必须换点。把"力沿作用线滑动不变"与"力垂直于作用线挪开就变"分清:前者只改变力矩为零(\(\mathbf r\parallel\mathbf f\))的参考点。

    "I only pushed 10 N at the tool tip; why does the sensor read a moment?" Because the sensor's reference point is at the wrist, 0.4 m from the tip: \(\mathbf m_s=\mathbf p\times\mathbf f\), and the 4 N·m is purely the lever arm; nobody twisted the tool. Conversely, if the controller wants the contact force at the tip, using the sensor-origin \(\mathbf f\) gives the right numbers (force does not depend on the point), but computing the contact moment requires moving the point. Keep apart "a force may slide along its line of action unchanged" and "moving the point off the line changes the moment": only reference points with \(\mathbf r\parallel\mathbf f\) leave the moment unchanged.

    误区 4:忘了传感器的重力偏置(以及它随姿态变化)Pitfall 4: forgetting the sensor's gravity bias (and that it varies with posture)

    在一个姿态下"去皮"(读数清零)只补偿了那个姿态的重力。手腕一转,重力在传感器系里的分量就变了(FIG 6)。必须用姿态实时计算 \(\mathbf f_g^s=R_{ws}^\top(0,0,-m_tg)\) 和 \(\mathbf c_t\times\mathbf f_g^s\),并标定 \(m_t\)、\(\mathbf c_t\)。参数有误会留下与姿态有关的残差,比如质量差 10% 会留下 10% 的重力残差,在力控制里表现为"手臂自己在慢慢爬"。传感器还有温漂,需要定期去皮。负载也包括抓着的零件:抓起一个零件后,\(m_t\)、\(\mathbf c_t\) 都变了。

    Taring (zeroing the reading) in one posture only compensates gravity in that posture. Turn the wrist and gravity's components in the sensor frame change (FIG 6). You must compute \(\mathbf f_g^s=R_{ws}^\top(0,0,-m_tg)\) and \(\mathbf c_t\times\mathbf f_g^s\) from the live orientation, and calibrate \(m_t\) and \(\mathbf c_t\). Wrong parameters leave a posture-dependent residual: a 10% mass error leaves 10% of the weight uncompensated, which shows up in force control as the arm "slowly creeping". Sensors also drift with temperature and need periodic re-taring. And the payload includes whatever is grasped: after picking up a part, both \(m_t\) and \(\mathbf c_t\) change.

    误区 5:把 τ = JᵀF 当成任何位形、任何电机都成立的真理Pitfall 5: treating τ = JᵀF as true at every posture and for every motor

    两个破绽。其一,奇异位形:FIG 5 的"针"说明某些方向的力矩/力不需要关节出力,反过来也意味着你无法通过关节主动控制这个方向的力,从关节力矩估计力时误差被放大 \(1/\sigma_{\min}\) 倍。其二,电机力矩 ≠ 关节力矩:\(\boldsymbol\tau\) 是作用在连杆上的力矩;电机出的力矩要先过减速器,经过齿轮摩擦、反向间隙、弹性才到关节,用电流乘力矩常数估计 \(\boldsymbol\tau\) 在低速、换向时误差很大(9.4 节)。这也是 Franka、iiwa 要在关节输出端装力矩传感器的原因。另外,\(\mathbf g(\mathbf q)\) 只是静态的保持力矩,运动时还要加惯性与科氏项(第 8 章)。

    Two cracks. First, singular postures: the "needle" of FIG 5 says that along some directions force and moment need no joint effort, which also means you cannot actively control force in that direction through the joints, and an estimate of force from joint torques is amplified by \(1/\sigma_{\min}\). Second, motor torque ≠ joint torque: \(\boldsymbol\tau\) is the torque on the link; the motor torque passes through a gearbox, with gear friction, backlash and elasticity on its way to the joint, so estimating \(\boldsymbol\tau\) as motor current times the torque constant is badly off at low speed and during reversals (Lesson 9.4). That is why the Franka and iiwa put torque sensors on the joint output. Finally, \(\mathbf g(\mathbf q)\) is only the static holding torque; moving adds inertial and Coriolis terms (Chapter 8).

    8小练习Check yourself

    1. 原点 \(O\) 处的 wrench 是 \(\mathbf m=(0,-3,0)\) N·m,\(\mathbf f=(0,0,10)\) N。参考点移到 \(O'=(0.5,0,0)\) m(坐标轴不变),新的力矩 \(\mathbf m'\) 是?1. The wrench at the origin \(O\) is \(\mathbf m=(0,-3,0)\) N·m, \(\mathbf f=(0,0,10)\) N. The reference point moves to \(O'=(0.5,0,0)\) m (axes unchanged). What is the new moment \(\mathbf m'\)?
    \(\mathbf r=(0.5,0,0)\),\(\mathbf r\times\mathbf f=(0\cdot10-0\cdot0,\ 0\cdot0-0.5\cdot10,\ 0)=(0,-5,0)\),\(\mathbf m'=\mathbf m-\mathbf r\times\mathbf f=(0,-3,0)-(0,-5,0)=(0,2,0)\)。检验:原来力的作用点在 \(x=0.3\)(因为 \(\mathbf m=\mathbf x\times\mathbf f=(0,-3,0)\)),相对 \(O'\) 的杠杆臂是 \((-0.2,0,0)\),\((-0.2,0,0)\times(0,0,10)=(0,2,0)\),吻合。选项 A 是把减号写成了加号,C 是忘了换点。\(\mathbf r=(0.5,0,0)\), \(\mathbf r\times\mathbf f=(0\cdot10-0\cdot0,\ 0\cdot0-0.5\cdot10,\ 0)=(0,-5,0)\), so \(\mathbf m'=\mathbf m-\mathbf r\times\mathbf f=(0,-3,0)-(0,-5,0)=(0,2,0)\). Check: the force must act at \(x=0.3\) (since \(\mathbf m=\mathbf x\times\mathbf f=(0,-3,0)\)); relative to \(O'\) its lever arm is \((-0.2,0,0)\), and \((-0.2,0,0)\times(0,0,10)=(0,2,0)\), as found. Option A adds instead of subtracting; C forgets to move the point.
    2. 传感器系 {s} 在世界系 {w} 中的位姿是 \(T_{ws}\),世界系里的 wrench 是 \(\mathbf F_w\)。传感器读到的是?2. The sensor frame {s} has pose \(T_{ws}\) in the world frame {w}, and the world-frame wrench is \(\mathbf F_w\). What does the sensor read?
    规则:\(\mathbf F_b=\operatorname{Ad}_{T_{ab}}^{\!\top}\mathbf F_a\),\(T_{ab}\) 是新系 {b} 在旧系 {a} 中的位姿。这里旧系是 {w}、新系是 {s},所以用 \(T_{ws}\)。B 是 twist 的规则;C 把位姿的方向写反了(那是 {w} 在 {s} 中的位姿);D 忽略了参考点和坐标轴都变了。The rule: \(\mathbf F_b=\operatorname{Ad}_{T_{ab}}^{\!\top}\mathbf F_a\), where \(T_{ab}\) is the pose of the new frame {b} in the old frame {a}. Here the old frame is {w} and the new one {s}, so use \(T_{ws}\). B is the rule for twists; C has the pose reversed (that is {w} in {s}); D ignores that both reference point and axes change.
    3. 刚体的 twist 是 \(\boldsymbol\xi=(\boldsymbol\omega,\mathbf v)=(0,0,2,\ 0.5,0,0)\)(rad/s,m/s),受到的 wrench 是 \(\mathbf F=(\mathbf m,\mathbf f)=(0,0,1.5,\ 4,0,0)\)(N·m,N)。wrench 对刚体做功的功率是?3. A rigid body has twist \(\boldsymbol\xi=(\boldsymbol\omega,\mathbf v)=(0,0,2,\ 0.5,0,0)\) (rad/s, m/s) and carries the wrench \(\mathbf F=(\mathbf m,\mathbf f)=(0,0,1.5,\ 4,0,0)\) (N·m, N). What power does the wrench deliver?
    \(P=\boldsymbol\omega\cdot\mathbf m+\mathbf v\cdot\mathbf f=2\times1.5+0.5\times4=3+2=5\) W。选 0 W 的人把两个向量的顺序配错了(拿 \(\boldsymbol\omega\) 去乘 \(\mathbf f\),\(\mathbf v\) 去乘 \(\mathbf m\)),这正是误区 2。3 W 和 2 W 各漏掉了一项。\(P=\boldsymbol\omega\cdot\mathbf m+\mathbf v\cdot\mathbf f=2\times1.5+0.5\times4=3+2=5\) W. Anyone choosing 0 W paired the two orderings wrongly (multiplying \(\boldsymbol\omega\) with \(\mathbf f\) and \(\mathbf v\) with \(\mathbf m\)), which is Pitfall 2. 3 W and 2 W each drop one term.
    4. 一根水平放置的均匀杆,长 1 m、质量 3 kg,一端接在肩关节上(轴水平且垂直于杆),另一端固定着一个 2 kg 的重物(可看成质点)。肩关节要提供多大的保持力矩?(\(g=9.81\) m/s²)4. A horizontal uniform rod, 1 m long and 3 kg, is attached at one end to a shoulder joint (axis horizontal and perpendicular to the rod), with a 2 kg point mass fixed at the other end. What holding torque must the shoulder supply? (\(g=9.81\) m/s²)
    \(\tau=\sum m_kg\,x_k=3\times9.81\times0.5+2\times9.81\times1=14.7+19.6=34.3\) N·m。这就是 \(\mathbf g=\sum m_kg\,J_{v,k}^\top\hat{\mathbf z}\):杆的质量集中在中点(杠杆臂 0.5 m),重物在端点(杠杆臂 1 m)。A 漏了杆,D 漏了重物,C 把杆当成全部质量都在端点。\(\tau=\sum m_kg\,x_k=3\times9.81\times0.5+2\times9.81\times1=14.7+19.6=34.3\) N·m. This is \(\mathbf g=\sum m_kg\,J_{v,k}^\top\hat{\mathbf z}\): the rod's mass acts at the midpoint (lever arm 0.5 m), the weight at the end (1 m). A forgets the rod, D forgets the weight, C puts the whole rod mass at the end.
    5. 手臂完全伸直,手爪沿手臂方向向外推 100 N(对着一堵墙)。关于关节力矩与力椭球,哪个说法正确?5. The arm is fully stretched out and the gripper pushes 100 N outward along the arm (against a wall). Which statement about joint torques and the force ellipsoid is correct?
    力沿手臂的作用线通过肩、肘关节,对它们的杠杆臂为零,\(\boldsymbol\tau=J^\top\mathbf F\approx0\)(\(\mathbf F\) 落在 \(\ker J^\top\) 里)。力椭球的半轴 \(1/\sigma_{\min}\to\infty\),这个方向"一个单位力矩就能顶出很大的力"。代价是这个方向上手爪动不了,也无法靠关节主动调节力(误区 5)。The force's line of action runs through the shoulder and elbow, so its lever arm about them is zero and \(\boldsymbol\tau=J^\top\mathbf F\approx0\) (\(\mathbf F\) lies in \(\ker J^\top\)). The force ellipsoid's semi-axis \(1/\sigma_{\min}\to\infty\): "one unit of torque can hold a huge force" along this direction. The price: the tip cannot move in this direction, and the joints cannot regulate the force there either (Pitfall 5).

    9延伸阅读Further reading

    • K. Lynch & F. Park, Modern Robotics, Sec. 3.4 (Wrenches), Sec. 5.2 (Statics of Open Chains) & Sec. 5.4 (Manipulability) — wrench、换系 \(\operatorname{Ad}^\top\)、\(\boldsymbol\tau=J^\top\mathbf F\) 与力椭球;本课的 \((\mathbf m,\mathbf f)\) 顺序与它一致wrenches, the change of frame by \(\operatorname{Ad}^\top\), \(\boldsymbol\tau=J^\top\mathbf F\) and the force ellipsoid; this lesson's \((\mathbf m,\mathbf f)\) order follows the book
    • R. Murray, Z. Li & S. Sastry, A Mathematical Introduction to Robotic Manipulation, CRC Press, 1994, Ch. 2 — 刚体运动、twist 与 wrench、互易螺旋系统rigid body motion, twists and wrenches, reciprocal screw systems
    • B. Siciliano, L. Sciavicco, L. Villani & G. Oriolo, Robotics: Modelling, Planning and Control, Ch. 3 — 运动学–静力学对偶、力椭球与可操作度椭球the kineto-statics duality, force and manipulability ellipsoids
    • N. Hogan, Impedance Control: An Approach to Manipulation (Parts I–III), J. Dynamic Systems, Measurement, and Control 107(1), 1985 — 阻抗控制的出处,把接触力当作被控的变量the source of impedance control, treating contact force as the controlled quantity
    • O. Khatib, A Unified Approach for Motion and Force Control of Robot Manipulators: The Operational Space Formulation, IEEE J. Robotics and Automation 3(1), 1987 — 在工作空间里把 \(\mathbf F\) 与关节力矩联系起来的力控制框架force control in operational space, linking \(\mathbf F\) to joint torques
    • R. Featherstone, Rigid Body Dynamics Algorithms, Springer, 2008, Ch. 2 — 空间向量代数:运动向量与力向量如何对偶地变换spatial vector algebra: how motion vectors and force vectors transform dually
    • R. S. Ball, A Treatise on the Theory of Screws, Cambridge University Press, 1900 — 螺旋理论的历史源头:twist 与 wrench 是同一种几何对象的两面the historical source of screw theory, where twists and wrenches are two faces of one geometric object