2. 机器人运动学基础:差速轮模型、阿克曼模型、全向轮模型简介
各位同学,欢迎来到《机器人局部路径规划与避障策略实战》的第一章。
做机器人规划,说白了,你得先懂你的机器人是怎么动的。你想想看,连车怎么转弯、怎么刹车都不清楚,你怎么给它规划路径?
我个人习惯,在讲任何算法之前,先把“腿”搞清楚。这里的“腿”,就是机器人的运动学模型。今天咱们就聊聊最常见的三种:差速轮、阿克曼、全向轮。
2.1 差速轮模型:最朴素的“坦克转向”
差速轮模型,我估计是大家接触最多的。两个驱动轮,一个万向轮(或者两个)。靠左右轮的速度差来实现转向。
核心原理:
- 左轮速度 = vL,右轮速度 = vR
- 线速度 v = (vL + vR) / 2
- 角速度 ω = (vR - vL) / d (d 是轮距)
嗯,这里要注意:如果 vL = vR,直线前进。如果 vL = -vR,原地旋转。说白了,就是坦克的转向方式。
我在项目中遇到过:有一次用差速轮小车做室内导航,发现转弯时总是打滑。后来排查发现,是轮距 d 的测量误差太大。差速轮对轮距非常敏感,差个几毫米,转弯半径就偏了。
避坑指南:
我曾经在调试时,直接把左右轮速度设成相反数,以为能原地转。结果小车在地上画了个大圈。为什么?因为轮子打滑了。差速轮原地旋转时,如果地面摩擦力不够,或者重心偏了,根本转不动。建议实际项目中,原地旋转速度不要超过 0.5 rad/s。
代码示例(ROS 中常见的 cmd_vel 转换):
// 输入:线速度 v,角速度 ω
// 输出:左轮速度 vL,右轮速度 vR
// 轮距 d = 0.5m
float vL = v - (ω * d / 2.0);
float vR = v + (ω * d / 2.0);
// 限幅处理,防止电机过载
if (abs(vL) > MAX_SPEED) vL = sign(vL) * MAX_SPEED;
if (abs(vR) > MAX_SPEED) vR = sign(vR) * MAX_SPEED;
2.2 阿克曼模型:汽车的“标准答案”
阿克曼模型,说白了就是汽车。前轮转向,后轮驱动。你想想看,汽车转弯时,四个轮子的轨迹是四个同心圆。这就是阿克曼转向几何要解决的问题。
核心公式:
- 转弯半径 R = L / tan(δ) (L 是轴距,δ 是前轮转角)
- 内轮转角 δi 和外轮转角 δo 满足:cot(δo) - cot(δi) = d / L
为什么会这样?因为内轮走的圆弧半径小,外轮走的圆弧半径大。如果两个前轮转同样的角度,轮胎就会侧滑。阿克曼几何就是让内外轮转角不同,保证所有轮子都做纯滚动。
我个人习惯:在做阿克曼模型的路径规划时,一定要考虑最小转弯半径。比如你的车最小转弯半径是 2 米,那规划出来的路径曲率就不能超过 0.5。否则,车根本拐不过去。
避坑指南:
我曾经在做一个园区无人车项目时,直接用了理想阿克曼模型。结果发现,实际车辆在低速时,轮胎的侧偏特性会导致实际转弯半径比理论值大 10%-20%。后来我加了一个经验修正系数,才把轨迹跟踪精度提上去。
代码示例(阿克曼模型的前轮转角计算):
// 输入:期望转弯半径 R,轴距 L
// 输出:前轮转角 δ
float delta = atan2(L, R);
// 阿克曼转向几何修正
float delta_inner = atan2(L, R - d/2);
float delta_outer = atan2(L, R + d/2);
// 实际控制时,左右轮分别用 delta_inner 和 delta_outer
2.3 全向轮模型:想怎么走就怎么走
全向轮,说白了就是可以“横着走”。它靠轮子上的小滚轮来实现侧向滑动。最常见的全向轮是麦克纳姆轮(Mecanum Wheel)。
核心原理:
- 四个轮子独立驱动,每个轮子有 45° 的滚轮
- 通过不同轮子的速度组合,实现任意方向的平移和旋转
- 运动学矩阵:
[vx, vy, ω] = M * [ω1, ω2, ω3, ω4]T
嗯,这里要注意:全向轮虽然灵活,但它的运动学解算不是唯一的。四个轮子,三个自由度,所以有冗余。我一般用伪逆矩阵来求解。
我在项目中遇到过:用麦克纳姆轮做仓储机器人,发现它在瓷砖地面上跑的时候,震动特别大。后来发现是滚轮和地面的接触点一直在变,导致机器人重心上下波动。解决办法是加了一层软胶垫,或者换用全向轮中的另一种——全向轮(Omni Wheel),它的滚轮是垂直的,震动会小一些。
避坑指南:
我曾经以为全向轮可以无视地面条件。结果在户外草地上测试,轮子直接陷进去了。全向轮的滚轮很小,对地面平整度要求很高。室内光滑地面没问题,户外就别想了。
代码示例(麦克纳姆轮运动学解算):
// 输入:期望速度 vx, vy, ω
// 输出:四个轮子的转速 w1, w2, w3, w4
// 轮距 Lx, Ly
float w1 = (vx - vy - (Lx + Ly) * ω) / R;
float w2 = (vx + vy + (Lx + Ly) * ω) / R;
float w3 = (vx + vy - (Lx + Ly) * ω) / R;
float w4 = (vx - vy + (Lx + Ly) * ω) / R;
// 注意:不同安装方式,符号可能不同
2.4 三种模型的对比
| 特性 | 差速轮 | 阿克曼 | 全向轮 |
|---|---|---|---|
| 自由度 | 2(v, ω) | 2(v, δ) | 3(vx, vy, ω) |
| 能否横移 | 否 | 否 | 能 |
| 原地旋转 | 能 | 不能 | 能 |
| 地面适应性 | 好 | 好 | 差(需平整地面) |
| 控制复杂度 | 低 | 中 | 高 |
| 典型应用 | 扫地机、AGV | 汽车、无人车 | 仓储机器人 |
好了,这一章就到这里。三种模型各有优劣,选型时一定要结合你的实际场景。下一章,咱们聊聊路径规划中最基础的东西——全局路径规划与局部路径规划的区别。
公众号:蓝海资料掘金营,微信deep3321