3. 轮子坐标系定义:机器人坐标系建立、轮子安装角度、轮子编号规则

好,咱们接着聊麦克纳姆轮的运动分解。前面两章我们把轮子的物理结构和运动原理讲清楚了,这一章要解决一个非常实际的问题——坐标系怎么建?轮子怎么装?编号怎么定?

说实话,我在早期做项目时,就吃过坐标系定义不清的亏。有一次调试四轮全向底盘,明明代码逻辑看起来都对,但车子就是不走直线,反而原地打转。折腾了两天,最后发现是轮子编号和坐标系方向没对齐。嗯,从那以后,我养成了一个习惯:先定坐标系,再写一行代码

3.1 机器人坐标系建立

我们先从最基础的开始。机器人坐标系,说白了就是给机器人定义一个“身体坐标系”。我个人习惯用 ROS 标准 来定义:

  • X轴:指向机器人前进方向
  • Y轴:指向机器人左侧(注意,是左侧!)
  • Z轴:垂直向上,符合右手定则

你可能会问:“为什么 Y 轴要指向左侧,而不是右侧?” 这是因为 ROS 的 base_link 坐标系就是这么规定的。如果你做机器人开发,最好遵循这个约定,否则后续和导航、定位模块对接时会很痛苦。

核心原则:机器人坐标系的原点通常位于底盘几何中心,Z轴过原点垂直向上。这个原点也是我们计算运动学的基础。

下面我用一张 SVG 图来展示这个坐标系,以及轮子的安装位置和编号。这张图是我自己画的,你直接看就行。

X Y O (0,0) 1 左前 2 右前 3 左后 4 右后 45° -45° -45° 45° 图例: 轮子(编号+位置) X轴(前进方向) Y轴(左侧方向) 轮子安装角度(辊子轴线方向)

小技巧:如果你用 ROS 的 tf2 工具,可以直接用 static_transform_publisher 发布 base_linkwheel_1_link 等子坐标系的变换。这样可视化工具里就能直接看到轮子的位置和朝向。

3.2 轮子安装角度

麦克纳姆轮的安装角度,指的是辊子轴线与轮子轴线的夹角。对于标准麦克纳姆轮,这个角度通常是 45度-45度(也就是135度)。

为什么是45度?你想想看,辊子与地面接触时,摩擦力分解成两个方向的分量。45度角能让这两个分量大小相等,这样运动学计算最简洁。我在项目中试过其他角度(比如30度或60度),结果运动学模型变得很复杂,而且控制精度反而下降了。所以,老老实实用45度,别折腾。

安装角度的正负号怎么定?这里有个约定:

  • 正45度(+45°):辊子轴线与轮子轴线呈45度,且辊子前端指向轮子外侧(远离机器人中心)。
  • 负45度(-45°):辊子轴线与轮子轴线呈-45度,且辊子前端指向轮子内侧(靠近机器人中心)。

对应到上面的 SVG 图:

  • 轮子1(左前):+45°
  • 轮子2(右前):-45°
  • 轮子3(左后):-45°
  • 轮子4(右后):+45°

这个配置是麦克纳姆轮底盘最经典的“X型”布局。你可能会问:“为什么不是所有轮子都装成同一个角度?” 嗯,如果那样的话,车子就只能斜着走,没法全向移动了。四个轮子的角度两两对称,才能合成任意方向的运动。

避坑指南:我曾经遇到过轮子安装角度搞反的情况——左前轮装成了-45度,右前轮装成了+45度。结果车子前进时,实际运动方向偏了90度。检查了半天才发现是机械装配时把轮子左右装反了。所以,装配完成后一定要做“单轮测试”:单独驱动每个轮子,观察它的实际运动方向是否与理论一致。

3.3 轮子编号规则

轮子编号看似简单,但不同团队、不同教材用的编号方式可能完全不同。我见过以下几种:

编号方式 轮子1 轮子2 轮子3 轮子4 说明
本课程采用 左前 右前 左后 右后 顺时针编号,从左上开始
方式B 右前 左前 右后 左后 逆时针,从右上开始
方式C 前左 前右 后左 后右 按前后分组

我个人习惯用 方式A,也就是:

  • 轮子1:左前(LF)
  • 轮子2:右前(RF)
  • 轮子3:左后(LB)
  • 轮子4:右后(RB)

这个编号顺序是顺时针的,从左上角开始。为什么这么定?因为后续写运动学代码时,这个顺序和矩阵运算的索引对应起来最自然。你想想看,如果编号乱糟糟的,写代码时很容易搞混哪个轮子对应矩阵的哪一行。

重要提醒:无论你采用哪种编号方式,一定要在代码和文档中保持一致。我见过一个项目,机械图纸用方式A,控制代码用方式B,结果联调时轮子乱转。最后花了半天时间统一编号才解决问题。

3.4 轮子坐标系与机器人坐标系的转换

每个轮子都有自己的局部坐标系。以轮子1(左前)为例:

  • 轮子坐标系原点在轮子中心
  • X_wheel 轴沿轮子轴线方向(指向右侧)
  • Y_wheel 轴垂直于轮子轴线(指向前方)
  • Z_wheel 轴垂直向上

从机器人坐标系到轮子坐标系的转换,说白了就是一个平移+旋转。平移量是轮子中心在机器人坐标系中的坐标,旋转量是轮子的安装角度。

举个例子,假设轮子1的中心在机器人坐标系中的位置是 (x₁, y₁),安装角度是 45°。那么从机器人坐标系到轮子1坐标系的变换矩阵就是:

// 伪代码:机器人速度到轮子1速度的转换
// v_robot = [vx, vy, wz]^T  (机器人线速度和角速度)
// v_wheel1 = 轮子1的线速度

// 平移部分:轮子1的位置
double Lx = 0.3;  // 轮子1到中心的X方向距离(米)
double Ly = 0.25; // 轮子1到中心的Y方向距离(米)

// 旋转部分:安装角度 45度 = PI/4
double theta = M_PI / 4;

// 最终公式(简化版)
v_wheel1 = vx * cos(theta) + vy * sin(theta) + wz * (Lx * sin(theta) - Ly * cos(theta));

这个公式看起来很复杂,但别怕。下一章我们会把它整理成完整的运动学矩阵,到时候你直接用就行。这里你只需要理解:每个轮子的速度,是由机器人整体速度、轮子位置、安装角度三者共同决定的

我的经验:在实际项目中,我通常不会手算这些变换。我会在 ROS 里定义好每个轮子的 urdf 模型,然后用 tf 库自动处理坐标变换。这样既准确又省事。但理解背后的原理还是必要的——至少调试时你知道问题出在哪。

3.5 本章小结

好,我们来快速回顾一下这一章的核心内容:

  • 机器人坐标系:X向前,Y向左,Z向上,原点在底盘几何中心
  • 轮子安装角度:标准配置是左前+45°、右前-45°、左后-45°、右后+45°
  • 轮子编号:1左前、2右前、3左后、4右后(顺时针)
  • 坐标变换:每个轮子的速度由机器人速度、轮子位置和安装角度共同决定

这些定义看起来琐碎,但它们是后续所有运动学计算的基础。就像盖房子打地基一样,地基歪了,上面盖得再漂亮也没用。下一章我们会把这些定义用起来,推导出完整的运动学公式。


公众号:蓝海资料掘金营,微信deep3321