2. 基础运动学模型:差速模型、全向模型、阿克曼模型在Nav2中的实现与参数配置
运动学模型,说白了就是告诉机器人「你该怎么动」。不同的底盘结构,运动方式天差地别。Nav2 里内置了三种最常见的模型:差速、全向、阿克曼。我这些年调试过的机器人,90% 都逃不出这三种。
2.1 差速模型:最常用的老朋友
差速模型,两个驱动轮加一个万向轮。控制量就两个:线速度 v 和角速度 ω。左右轮速度差产生旋转,这个大家应该都熟悉。
我在项目中遇到过一个问题:明明里程计校准了,机器人走直线还是歪。后来发现是轮距参数没设对。嗯,这里要注意,wheel_separation 这个参数直接影响角速度的解算精度。
核心参数配置(Nav2 中差速模型):
# 通常在 robot_base_controller 的 yaml 中
controller_frequency: 20.0
# 差速模型特有参数
wheel_separation: 0.35 # 左右轮中心距,单位米
wheel_radius: 0.075 # 轮子半径
max_linear_vel: 0.5 # 最大线速度 m/s
max_angular_vel: 1.0 # 最大角速度 rad/s
min_linear_vel: -0.3 # 允许后退
我的经验:wheel_separation 这个值,别光看图纸。实际测量一下轮子中心到中心的距离,误差超过 1cm 就会影响转弯精度。我曾经因为偷懒用了设计值,结果机器人转圈总是差几度。
2.2 全向模型:灵活但娇气
全向模型,说白了就是能「横着走」。三个全向轮呈 120° 分布,或者四个麦克纳姆轮。控制量变成了三个:vx(前后)、vy(左右)、ω(旋转)。
为什么说它娇气?因为全向轮对地面平整度要求极高。我调试过一个麦克纳姆轮机器人,在实验室地板上跑得飞起,一到车间就各种打滑。你想想看,小滚子稍微卡个石子,运动学解算就全乱了。
全向模型参数配置示例:
# 全向模型(麦克纳姆轮)
controller_frequency: 30.0 # 全向模型建议更高频率
# 运动学参数
wheel_radius: 0.05
wheel_separation_x: 0.25 # 前后轮距的一半
wheel_separation_y: 0.20 # 左右轮距的一半
# 速度限制
max_linear_vel_x: 0.8
max_linear_vel_y: 0.6 # 横向速度通常比纵向小
max_angular_vel: 0.8
避坑指南:我曾经在配置全向模型时,把 wheel_separation_x 和 wheel_separation_y 搞反了。结果机器人走斜线时严重偏离轨迹。记住:x 是前后方向,y 是左右方向,别搞混。
2.3 阿克曼模型:车规级转向
阿克曼模型,就是汽车那种转向方式。前轮转向,后轮驱动。控制量是 v(速度)和 δ(前轮转向角)。
这个模型有个硬伤:不能原地转弯。最小转弯半径由轴距 L 和最大转向角决定:R_min = L / tan(δ_max)。我调试过一台 1.2 米轴距的机器人,最小转弯半径接近 2 米,在窄走廊里简直要命。
阿克曼模型参数配置:
# 阿克曼模型
controller_frequency: 15.0 # 阿克曼频率可以低一些
# 车辆几何参数
wheel_base: 0.45 # 轴距,前轮到后轮距离
max_steering_angle: 0.52 # 最大转向角,约 30°
max_linear_vel: 1.0
max_angular_vel: 0.5 # 受限于转向角速度
# 转向控制
steering_angle_velocity: 0.3 # 转向电机最大转速 rad/s
我的习惯:阿克曼模型调试时,先测最小转弯半径。找个空地,让机器人以最大转向角转圈,用激光雷达或视觉测量实际半径。如果和理论值偏差超过 10%,检查一下 wheel_base 是不是量错了。
2.4 三种模型对比与选型建议
| 特性 | 差速模型 | 全向模型 | 阿克曼模型 |
|---|---|---|---|
| 自由度 | 2 (v, ω) | 3 (vx, vy, ω) | 2 (v, δ) |
| 横向移动 | ❌ 不能 | ✅ 可以 | ❌ 不能 |
| 原地转弯 | ✅ 可以 | ✅ 可以 | ❌ 不能 |
| 地面适应性 | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ |
| 控制精度 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 典型应用 | 室内配送、仓储 | 狭小空间、精密对接 | 园区物流、巡检 |
选型其实没那么复杂。室内平地、需要灵活转向的,差速模型最省心。空间特别窄、需要横着进出的,上全向模型。室外跑、要速度的,阿克曼是唯一选择。
重要提醒:Nav2 默认使用差速模型。如果你用的是全向或阿克曼底盘,记得在 controller_server 的 yaml 中显式指定模型类型。我见过有人用阿克曼底盘,却忘了改参数,结果控制器一直输出角速度指令,机器人原地打转。
好了,三种模型的基本原理和配置就这些。下一节我们深入讲讲里程计融合,那才是真正考验调试功夫的地方。