Differential Drive(差速驱动)运动学模型
差速底盘结构
x(车体前进方向)
↑
│
左轮 │ 右轮
┌──────┐ │ ┌──────┐
│WheelL│ │ │WheelR│
└──────┘ │ └──────┘
<---- L ---->
O (机器人中心)
其中:
- 左轮速度:
v_L - 右轮速度:
v_R - 两轮中心距离:
L(Wheel Base) - 轮半径:
r
机器人在世界坐标系中的状态表示为:
\[(x,\;y,\;\theta)\]其中:
x:世界坐标 Xy:世界坐标 Yθ:机器人航向角(Heading)
轮速与机器人速度关系-正运动学
这是控制器最常用的公式。
假设左右轮线速度分别为:
\[v_L,\quad v_R\]那么机器人整体的线速度为:
\[v=\frac{v_R+v_L}{2}\]机器人角速度为:
\[\omega=\frac{v_R-v_L}{L}\]因此:
\[\boxed{ \begin{aligned} v &= \frac{v_R+v_L}{2}\\ \omega &= \frac{v_R-v_L}{L} \end{aligned} }\]这就是正运动学(Forward Kinematics)。
机器人运动方程
机器人当前位姿:
\[(x,y,\theta)\]运动学微分方程为:
\[\boxed{ \begin{aligned} \dot x &= v\cos\theta\\ \dot y &= v\sin\theta\\ \dot\theta &= \omega \end{aligned} }\]将轮速代入,可得到完整运动学模型:
\[\boxed{ \begin{aligned} \dot x &= \frac{v_R+v_L}{2}\cos\theta\\ \\ \dot y &= \frac{v_R+v_L}{2}\sin\theta\\ \\ \dot\theta &= \frac{v_R-v_L}{L} \end{aligned} }\]这就是经典 Differential Drive Model。
- $\dot{x}$:机器人在水平方向($X$ 轴)的速度分量。
- $\dot{y}$:机器人在竖直方向($Y$ 轴)的速度分量。
- $\dot{\theta}$(即 $\omega$):机器人的旋转角速度(偏航角的变化率)。
逆运动学
ROS2 控制器发送的是:
cmd_vel
linear.x
angular.z
也就是:
- 线速度
v - 角速度
ω
但电机真正需要的是左右轮速度,因此需要进行逆运动学计算:
\[\boxed{ \begin{aligned} v_L &= v-\frac{L}{2}\omega\\ \\ v_R &= v+\frac{L}{2}\omega \end{aligned} }\]例如:
cmd_vel
linear.x = 1.0
angular.z = 0.5
若:
L = 0.4 m
计算得到:
左轮:
\[v_L=1-0.1=0.9m/s\]右轮:
\[v_R=1+0.1=1.1m/s\]控制器只需要将两个目标速度发送给左右轮即可。
电机 RPM 与线速度转换
RPM 是 Revolutions Per Minute(每分钟转数)的缩写,它是一个转速单位,表示某个旋转物体在一分钟内绕自身轴转了多少圈
轮毂电机通常反馈的是:
RPM(转/分钟)
需要转换成线速度。
轮子的角速度:
\[\omega=\frac{2\pi n}{60}\]其中:
n为 RPM
线速度:
\[v=\omega r\]因此:
\[\boxed{ v=\frac{2\pi r n}{60} }\]例如:
轮径 D = 0.20 m
半径:
r = 0.10 m
电机:
100 RPM
计算:
\[v = \frac{2\pi\times0.1\times100}{60} = 1.047m/s\]ROS2 控制链路
Nav2
│
▼
geometry_msgs/Twist
linear.x
angular.z
│
▼
Diff Drive Controller
│
(逆运动学)
▼
左轮目标速度 右轮目标速度
│
▼
PID速度闭环
│
▼
轮毂电机驱动
│
▼
编码器反馈(霍尔传感器反馈)
│
▼
Odom
有编码器和只有霍尔的区别
编码器方案
电机
│
▼
编码器
│
高精度角度反馈
│
▼
里程计 Odom
编码器可以知道:
- 转过多少角度
- 累计位移
- 速度
- 方向
霍尔方案
电机
│
▼
三相霍尔传感器
│
▼
电机控制器
霍尔主要作用:
- BLDC换相
- 检测转速
- 判断方向
但是:
它通常不能精确知道转角。
三相霍尔轮毂电机详细介绍
三相霍尔轮毂电机(Three-phase Hall BLDC Hub Motor)是无人车、AGV、电动车、小型机器人中非常常见的一种驱动方案。
它本质上是:
把无刷直流电机(BLDC)+ 减速结构(部分型号)+ 车轮 + 霍尔位置传感器集成在一个轮子里面。
对于你的园区配送无人车(100kg级、ROS2差速底盘),轮毂电机是一个非常合适的方案。
结构组成
轮胎
┌────────────┐
│ │
│ 转子 │
│ 永磁磁钢 │
│ │
│ ┌────────┐ │
│ │ 定子 │ │
│ │ 三相线圈│ │
│ └────────┘ │
│ │
└────────────┘
│
│
霍尔传感器
│
BLDC电机控制器
| 部件 | 作用 |
|---|---|
| 永磁转子 | 产生旋转磁场 |
| 三相定子绕组 | 产生电磁力 |
| 霍尔传感器 | 检测转子位置 |
| 电机控制器 | 控制三相电流 |
| 轮胎 | 输出机械运动 |
接线
BLDC电机控制器与三相霍尔轮毂电机接线详解
三相霍尔轮毂电机和 BLDC 控制器之间通常通过两组线连接:
三根粗动力线(三相线) 五根霍尔信号线
整体关系:
BLDC电机控制器
┌───────────┐
│ │
│ MOS驱动 │
│ │
└───────────┘
│
┌───────┴────────┐
│ │
三相动力线 霍尔信号线
│ │
U V W 5V GND HA HB HC
│ │
▼ ▼
┌────────────────────────┐
│ │
│ 三相霍尔轮毂电机 │
│ │
│ U V W Hall │
│ │
└────────────────────────┘
动力线
电池
|
|
MOSFET三相桥
|
┌────┼────┐
│ │ │
U V W
|
电机
MOS管不断切换电流方向形成旋转磁场。
三相六步换相过程

┌───────┬────────────┬─────────────┐
│ 步骤 │ 导通相 │ Hall状态 │
├───────┼────────────┼─────────────┤
│ Step1 │ U+ → V- │ 001 │
│ Step2 │ U+ → W- │ 101 │
│ Step3 │ V+ → W- │ 100 │
│ Step4 │ V+ → U- │ 110 │
│ Step5 │ W+ → U- │ 010 │
│ Step6 │ W+ → V- │ 011 │
└───────┴────────────┴─────────────┘
霍尔在里面做什么?
控制器需要知道:转子现在在哪里?
否则不知道下一步给哪个绕组通电。
霍尔反馈:
读取Hall
↓
判断转子位置
↓
选择MOS管开关组合
↓
改变U/V/W电流方向
↓
产生旋转磁场
↓
转子跟随旋转
两轮差速 VS 四轮差速
| 两轮差速 | 四轮差速 | |
|---|---|---|
| 承重 | 较低 | 较高 |
| 结构刚度 | 一般 | 强 |
| 载货能力 | 几十kg | 几十~几百kg |
| 工业应用 | 少 | 多 |
四轮差速的RtabMap问题
四轮差速认为“车轮转了多少 = 车走了多少”;RTAB-Map认为“摄像头看到环境变化 = 车走了多少”。但是四轮差速转弯时,轮子会偷偷打滑,所以两个判断经常不一样。
四轮差速:像四个人穿着普通鞋搬桌子转弯
四轮:
前
O O
O O
假设向左转。
控制器说:
左边两个轮子慢
右边两个轮子快
于是希望:
左边走小圈
右边走大圈
但是问题来了:
所有轮子都是固定朝前的:
轮子方向:
↑ ↑
↑ ↑
可是转弯时,轮子的实际运动方向应该:
左前轮:
↖
右前轮:
↗
怎么办?
轮子不能拐方向。
只能:
一边滚
一边横着蹭地
这就是侧滑。
阿克曼底盘
- 问题1:不能原地旋转
- 问题2:低速灵活性差
- 问题3: 高速时需要转向机构
低速当然可以不用转向机构,这也是机器人行业常见方案;但随着重量增加,决定因素从“速度”变成了“轮胎侧向摩擦力”。300kg已经进入一个需要认真考虑底盘运动学的级别。
四轮全向
四轮全向并不是搭配 RTAB-Map 的最佳方案,甚至在很多情况下比四轮差速更难做 SLAM。
| 底盘 | 运动模型 | RTAB-Map难度 |
|---|---|---|
| 两轮差速 | 简单 | ★★★★★ |
| 四轮差速 | 中等 | ★★★★ |
| 阿克曼 | 准确 | ★★★★★ |
| 麦克纳姆全向 | 复杂 | ★★ |
| 四轮转向 | 复杂但准确 | ★★★★ |
基本结构
前
转向舵机/电机
|
↖ ↗
左前轮 右前轮
| |
驱动电机 驱动电机
| |
左后轮 右后轮
↙ ↘
|
转向舵机/电机
后
控制复杂度
你不能只控制轮子的转速,还必须同时控制每个轮子的方向,而且速度和方向必须满足车辆运动学约束。