2. 机器人学基础
移动操作机器人要在仿真与实机之间保持一致,前提是“描述一致”:同一个末端位姿、同一个关节轴、同一个连杆长度,必须在数学、仿真模型和真实控制器中表达为同一件事。本章围绕刚体运动学这条主线,把坐标系变换、姿态表示、DH参数与URDF建模串成一个可落地的知识链。
一、核心原理:刚体运动与齐次变换
刚体运动包含平移与旋转两部分。三维空间中,一个点 p 在坐标系 B 下的坐标,可以通过旋转矩阵 R 与平移向量 t 变换到坐标系 A:
p_A = R_AB * p_B + t_AB
齐次形式:
[ p_A ] [ R_AB t_AB ] [ p_B ]
[ 1 ] = [ 0 1 ] [ 1 ]
T_AB = [ R_AB t_AB
0 1 ]
齐次变换矩阵 T 是机器人学中最通用的位姿描述工具。它把旋转和平移统一为 4×4 矩阵,并支持链式相乘:T_AC = T_AB * T_BC。这意味着从基座到末端的位姿,可以由各连杆变换依次相乘得到,这正是正运动学的基础。
二、姿态表示:欧拉角、旋转矩阵与四元数
旋转矩阵直观但冗余,9 个元素只有 3 个自由度;欧拉角紧凑,却存在万向节死锁;四元数用 4 个数表达旋转,无奇异、插值平滑,是仿真与实机通信中的常用姿态格式。
| 表示方式 | 自由度/维度 | 优点 | 局限 | 典型用途 |
|---|---|---|---|---|
| 旋转矩阵 R | 3 / 9 | 直接作用于向量,链式相乘清晰 | 冗余、需正交约束 | 运动学推导、坐标变换 |
| 欧拉角 (RPY) | 3 / 3 | 人类可读,便于调试 | 万向节死锁、顺序敏感 | 示教、界面显示、参数配置 |
| 四元数 (x,y,z,w) | 3 / 4 | 无奇异、插值平滑、计算高效 | 不够直观,需归一化 | ROS 消息、姿态插值、实机通信 |
欧拉角必须明确旋转顺序,例如 ZYX(偏航-俯仰-滚转)与 XYZ 的结果完全不同。四元数则需注意单位化与符号等价:q 与 -q 表示同一旋转。在 ROS 中,姿态通常以四元数发布,而调试时再转换为 RPY 查看。
# Python 示例:欧拉角转四元数
from scipy.spatial.transform import Rotation as R
rpy = [0.1, -0.2, 0.3] # roll, pitch, yaw
quat = R.from_euler('xyz', rpy).as_quat() # [x, y, z, w]
print(quat)
三、DH参数与URDF建模:从数学到仿真模型
DH参数用四个量描述相邻连杆坐标系关系:连杆长度 a、连杆扭转 alpha、关节偏距 d、关节角 theta。标准DH与改进DH的坐标系定义不同,建模时必须与控制器约定一致。
URDF 则是 ROS 中的机器人描述格式,用 XML 描述 link、joint、visual、collision 与 inertial。DH参数偏重运动学链的数学表达,URDF 偏重仿真与可视化所需的完整模型。两者可以互相转换,但转换时要注意关节类型、轴向、原点偏移和惯性参数。
<robot name="mobile_manipulator">
<link name="base_link"/>
<link name="arm_link1"/>
<joint name="joint1" type="revolute">
<parent link="base_link"/>
<child link="arm_link1"/>
<origin xyz="0 0 0.2" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-3.14" upper="3.14" effort="30" velocity="1.5"/>
</joint>
</robot>
下面这张图展示了从“数学描述”到“仿真模型”再到“实机部署”的完整关系链,帮助理解各环节的对应关系。
四、案例与场景:移动操作机器人的抓取链路
假设移动底盘到达目标点后,机械臂要抓取桌面物体。完整链路如下:
- 底盘定位给出
map → base_link变换; - 机械臂正运动学由 DH 或 URDF 计算
base_link → ee_link; - 相机标定给出
camera_link → object的检测位姿; - 通过 TF 树查询
base_link → object,再规划抓取; - 控制器把关节角指令下发到实机,编码器回读验证。
如果其中任一变换方向写反,或四元数未归一化,都会导致末端“看起来差一点”,实机却撞桌或抓空。因此,仿真中应先用 RViz 检查 TF 树,再上实机。
rosrun tf tf_echo base_link ee_link 查看实时变换;用 check_urdf 验证 URDF 结构;用 joint_state_publisher 拖动关节检查模型是否正确。五、常见误区与复盘
- 欧拉角顺序混淆:ZYX 与 XYZ 结果不同,必须与控制器、示教器约定一致。
- 四元数未归一化:长时间插值后模长漂移,导致旋转失真,需定期归一化。
- DH 与 URDF 原点不一致:DH 的连杆坐标系原点常与 URDF 的 joint origin 不同,转换时需重新计算。
- 忽略惯性参数:仿真中只填 visual 不填 inertial,会导致动力学仿真异常或控制器增益难调。
- TF 树断裂:缺少
base_link → camera_link或时间戳不同步,查询会失败。
掌握本章内容后,你应能:用齐次变换描述任意两坐标系关系;在欧拉角与四元数之间正确转换;根据 DH 参数或 URDF 建立机器人运动学模型;并在仿真与实机之间保持描述一致。这是后续运动规划、控制与部署的数学地基。