第6章 机器人本体坐标系

码枢沄社 · 嵌入式体系化教程平台
入门 👤 刚接触机器人编程,需要理解机器人“身体”如何描述自己的开发者 🔧 为机器人运动控制、传感器数据融合、路径规划建立统一的“身体”参考系
本章你将学到
  • 机器人本体坐标系(Base Link)的定义与核心作用
  • 如何为不同形态的机器人(轮式、足式、机械臂)定义其本体坐标系
  • 本体坐标系与机器人其他部件(如轮子、关节)的关联关系
核心概念Base Link运动学链

想象一下,你站在房间里描述自己的位置。你会说“我距离门口3米”,这个“我”指的是你身体的哪个部位?是脚底、胸口还是头顶?机器人也需要一个明确的“身体原点”来报告自己的位置和姿态,这个原点就是机器人本体坐标系(Base Link Frame)的起点。

生活类比: 就像一个人的身份证照片,需要以面部正中央为基准来定义五官位置。机器人本体坐标系就是机器人的“身份证基准点”,所有其他部件的位置都以此为参照。

技术定义: 机器人本体坐标系是一个固定在机器人本体上的坐标系,通常被定义为机器人运动学链的根(Root)。它是描述机器人自身姿态(位置和朝向)以及其所有部件(如轮子、关节、传感器)相对位置的绝对参考系。

为什么需要本体坐标系?

没有统一的本体坐标系,机器人的各个模块将无法协同工作。运动控制器不知道轮子指令该发给哪个方向,激光雷达的数据不知道相对于机器人中心偏了多少,路径规划器给出的目标点机器人也不知道该朝哪走。

我在调试一个轮式机器人项目时,就踩过这个坑。当时底盘驱动代码和导航算法各自使用不同的“中心点”,导致发送“前进1米”指令时,机器人总是斜着走。排查了半天,才发现是两边的坐标系原点没对齐。

路径规划器
运动控制器
电机驱动器
(世界坐标)
(本体坐标)
(轮子坐标)
所有外部指令(如“去往(x=5, y=3)点”)最终都必须转换到机器人本体坐标系下,才能被驱动系统理解并执行。

如何定义你的机器人本体坐标系

定义本体坐标系不是随意的,需要遵循一些通用原则,以确保计算简便和符合直觉。对于大多数地面移动机器人,我推荐采用以下定义:

坐标轴正方向定义(右手系)典型参考点
X轴机器人正前方指向机器人通常前进的方向
Y轴机器人左侧指向机器人左侧
Z轴垂直向上指向机器人顶部
原点通常位于机器人几何中心、驱动轴中心或底盘中心平面上

这个定义符合右手坐标系规则:伸出右手,食指指向X轴正方向(前方),中指指向Y轴正方向(左方),拇指自然指向的就是Z轴正方向(上方)。

关键点:原点位置的选择

原点位置的选择取决于机器人的主要运动模式和控制需求:

  • 差分驱动机器人: 原点通常设在两个驱动轮轴线的中点。这样,机器人的旋转是绕原点进行的,运动学模型最简单。
  • 全向轮(麦克纳姆轮)机器人: 原点通常设在机器人底盘几何中心,因为运动是整体平移和旋转的组合。
  • 机械臂: 本体坐标系(常称为基座坐标系)固定在机械臂的底座,是第一个关节的坐标系。

⚠️ 常见误区

  • 混淆前进方向与X轴: 有人习惯将机器人“车头”方向设为Y轴,这会导致后续所有旋转变换公式(如用旋转矩阵计算航向角)变得复杂且容易出错。坚持“X轴向前”是行业惯例。
  • 忽略Z轴高度: 对于地面机器人,Z轴原点常被设在地面接触点。但更好的做法是设在机器人的重心平面或几何中心平面,这样当机器人上下坡或颠簸时,姿态(Roll, Pitch)的变化更直观。
  • 原点定义不唯一: 团队内部必须统一原点定义。如果导航模块和底盘驱动模块对原点理解不一致,就会产生系统性误差。

不同机器人形态的本体坐标系示例

让我们通过几个具体例子,看看本体坐标系如何与机器人的物理结构绑定。

四轮差分驱动机器人

  • 原点:两驱动轮轴线中点
  • X轴:指向正前方(通常也是从动轮方向)
  • 典型平台:TurtleBot3, Pioneer 3-DX

三轮全向移动机器人

  • 原点:三个全向轮构成的三角形的中心
  • X轴:指向机器人设计的“正面”
  • 特点:可在平面内任意方向平移

六足步行机器人

  • 原点:躯干几何中心或重心投影点
  • X轴:指向机器人默认行进方向
  • 注意:步行时躯干姿态会动态变化

六轴工业机械臂

  • 原点:基座安装面中心
  • X轴:通常指向第一个关节的运动平面方向
  • 遵循厂家定义的基坐标系(Base Frame)

对于轮式机器人,一个实用的检查方法是:让机器人执行“纯旋转”指令。如果机器人是绕着你定义的原点旋转,而不是绕着某个轮子打转,那么你的原点定义很可能是正确的。

编者提示: 在实际开发中,强烈建议在机器人物理模型(如URDF文件)中,用一段简短的XML注释明确记录本体坐标系(base_link)的原点定义规则。例如:“base_link原点位于两驱动轮轴心连线中点,距地面0.1米(底盘厚度一半),X轴指向激光雷达安装方向”。这能避免团队成员因记忆模糊而产生分歧。

本体坐标系与运动学链

机器人本体坐标系不仅仅是孤立的原点,它还是整个机器人运动学树的起点。从本体坐标系出发,通过一系列固定的连杆变换,可以到达机器人的任何一个部件。

本体坐标系 (base_link)
固定变换
左轮坐标系 (left_wheel_link)
本体坐标系 (base_link)
固定变换
激光雷达坐标系 (laser_link)
本体坐标系 (base_link)
关节1变换
机械臂连杆1坐标系 (link1)

以常见的差分机器人URDF描述片段为例,你可以看到这种连接关系(以下为示意性描述,非完整代码):

<!-- 机器人根链接:本体坐标系 -->
&lt;link name="base_link"/&gt;

<!-- 左轮坐标系,相对于base_link有一个固定的平移 -->
&lt;joint name="left_wheel_joint" type="fixed"&gt;
  &lt;parent link="base_link"/&gt;
  &lt;child link="left_wheel_link"/&gt;
  &lt;origin xyz="-0.1 0.2 0" rpy="0 0 0"/&gt;
&lt;/joint&gt;
&lt;link name="left_wheel_link"/&gt;

在这段描述中,`base_link`是父坐标系,`left_wheel_link`是子坐标系。``标签中的`xyz`属性“-0.1 0.2 0”就定义了左轮坐标系原点相对于`base_link`原点:在X轴负方向0.1米,Y轴正方向0.2米,Z轴相同高度。

实际开发中,大部分团队会使用尺子或三维建模软件精确测量这些偏移量。如果测量不准,比如激光雷达相对于本体的偏移输错了几厘米,建图时就会产生重影,定位也会漂移。

从理论到代码:获取本体坐标系位姿

在机器人操作系统(如ROS)中,你通常不需要直接计算本体坐标系的位姿,因为它被默认为“自我”的参考系。但你需要知道如何表达其他坐标系相对于本体坐标系的位置。

假设你从里程计得到一个消息,告诉你机器人本体坐标系相对于世界坐标系的位置是(x=1.0, y=2.0, theta=0.5 rad)。在程序中,你可能会这样定义一个结构体来表示这个位姿:

// 一个简化的机器人位姿结构体
struct RobotPose {
  double x;      // 在世界坐标系中的X坐标(米)
  double y;      // 在世界坐标系中的Y坐标(米)
  double yaw;    // 绕Z轴的旋转角(弧度),0弧度表示X轴指向世界坐标系X轴
};

int main() {
  // 假设从里程计更新了当前机器人本体坐标系的位姿
  RobotPose base_link_pose;
  base_link_pose.x = 1.0;
  base_link_pose.y = 2.0;
  base_link_pose.yaw = 0.5; // 约28.6度

  // 现在,一个在机器人前方0.5米,左侧0.2米的点(在本体坐标系中为(0.5, 0.2))
  // 需要转换到世界坐标系,这里就需要用到前几章学的旋转矩阵和平移
  // 具体转换代码涉及旋转矩阵,此处略过...
  return 0;
}

这里有个隐藏的坑:不同系统对偏航角(yaw)的零度方向定义可能不同。有的定义为零度指向世界坐标系X轴,有的定义为指向北。你必须查阅你所用的导航框架的文档,确认其约定。我在集成一个第三方定位模块时,就因为它使用的“北东地”坐标系与我们“X向前”的约定不符,导致机器人总是朝错误的方向前进。

动手试一试

1. 纸上定义: 拿一张纸,画一个长方形代表你的机器人底盘(或想象一个你熟悉的机器人,如扫地机器人)。在图上标出你认为合理的本体坐标系原点、X轴和Y轴正方向。写下你选择的理由(例如:因为驱动轮在这里,因为这是重心等)。

2. 测量练习: 如果你有一个实体机器人或机器人模型(哪怕是玩具车),用卷尺测量。假设你将本体坐标系原点定在某个点(如两驱动轮中点),尝试测量一个特征点(如车头最前端、某个传感器安装点)相对于这个原点的 (x, y) 偏移量。记录下这些数据,这就是该特征点在本体坐标系中的坐标。

3. 思维实验: 如果你的机器人执行“绕自身原点逆时针旋转90度”的指令,根据你定义的本体坐标系,机器人最终的车头朝向应该是哪个方向?用你的图纸验证一下。

检验你的理解

1. 判断题:机器人本体坐标系(base_link)的原点必须放在机器人的物理重心上。 (对/错)

2. 选择题:对于一个标准的差分驱动机器人,其本体坐标系的X轴正方向通常如何定义? A. 指向机器人的左侧 B. 指向机器人的右侧 C. 指向机器人的正前方(通常的前进方向) D. 指向机器人的正后方

3. 判断题:只要团队内部协商一致,可以将机器人本体坐标系的Z轴正方向定义为垂直向下。 (对/错)

本章小结

  • 机器人本体坐标系(Base Link)是固定在机器人身上的“身体参考系”,是所有内部部件坐标的根。
  • 定义时应遵循右手系惯例:X轴向前,Y轴向左,Z轴向上。原点位置需根据机器人运动模式合理选择(如差分轮机器人的驱动轴中点)。
  • 本体坐标系是机器人运动学树的起点,通过一系列固定或关节变换,可以连接到轮子、传感器等所有部件坐标系。
  • 统一且明确的本体坐标系定义是避免导航和控制中出现系统性错误的基础,应在设计文档和模型文件中清晰说明。
  • 在实际编程中,机器人本体坐标系相对于世界坐标系的位姿(位置和朝向)是导航算法的核心状态量。
← 上一章 返回目录 下一章 →