4、全向轮运动学:三轮全向轮底盘的运动学方程推导、三轮与四轮底盘的对比分析
4.1 为什么先讲三轮?
做机器人底盘这些年,我见过不少新手一上来就搞四轮全向。结果呢?控制效果一塌糊涂。其实,三轮全向轮才是入门的最佳选择。
为什么?因为三轮结构在数学上是“静定”的——三个轮子的速度可以唯一确定底盘的运动状态。说白了,就是方程有唯一解。四轮就不一样了,它是“超静定”的,会有冗余自由度,处理起来麻烦得多。
我记得2018年做第一个全向轮项目时,选了四轮结构,结果调试了整整两周,底盘总是在原地打转。后来换成三轮,一天就调通了。嗯,这个教训挺深刻的。
4.2 三轮全向轮的运动学模型
先看一个典型的三轮全向轮底盘布局。三个轮子互成120°安装,每个轮子的轴线指向底盘中心。我习惯把这种布局叫做“Y型布局”。
核心思想:底盘在平面内的运动可以分解为三个自由度——X方向平移、Y方向平移、绕Z轴旋转。三个轮子的速度就是这三个自由度的线性组合。
4.2.1 建立坐标系
我们需要两个坐标系:
- 世界坐标系:固定在地面,用Xw、Yw表示
- 底盘坐标系:固定在底盘中心,用Xb、Yb表示
底盘坐标系的原点O就是底盘几何中心。三个轮子分别位于0°、120°、240°方向,距离中心距离为R。
4.2.2 运动学方程推导
设底盘在自身坐标系下的速度为:
- vx:沿Xb方向的速度
- vy:沿Yb方向的速度
- ω:绕Z轴的角速度(逆时针为正)
每个轮子的速度由两部分组成:
- 平移分量:底盘平动在轮子方向上的投影
- 旋转分量:底盘旋转在轮子处产生的切向速度
对于轮子i(i=1,2,3),其安装角度为θi,轮子速度vi的表达式为:
v₁ = -sin(θ₁)·vx + cos(θ₁)·vy + R·ω
v₂ = -sin(θ₂)·vx + cos(θ₂)·vy + R·ω
v₃ = -sin(θ₃)·vx + cos(θ₃)·vy + R·ω
代入θ₁=0°, θ₂=120°, θ₃=240°:
v₁ = 0·vx + 1·vy + R·ω
v₂ = -0.866·vx - 0.5·vy + R·ω
v₃ = 0.866·vx - 0.5·vy + R·ω
写成矩阵形式就是:
[v₁] [ 0 1 R ] [vx]
[v₂] = [-0.866 -0.5 R ] [vy]
[v₃] [ 0.866 -0.5 R ] [ω ]
我的小技巧:这个矩阵就是“正向运动学矩阵”。实际编程时,我习惯把它写成3×3的浮点数组,直接做矩阵乘法。别用循环,手写展开更快。
4.2.3 逆运动学:从轮速到底盘速度
实际控制中,我们更关心的是:给定三个轮子的速度,底盘会怎么动?这就需要求逆矩阵。
上面那个3×3矩阵是可逆的(因为三轮结构是静定的)。逆矩阵为:
[vx] [ 0 -0.577 0.577 ] [v₁]
[vy] = [ 0.667 -0.333 -0.333 ] [v₂]
[ω ] [ 0.333 0.333 0.333 ] [v₃]
注意看第三行:三个系数都是0.333。这意味着什么?如果三个轮子速度相同,底盘就会原地旋转。如果想让底盘直线前进,三个轮子的速度必须满足特定比例。
我曾经踩过的坑:逆运动学矩阵的系数依赖于轮子安装角度。如果你的底盘不是严格的120°布局,一定要重新计算!我见过有人直接套用公式,结果底盘走S形。
4.3 三轮 vs 四轮:到底选哪个?
这个问题我经常被问到。直接说结论:
| 对比项 | 三轮全向 | 四轮全向 |
|---|---|---|
| 运动学复杂度 | 简单,唯一解 | 复杂,需要优化求解 |
| 地面适应性 | 较差,三点支撑 | 较好,四点支撑更稳 |
| 负载能力 | 一般 | 较强 |
| 控制精度 | 高(无冗余) | 中等(有冗余) |
| 成本 | 低 | 高 |
| 典型应用 | 小型机器人、竞赛 | 工业AGV、服务机器人 |
我个人建议:
- 做原型验证、教学演示:选三轮,简单可靠
- 做产品、商业项目:选四轮,稳定性更好
- 地面不平整:必须选四轮,三轮会翘脚
4.4 四轮全向的运动学(简要对比)
四轮全向底盘通常采用“X型布局”或“O型布局”。四个轮子互成90°安装。
运动学方程形式上类似,但多了一个自由度。你想想看,四个方程解三个未知数,这就有了冗余。实际处理时有两种方法:
- 最小二乘法:找一个最优解,让四个轮子的速度误差最小
- 约束法:增加一个约束条件,比如“四个轮子速度平方和最小”
我在项目中用过最小二乘法。效果还行,但要注意:如果某个轮子打滑,整个解就会偏掉。所以四轮系统一定要加轮速反馈。
4.5 运动学方程的可视化理解
说了这么多公式,我们来画个图直观理解一下。
从图上可以清楚看到:每个轮子的速度方向都是沿着该轮子所在位置的切线方向。底盘要往哪个方向走,就是这三个速度的合成结果。
4.6 实际编程中的注意事项
我的编程习惯:
- 运动学矩阵用
const float定义,编译时优化 - 逆运动学计算用定点数或浮点数,看MCU性能
- 一定要做限幅处理,防止轮子速度超限
举个简单的C代码片段:
// 三轮全向逆运动学
// 输入:三个轮子速度 v1, v2, v3
// 输出:底盘速度 vx, vy, omega
void inverse_kinematics(float v1, float v2, float v3,
float *vx, float *vy, float *omega) {
// 逆运动学矩阵系数
const float k1 = 0.0f;
const float k2 = -0.577f;
const float k3 = 0.577f;
const float k4 = 0.667f;
const float k5 = -0.333f;
const float k6 = -0.333f;
const float k7 = 0.333f;
*vx = k1 * v1 + k2 * v2 + k3 * v3;
*vy = k4 * v1 + k5 * v2 + k6 * v3;
*omega = k7 * (v1 + v2 + v3);
// 限幅处理
if (*vx > MAX_SPEED) *vx = MAX_SPEED;
if (*vx < -MAX_SPEED) *vx = -MAX_SPEED;
// ... 类似处理 vy 和 omega
}
注意:上面的系数是针对120°布局的。如果你的底盘是其他角度,一定要重新推导!我曾经见过有人把90°布局的系数用在120°布局上,结果底盘横着走。
4.7 小结
这一章我们重点讲了:
- 三轮全向底盘的运动学方程推导过程
- 正向和逆运动学矩阵的建立方法
- 三轮与四轮底盘的对比分析
说白了,运动学就是建立“轮子速度”和“底盘速度”之间的映射关系。这个关系搞清楚了,控制算法才能写得对。
下一章我们会讲全向轮底盘的动力学建模,那才是真正考验控制功底的地方。
公众号:蓝海资料掘金营,微信deep3321