☰
机器人自由度计算避坑:构型空间与Grübler公式
2026/10/27 5:04:53 网站建设 项目流程

简介:《现代机器人学》课后习题答案PDF面向机器人专业学生、工程师及自学者,用于对照教材巩固运动学、动力学、路径规划与控制等核心知识,适合课程复习、习题自查和考前查漏补缺。压缩包内含1个PDF文件,大小约13.97MB,按章节组织解答,覆盖第2至第13章练习,涉及自由度计算、球形关节与约束分析、七自由度上肢机构等典型题目,便于按知识模块定位。已有1247人学习,说明其在机器人学学习群体中具有一定参考价值。读者可借助逐题推导核对思路,理解机构运动特性、空间定位与关节约束之间的关联,对复杂公式和刚体约束的推导过程可反复研读,并延伸到机械设计、规划和控制问题的分析,从而提升理论联系实际的能力。

1. 自由度为什么总差一位:从数关节到数约束的视角切换

把一个并联平台摊在纸上,一条腿一条腿地数关节,很容易数出一个远大于 6 的数字,但平台整体只能有 6 个自由度。机器人学里最容易被低估的一课就在这里:自由度不是关节数量的加总,而是构型空间的维数。同一套机构,换一种记账方式,公式给出的数字可以差出好几位。这套覆盖第 2 到第 13 章的习题解答,真正有价值的部分不是答案本身,而是它反复演示的记账规则:先定拓扑,再数连杆,再数关节,最后才代公式。把这套规则吃透,看到任何并联或过约束机构,都能判断出「公式给的值」和「实物能不能动」之间的差距从哪来。

2. 构型空间:n 个点为什么恰好有 n(n+1)/2 个自由度

2.1 逐点放置:每一步到底扣掉了几个自由度

先从最朴素的建模动作开始:在空间里放置 n 个点,让它们构成一个刚体。第一个点没有任何约束,n 个自由度随你摆。第二个点不行了,它必须和第一个点保持固定距离,于是被约束在一个以第一点为球心、半径固定的球面 S^{n-1} 上,只剩 n-1 个自由度。第三个点同时受前两个点约束,落在两个球面的交集上,剩 n-2 个。依此类推,最后一个点只能落在 S^1 上,贡献 1 个自由度。

把这串数字加起来就是 n + (n-1) + (n-2) + … + 1,首尾配对后每对都等于 n+1,共 n/2 对,结果是 n(n+1)/2。这个求和技巧本身没什么稀奇,稀奇的是它揭示的机制:刚体的自由度不是一次性给定的,而是一个点一个点"钉"出来的,每钉一个点就消耗掉一维球面上的位置选择。

这条推理还能顺手解释一个常见困惑:为什么确定一个刚体位姿只要 n+1 个点。第 n+1 个点之后,它需要落到的球面已经退化成 S^0(两个离散点),再加点就只剩离散的镜像选择,连续的构型空间不再增长。超定约束并不会增加自由度,只会让机构要么变成结构,要么在几何巧合下产生新的运动——这一点在第 4 章会展开。

def point_placement_dof(n): """n 个点构成刚体时,构型空间的维数分解""" total = n * (n + 1) // 2 # n + (n-1) + ... + 1 linear = n # 第一个点贡献的平移自由度 rotational = total - linear # n(n-1)/2,逐点落到球面上的剩余选择 spheres = " x ".join(f"S^{k}" for k in range(n - 1, 0, -1)) return total, linear, rotational, f"R^{n} x {spheres}" for n in (2, 3, 4): print(n, point_placement_dof(n)) # 2 (3, 2, 1, 'R^2 x S^1') # 3 (6, 3, 3, 'R^3 x S^2 x S^1') # 4 (10, 4, 6, 'R^4 x S^3 x S^2 x S^1')

参数只有点数 n 一个,total对应答案里反复出现的 n(n+1)/2,linear和rotational是同一笔账按性质拆开的两栏。对照一下 n=2 和 n=3 的输出很有意思:平面两点给出 3 个自由度,正好是平面刚体的标准值;空间三点给出 6 个,正好是空间刚体的标准值。这不是巧合,而是这套构造方法在 n+1 个点时自然收束到刚体自由度。

2.2 线性项与旋转项:n 与 n(n-1)/2 是怎么分开的

答案里明确写了「n 个自由度是放置第一个点的线性自由度,其余 n(n-1)/2 是旋转自由度」。这句话容易被当成一句注脚跳过,其实它决定了后续所有误差传播的判断方式。

线性项来自第一个点的位置,它和刚体自身的朝向完全解耦,可以直接用欧氏距离度量。旋转项来自逐个点相对前一个点的方向选择,它们不是独立的平移,而是相互耦合的角度量。两者在数值优化里的病态程度完全不同:平移项的条件数通常良好,旋转项在接近奇异位形时会急剧恶化。

理解这一点之后,看到「这个机构有 7 个自由度」时就不会只当它是一个计数结果,而会追问:这 7 个里几个是可以直接驱动的直线量,几个是必须靠角度闭环控制的量。实际选型时,直线自由度多的机构标定更容易,纯旋转自由度多的机构精度更依赖减速比和编码器分辨率。

2.3 同维不同拓扑:R^n × S^{n-1} × … × S^1 与 SE(n) 的差别

答案给出了构型空间的拓扑形式 R^n × S^{n-1} × S^{n-2} × … × S^1。这串乘积的维数加起来正好是 n(n+1)/2,和刚体一致。但维数相同不等于空间相同,这是很多人翻车的地方。

以 n=3 为例,R^3 × S^2 × S^1 和真正的刚体位形空间 SE(3) = R^3 × SO(3) 都是 6 维,局部看起来完全一样,但整体拓扑不同:SO(3) 同胚于 RP^3,基本群是 Z/2,意味着绕任意轴转 2π 回不到原位、转 4π 才回到;而 S^2 × S^1 的基本群是 Z,绕杆轴转一圈是实打实的一圈。这个差别不是数学洁癖,它直接影响路径规划:在 S^2 × S^1 上做插值,绕杆自旋的路径和杆方向的路径可以分开处理;在 SO(3) 上做插值,就得用四元数或指数坐标处理那个"双覆盖"带来的符号翻转。

答案里 Exercise 2.16(b) 还点出了另一层结构:四转动关节的球面机构只有 1 个自由度,它的构型空间不是整个 T^4,而是 T^4 里的一条曲线——可能闭合,也可能自交。这条曲线才是规划器真正搜索的空间,直接在 T^4 上撒点会采到大量物理上不可达的位形。拓扑判断的第一步永远是先写出 C-space 的实际结构,再决定用什么度量、什么采样策略。

3. Grübler 公式:N、J、f_i 三个计数到底在数什么

3.1 从 3(N-1) 减到 3(N-1-J)+Σf_i 的推导

公式本身很好记,但只有自己推一遍才知道每个符号在防什么错。取平面情形:N 个连杆里有一个是地面(固定不动),剩下 N-1 个活动连杆,各自本来有 3 个自由度,总账是 3(N-1)。

每接一个关节,就扣掉一部分自由度。一个自由度为 f_i 的关节,在平面里最多允许 3 个相对运动,实际只给 f_i 个,于是扣掉 3 - f_i 个约束。把所有关节扣掉的部分加起来:

dof = 3(N-1) - Σ(3 - f_i) = 3(N-1) - 3J + Σf_i = 3(N-1-J) + Σf_i

空间情形把系数 3 换成 6,推导过程一字不改。这就是公式的真面目:它不是在"数自由度",而是在"数被关节吃掉的自由度"。这也解释了为什么 N 必须包含地面、为什么 J 数错了结果会差 3 或 6 的整数倍——错误总是以整块约束的形式出现的。

def grubler(N, joint_dofs, dim): """N: 连杆总数,含 1 个 ground joint_dofs: 每个关节的自由度列表,如 [1,1,1,3,3] dim: 3 表示平面,6 表示空间""" J = len(joint_dofs) f_sum = sum(joint_dofs) return dim * (N - 1 - J) + f_sum print(grubler(7, [1, 1, 1, 1, 1, 3, 3], 6)) # 5,六连杆带两球关节 print(grubler(14, [1] * 18, 3)) # 3,全 R/P 的平面机构 print(grubler(8, [3] * 12, 6)) # 6,六腿球关节并联平台

三个调用分别对应答案里 Exercise 2.5、2.9(b)、2.13 的原始输入。参数N一旦把地面漏掉,前两个例子会分别变成 -1 和 0,看起来像"机构卡死",其实是记账错了。

3.2 七自由度手臂:用约束反推关节构型的逆向用法

答案里 Exercise 2.2 的推理方向和常规用法相反:不是已知关节求自由度,而是先给出"手掌固定后还剩 1 个自由度"这个结论,再反推整条手臂应该是 7 个自由度。

具体拆解是这样:肩部视为球关节 3 个自由度,肘部 1 个,腕部 2 个,前臂绕自身轴线的旋转 1 个,3+1+2+1 = 7。手掌在空间中固定位置和姿态,等于施加了刚体的 6 个约束,7-6 = 1,剩下的是肘尖可以沿一段圆弧滑动。

这个 1 很有说服力:它不是随便算出来的余数,而是有明确物理图像的。肩关节中心不动、手掌不动,整条手臂的可行位形就退化成一维曲线。逆向使用公式的价值在于,它能把一个模糊的"结构合理"判断变成一个可证伪的数字。如果有人设计出一条号称 6 自由度却能同时锁住手掌和肘部的手臂,公式会立刻给出 0,提示要么关节数记错了,要么存在过约束。

答案里 Exercise 2.3 把这一招用得更狠:把前臂看成肱骨与腕骨之间的闭链,用已知的 7 自由度反推前臂各关节的自由度总和。假设关节数取最少 4 个,解出四个关节要贡献 10 个自由度;取最多 6 个,要贡献 25 个。25 这个数意味着平均每个关节超过 4 个自由度,标准关节模型撑不住,只有韧带复合体稳定下的非标准连接才能满足。公式在这里不是计算器,而是模型证伪器——它告诉你"把前臂简化成两个转动关节"这个假设在自由度层面就不成立。

3.3 并联机构的腿数无关性:6+(α-6)n 的稳定点

答案里 Exercise 2.8 的推导值得单独拎出来。把每条开链腿的自由度记作 α,机构变成 N=2(平台 + 地面)、J=n、Σf = αn,代入空间公式:

dof = 6(2 - 1 - n) + αn = 6 + (α - 6)n

只要 α = 6,n 取任何值结果都是 6。并联平台的自由度不随腿数变化,这条结论打破了很多人的直觉——加了腿怎么会不变?

机制在于每条腿贡献的"净约束"是 α-6。α=6 的腿刚好抵消自己引入的那部分自由度,所以每条腿都是"零净贡献",整体自由度锚定在 6。如果腿是 5 自由度的(比如少一个被动关节),净贡献变成 -1,每加一条腿就少一个自由度;反之如果是冗余驱动的 7 自由度腿,净贡献 +1,整体反而更松。

这条公式直接对应设计取舍:实际并联平台用 6 条腿而不是 8 条,不是因为"多两条更稳",而是因为超过 6 条之后每条腿都变成过约束条件,几何误差会让装配产生内应力。冗余腿换来的是刚度均匀性和工作空间形状,代价是标定复杂度和成本——自由度账面上不变,力学性能上变化很大。

3.4 关节合并的记账一致性:R+P 与 C 的等价条件

答案里 Exercise 2.9 用两种编码算了同一个机构:一种把相邻的转动关节和移动关节合并成圆柱关节 C,另一种全部拆开按 R 和 P 单独数。两种方式都得到 3,这个"都"才是重点。

合并操作的规则必须完整:把串联的 R+P 换成 C,关节数 J 减 1,自由度之和 Σf 不变(1+1 变成 2),同时中间那个连杆必须一起消掉,N 也减 1。三者同时调整,代入 3(N-1-J)+Σf_i 后结果不变:

原编码:N, J, Σf -> 3(N-1-J) + Σf 合并后:N-1, J-1, Σf -> 3((N-1)-1-(J-1)) + Σf = 3(N-1-J) + Σf

只改 J 不改 N,结果会硬生生多出 3(平面)或 6(空间)。这是自由度计算里最常见的一类错误:看起来只是换了个写法,实际上偷偷删掉了一个刚体却保留了对它的约束记账。合并与拆分本身是自由的,前提是三个量必须同步维护,缺一个就失真。

4. 公式失效的边界:过约束、球面机构与降维记账

4.1 过约束:空间正方形机构为什么算出 0 却能动

答案里 Exercise 2.15 给了一个非常干净的对照。五个正方形通过六个转动关节首尾相连:用平面公式算,dof = 3(6-1-6) + 6 = 3;用空间公式算,dof = 6(6-1-6) + 6 = 0。

0 意味着这是一个结构,动不了。但答案是:在所有正方形尺寸相同的假设下,这个机构确实能以一个自由度运动。公式错了,或者说公式的前提不成立。

原因在于 Grübler 公式默认"每个关节施加的约束彼此独立"。正方形机构里,多个转动关节的轴线在运动过程中始终保持特定的几何关系,约束之间线性相关,实际被扣掉的独立约束少于公式假设的数量,多出来的那部分就变成了额外运动。这类机构叫过约束机构,它的可动性来自几何巧合,不是来自关节数量。

这对工程实践的含义很直接:过约束机构用几何对称性换刚度。同样是支撑一个平台,过约束结构在理想几何下应力分布均匀、刚度高;一旦装配误差破坏了那个巧合,机构要么卡死,要么产生不可预测的内力。所以这类设计必须配一套误差敏感度分析,不能只靠公式算出来的自由度下结论。

如何验证?对任意位形求雅可比矩阵的秩,秩掉下来就说明约束相关。理想对称的正方形机构在整条运动路径上雅可比都掉秩,这就是"公式说 0、实物能动"的数值证据。

4.2 隐藏降维:4R 球面机构的 -2 与 1

Exercise 2.16 的四转动关节机构更极端。四个连杆的转轴全部交于一点,所有构件被限制在一个球面上运动。此时每个活动构件能到达的位形空间是 2 维的球面,不是 3 维的空间,扣约束时应该扣 2 - f_i 而不是 3 - f_i。

用二维公式:N=4、J=4、Σf=4,dof = 3(4-1-4) + 4 = 1,正确。用空间公式:dof = 6(4-1-4) + 4 = -2,直接给出一个物理上不可能的值。

def mobility(N, joint_dofs, dim): return dim * (N - 1 - len(joint_dofs)) + sum(joint_dofs) spherical_4r = [1, 1, 1, 1] print(mobility(4, spherical_4r, 3)) # 1,构件被限制在球面上 print(mobility(4, spherical_4r, 6)) # -2,约束被重复扣除

同一个机构、同一组关节,只因为维度参数选错,答案从"能正常运动"变成"物理上不可能"。负的自由度几乎总是记账错误的信号,而不是机构真的存在某种反物理特性。看到负数先别怀疑机构,先怀疑维度选错了。

这条规则可以推广成一个判定习惯:拿到机构先检查所有转轴是否共点、所有运动是否共面、是否存在某个方向被整体锁死。只要有一项成立,就说明机构的真实位形空间维度低于 3(或 6),必须换用降维后的公式。

4.3 几何巧合当约束用:穿点工具与 SP 关节等效

Exercise 2.17 讨论的手术工具是个好例子。工具必须始终穿过基座上的一个固定点 A,这个要求不是靠某个具体关节实现的,而是一种几何约束。答案把这种约束等效成一个四自由度的 SP 关节:球关节确定工具的朝向(3 个自由度),移动关节确定工具沿自身轴线的位移(1 个自由度),合起来正好 4 个。

加入这个等效关节后,N 不变、J 加 1、Σf 加 4,代入空间公式后自由度从 4 降到 2。数字变化的背后是约束被正确地"外化"成了一个虚拟关节——把几何约束翻译成虚拟关节,是处理这类问题的通用手法,比在公式外额外减自由度要可靠得多,因为它保持了记账体系的封闭性。

答案的第三小问走了另一条路:不引入虚拟关节,而是把所有转轴都设计成通过 A 点,整个机构退化成球面机构,改用二维公式。两种建模路径给出自洽的结果,这也是检查建模正确性的常用手段——用两种不同的等效方式算同一个机构,答案必须一致,不一致就说明某一处的 N、J、Σf 有一栏漏了。

代价同样明显。把约束寄托在几何巧合上,意味着装配误差会直接破坏约束关系,机构从"恰好 2 自由度"变成过约束状态,轻则运动受阻,重则关节承受异常载荷。实际设计里要么留柔性环节,要么把这部分误差纳入标定。

5. 自由度计算的避坑清单:五次翻车对应的现象、原因与解法

5.1 计数类:合并关节与连杆归并的两处失真

现象一:把一对串联的 R 关节和 P 关节合并成一个 C 关节之后,自由度从 3 变成了 6,多出来的正好是平面系数的 3 倍。原因:只改了 J 和 Σf,忘掉中间那个连杆已经不存在了,N 没有跟着减 1。解决:合并操作永远三栏一起改,改完立刻代回公式验算,只要结果和合并前不等就说明漏了一栏。

现象二:两个人在同一张机构简图上算出不同的自由度,差值是 3 的整数倍。原因:对"什么算一个连杆"没有统一约定。用螺栓刚性连在一起的两块板,一个人算两个连杆加一个关节,另一个人算一个连杆,两者的 N 和 J 同时差 1,结果却可能因为关节自由度不同而不一致。解决:动笔之前先把刚性连接的零件合并成连杆,画出只含连杆和关节的拓扑图,图上每个节点都必须能相对邻居运动,否则就还没合并干净。

5.2 建模类:地面重复计入与维度选错

现象三:并联平台算出来的自由度是负数,而且绝对值随腿数增加而增大。原因:每条腿的固定基座都被单独算成了一个 ground,N 里塞进了多个地面。解决:全机构只保留一个 ground,所有固定在基座上的关节都接到同一个节点上。这条规则在串联机构里几乎不会错,一到并联就特别容易忘。

现象四:球面机构或平面机构用空间公式算出 0 或负数。原因:没有识别出隐藏的降维,每个构件仍按 6 个自由度扣约束。解决:先做三项检查——转轴是否共点、运动是否共面、是否存在整体被锁的方向——命中任何一项就换用低维公式。Exercise 2.16 的 -2 就是没做这项检查的典型后果。

5.3 判定类:把必要条件当充分条件

现象五:公式给出 0,判定机构是结构,实物装配起来却能转动;或者公式给出正数,实物却卡在某几个位形动不了。原因:Grübler 公式是必要条件不是充分条件。前者对应过约束(约束相关,实际自由度更多),后者对应奇异位形(某些位形下雅可比掉秩,瞬时自由度减少)。解决:公式只用来做初筛和交叉验证,最终结论必须靠雅可比秩检验或数值仿真。对疑似过约束的机构,在整条运动路径上采样若干位形分别算秩,秩恒定偏低才说明是结构性的过约束,而不是某个孤立奇异点。

这套排查顺序我自己的习惯是倒着走:先看结果是否合理(负数、零、超出预期都算异常),再回头查 N、J、Σf 三栏,最后才怀疑公式前提。绝大多数错误在前两步就暴露了,真正需要动用秩检验的不到一成。

6. 把答案当验证器:自由度建模的自检回路与取舍

这套习题解答最容易用错的方式,是当成对答案的抄写本。翻到某一题、看一遍解法、觉得"懂了",然后合上。下一次遇到新机构,还是从零开始数关节,还是会在并联的地方把地面数两遍。

更有效的用法是把它当成一个验证器,而且是有冗余的验证器。同一道题往往给出多种等效编码——Exercise 2.9 把关节合并和不合并各算一遍,Exercise 2.17 用虚拟关节和几何降维各算一遍。这些"殊途同归"不是排版冗余,而是内置的交叉检验。如果两种正确编码给出不同结果,那一定是其中一种的记账漏了东西,这个后悔药比任何口诀都管用。

具体落到流程上,我建议的顺序是:先只读题干不看解答,自己画拓扑图、标 N 和 J;再算一遍自由度,记下数值;然后才翻解答,重点不看它算出的数字,而看它的 N 和 J 各是多少、有没有引入虚拟关节、用的是三维还是二维公式。三个量对上两个,基本就说明建模方向没错;只有一个对得上,就得回去查是不是漏了降维或者多算了地面。

做这个对照时有个判断标准值得记住:自由度相同的两种编码不一定都正确,但自由度不同的两种编码一定有一种是错的。前者可能是因为两处错误恰好互相抵消,后者没有侥幸空间。

从设计取舍的角度看,这份答案真正传递的是一种态度:公式给出的数字是一个待验证的假设,不是结论。过约束机构告诉你几何巧合可以换来刚度和额外运动,球面机构告诉你维度选错会让答案变成负数,穿点工具告诉你几何约束可以外化成虚拟关节来统一记账。这三件事的共同点是,它们都无法只靠套公式发现,必须靠对机构的物理直觉加上至少一种独立的验证手段。

从那以后我每次建完拓扑图,都会强制把 N、J、Σf 三栏单独抄在一张纸上核对一遍,再代公式,最后拿另一种等效编码复算一次。三步走完花不了几分钟,但省下来的返工时间远不止几分钟。这套答案覆盖第 2 章到第 13 章,从构型空间、自由度一路铺到轨迹规划和控制,把它放在手边当参照系,比自己闷头推要快得多。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询