第二章:关节机器人基础
各位同学,欢迎来到《强化学习关节策略训练实战》的第二讲。今天咱们聊聊关节机器人的基础。说实话,这部分内容看起来有点理论,但它是后面所有实战的根基。我见过不少同学,一上来就急着调算法,结果连机器人的正逆解都搞不清楚,最后策略训练出来,机器人直接飞了——嗯,物理仿真里飞出去的那种。
2.1 机器人运动学基础
运动学,说白了就是研究机器人怎么动,但不关心它为什么能动。我们只关注关节角度和末端位置之间的关系。
2.1.1 正运动学
正运动学很简单:给你每个关节的角度,算出末端执行器在空间中的位置和姿态。我记得刚入行时,导师让我手推一个六轴机器人的正运动学公式,我推了整整三天。后来发现,其实用齐次变换矩阵就能搞定。
每个关节对应一个变换矩阵,连乘起来就是末端位姿:
T_0_n = T_0_1 * T_1_2 * ... * T_{n-1}_n
这里每个 T 是一个 4x4 的齐次变换矩阵,包含旋转和平移信息。我个人习惯用 DH 参数法来建立这些矩阵,它把每个关节的几何关系抽象成四个参数:
- a:连杆长度
- α:连杆扭转角
- d:连杆偏距
- θ:关节角
你想想看,有了这四个参数,任何串联机器人的运动学都能统一描述。我在项目中遇到过一个问题:用标准 DH 还是改进 DH?标准 DH 的坐标系建在连杆末端,改进 DH 建在连杆起点。我个人建议初学者先用标准 DH,因为教材里大多用这个,方便对照。
2.1.2 逆运动学
逆运动学就麻烦多了。给你末端位姿,反求关节角度。为什么麻烦?因为解不唯一,甚至可能无解。
举个例子,一个六轴机器人,末端要到达某个点,可能有 8 组甚至 16 组关节解。你选哪一组?这就要考虑关节限位、避障、运动平滑性等因素。我曾经在调试一个焊接机器人时,逆解算出来的关节角度直接撞到了工件上——嗯,那次之后我学会了加约束条件。
常用的逆解方法有两种:
- 解析法:针对特定构型推导封闭解,速度快,但通用性差
- 数值法:用迭代方式求解,通用性强,但可能不收敛
我个人习惯,如果机器人构型比较规整(比如有相邻关节轴相交),优先用解析法。否则就用数值法,配合一个好的初始值。
2.2 关节空间与任务空间
这两个概念,说白了就是两种描述机器人运动的方式。
2.2.1 关节空间
关节空间,就是用每个关节的角度来描述机器人的状态。比如一个六轴机器人,它的状态就是一个六维向量 [θ1, θ2, θ3, θ4, θ5, θ6]。在强化学习里,我们通常把关节角度和角速度作为观测的一部分。
为什么用关节空间?因为控制指令最终要发到每个关节的电机上。你想想看,你不可能直接告诉电机「末端往右走 10 厘米」,你只能告诉它「关节 1 转 30 度,关节 2 转 -15 度」。
2.2.2 任务空间
任务空间,也叫操作空间,是用末端执行器的位置和姿态来描述。比如 [x, y, z, roll, pitch, yaw]。这个空间更直观,因为我们关心的是末端干了什么,而不是关节怎么转的。
在强化学习里,任务空间常用于定义奖励函数。比如你要让机器人抓一个杯子,你肯定关心末端离杯子有多远,而不是每个关节的角度对不对。
2.2.3 两者之间的映射
从关节空间到任务空间,就是正运动学。反过来,就是逆运动学。但这里有个坑:雅可比矩阵。
雅可比矩阵 J 描述了关节速度与末端速度之间的关系:
v_end = J * q_dot
其中 v_end 是末端速度(线速度+角速度),q_dot 是关节速度。这个矩阵在强化学习里很有用,比如你要做阻抗控制,或者计算操作空间惯性矩阵。
我记得有一次,我在训练一个机械臂的推箱子任务,直接用关节空间的动作输出,结果训练特别慢。后来换成任务空间的动作输出,再用雅可比逆矩阵映射回关节空间,训练速度快了将近一倍。为什么?因为任务空间的动作更直观,探索效率更高。
2.3 常见的关节机器人仿真环境
说到仿真环境,目前主流的就是 MuJoCo 和 PyBullet。我两个都用过,各有千秋。
2.3.1 MuJoCo
MuJoCo(Multi-Joint dynamics with Contact)是 DeepMind 开源的物理引擎。它的特点是:
- 速度快:用了优化的数值算法,比 PyBullet 快不少
- 精度高:对接触和摩擦的建模很精细
- 可微分:支持自动微分,适合基于梯度的强化学习
我个人习惯用 MuJoCo 做高精度仿真,尤其是需要精细接触建模的任务,比如抓取、操作等。它的 XML 模型文件写起来有点繁琐,但熟悉了之后还好。
<mujoco model="simple_arm">
<worldbody>
<body name="base" pos="0 0 0">
<joint name="joint1" type="hinge" axis="0 0 1"/>
<geom type="box" size="0.1 0.1 0.2" pos="0 0 0.1"/>
<body name="link1" pos="0 0 0.2">
<joint name="joint2" type="hinge" axis="0 1 0"/>
<geom type="box" size="0.05 0.05 0.2" pos="0 0 0.1"/>
</body>
</body>
</worldbody>
</mujoco>
2.3.2 PyBullet
PyBullet 是另一个流行的物理引擎,基于 Bullet。它的特点是:
- 易用性高:Python 接口非常友好,上手快
- 可视化好:自带 GUI,调试方便
- 社区活跃:网上资源多,遇到问题容易找到答案
我建议初学者先用 PyBullet 入门,因为它简单直接。你写几行代码就能让一个机器人动起来:
import pybullet as p
import pybullet_data
p.connect(p.GUI)
p.setAdditionalSearchPath(pybullet_data.getDataPath())
robot = p.loadURDF("kuka_iiwa/model.urdf", useFixedBase=True)
while True:
p.stepSimulation()
你看,就这么几行,一个 KUKA 机器人就出现在屏幕上了。PyBullet 的 URDF 文件格式也是工业标准,很多机器人厂商都提供 URDF 模型。
2.3.3 两者对比
| 特性 | MuJoCo | PyBullet |
|---|---|---|
| 仿真速度 | 快 | 中等 |
| 接触建模 | 精细 | 一般 |
| 易用性 | 中等 | 高 |
| 可微分 | 支持 | 不支持 |
| 社区资源 | 较少 | 丰富 |
| 适用场景 | 高精度、大规模训练 | 快速原型、教学演示 |
本章知识体系
下面这张图展示了本章的核心逻辑:从运动学基础出发,理解关节空间和任务空间的关系,再选择合适的仿真环境进行实践。
好了,这一章的内容就到这里。运动学是基础,关节空间和任务空间是两种视角,MuJoCo 和 PyBullet 是两把好用的工具。下一章我们会深入强化学习的基础概念,到时候你会看到这些知识怎么用起来。
可可精品资料库