元器件 · 底盘
麦克纳姆轮组
以 45° 推地的轮子。本文讲四只轮子里哪一只是左手、能揪出装反的 X 形检查,以及为了横向移动要牺牲多少附着力。
它是什么
麦克纳姆轮是在普通轮子轮缘上装一圈自由转动的滚子,每个滚子的轴线与轮子自身成 45°。1972 年 Bengt Ilon 在瑞典 Mecanum AB 公司为它申请了专利,名字就从这里来,仓库机器人从此一直在悄悄用它。
这个 45° 就是全部故事。因为滚子在其他方向上自由转动、拒绝传递力,所以麦克纳姆轮只能沿滚子轴线推地——无论电机怎么转,这个合力方向相对底盘永远钉在 45° 上。
单独一只这样的轮子毫无用处。四只轮子按两左两右配对,就得到四个交替 45° 的力矢量,四个矢量之和可以指向地面的任意方向并带上旋转。这就是全向底盘:四个普通无转向电机,给出三个可控自由度——前进、横移、旋转。
分左右,为什么没得商量
麦克纳姆轮有两种互为镜像的形式,一般按左(A)和右(B)卖,或直接在轮毂上打 L、R。一台车需要各两只,对角配对:
| 角 | 左右 | 从上方看它的力矢量 |
|---|---|---|
| 左前 | 左手(A) | 轮子正转时指向前右 |
| 右前 | 右手(B) | 指向前左 |
| 左后 | 右手(B) | 指向前左 |
| 右后 | 左手(A) | 指向前右 |
对角共用同一种。买四只一样的轮子是真实且常见的错误——靠谱卖家的“麦克纳姆轮四只装”里是两左两右,但分开买的两个单只经常不是。
X 形检查
可靠的检查不需要任何标记。
- 把车轮朝下放桌上。
- 人站在正上方垂直往下看。
- 每只轮子,沿顶部能看到的滚子排成的线看过去。
- 这四条线应该指向车体中心,画出一个 X。
如果画出来是菱形——O 形或菱形——就把对角的两只轮子对调再检查。
有个容易绕晕的细节:顶部看到的滚子和着地的滚子是镜像关系,因为轮顶的滚子转半圈就到轮底了。真正推地的滚子指向另一边。没关系——能看到的 X 依然是正确的检查,而且人人都用它,正因为它看得见。
在 Arduino 上接四个轮子
麦克纳姆是四电机底盘,一个 L298N 不够。要么两个双 H 桥,要么一块四通道板:
| 轮子 | 驱动 | 方向引脚 | PWM 引脚 | 编码器 A/B |
|---|---|---|---|---|
| 左前 | 驱动 1,通道 A | 2、4 | 3 | 18、30 |
| 右前 | 驱动 1,通道 B | 7、8 | 5 | 19、31 |
| 左后 | 驱动 2,通道 A | 24、26 | 6 | 20、32 |
| 右后 | 驱动 2,通道 B | 28、22 | 11 | 21、33 |
两个容易踩的坑:
- **共用定时器的四个 PWM 通道不会全都工作。**Uno 上六个 PWM 引脚分属三个定时器,Servo 库或
tone()还会偷走一个。Mega 或 ESP32 上这根本不是问题;在 Uno 上焊接前先查定时器分配。 - **四个编码器想要四个中断引脚。**Uno 只有两个。这就是麦克纳姆作品最终大都跑到 Mega 2560 或 ESP32 上的最常见原因。
能跑的最小代码
逆运动学就四行,其余都是杂务。
// Mecanum inverse kinematics: a chassis command in, four wheel speeds out.
// x is forward, y is to the robot's LEFT, omega is counter-clockwise.
const float LX = 0.075; // half the wheelbase, m
const float LY = 0.085; // half the track, m
const float K = LX + LY; // the only place geometry enters
void driveMecanum(float vx, float vy, float omega) {
float fl = vx - vy - K * omega;
float fr = vx + vy + K * omega;
float rl = vx + vy - K * omega;
float rr = vx - vy + K * omega;
// Scale, do not clip. Clipping each wheel on its own keeps the speed and
// throws the direction away, which is a bug you will chase for a week.
float peak = max(max(fabs(fl), fabs(fr)), max(fabs(rl), fabs(rr)));
if (peak > V_MAX) {
float s = V_MAX / peak;
fl *= s; fr *= s; rl *= s; rr *= s;
}
setWheel(FL, fl); setWheel(FR, fr);
setWheel(RL, rl); setWheel(RR, rr);
}
setWheel() 是速度环住的地方(如果有的话)。开环就是写 PWM,而开环麦克纳姆会漂移——见轮速闭环。
关键的三个数字
三个都是几何决定的,花钱解决不了。
| 量 | 麦克纳姆 | 普通轮 | 原因 |
|---|---|---|---|
| 直线附着力 | 71%(1/√2) | 100% | 摩擦限制的是整个 45° 力矢量,只有前向分量推动你 |
| μ = 0.85 时的加速度上限 | 5.9 m/s² | 8.3 m/s² | 同样比例,车重在两边都约掉了 |
| 对角最高速度 | 最高轮速的 71% | n/a | 45° 指令让两个轮子满载、两个轮子空转 |
| 自由度 | 3 | 2 | 你买它的理由 |
最后一行是你买的东西,前三行是账单。
故障排查
| 现象 | 原因 | 解决 |
|---|---|---|
| 前进正常,横移画弧带转 | 有轮子装错了角 | 做 X 检查,对角对调两只轮子 |
| 横移方向反了 | 四只轮子全镜像了——X 里外反了 | 左右两对轮子互换 |
| 长直线微微往一边偏 | 电机带载不一致 | 每个轮子闭速度环,或配对校准 |
| 对角比前进慢得多 | 设计如此,不是故障 | 1/√2 上限;提高最高速度或少走对角 |
| 横移时抖动尖叫 | 滚子在打滑而不是滚动——抓地太强、载荷太轻或滚子卡死 | 每只滚子用手拨一下,都应该转得顺滑 |
| 里程计前进准、横向没法看 | 滚子天生打滑,编码器量的不是地面 | 加 IMU 管航向,加死轮管位置 |
| 某个角声音和其他角不一样 | 那只滚子轴承坏了 | 换滚子;卡死等于那个角变成 45° 普通轮 |
麦克纳姆,还是替代方案?
| 方案 | 能横移吗 | 推力 | 地形 | 成本与复杂度 |
|---|---|---|---|---|
| 麦克纳姆,4 电机 | 能,任意方向任意朝向 | 差——滚子橡胶之前先打七折 | 仅平整硬地面 | 4 电机、4 驱动、4 编码器 |
| X 形全向轮,4 电机 | 能——包络相同,转 45° 且高 √2 倍 | 差,同速度下力再小 √2 倍 | 仅平整地面 | 电机数相同,布置别扭 |
| 差速底盘,2 电机 | 不能——先转弯 | 同样轮子下最强 | 能应付多得多 | 2 电机,便宜简单皮实 |
| 舵轮,8 电机 | 能,且附着力全额 | 强 | 好 | 四倍的工作量和成本 |
老实话:地面平整干净、空间局促、车要边走边保持朝向——仓库过道、比赛场、相机云台车——麦克纳姆是对的答案。车要推、要爬、要只靠轮子就知道自己在哪时,它是错的答案。
它用在哪里
把它们装到底盘下,你就是在做麦克纳姆全向机器人。动刀之前,先在麦克纳姆驱动模拟器里花二十分钟——在那里装反轮子不花钱,而这正是你最可能亲手造出来的故障。
探索关联图谱
用到它的搭建
包含 麦克纳姆轮组 的项目、学习路线和模拟器。
对比
替代方案
问题
麦克纳姆轮组 常见问题
怎么知道哪只麦克纳姆轮该装在哪里?
把机器人放在台面上,人站在它正上方垂直往下看。沿着每只轮子顶部能看到的那排滚子看出一条线。在装配正确的底盘上,这四条线都指向车体中心,合起来画出一个 X。如果画出来的是菱形(也就是 O 形),说明有两只轮子装错了角。这个检查只要五秒钟,不需要任何标记,却能抓出最常见的那一种麦克纳姆装配错误。轮毂上印的 L 和 R 标记有帮助,但真正可信的是 X 检查,因为它检验的正是真正要紧的东西。
如果一只麦克纳姆轮装反了会怎样?
机器人仍然能开,这正是它让人困惑的地方。前进和后退看起来都正常,因为横向分量大体上仍然相互抵消。出问题的是横移:装错的那个角把力推向与指令交叉的方向,而不是顺着指令的方向,于是一条横移指令变成了一道缓慢的、还带着自转的弧线。在模拟器里,四只轮子都装对时,横移走一圈方形最后只差 17 mm 就能闭合;装反一只轮子,终点就偏出一米多,还转了几十度。代码里没有任何错误,调多少 PID 也修不好。在真机器人上能看出来的迹象是编码器残差,它会从零升到约 0.28,并一直停在那里。
麦克纳姆轮需要编码器吗?
它比差速驱动的机器人更需要编码器,却从编码器那里得到的更少。说更需要,是因为四只轮子必须保持各自的速度比例,机器人才能朝着指令的方向走,而一只带载时掉速的电机会悄悄地把你带偏。说得到的更少,是因为滚子按设计就会打滑,所以轮子编码器测的是轮子而不是地面——里程计里横向的那部分,是整台机器人上最不可信的数字。大多数认真的麦克纳姆作品保留编码器用于速度环,再加一个 IMU 或不驱动的全向死轮来测量位置。
为什么我的麦克纳姆机器人这么容易被推动?
因为麦克纳姆轮只能沿滚子轴线方向咬住地面,而滚子轴线与你想走的方向成 45°。摩擦限制的是整个力矢量,但只有沿滚动方向的分量推动机器人——所以你得到的附着力,只有同一台机器人在同一地面上换用普通轮时的 1/√2,约 71%。滚子橡胶的抓地力通常比这个数字听起来要好,但几何上的损失是真实存在的,没有任何设置能消除它。如果重点就是用力推,那就别用麦克纳姆轮。
麦克纳姆轮能在地毯上或户外使用吗?
地毯上能用,但会损失速度和精度:滚子会陷进去而不是滑动,所以横向运动变得杂乱,里程计也更差。户外不行。碎石、草地以及任何带凸沿的东西都会卡住滚子或让它完全停转,而一只卡死的滚子会把那个角变成一只偏了 45° 的普通轮——这又是装反轮子的那种故障,只不过是间歇出现的。麦克纳姆轮是为平整、坚硬、干净的地面准备的,而仓库和比赛场地恰恰就是这样的地方。
麦克纳姆机器人需要几个电机?
四个,每只轮子一个,每个都能双向独立控制。不存在两电机的麦克纳姆底盘——整个机构靠的就是四个力矢量相加得出你想要的结果,把两只轮子绑在一个电机上就去掉了其中两个矢量。这意味着需要四路 H 桥通道;如果要速度环,还需要四组编码器线;电流预算也要按四个电机而不是两个来算。
延伸阅读