元器件 · 底盘

麦克纳姆轮组

以 45° 推地的轮子。本文讲四只轮子里哪一只是左手、能揪出装反的 X 形检查,以及为了横向移动要牺牲多少附着力。

它是什么

麦克纳姆轮是在普通轮子轮缘上装一圈自由转动的滚子,每个滚子的轴线与轮子自身成 45°。1972 年 Bengt Ilon 在瑞典 Mecanum AB 公司为它申请了专利,名字就从这里来,仓库机器人从此一直在悄悄用它。

这个 45° 就是全部故事。因为滚子在其他方向上自由转动、拒绝传递力,所以麦克纳姆轮只能沿滚子轴线推地——无论电机怎么转,这个合力方向相对底盘永远钉在 45° 上。

单独一只这样的轮子毫无用处。四只轮子按两左两右配对,就得到四个交替 45° 的力矢量,四个矢量之和可以指向地面的任意方向并带上旋转。这就是全向底盘:四个普通无转向电机,给出三个可控自由度——前进、横移、旋转。

分左右,为什么没得商量

麦克纳姆轮有两种互为镜像的形式,一般按左(A)和右(B)卖,或直接在轮毂上打 L、R。一台车需要各两只,对角配对:

角 左右 从上方看它的力矢量
左前 左手(A) 轮子正转时指向前右
右前 右手(B) 指向前左
左后 右手(B) 指向前左
右后 左手(A) 指向前右

对角共用同一种。买四只一样的轮子是真实且常见的错误——靠谱卖家的“麦克纳姆轮四只装”里是两左两右,但分开买的两个单只经常不是。

X 形检查

可靠的检查不需要任何标记。

  1. 把车轮朝下放桌上。
  2. 人站在正上方垂直往下看。
  3. 每只轮子,沿顶部能看到的滚子排成的线看过去。
  4. 这四条线应该指向车体中心,画出一个 X。

如果画出来是菱形——O 形或菱形——就把对角的两只轮子对调再检查。

有个容易绕晕的细节:顶部看到的滚子和着地的滚子是镜像关系,因为轮顶的滚子转半圈就到轮底了。真正推地的滚子指向另一边。没关系——能看到的 X 依然是正确的检查,而且人人都用它,正因为它看得见。

同一台四轮机器人俯视图,车头朝上。上图标题为正确,X 形,转动臂 lx 加 ly 等于 160 毫米,每只轮子可见滚子延长出的青色虚线交于车体中心形成 X。下图标题为错误,O 形,转动臂 lx 减 ly 的绝对值等于 10 毫米,红色标记轮子延长出的线在车周围形成菱形,永不经过中心。配文:在车正上方沿顶部可见滚子看,四条线过中心成 X,其他情况都要对调一对轮子,O 形损失十六倍转向能力,方形底盘上则全部损失。
五秒钟装配检查,以及它背后的数字。X 形排布每只轮子的转动臂都是 lx + ly;O 形只有 |lx − ly|——这里小 16 倍,方形底盘上恰好为零。 下载 SVG

在 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 桥通道;如果要速度环,还需要四组编码器线;电流预算也要按四个电机而不是两个来算。

延伸阅读

参考资料