1. 两轮差速驱动机器人运动学基础
差速驱动机器人作为移动机器人中最经典的结构之一,其运动控制的核心在于理解轮速(rpm)与整车运动(线速度v、角速度w)之间的数学关系。这种结构通过左右轮的速度差实现转向,具有机械简单、控制直接的特点,广泛应用于服务机器人、AGV小车等场景。
在实际工程中,我们常需要处理两类问题:
- 正运动学:已知左右轮转速(rpm),计算机器人本体的运动状态(v, w)
- 逆运动学:给定期望的机器人运动(v, w),解算出所需的左右轮转速
这两类问题的解算构成了差速机器人运动控制的基础框架。以一个典型的餐厅服务机器人为例,当它需要以0.5m/s的速度前进并左转时,控制系统需要准确计算出左右轮应有的转速,这个转换过程就是逆运动学的典型应用。
2. 运动学模型建立与参数定义
2.1 机器人几何参数
建立运动学模型前,需明确三个核心物理参数:
- 轮半径(r):驱动轮的实际半径,单位通常为米
- 轮距(L):左右驱动轮中心之间的距离
- 最大转速(N_max):电机在无负载情况下的最大转速(rpm)
以TurtleBot3 Burger型号为例:
- r = 0.033m
- L = 0.16m
- N_max = 61 rpm
这些参数会直接影响运动学方程的系数,必须在系统初始化时准确测量并配置。轮半径的测量建议采用周长法:在轮上做标记,滚动一周测量行进距离,除以2π得到半径。
2.2 转速单位转换
电机常用的转速单位rpm(转/分钟)需要转换为国际单位制:
code复制ω_rad = (2π * rpm) / 60 = rpm * π/30
其中ω_rad表示角速度(rad/s)。这个转换关系是衔接硬件层与控制层的关键。
3. 正运动学解算:从轮速到整车运动
3.1 基本运动学方程
正运动学解决"轮速→整车运动"的映射问题。对于两轮差速结构,存在如下基本关系:
code复制v = (v_r + v_l)/2
w = (v_r - v_l)/L
其中:
- v_r, v_l:右轮和左轮的线速度(m/s)
- v:机器人质心的前进速度
- w:机器人绕质心旋转的角速度
将轮速rpm转换为线速度:
code复制v_r = ω_r * r = (rpm_r * π/30) * r
v_l = ω_l * r = (rpm_l * π/30) * r
3.2 实现代码示例
python复制def forward_kinematics(rpm_r, rpm_l, r=0.033, L=0.16):
"""正运动学解算
参数:
rpm_r, rpm_l: 左右轮转速(rpm)
r: 轮半径(m)
L: 轮距(m)
返回:
v: 线速度(m/s)
w: 角速度(rad/s)
"""
# rpm转rad/s
omega_r = rpm_r * math.pi / 30
omega_l = rpm_l * math.pi / 30
# 计算轮线速度
v_r = omega_r * r
v_l = omega_l * r
# 计算机器人运动
v = (v_r + v_l) / 2
w = (v_r - v_l) / L
return v, w
3.3 特殊运动状态分析
-
纯直线运动:
- 条件:rpm_r = rpm_l
- 结果:w=0,机器人直线行驶
- 示例:rpm_r=rpm_l=30 → v≈0.103m/s, w=0
-
原地旋转:
- 条件:rpm_r = -rpm_l
- 结果:v=0,机器人绕中心旋转
- 示例:rpm_r=30, rpm_l=-30 → v=0, w≈0.648rad/s
-
弧线运动:
- 一般情况下的复合运动
- 转弯半径:R = v/w = L*(v_r+v_l)/(2*(v_r-v_l))
4. 逆运动学解算:从指令到轮速
4.1 基本逆运动学方程
逆运动学解决"期望运动→所需轮速"的问题,通过正运动学方程反推得到:
code复制v_r = v + w*L/2
v_l = v - w*L/2
转换为rpm指令:
code复制rpm_r = (v_r / r) * (30/π) = (v + w*L/2)/r * 30/π
rpm_l = (v_l / r) * (30/π) = (v - w*L/2)/r * 30/π
4.2 实现代码示例
python复制def inverse_kinematics(v, w, r=0.033, L=0.16):
"""逆运动学解算
参数:
v: 期望线速度(m/s)
w: 期望角速度(rad/s)
r: 轮半径(m)
L: 轮距(m)
返回:
rpm_r, rpm_l: 左右轮转速(rpm)
"""
# 计算轮线速度
v_r = v + w * L / 2
v_l = v - w * L / 2
# 转换为rpm
rpm_r = (v_r / r) * 30 / math.pi
rpm_l = (v_l / r) * 30 / math.pi
return rpm_r, rpm_l
4.3 运动指令限幅处理
实际系统中需要考虑电机性能限制:
python复制def clamp_rpm(rpm_r, rpm_l, max_rpm=61):
"""限制rpm不超过电机最大值"""
rpm_r = max(min(rpm_r, max_rpm), -max_rpm)
rpm_l = max(min(rpm_l, max_rpm), -max_rpm)
return rpm_r, rpm_l
5. 实际应用中的问题与解决方案
5.1 轮径不一致校准
由于制造误差,两轮实际直径可能存在微小差异,导致直线行驶时产生偏差。可通过实验法校准:
- 让机器人以相同rpm直线行驶固定时间t
- 测量实际偏移角度θ
- 计算修正系数:k = (L·θ)/(2·v·t)
- 在逆运动学中引入修正:
python复制rpm_l *= (1 + k) # 假设左轮较小
5.2 电机响应延迟处理
低端电机可能存在响应延迟,导致瞬时运动偏差。解决方法:
- 加入转速变化率限制(slew rate limiting)
- 使用二阶滤波器平滑rpm指令
- 在运动规划中考虑加速度约束
5.3 打滑检测与补偿
通过编码器反馈检测打滑:
python复制def detect_slip(current_rpm, target_rpm, threshold=0.2):
"""检测轮子打滑"""
return abs(current_rpm - target_rpm) > threshold * abs(target_rpm)
出现打滑时可采取的补偿策略:
- 降低目标速度
- 调整控制参数(如PID增益)
- 通知上层规划器重新规划路径
6. 运动控制集成实践
6.1 控制频率选择
建议控制频率:
- 底层电机控制:≥100Hz
- 运动解算层:50-100Hz
- 路径规划层:10-20Hz
高频控制可减少离散化带来的误差,但需考虑计算资源限制。
6.2 完整控制流程示例
python复制class DifferentialDriveController:
def __init__(self, r, L, max_rpm):
self.r = r # 轮半径
self.L = L # 轮距
self.max_rpm = max_rpm # 电机最大转速
def update(self, v_target, w_target, dt):
"""控制循环更新
参数:
v_target: 目标线速度(m/s)
w_target: 目标角速度(rad/s)
dt: 控制周期(s)
返回:
rpm_r, rpm_l: 左右轮指令转速
"""
# 逆运动学解算
rpm_r, rpm_l = inverse_kinematics(v_target, w_target, self.r, self.L)
# 转速限幅
rpm_r, rpm_l = clamp_rpm(rpm_r, rpm_l, self.max_rpm)
# 加入变化率限制(示例:最大500rpm/s变化)
max_delta = 500 * dt
self.last_rpm_r = clamp(rpm_r,
self.last_rpm_r - max_delta,
self.last_rpm_r + max_delta)
self.last_rpm_l = clamp(rpm_l,
self.last_rpm_l - max_delta,
self.last_rpm_l + max_delta)
return self.last_rpm_r, self.last_rpm_l
6.3 与导航栈的接口设计
当集成到ROS等机器人框架时,典型接口包括:
- 输入:
cmd_vel话题(包含v, w) - 输出:电机控制指令(可通过
/joint_states反馈) - 参数服务器配置:轮径、轮距等机械参数
建议实现一个独立的运动解算节点,将高层指令转换为底层控制指令。
7. 进阶话题:运动学模型的扩展
7.1 考虑轮子滑移的改进模型
更精确的模型需考虑纵向滑移率s和侧向滑移角α:
code复制v_r = r·ω_r·(1-s_r) / cos(α_r)
v_l = r·ω_l·(1-s_l) / cos(α_l)
其中滑移参数可通过实验或观测器估计得到。
7.2 非对称结构的处理
当机器人重心不在几何中心时,需引入偏移量d:
code复制v = (v_r + v_l)/2
w = (v_r - v_l)/(L + 2d)
7.3 全向移动平台的扩展
对于麦克纳姆轮或全向轮结构,运动学方程扩展为:
code复制[v_x; v_y; w] = J · [ω_1; ω_2; ω_3; ω_4]
其中J为雅可比矩阵,取决于轮子布局方式。