3. 轮子坐标系定义:机器人坐标系建立、轮子安装角度、轮子编号规则
好,咱们接着聊麦克纳姆轮的运动分解。前面两章我们把轮子的物理结构和运动原理讲清楚了,这一章要解决一个非常实际的问题——坐标系怎么建?轮子怎么装?编号怎么定?
说实话,我在早期做项目时,就吃过坐标系定义不清的亏。有一次调试四轮全向底盘,明明代码逻辑看起来都对,但车子就是不走直线,反而原地打转。折腾了两天,最后发现是轮子编号和坐标系方向没对齐。嗯,从那以后,我养成了一个习惯:先定坐标系,再写一行代码。
3.1 机器人坐标系建立
我们先从最基础的开始。机器人坐标系,说白了就是给机器人定义一个“身体坐标系”。我个人习惯用 ROS 标准 来定义:
- X轴:指向机器人前进方向
- Y轴:指向机器人左侧(注意,是左侧!)
- Z轴:垂直向上,符合右手定则
你可能会问:“为什么 Y 轴要指向左侧,而不是右侧?” 这是因为 ROS 的 base_link 坐标系就是这么规定的。如果你做机器人开发,最好遵循这个约定,否则后续和导航、定位模块对接时会很痛苦。
核心原则:机器人坐标系的原点通常位于底盘几何中心,Z轴过原点垂直向上。这个原点也是我们计算运动学的基础。
下面我用一张 SVG 图来展示这个坐标系,以及轮子的安装位置和编号。这张图是我自己画的,你直接看就行。
小技巧:如果你用 ROS 的 tf2 工具,可以直接用 static_transform_publisher 发布 base_link 到 wheel_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