3、坐标系与运动学基础:关节坐标系与笛卡尔坐标系、正运动学与逆运动学、DH参数建模方法
各位同学,今天我们来聊聊运动学里最核心的几个概念。说实话,我刚入行那会儿,被坐标系和正逆解绕得晕头转向。后来在调试一台六轴机器人时,因为坐标系搞反了,差点把末端执行器怼到工件上——嗯,从那以后,我对这块内容就格外上心。
运动学说白了,就是研究“动”的学问。但动之前,你得先知道“在哪儿”。这就离不开坐标系。
3.1 关节坐标系与笛卡尔坐标系
先讲关节坐标系。每个关节都有一个自己的坐标系,通常叫关节坐标系。比如一个六轴机器人,它有六个关节,每个关节都有一个角度值。这些角度值组成的空间,就是关节空间。
举个例子:你让机器人“肘关节弯曲30度”,这就是在关节坐标系下操作。我习惯把关节坐标系想象成机器人的“母语”——它天生就懂。
笛卡尔坐标系呢?就是我们熟悉的X、Y、Z直角坐标系。在笛卡尔空间里,我们描述的是机器人末端在三维空间中的位置和姿态。比如“末端移动到点(100, 200, 300)毫米处,姿态保持水平”。
这两者有什么区别?我打个比方:
- 关节坐标系:你告诉机器人“每个关节转多少度”。机器人听得懂,但你不直观。
- 笛卡尔坐标系:你告诉机器人“末端走到哪里”。你直观,但机器人需要算一下。
核心要点:我们操作机器人时,通常用笛卡尔坐标系(直观);但机器人底层控制,必须用关节坐标系(直接)。两者之间的桥梁,就是正运动学和逆运动学。
我的经验:在调试现场,我经常遇到新手直接给笛卡尔坐标,结果机器人“抽风”。为什么?因为逆解可能有多解,或者关节限位没考虑。所以,我建议先确认关节空间是否可达,再给笛卡尔指令。
3.2 正运动学与逆运动学
正运动学,就是已知关节角度,求末端位姿。说白了,你告诉机器人“每个关节转多少”,它告诉你“末端在哪儿”。
逆运动学,反过来:已知末端位姿,求关节角度。你告诉机器人“末端要去这儿”,它算出“每个关节该转多少”。
听起来很简单?但实际工程中,逆运动学才是真正的难点。为什么?
- 多解性:同一个末端位姿,可能有多种关节角度组合。比如肘关节可以“向上弯”也可以“向下弯”。
- 奇异性:某些位姿下,关节速度会变得无穷大。我记得有一次调试SCARA机器人,在某个点附近,关节4突然疯狂旋转——那就是奇异点。
- 无解:末端位姿超出了机器人的工作空间。比如你让一个短臂机器人去够远处的点,它当然够不着。
避坑指南:我曾经在项目中直接用了开源的逆解算法,结果在奇异点附近,机器人剧烈抖动。后来我加了“奇异点规避”逻辑,才稳定下来。所以,逆解算法一定要考虑边界条件。
正运动学相对简单,通常用齐次变换矩阵连乘就能搞定。但逆运动学,我建议根据具体构型选择方法:
- 解析法:对于常见构型(如六轴机器人有封闭解),速度快、精度高。
- 数值法:如牛顿-拉夫森法,通用性强,但可能不收敛。
- 几何法:针对特定构型,比如SCARA、Delta机器人,用几何关系推导。
3.3 DH参数建模方法
DH参数,全称Denavit-Hartenberg参数。这是运动学建模的“标准语言”。我个人觉得,DH参数就像给机器人关节之间“画地图”——每个关节用一个4x4的矩阵表示,连起来就是整个运动链。
DH参数有四个:
| 参数 | 符号 | 含义 |
|---|---|---|
| 连杆长度 | a | 相邻关节轴线的公垂线长度 |
| 连杆扭角 | α | 相邻关节轴线的夹角 |
| 关节距离 | d | 沿关节轴线的偏移 |
| 关节角度 | θ | 绕关节轴线的旋转角 |
建模步骤很简单:
- 给每个关节建立坐标系(Z轴沿关节轴线)
- 确定四个DH参数
- 写出齐次变换矩阵
- 连乘得到末端位姿
下面是一个标准DH变换矩阵的代码示例(Python):
import numpy as np
def dh_transform(a, alpha, d, theta):
"""
标准DH参数变换矩阵
a: 连杆长度
alpha: 连杆扭角
d: 关节距离
theta: 关节角度
"""
T = np.array([
[np.cos(theta), -np.sin(theta)*np.cos(alpha), np.sin(theta)*np.sin(alpha), a*np.cos(theta)],
[np.sin(theta), np.cos(theta)*np.cos(alpha), -np.cos(theta)*np.sin(alpha), a*np.sin(theta)],
[0, np.sin(alpha), np.cos(alpha), d],
[0, 0, 0, 1]
])
return T
# 示例:一个两连杆机器人
T1 = dh_transform(1.0, 0, 0, np.radians(30)) # 关节1
T2 = dh_transform(0.8, 0, 0, np.radians(45)) # 关节2
T_end = T1 @ T2 # 正运动学
print("末端位姿矩阵:\n", T_end)
我的习惯:写DH参数时,我总会在纸上先画一遍坐标系。画错了,后面全错。有一次我偷懒没画,结果参数顺序搞反了,仿真时机器人“拧麻花”。所以,别省这一步。
下面我用一张SVG图来展示本章的知识体系:
最后,我想说一句:运动学基础,看似枯燥,但它是所有运动控制的根基。你想想看,如果连坐标系都搞不清,后面做轨迹规划、动力学控制,那不就是空中楼阁吗?
嗯,今天就到这里。记住:多画图、多写代码、多动手仿真。纸上得来终觉浅,绝知此事要躬行。