机器人运动控制学习7——映射关系
从这里开始,我们正式进入:
FK → Jacobian → 数值IK → 伪逆 → 奇异位形 → DLS
先记一句话:
Jacobian = “关节动一点,会让末端怎么动”的映射关系。
1. 为什么有了 FK 还需要 Jacobian?
FK解决的是:
已知关节角 q
↓
手在哪里?
比如:
q1 = 30°
q2 = 60°
↓
FK
↓
Hand = (0.866, 1.5)
但现在我们想问一个新的问题:
如果肩膀再动 1°,手会往哪里动?会动多少?
这时候,仅仅知道“现在手在哪里”还不够。我们需要知道:
关节变化
↓
末端变化
这就是 Jacobian。
2. 继续用两关节机械臂
还是这个模型:
Base
O
\
\
O Elbow
\
\
O Hand
两个关节:
q1 = 肩
q2 = 肘
现在假设机器人保持某个姿势不动。
我们先只让:
q1
稍微增加一点点。
比如:
q1 + 1°
会发生什么?
肩膀后面的:
上臂
肘
前臂
手
全部跟着动。所以手会产生一个小位移。
3. 再只动 q2
保持肩膀不动。
只让:
q2 + 1°
这时候:
Elbow
位置基本不变。
但:
Forearm
Hand
会跟着肘转。
于是手也会产生一个小位移。
但这个位移通常和刚才:
q1 + 1°
导致的位移不一样。
这就是关键:
不同关节,对末端运动的影响不同。
Jacobian就是把这些影响全部记录下来。
4. 先把它想成一张“影响表”
比如某个姿势下:
肩膀转一点
→ 手主要向左上移动
肘转一点
→ 手主要向左下移动
我们可以想象一张表:
| 关节 | 对手x方向影响 | 对手y方向影响 |
|---|---|---|
| q1 | 某个值 | 某个值 |
| q2 | 某个值 | 某个值 |
把这张表写成矩阵,就是:
J
也就是 Jacobian 矩阵。
5. Jacobian 最核心的关系
你以后会经常看到:
ẋ = J(q) q̇
先别怕。
翻译成人话:
关节速度
q̇
↓
Jacobian
↓
末端速度
ẋ
也就是:
我知道每个关节现在转多快,就能通过 Jacobian 算出手在空间里运动多快。
6. q 和 q̇ 不一样
这里顺便补一个非常重要的符号。
q
代表:
关节当前的位置 / 角度。
比如:
q =
[30°
60°]
而:
q̇
读作:
q dot
表示:
关节速度。
例如:
q̇ =
[10°/s
20°/s]
意思是:
肩膀每秒转10°
肘每秒转20°
以后还会有:
q̈
表示:
关节加速度。
所以先记:
q = 位置
q̇ = 速度
q̈ = 加速度
这三个以后贯穿整个机器人控制。
7. ẋ 又是什么?
这里的:
x
不是一定只代表World坐标的x轴。
在机器人学里,很多时候:
x
会泛指:
末端任务空间状态。
比如二维手的位置:
x =
[x_hand
y_hand]
那么:
ẋ =
[vx
vy]
就是手的速度。
所以:
ẋ = J q̇
就是:
关节怎么转 → 手怎么移动。
8. 一个很直观的例子
假设某个姿势下,Jacobian近似:
J =
[1.0 0.3
0.5 0.8]
你现在不用管这些数字怎么得到。
假设:
q̇ =
[1
0]
也就是:
只有肩膀在动,肘不动。
那么:
ẋ
=
J q̇
实际上就是取:
J的第一列
所以手的运动趋势是:
[1.0
0.5]
也就是说:
第一列描述 q1 对末端的影响。
如果:
q̇ =
[0
1]
只有肘动。
那么结果就是:
J第二列
=
[0.3
0.8]
所以:
Jacobian 的每一列,可以理解成“某一个关节单独动时,末端会怎么动”。
这个直觉非常重要。
9. 为什么肩关节影响通常更大?
想象一条伸直的手臂:
Shoulder O────────Elbow────Hand
肩膀转1°,因为手离肩膀比较远:
半径很大
所以手会扫过比较大的弧,但肘转1°:
Elbow O────Hand
手离肘比较近,扫过的弧会小一点,所以同样:
1°
不同关节造成的末端位移可能完全不同,Jacobian就在描述这种“杠杆效应”。
10. Jacobian 不是固定不变的
这一点特别重要。
假设手臂伸直:
O────O────O
肩膀转一点,手会主要横向移动。
但如果手臂已经折起来:
O
\
O
/
O
同样肩膀转一点,手的运动方向和大小都会变。
所以:
J = J(q)
意思是:
Jacobian取决于机器人当前姿态 q。
机器人姿态一变:
Jacobian
也跟着变。
11. FK和Jacobian是什么关系?
FK:
q
↓
末端位置 x
可以写成:
x = f(q)
意思:
手的位置是关节角的函数。
那么 Jacobian 可以粗略理解成:
FK对关节角的“敏感程度”。
也就是:
q改变一点
↓
x会改变多少
数学上这和“导数”有关。
12. Jacobian 上半部分和下半部分
以后你可能看到:
J =
[ Jv
Jw ]
可以简单理解:
Jv
=
关节对末端“位置/线速度”的影响
Jw
=
关节对末端“方向/角速度”的影响
所以:
q̇
↓
J
↓
末端线速度 + 角速度
所以 Jacobian 是 FK 到 IK 的桥,这张图必须记住:
FK
q
↓
x
Jacobian
q̇
↓
ẋ
数值IK
希望x怎么变
↓
反过来求q怎么变
这就是为什么学习顺序一定是:
FK
↓
Jacobian
↓
IK
而不是一上来就直接学IK代码。
接近奇异点时关节速度突然爆炸
FK
↓
我现在在哪?
Jacobian
↓
关节动一点,手怎么动?
Jacobian伪逆
↓
我想让手这样动,关节该怎么动?
奇异位形
↓
为什么有时候伪逆会爆?
DLS
↓
怎么让IK更稳定?
关节限位
↓
不能让肘和肩随便转
多任务IK
↓
右手跟踪 + 身体姿态 + 左手任务
Jacobian描述关节运动对末端运动的影响。
ẋ = J q̇
翻译:
关节速度经过Jacobian,变成末端速度。
Jacobian每一列,可以理解为某个关节单独运动时对末端的影响。
Jacobian跟机器人当前姿态有关,不是固定矩阵。
奇异位形
奇异位形不是:
电机坏了
传感器坏了
代码崩了
而是:
机器人几何结构导致,在某个特定姿势下,某些末端运动方向无法通过关节瞬时运动实现。
也就是说:
机械结构
+
当前姿态
共同导致。
1. Rank 是什么?
先用小白版本,假设二维末端需要:
x方向能力
y方向能力
正常:
有2个独立运动方向
可以粗略认为 rank = 2,到了奇异位形:
两个关节只能产生类似方向的末端运动
独立能力可能只剩:
1个方向
于是:
rank 从2降到1
这就叫:
Jacobian 降秩。
8. 为什么伪逆会出问题?
假设末端想移动:
Δx = 很小
但这个方向恰好是机器人在当前姿态下非常难实现的。
算法仍然想:
“我要尽量把这个 1cm 的误差消掉。”
于是它可能计算出:
需要非常大的 Δq
例如:
目标手只移动 1 cm
结果:
肩关节 +60°
肘关节 -120°
这种数值虽然只是示意,但表达了核心:
末端小变化,可能对应巨大的关节变化。
所以接近奇异点时经常出现:
关节速度暴涨
抖动
数值不稳定
控制指令尖峰
9. 用“方向放大器”理解
Jacobian 可以看成:
关节运动
↓
末端运动
反过来做 IK:
末端希望运动
↓
Jacobian伪逆
↓
关节运动
在奇异附近,某些方向上的转换比例变得非常差。
就像:
你想让末端移动一点点
↓
算法需要把关节变化放大很多倍
所以伪逆像一个突然把噪声放大的放大器。
10. 这和你的动捕重定向特别相关
人体动作里很容易出现:
手臂伸直
腿伸直
膝盖接近锁死
例如人体做:
右臂水平完全伸直
机器人模仿后也靠近奇异姿态。
这时动捕数据本身可能只有一点点噪声:
目标手位置抖 2 mm
普通伪逆 IK 却可能变成:
肩膀大幅调整
肘关节快速抖动
于是你看到:
人的手明明很稳定,机器人的肘却一直抖。
这不一定是动捕问题。
也可能是:
IK接近奇异位形。
11. 人形机器人还有很多奇异姿态
不只是手臂伸直。
例如腿:
Hip ─ Knee ─ Ankle
膝盖完全打直时,也可能接近奇异。
所以实际人形机器人控制里通常不喜欢:
膝关节完全0°
而会保持一点屈膝:
slightly bent knee
除了机械、安全等原因外,运动学可控性也是一个因素。
12. 机械臂常见奇异
比如经典 6 轴机械臂可能有:
肩部奇异
肘部奇异
腕部奇异
腕部奇异很典型:
如果两个旋转轴重合,
原来两个关节能控制两个独立方向
↓
现在两个轴重合
↓
丢失一个旋转自由度
本质还是同一个问题:
独立运动方向减少。
13. 怎么判断接近奇异?
有很多方法。
以后工程里常见的有:
det(J)
但这个只适合某些方阵情况。
更常用、也更一般的是:
SVD
也就是:
Singular Value Decomposition
奇异值分解
这就是为什么你的数学路线里一定有 SVD。
14. SVD 先只理解一个作用
SVD 可以告诉我们:
Jacobian 在不同运动方向上的“能力有多强”。
它会给出一些:
σ1, σ2, σ3 ...
叫:
奇异值。
正常情况:
σ都不太小
说明各个方向都有一定运动能力。
接近奇异时:
某个 σ → 0
说明:
某一个运动方向几乎失去能力了。
所以:
最小奇异值很小
通常就是危险信号。
15. 一个非常形象的理解
把机器人末端瞬时可运动范围想成一个圆。
正常姿态:
****
** **
* *
* *
** **
****
大致各方向都能动。
接近奇异时,圆会被压扁:
----------------
某个方向几乎没有能力。
这个东西以后叫:
Manipulability Ellipsoid
可操作度椭球
你之后做人形机器人运动学时也会遇到。
16. 所以奇异位形为什么重要?
因为它会直接影响:
IK稳定性
关节速度
轨迹平滑
控制性能
数值计算
所以你的项目不能只测:
末端误差
还应该看:
最大关节速度
最大关节加速度
jerk
奇异附近是否抖动
求解稳定性
这会让你的项目质量明显提升。
17. 怎么解决?
不能说完全“消灭”奇异位形。
因为它来自机器人几何结构。
我们能做的是:
避免
+
检测
+
稳定处理
比如:
① 规划时尽量远离奇异点
② 限制关节速度
③ 用更好的IK方法
④ 加阻尼
第四个就是我们下一课要学的:
Damped Least Squares
阻尼最小二乘。
18. DLS 的直觉先提前讲
普通伪逆的态度是:
“末端误差必须尽可能消掉!”
接近奇异时,就可能为了追 1mm 误差让关节疯狂运动。
DLS会说:
“不用这么激进。末端误差可以稍微留一点,但关节不要乱跑。”
所以它同时考虑:
末端误差要小
+
关节变化不要太大
这就是为什么叫:
阻尼。
它给 IK 加了一个“刹车”。
19. 举个非常直观的对比
普通伪逆:
目标手误差:1 cm
算出来:
肩 +50°
肘 -100°
DLS可能说:
这太离谱了。
我宁愿这一次只修正:
0.7 cm
剩下:
0.3 cm
下一轮继续修。
换来的好处:
关节稳定
数值稳定
抖动减少
这就是实际工程中很重要的权衡。
20. 到现在把链条串起来
你已经学到:
FK
↓
根据q算末端
Jacobian
↓
关节小变化 → 末端小变化
伪逆IK
↓
末端目标变化 → 关节变化
奇异位形
↓
为什么伪逆会突然不稳定
下一步:
DLS
↓
怎么让IK在奇异附近稳定
21. 今天只记住四句话
第一:
奇异位形 = 机器人在某个姿势下失去某些瞬时运动方向。
第二:
数学上表现为 Jacobian 降秩或接近降秩。
第三:
接近奇异点时,普通伪逆可能把很小的末端误差放大成很大的关节运动。
第四:
DLS 的目的,就是牺牲一点点末端精度,换取更好的数值和关节运动稳定性。
下一课就是非常关键的:
第183课:阻尼最小二乘 DLS IK 到底在干什么?
这一课我们会真正看懂:
[
\Delta q
J^T(JJ^T+\lambda^2 I)^{-1}e
]
但我不会让你死背。
我们会先搞明白:
为什么多了一个 λ?
λ小时会怎样?
λ大时会怎样?
为什么它能压住奇异点附近的关节爆炸?
学完这一课,你就已经进入“能独立解释一个实用数值IK算法”的阶段。
好,后面我会收紧一点,保留核心逻辑和必要公式。
第183课:阻尼最小二乘 DLS IK
普通伪逆 IK:
[
\Delta q = J^+ e
]
其中:
-
(e):末端误差
-
(J):Jacobian
-
(\Delta q):关节需要调整多少
问题是:接近奇异位形时,(J^+) 可能把很小的末端误差放大成很大的关节变化。
所以引入 DLS:
[
\boxed{
\Delta q
J^T(JJ^T+\lambda^2 I)^{-1}e
}
]
你现在不需要推导,重点理解里面新增的:
[
\lambda
]
叫阻尼系数。
1. λ 是干什么的?
可以把它理解成 IK 的“刹车”。
普通伪逆:
末端误差
↓
尽可能快速消除
↓
可能导致关节变化很大
DLS:
末端误差
↓
既想消除误差
又不希望关节变化太激烈
↓
得到更稳定的 Δq
所以它实际上是在权衡:
[
\text{末端精度}
\quad \leftrightarrow \quad
\text{关节稳定性}
]
2. λ 大小有什么影响?
λ 很小
DLS越来越接近普通伪逆:
跟踪精度高
收敛快
但奇异点附近容易不稳定
λ 较大
关节变化更小
更稳定
但收敛变慢
末端可能存在更大误差
所以不能无限增大 λ。
工程上要调。
3. DLS 为什么能处理奇异问题?
普通伪逆在奇异附近会遇到:
某些奇异值 σ → 0
相当于出现类似:
[
\frac{1}{\sigma}
]
于是:
σ很小
↓
1/σ非常大
↓
Δq爆炸
DLS加入阻尼以后,大致变成:
[
\frac{\sigma}{\sigma^2+\lambda^2}
]
当:
[
\sigma \rightarrow 0
]
结果不会无限增大。
所以 DLS 相当于把奇异方向上的“增益”压住了。
这就是它最核心的作用。
4. 实际 IK 循环
以后你自己写 DLS IK,基本流程就是:
给定目标 Pose
↓
当前 q
↓
FK(q)
↓
计算末端误差 e
↓
计算 Jacobian J
↓
DLS求 Δq
↓
限制 Δq
↓
q = q + αΔq
↓
检查是否收敛
↓
继续迭代
核心代码逻辑以后会类似:
dq = J.transpose()
* (J * J.transpose()
+ lambda * lambda * I).inverse()
* error;
q += alpha * dq;
实际代码我们会用 Eigen 的线性方程求解方式,不会直接手写 .inverse()。
5. 为什么还要限制 Δq?
即使用了 DLS,也建议:
|Δq_i| ≤ 最大单步关节变化
比如:
每轮最多变化 0.05 rad
这是第二层保护。
未来你的 IK 会逐渐变成:
DLS
+
步长 α
+
最大迭代次数
+
误差阈值
+
关节变化限幅
+
关节位置限位
这就已经开始接近一个真正可用的求解器。
6. 对你的动作重定向有什么意义?
动捕过程中人体可能突然:
手臂接近伸直
普通伪逆可能:
人体目标只抖几毫米
↓
机器人肘关节明显抖动
DLS可以显著降低这种现象。
所以以后项目可以做一个很好的对比实验:
| 方法 | 末端误差 | 最大关节速度 | 奇异附近稳定性 |
|---|---|---|---|
| Jacobian Pseudoinverse | 较小 | 可能很高 | 较差 |
| DLS IK | 略高或接近 | 更低 | 更好 |
这就是很有价值的项目证据。
7. 现在你已经掌握了 IK 的主干
FK
↓
Jacobian
↓
伪逆IK
↓
奇异位形
↓
DLS IK
接下来还缺两个非常实际的问题:
关节不能超过机械限位
以及:
不止右手一个任务怎么办?
所以:
第184课:关节限位和多任务 IK
下一课我们重点讲:
-
为什么单纯 DLS 仍可能把关节拧到极限
-
怎么让 IK 主动远离关节限位
-
“右手跟踪 + 身体姿态 + 肘部自然姿势”怎么同时处理
学完这部分,运动学理论主体基本就快结束了。
好,后面我就按这个方式讲:少公式、重直觉、先把“为什么”讲明白。
第184课:关节限位和多任务 IK
DLS IK 解决了一个问题:
接近奇异位形时,别让关节突然乱飞。
但它还没有解决另外两个很现实的问题:
第一,关节不能无限转。
第二,机器人通常不只执行一个任务。
这两个问题一解决,IK才开始像“真正能用于机器人”的算法。
1. 什么叫关节限位?
以肘关节为例。
真实机器人不可能:
0°
↓
90°
↓
180°
↓
270°
↓
360°
一直转。
机械结构会规定:
最小角度
≤
当前关节角
≤
最大角度
比如:
肘关节:
0° ~ 150°
那么 IK 如果算出:
肘关节目标 = 170°
数学上它可能觉得没问题,
但真机上:
做不到。
所以机器人算法必须知道:
每个关节的合法范围
2. 为什么普通 IK 会撞限位?
假设机器人要把手伸到某个地方。
这个目标可能有很多种姿势都能完成。
例如:
姿势A:
肩膀多转一点
肘少转一点
姿势B:
肩膀少转一点
肘多转一点
普通 IK 可能只关心:
“手到目标了吗?”
它并不一定关心:
“肘是不是已经快撞到机械极限了?”
于是可能出现:
Hand Error = 很小
但是:
Elbow = 149°
而极限:
150°
从末端误差看:
很优秀。
从机器人控制看:
很危险。
3. 所以好的 IK 不应该只看“手”
我们希望它同时考虑:
任务1:
手到目标
任务2:
关节不要撞限位
这就是一个非常重要的思想:
机器人控制通常不是只有一个目标,而是多个目标同时存在。
这就是多任务控制的开始。
4. 最简单的关节限位方法
最粗暴的方法就是:
IK算出q
↓
超过最大值?
↓
截到最大值
比如:
计算结果 = 170°
最大允许 = 150°
最终命令 = 150°
这叫:
Clamp / Saturation,截断或饱和。
它能保护硬件。
但有个明显缺点:
它只是“撞墙以后把你拦住”。
而不是:
“提前知道前面有墙,主动绕开。”
5. 更好的思路:主动远离关节极限
例如某个关节范围:
-100° ~ +100°
那么最舒服的位置可能在:
0°
如果现在:
q = 95°
已经非常靠近上限。
这时候即使:
继续往 + 方向运动
能稍微减少末端误差,
我们也不希望这么做。
而是希望 IK 倾向于:
把这个关节往中间拉回来
同时用其他关节补偿。
也就是说:
手继续跟目标
+
关节远离极限
这就是更成熟的 IK。
6. 为什么人形机器人特别需要这个?
因为人形机器人自由度很多。
比如一条手臂可能:
肩3自由度
肘1自由度
腕3自由度
如果只要求:
右手到某个位置
实际上很多关节组合都可以做到。
因此我们可以利用“多出来的自由度”做一些好事:
避免关节限位
保持自然姿势
避免奇异位形
减少关节运动
这就是:
冗余自由度的利用
7. 一个很直观的例子
你自己把手放到桌上某一点。
手的位置固定。
但你的肘可以:
抬高一点
也可以:
放低一点
甚至肩膀还能调整。
也就是说:
手的位置一样
但:
全身姿势不同
这就是为什么一个 IK 目标经常对应很多解。
所以真正的问题不是:
“有没有解?”
而是:
“这么多解里,我希望机器人选哪一种?”
8. 这就进入多任务 IK
比如我们希望机器人同时做三件事:
任务1:
右手跟人体右手
任务2:
左手也跟人体左手
任务3:
身体保持比较直立
甚至还有:
任务4:
肘关节保持自然
任务5:
关节远离限位
所以人形机器人实际面对的是:
右手
左手
头
躯干
骨盆
双脚
关节限位
很多任务一起存在。
这就是为什么以后会进入:
Multi-task IK
↓
QP
↓
WBC
9. 多任务有两种基本思想
先不用记复杂算法。
你只需要知道两种。
第一种:加权
比如:
右手任务:很重要
身体姿态:比较重要
肘部自然:没那么重要
可以理解成:
右手权重 = 100
身体权重 = 50
肘姿态权重 = 5
算法会尽量让重要任务先做好。
这叫:
Weighted Tasks,加权任务。
第二种:严格优先级
还有一种情况不是“权重不同”,而是:
有些事情绝对不能为了其他任务被破坏。
比如人形机器人:
第一优先级:
不要摔倒
第二优先级:
双脚别滑
第三优先级:
右手跟踪动作
那就不能出现:
为了让右手多靠近目标1厘米,机器人把支撑脚抬起来。
这种设计就更像:
任务1必须满足
↓
在不破坏任务1的前提下做任务2
↓
在不破坏前两个任务的前提下做任务3
这就是:
Task Priority,任务优先级。
10. 这和你未来的动作重定向有什么关系?
非常直接。
人体动捕可能告诉机器人:
右手应该在这里
左手应该在那里
头应该这样转
身体应该这样倾斜
但机器人自己的身体结构和人体不一样。
比如人体可以做某个动作:
手再往前10cm
机器人可能已经:
肩膀快到极限
那么控制器不能简单地:
“人体怎么动,我就一模一样复制。”
而应该:
尽可能保持动作相似
+
满足机器人自己的关节限制
+
保持动作平滑
+
保证稳定
这才叫真正的:
Motion Retargeting
而不是简单的关节角复制。
11. “重定向误差”也开始出现了
以后你的项目不能只说:
机器人成功模仿了人体动作。
要能量化:
右手位置误差
左手位置误差
手部姿态误差
关节是否超限
关节速度是否平滑
jerk大小
例如:
人体目标手位置
↓
机器人实际手位置
↓
两者距离
↓
末端位置误差
这样才能判断:
你的重定向算法到底好不好。
12. 为什么这一步会自然走向 QP?
现在问题越来越像:
我要:
右手跟踪好
左手跟踪好
身体姿态别太偏
同时:
关节不能超限
速度不能太大
你会发现已经不是一个简单:
IK公式
就能优雅解决的问题了。
这时候 QP 就非常适合。
因为 QP 很擅长处理:
“我有很多目标,同时还有很多不能违反的约束。”
例如:
目标:
尽量减少手的位置误差
约束:
q不能超过关节限位
q̇不能超过速度限制
这就是以后:
QP IK
甚至:
Whole Body Control
的基础。
13. 所以从 DLS 到 QP 其实很自然
可以理解成:
最简单 IK
只关心:
手到目标
DLS IK
手到目标
+
别在奇异点发疯
带关节限位 IK
手到目标
+
别发疯
+
别撞关节限位
多任务 IK
右手
+
左手
+
身体
+
关节姿态
QP
很多目标
+
很多明确约束
WBC
整个机器人一起控制
+
接触
+
平衡
+
力矩
现在路线就应该越来越清楚了。
14. 你目前运动学这块已经学到哪里?
现在你已经理解了:
Frame
↓
坐标变换
↓
旋转
↓
齐次变换
↓
FK
↓
Jacobian
↓
数值IK
↓
伪逆
↓
奇异位形
↓
DLS
↓
关节限位
↓
多任务IK
运动学理论主干已经基本走完。
接下来我不建议继续堆概念。
应该开始往实际工具走。
下一课:第185课——Pinocchio 到底是什么,为什么要用它?
我们会开始把前面这些东西对应到真正的软件:
URDF
↓
Pinocchio
↓
Robot Model
↓
q
↓
FK
↓
Hand Pose
↓
Jacobian
↓
DLS IK
我会重点告诉你:
-
Pinocchio 帮你做什么
-
哪些东西你还应该自己实现
-
model、data、q、frame分别是什么 -
为什么它特别适合人形机器人
-
它和 MuJoCo 到底是什么关系
这一步开始,我们就从“学概念”正式进入“以后要写项目”的阶段。
继续。
第185课:Pinocchio 到底是什么?
你可以先把 Pinocchio 理解成:
一个专门帮你做机器人运动学和动力学计算的库。
它不是仿真器,也不是控制器。
它更像是:
URDF机器人模型
↓
Pinocchio
↓
帮你计算
FK
Jacobian
质量矩阵
重力项
RNEA
CRBA
ABA
...
1. 它和 MuJoCo 有什么区别?
这个一定要分清。
Pinocchio
主要负责:
“算”
例如:
给我机器人关节角 q
↓
手在哪里?
给我 q
↓
Jacobian是多少?
给我 q、q̇、q̈
↓
需要多少力矩?
它是一个:
机器人数学计算库。
MuJoCo
主要负责:
“模拟真实机器人动起来”
例如:
我给电机100 Nm
↓
机器人会怎么动?
脚踩地面
↓
地面产生什么接触力?
机器人失去平衡
↓
会不会摔?
所以最简单地区分:
Pinocchio = 算法模型
MuJoCo = 物理世界仿真
以后它们经常一起用。
2. 为什么不能只用 MuJoCo?
MuJoCo当然也能得到很多机器人状态。
但你以后自己写算法时,会经常需要:
Jacobian
质量矩阵
非线性项
质心
动力学相关量
Pinocchio特别擅长快速计算这些。
所以未来控制器可能长这样:
MuJoCo
↓
读取 q、q̇
↓
Pinocchio
↓
计算 FK / J / M / g
↓
你的 IK / QP / WBC
↓
得到控制命令
↓
MuJoCo
这就是我们最终项目非常重要的一条数据链。
3. Pinocchio怎么知道机器人长什么样?
靠:
URDF
比如机器人模型里面会描述:
pelvis
torso
upper_arm
forearm
hand
thigh
calf
foot
以及:
哪个link和哪个link连接
关节转轴是什么
关节限位多少
link长度多少
质量多少
惯量多少
流程就是:
robot.urdf
↓
Pinocchio读取
↓
建立机器人模型
4. Pinocchio里你最常见的四个东西
目前先认识:
model
data
q
frame
model
可以理解成:
机器人“说明书”。
里面描述:
有多少关节
关节怎么连接
link结构
质量
惯量
关节限制
它通常不会随着机器人运动不断改变。
比如:
G1还是这个G1
机器人举手以后,结构并没有换掉。
所以:
model = 机器人固定模型
q
这个我们已经认识了。
q = 当前机器人位形
里面包含机器人当前:
肩关节角
肘关节角
膝关节角
髋关节角
...
对于人形浮动基机器人,还会比普通机械臂更复杂,我们后面讲。
data
你可以暂时把它理解成:
Pinocchio做计算时使用和保存中间结果的地方。
比如刚刚做完 FK:
q
↓
forwardKinematics
↓
各种link/frame当前的位置
这些计算结果很多会存在:
data
里。
所以小白阶段可以先记:
model = 机器人是什么
q = 机器人现在什么姿势
data = 计算过程中产生的结果
frame
比如:
right_hand
left_hand
left_foot
right_foot
head
你经常不会关心某个 link 的所有信息,
而会问:
右手 Frame 当前在哪里?
所以流程经常是:
q
↓
Pinocchio做FK
↓
更新Frame
↓
读取 right_hand frame
然后得到:
右手 Position
+
右手 Orientation
5. 用 Pinocchio 做 FK 是什么感觉?
概念上非常简单:
加载URDF
↓
得到model
↓
创建data
↓
准备q
↓
执行FK
↓
读取right_hand的Pose
这和我们前面手算:
q1
q2
↓
一段一段坐标变换
↓
Hand
完全是同一件事。
只是现在:
Pinocchio帮你处理几十个关节。
6. 为什么还要学自己推 FK?
你可能会问:
Pinocchio都能算,那我之前为什么还要学FK?
因为如果你只会:
forwardKinematics(...)
但不知道它做什么,
面试官问:
“FK底层原理是什么?”
你只能回答:
“调用Pinocchio。”
这不叫掌握算法。
我们希望你达到:
简单2R/3R
→ 我自己能推、能写
真实人形机器人
→ 用Pinocchio高效计算
这才是正确组合。
7. Jacobian也是一样
简单机械臂:
自己理解Jacobian怎么来的
真实机器人:
Pinocchio计算Jacobian
然后你自己实现:
Jacobian
↓
DLS
↓
Δq
↓
更新q
所以我们不是让 Pinocchio 帮你“把 IK 全写完”。
我们要让它负责:
机器人模型相关计算
而你负责:
IK算法逻辑
这样最适合你的学习目标。
8. 未来我们会这样分工
Pinocchio:
FK
Jacobian
动力学模型
Eigen:
矩阵和向量运算
你自己的C++代码:
DLS IK
关节限位
误差计算
迭代逻辑
QP控制器
MuJoCo:
物理仿真
ROS2:
把各个模块连接起来
这张关系图很重要:
URDF
↓
Pinocchio
↓
FK / J / Dynamics
↓
Human → Retargeting → IK/QP
↓
Command
↓
MuJoCo
↓
State
└──────→ 再计算
9. 为什么 Pinocchio 特别适合你后面的人形机器人?
因为人形机器人不是一个简单机械臂。
它是:
多关节
+
树结构
+
浮动基
+
多接触
+
全身动力学
如果全部自己从零写:
FK
Jacobian
质量矩阵
RNEA
CRBA
ABA
工作量非常大,而且容易出错。
所以真正工程开发会:
理解算法原理,但使用成熟库实现机器人模型计算。
Pinocchio正适合干这个。
10. 你目前只需要记住
URDF
↓
Pinocchio读取机器人结构
↓
model
↓
输入当前q
↓
计算
├─ FK
├─ Jacobian
├─ CoM
└─ Dynamics
以及:
Pinocchio负责“算机器人模型”,MuJoCo负责“模拟机器人真的动起来”。
这两个一定不要混。
下一课:第186课——URDF进入Pinocchio后,到底变成了什么?
下一课我们会把:
URDF
link
joint
frame
model
data
q
全部串起来。
然后再下一步就开始进入真正的:
Pinocchio FK
↓
Pinocchio Jacobian
↓
Eigen DLS IK
也就是说,离我们的第一个运动学小项目已经很近了。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)