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 个数表达旋转,无奇异、插值平滑,是仿真与实机通信中的常用姿态格式。

表示方式自由度/维度优点局限典型用途
旋转矩阵 R3 / 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>

下面这张图展示了从“数学描述”到“仿真模型”再到“实机部署”的完整关系链,帮助理解各环节的对应关系。

刚体运动学 → 建模 → 仿真 → 实机 关系链 数学描述层 齐次变换 T 旋转矩阵 R / 四元数 q 欧拉角 RPY 参数层 DH 参数 a, alpha d, theta 关节限位 / 轴向 模型层 URDF / Xacro link / joint / axis visual / collision / inertial 仿真 Gazebo RViz MoveIt 实机部署层 控制器 / 驱动器 / 编码器 TF 树 / 关节状态 / 标定参数 实机偏差反馈 一致性原则:数学层定义变换方向与上下标;参数层保证 DH 与关节轴一致;模型层保证 URDF 与实机尺寸、限位、惯性一致; 仿真层验证运动学与碰撞;实机层通过 TF 与关节状态回读,形成闭环校验。

四、案例与场景:移动操作机器人的抓取链路

假设移动底盘到达目标点后,机械臂要抓取桌面物体。完整链路如下:

  1. 底盘定位给出 map → base_link 变换;
  2. 机械臂正运动学由 DH 或 URDF 计算 base_link → ee_link;
  3. 相机标定给出 camera_link → object 的检测位姿;
  4. 通过 TF 树查询 base_link → object,再规划抓取;
  5. 控制器把关节角指令下发到实机,编码器回读验证。

如果其中任一变换方向写反,或四元数未归一化,都会导致末端“看起来差一点”,实机却撞桌或抓空。因此,仿真中应先用 RViz 检查 TF 树,再上实机。

实用技巧:在 ROS 中可用 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 建立机器人运动学模型;并在仿真与实机之间保持描述一致。这是后续运动规划、控制与部署的数学地基。