ESC
输入关键词搜索文章标题和内容

vehicle_kinematics_dynamics_model

机器人、汽车运动学与动力学模型选型指南(运动学 + 动力学 + 行业落地)

这里说的"模型"不是AI大模型,是车辆、机器人的运动学与动力学数学模型。搞机器人、自动驾驶,第一件事不是写代码,是选模型——选错了,后面的控制算法全是白做。从差速小车到高速NOA,从两轮自行车到7自由度动力学,全讲一遍。别再拿运动学模型去跑高速了。


一、为什么需要模型?不建模行不行?

先看三个场景:

  1. 路径规划:规划模块要算"从当前位置到目标点,方向盘打多少度、油门踩多深"。没有模型,这就算不出来。
  2. 轨迹跟踪控制:MPC(模型预测控制)需要预测"我打了这个方向盘角度,0.5 秒后车会在哪"。没有模型,预测就是瞎猜。
  3. 运动预测:自动驾驶要预测周围车辆未来 3 秒的轨迹。没有模型,就只能假设别人匀速直线——这在弯道里完全不靠谱。
flowchart TB A(["车辆模型"]) --> B["规划层"] A --> C["控制层"] A --> D["预测层"] B --> B1["路径规划:从A到B怎么走"] B --> B2["轨迹生成:方向盘角度序列"] C --> C1["MPC预测:打了方向后车在哪"] C --> C2["LQR/MPC反馈:纠偏量"] D --> D1["周围车辆轨迹预测"] D --> D2["运动可行性判断"] style A fill:#FFEBEE,stroke:#D32F2F style B fill:#E3F2FD,stroke:#1976D2 style B1 fill:#E3F2FD,stroke:#1976D2 style B2 fill:#E3F2FD,stroke:#1976D2 style C fill:#FFF8E1,stroke:#F57C00 style C1 fill:#FFF8E1,stroke:#F57C00 style C2 fill:#FFF8E1,stroke:#F57C00 style D fill:#E8F5E9,stroke:#388E3C style D1 fill:#E8F5E9,stroke:#388E3C style D2 fill:#E8F5E9,stroke:#388E3C

主流开源项目用的是什么模型?

项目 模型 用途
百度 Apollo 2 自由度动力学自行车模型 + 线性轮胎模型 LQR / MPC 横向控制
Autoware (TIER IV) 运动学自行车模型 位姿推算、仿真
openpilot (comma.ai) 纵向 3 阶动力学模型(位置→速度→加速度→加加速度) 纵向 MPC 控制
ROS2 Nav2 差速/全向/阿克曼运动学模型 机器人路径规划+控制
Carla_iLQR_MPC (295 stars) 动力学自行车模型 + 系统辨识 iLQR 轨迹跟踪
Multi-Purpose-MPC (278 stars) 空间自行车模型(非线性) 路径跟踪 + 避障

模型选错了什么后果?Carla 上实测过:用运动学自行车模型做高速(25 m/s)紧急变道,车辆直接冲出车道;换成混合扩展自行车模型(加了侧偏角预测),同样的控制器,轨迹误差从米级降到厘米级。


二、机器人、汽车怎么分类?各自用什么模型?

先看你研究的东西长什么样,再决定用什么模型。

flowchart TB A(["移动平台分类"]) --> B["轮式机器人"] A --> C["汽车"] A --> D["腿足机器人"] A --> E["无人机 / 水下"] B --> B1["差速驱动<br/>扫地机、AGV"] B --> B2["阿克曼转向<br/>无人配送车"] B --> B3["全向轮/麦克纳姆轮<br/>仓储机器人"] B --> B4["履带式<br/>侦察、排爆"] C --> C1["前轮转向<br/>家用车、L2辅助驾驶"] C --> C2["四轮转向<br/>高端电车、特种车辆"] D --> D1["双足<br/>人形机器人"] D --> D2["四足<br/>机器狗"] E --> E1["四旋翼/固定翼"] E --> E2["水下航行器"] style A fill:#F3E5F5,stroke:#7B1FA2 style B fill:#E8F5E9,stroke:#388E3C style B1 fill:#E8F5E9,stroke:#388E3C style B2 fill:#E8F5E9,stroke:#388E3C style B3 fill:#E8F5E9,stroke:#388E3C style B4 fill:#E8F5E9,stroke:#388E3C style C fill:#E3F2FD,stroke:#1976D2 style C1 fill:#E3F2FD,stroke:#1976D2 style C2 fill:#E3F2FD,stroke:#1976D2 style D fill:#FFF8E1,stroke:#F57C00 style D1 fill:#FFF8E1,stroke:#F57C00 style D2 fill:#FFF8E1,stroke:#F57C00 style E fill:#FFEBEE,stroke:#D32F2F style E1 fill:#FFEBEE,stroke:#D32F2F style E2 fill:#FFEBEE,stroke:#D32F2F

每种平台对应什么模型?

平台类型 运动学模型 动力学模型 说明
扫地机(差速) 差速小车模型 一般不需要 低速,不打滑,运动学够用
仓储AGV(全向轮) 全向运动学模型 不需要 全向轮无侧滑约束,运动学即完整描述
无人配送车(阿克曼) 四轮阿克曼 / 自行车 不需要(低速) < 30 km/h 运动学够用
家用车(L2 辅助驾驶) 不适用(高速) 2 自由度动力学自行车 高速必须算轮胎侧偏
高速 NOA(L2+) 不适用 2 自由度动力学 横向+纵向解耦控制
四驱电车(扭矩分配) 不适用 7 自由度动力学 离线仿真,不上实车
机器狗(四足) 不适用 整机动力学 + 足端力控 需要腿足动力学,这里不展开
无人机 不适用 6 自由度刚体动力学 推力+力矩控制
底盘研发 不适用 多体仿真 悬挂、转向全复刻

下面重点讲轮式机器人和汽车的运动学/动力学模型。腿足、无人机模型这里不展开。

复杂平台(如轮式人形机器人)底盘和手臂的运动学是耦合的,需要合并成全身运动学方程统一求解,不能分开建模。江南大学李宽宽的论文中有详细推导。


三、两大类模型

flowchart TB START(["模型选型"]) --> Q1{"平台类型?"} subgraph 运动学["运动学模型:几何路线 · 忽略侧偏 · 无惯性"] direction TB KIN_DIFF["差速 / 全向轮 机器人<br/>运动学即完整描述"] KIN_LOW["阿克曼 / 汽车 低速<br/>≤ 30 km/h · 泊车/导航"] end subgraph 动力学["动力学模型:轮胎侧偏 · 离心力 · 惯性效应"] direction TB DYN_HIGH["阿克曼 / 汽车 高速<br/>> 30 km/h · 过弯/车道保持"] end Q1 -->|"差速/全向轮"| KIN_DIFF Q1 -->|"阿克曼/汽车"| Q2{"车速 > 30 km/h?"} Q2 -->|"否"| KIN_LOW Q2 -->|"是"| DYN_HIGH style START fill:#F3E5F5,stroke:#7B1FA2 style Q1 fill:#FFF8E1,stroke:#F57C00 style Q2 fill:#FFF8E1,stroke:#F57C00 style 运动学 fill:#E8F5E9,stroke:#388E3C style 动力学 fill:#FFEBEE,stroke:#D32F2F

运动学模型:只看怎么走——几何路线,纯数学。轮胎永远不打滑,没有质量,没有惯性。说白了就是"画线"。差速轮机器人、全向轮AGV,不管跑多快,运动学模型就是它的完整描述——因为它根本没有转向机构,不存在侧偏问题。

动力学模型:把轮胎侧偏、离心力、车速惯性全算进去。不是质点,有重量、有速度、转弯时外侧轮胎吃更多力。汽车和带阿克曼转向的机器人,速度上来后必须换动力学模型。

汽车的速度分水岭在 30~40 km/h——低于这个速度,轮胎侧偏角 < 2°,运动学模型误差 < 3%;超过这个速度,侧偏角迅速增大,误差从厘米级跳到米级。差速机器人没有这个分水岭——它压根没有侧偏角这个概念,运动学模型就是它的全部。


四、运动学模型详解(低速专用)

运动学模型的核心假设:轮胎和地面之间没有滑动。所有车轮绕着同一个圆心转,纯滚动。

4.1 差速小车模型

flowchart LR A(["差速驱动"]) --> B["左轮转速 ωL"] A --> C["右轮转速 ωR"] B --> D{"ωL = ωR ?"} C --> D D -->|"是"| E["直行"] D -->|"否"| F["转弯"] F --> G["ωL > ωR:右转"] F --> H["ωL < ωR:左转"] style A fill:#F3E5F5,stroke:#7B1FA2 style B fill:#F3E5F5,stroke:#7B1FA2 style C fill:#F3E5F5,stroke:#7B1FA2 style D fill:#FFF8E1,stroke:#F57C00 style E fill:#E8F5E9,stroke:#388E3C style F fill:#FFF8E1,stroke:#F57C00 style G fill:#E3F2FD,stroke:#1976D2 style H fill:#E3F2FD,stroke:#1976D2

没有转向机构,没有前轮转角。靠左右轮子快慢差来拐弯——左轮比右轮快就右转,反过来就左转。全程硬磨轮胎。

只用在:扫地机器人、仓储AGV、小型轮式机器人。家用汽车不用这个,轮胎磨不起。

4.2 两轮自行车模型(最常用简化版)

把汽车左右前轮合成一个虚拟前轮,左右后轮合成一个虚拟后轮,车身等效为一辆自行车。只用一个前轮转角 δ 就能算出整车的运动轨迹。

优点 缺点
计算量极小,一个转角参数搞定 看不出四个车轮各自的轨迹
适合实时路径规划和导航 无法判断车身宽度是否擦碰障碍物
高速场景下也能用作预测模型的骨架 忽略了左右轮差速

用途:导航路径规划、高速车道级路线预测。L2+ 辅助驾驶的规划模块底层都用这个模型。Autoware 的仿真器(scenario_simulator_v2)直接用自行车运动学模型做位姿推算。

自行车模型的关键公式就一个:转向半径 R = L / tan(δ),L 是轴距,δ 是前轮转角。轴距越长、转角越小,转弯半径越大。

4.3 四轮阿克曼模型

真实还原四个车轮的独立运动。转弯时,内侧前轮转得比外侧前轮更大,四个轮子绕着同一个圆心纯滚动,不磨胎。

flowchart TB A(["四轮阿克曼转向"]) --> B["内侧前轮转角 δi"] A --> C["外侧前轮转角 δo"] B --> D["δi > δo"] C --> D D --> E["四个轮子绕同一圆心"] E --> F["纯滚动,不磨胎"] E --> G["可计算每个车轮轨迹"] G --> H["自动泊车"] G --> I["倒车轨迹线"] G --> J["窄路转弯判断"] style A fill:#F3E5F5,stroke:#7B1FA2 style B fill:#F3E5F5,stroke:#7B1FA2 style C fill:#F3E5F5,stroke:#7B1FA2 style D fill:#FFF8E1,stroke:#F57C00 style E fill:#E3F2FD,stroke:#1976D2 style F fill:#E8F5E9,stroke:#388E3C style G fill:#E3F2FD,stroke:#1976D2 style H fill:#E8F5E9,stroke:#388E3C style I fill:#E8F5E9,stroke:#388E3C style J fill:#E8F5E9,stroke:#388E3C
优点 缺点
四个车轮各自轨迹全知道 比自行车模型多算几个参数
能算车身宽度够不够过窄路 低速场景才准
倒车蹭不蹭路牙一眼就知道

用途:自动泊车、车轮轨迹线可视化、窄路转弯辅助。车机上看到的"倒车轨迹线"就是阿克曼模型算出来的。

阿克曼的核心公式:cot(δo) - cot(δi) = 轮距 / 轴距。轮距越宽、轴距越短,内外轮转角差越大。


五、动力学模型详解(高速专用)

运动学模型有 5 个隐藏假设,速度一上来全崩:

  1. 低速假设(< 5 m/s ≈ 18 km/h):模型默认轮胎横向力可以忽略
  2. 无滑移假设:轮胎速度方向与车轮平面一致(侧偏角 ≡ 0)
  3. 刚性车身假设:忽略悬挂带来的姿态变化
  4. 瞬时转向中心假设:前后轮转向延长线总有完美交点
  5. 阿克曼几何近似:把复杂转向几何简化为单轮等效

动力学模型把这些假设一个个拆掉,把轮胎侧偏、惯性效应全算进去。

flowchart TB A(["动力学模型"]) --> B["2 自由度<br/>两轮自行车"] A --> C["7 自由度<br/>四轮独立"] A --> D["多体仿真<br/>全底盘"] B --> B1["轮胎侧偏刚度"] B --> B2["离心力"] B --> B3["横摆角速度"] B --> B4["L2 辅助驾驶标配"] C --> C1["四轮独立抓地力"] C --> C2["四驱扭矩分配"] C --> C3["离线仿真"] D --> D1["悬挂几何"] D --> D2["转向拉杆"] D --> D3["减震特性"] D --> D4["不上车,仅研发用"] style A fill:#FFEBEE,stroke:#D32F2F style B fill:#E3F2FD,stroke:#1976D2 style B1 fill:#E3F2FD,stroke:#1976D2 style B2 fill:#E3F2FD,stroke:#1976D2 style B3 fill:#E3F2FD,stroke:#1976D2 style B4 fill:#E3F2FD,stroke:#1976D2 style C fill:#FFF8E1,stroke:#F57C00 style C1 fill:#FFF8E1,stroke:#F57C00 style C2 fill:#FFF8E1,stroke:#F57C00 style C3 fill:#FFF8E1,stroke:#F57C00 style D fill:#F3E5F5,stroke:#7B1FA2 style D1 fill:#F3E5F5,stroke:#7B1FA2 style D2 fill:#F3E5F5,stroke:#7B1FA2 style D3 fill:#F3E5F5,stroke:#7B1FA2 style D4 fill:#F3E5F5,stroke:#7B1FA2

5.1 2 自由度动力学自行车模型(行业标配)

在两轮自行车模型的基础上,加两个东西:

  1. 轮胎侧偏刚度:轮胎不是刚体,过弯时会侧向变形,产生侧偏角。侧偏角 × 侧偏刚度 = 侧向力。
  2. 横摆角速度:车身绕垂直轴的旋转速度,用来描述推头(转向不足)和甩尾(过度转向)。

有了这两个参数,模型就能模拟高速过弯时车子的真实反应——方向盘打多了会不会甩尾,打少了会不会推头。

百度 Apollo 的 LQR 和 MPC 横向控制,底层全是这个模型。 状态向量包含横向误差、航向角误差、横向速度误差、横摆角速度误差四个量,控制输入是前轮转角。轮胎侧偏刚度从实车标定获取,不能随便填。

2 自由度 = 横向位移 + 横摆角。纵向速度当外部输入,不参与状态估计。

5.2 7 自由度四轮动力学

把四个车轮拆开,每个轮子单独建模。能控制每个轮的抓地力制动力驱动力分配

适用场景 说明
四驱电车扭矩分配 前后轴、左右轮扭矩怎么分
极限操控仿真 漂移、冰雪路面、紧急变道
底盘标定参考 给实车标定提供理论值

不上车。7 自由度算力太大,实车控制器跑不动,只在电脑上做离线仿真和标定参考。

5.3 多体仿真模型

精细到悬挂几何、转向拉杆、减震器阻尼曲线、衬套刚度。完全复刻真实底盘的每一个零件。

只在车企研发部门用——底盘结构设计、悬挂调校、碰撞仿真。算力要求极高,根本装不到车上。


六、行业落地:不同场景选什么模型

机器人 + 汽车低速场景(运动学模型)

flowchart TB subgraph 机器人["机器人场景"] direction TB R1["扫地机导航"] --> M1["差速小车<br/>运动学"] R2["仓储AGV全向移动"] --> M2["全向运动学"] R3["无人配送车(低速)"] --> M3["阿克曼/自行车<br/>运动学"] end subgraph 汽车低速["汽车低速场景"] direction TB C1["导航 / 路径规划"] --> M4["两轮自行车<br/>运动学"] C2["自动泊车 / 轨迹线"] --> M5["四轮阿克曼<br/>运动学"] end style 机器人 fill:#E8F5E9,stroke:#388E3C style 汽车低速 fill:#E8F5E9,stroke:#388E3C style M1 fill:#E8F5E9,stroke:#388E3C style M2 fill:#E8F5E9,stroke:#388E3C style M3 fill:#E8F5E9,stroke:#388E3C style M4 fill:#E8F5E9,stroke:#388E3C style M5 fill:#E8F5E9,stroke:#388E3C

汽车高速 + 研发场景(动力学模型)

flowchart TB subgraph 汽车高速["汽车高速场景"] direction TB H1["车道保持 / ACC"] --> M6["2自由度<br/>动力学自行车"] H2["高速 NOA 横纵向控制"] --> M6 H3["紧急避障 / AEB"] --> M6 end subgraph 研发["研发场景"] direction TB D1["四驱扭矩分配"] --> M7["7自由度<br/>四轮动力学"] D2["底盘结构设计"] --> M8["多体仿真"] D3["悬挂调校"] --> M8 end style 汽车高速 fill:#E3F2FD,stroke:#1976D2 style 研发 fill:#F3E5F5,stroke:#7B1FA2 style M6 fill:#E3F2FD,stroke:#1976D2 style M7 fill:#FFF8E1,stroke:#F57C00 style M8 fill:#F3E5F5,stroke:#7B1FA2
场景 推荐模型 复杂度 上实车/机器人 开源参考
扫地机定位导航 差速小车运动学 Nav2 dwb_controllermotion_model: DiffDrive
仓储AGV全向移动 全向运动学 Nav2 nav2_mppi_controllermotion_model: Omni
无人配送车(低速) 阿克曼/自行车运动学 Autoware 仿真器
汽车导航路径规划 两轮自行车运动学 Autoware 仿真器
高速车道保持 / ACC 2 自由度动力学 Apollo LQR
高速 NOA 横纵控制 2 自由度动力学 Apollo MPC
自动泊车 / 轨迹线 四轮阿克曼运动学
电车四驱扭矩分配 7 自由度动力学 否(离线)
底盘结构设计 / 调校 多体仿真 极高 否(研发)

多 AGV 协同场景中,运动模型的选择直接影响路径规划和冲突避免的效率。差速模型可以原地转向,全向模型可以横向平移,两者在窄通道里的避让策略完全不同。张增的研究里,改进 CBS 算法做多 AGV 路径规划时,第一步就是明确每台 AGV 的运动学模型——模型类型不同,冲突检测的约束条件也不一样。


七、研究选型速查

你要做什么研究 选哪个模型 理由
路径规划 两轮自行车运动学 一个转角搞定,算得快
低速轨迹跟踪(< 20 km/h) 两轮自行车运动学 误差可接受,计算量小
高速轨迹跟踪(> 30 km/h) 2 自由度动力学 轮胎侧偏必须算进去
自动泊车、轨迹线可视化 四轮阿克曼运动学 四个轮子各自轨迹,倒车不蹭
扫地机器人定位导航 差速小车运动学 结构最简单,ROS 自带
仓储AGV全向移动 全向运动学 麦克纳姆轮无侧滑约束
MPC 控制算法研究 2 自由度动力学 Apollo 标准用法,可复现
系统辨识 + 控制 动力学自行车 + 辨识 Carla_iLQR_MPC 的套路
四驱扭矩分配仿真 7 自由度动力学 四轮独立,离线跑
底盘结构设计 多体仿真 悬挂转向全复刻

记住:低速画线用运动学,高速控制用动力学,底盘研发用多体。别拿自行车模型去做泊车,也别拿阿克曼去跑高速——模型选错了,后面的控制算法全是白做。


八、工程落地要点

几个典型问题,记录下来供参考。

1:高速场景用了运动学模型

运动学模型默认轮胎不打滑。实际过弯时侧偏严重,控制器输出和实际响应差一大截,LKA 跑着跑着就画龙。

某园区自动驾驶项目,直角弯总是"切西瓜"。排查发现速度过 30 km/h 后,运动学模型预测误差从 5 cm 跳到 50 cm。换成动力学模型,解决。

运动学模型在 15 km/h 以下误差 < 3%,30 km/h 以上迅速放大。弯道控制失效,第一件事先看模型选对没有。

2:泊车用了自行车模型

自行车模型只算一个虚拟轮的轨迹,看不到四个车轮各自走哪。倒车时左后轮蹭路牙了,模型根本不知道。

3:动力学模型参数随便填

侧偏刚度、转动惯量,要么从轮胎厂拿数据,要么自己标定。随便填个值,精度还不如运动学模型。Apollo 是先跑系统辨识拿初始值,再上实车微调。

4:阿克曼模型轴距量错了

轴距差 5 cm,泊车轨迹线偏移十几厘米。倒车影像里的轨迹线不准,多半是轴距参数没填对。

5:线性轮胎模型用在不该用的工况

线性轮胎模型(侧偏力 = 侧偏刚度 × 侧偏角)只在侧偏角 < 5° 时管用。急转弯、漂移,侧偏角一过 5°,线性模型就崩了。这种工况得上 Pacejka 魔术公式等非线性模型。

6:拿神经网络直接替代物理模型

有人在 Carla 上试过:拿全连接网络直接拟合车辆动力学,没有物理先验,长期预测漂得厉害,也不保证运动学可行性。正确的用法是 hybrid——物理模型做骨架,网络只拟合残差。Carla_iLQR_MPC 就是这么干的。

7:差速轮底盘配了阿克曼模型

差速轮底盘没有转向机构,靠左右轮速差原地转向。用了阿克曼模型做路径规划——阿克曼强制最小转弯半径,差速轮可以原地转。实际轨迹与规划偏差 > 15 cm,窄通道里直接卡死。

Nav2 里的做法:nav2_mppi_controller 配置里指定 motion_modelDiffDrive。模型类型和底盘不一致,角速度指令就是错的。

8:全向轮 AGV 配了差速模型

麦克纳姆轮可以横向平移,差速模型做不到。仓库里 AGV 本来能横着进窄巷道,用了差速模型,控制器只会原地转圈再前进,效率直接腰斩。

Nav2 的 nav2_mppi_controller 支持 motion_model: Omni,需要显式指定,默认是 DiffDrive

9:机器人里程计融合时传感器配置不当

ROS2 的 robot_localization 包做 EKF 融合时,odom0_config 是一个 15 位的布尔向量,控制哪些状态量参与融合。差速底盘如果配置了全向模式的融合向量(比如把 Y 方向速度也 fuse 了),EKF 会以为你的机器人能横向漂移,融合出来的位姿一直偏。排查这类问题,先打印 odom0_config 向量,确认只开启了差速底盘实际能产生的运动分量。

轮式人形机器人(底盘+手臂)这类复杂平台,底盘运动学和手臂运动学是耦合的——底盘移动会改变手臂末端位置,手臂摆动也会影响底盘重心。江南大学李宽宽的论文里,把底盘运动学和手臂运动学合并成全身运动学方程,再用 CBF+QP 或 MPC 统一求解。如果简单地把底盘和手臂分开控制,碰撞检测和轨迹精度都会出问题。

返回首页