车辆运动学中经典模型,主要用于描述汽车转向时轮胎的运动关系,解决车辆非滑移转弯问题。
模型需要解决的问题
-
给定控制量(速度 v、前轮转角 δ),预测车辆未来位置与姿态;
-
提供适用于路径规划和控制的运动学基础(约束)。
模型成立的前提
-
车辆为四轮转向车辆,前轮转向、后轮驱动(前轮转角决定转弯半径);
-
车辆质点近似位于后轴中心,小车后轴中心作为参考点建模。(简化为质点模型)。
-
车辆在平面内运动,只考虑几何关系,不考虑动力学(无质量、无摩擦、无惯性);
以上前提成立的情况下,阿克曼模型就可以简化为单车模型,方便计算
根据单车模型的几何关系就可以求解出车辆的转向圆半径:
在geogebra中绘制出阿克曼模型如图
模型公式表达
-
v :车辆线速度(m/s)
-
θ :车辆航向角(车辆纵向轴与x轴夹角)
-
δ :前轮转角(车辆前轮相对于车辆纵向轴的转角)
-
L :车辆轴距(前后轮中心距离)
-
(x,y) :车辆质点位置坐标
由以上运动学方程离散时间:
其几何含义是:
给定时刻 k 的车辆状态 (xk,yk,θk)、车速 vk、前轮转角 δk,我们可以计算出下一个时刻 k+1 的车辆位姿 (xk+1,yk+1,θk+1)。
本质上,车辆沿着以后轴为圆心、曲率为 κ=Ltan(δk) 的圆弧轨迹行驶一段距离 vk⋅Δt。
当 Δt 足够小时,转向圆弧 c1 可被起点处的切线 l1 所近似,故我们采用直线近似圆弧运动,实现高效计算。
给定车辆的位姿和当前时刻的车速和前轮转角就可以求得下一时刻的车辆位姿:
代码表达
#include <cmath>
// 车辆状态结构体
struct VehicleState {
double x; // x 坐标
double y; // y 坐标
double theta; // 朝向角(弧度)
};
// 常量定义
const double kWheelBase = 2.5; // 轴距(单位:米)
// 车辆运动更新函数(直线近似圆弧)
VehicleState UpdateState(const VehicleState& state, double v, double delta, double dt) {
// 计算曲率:kappa = tan(delta) / L
double kappa = std::tan(delta) / kWheelBase;
// 如果曲率很小,近似为直线运动
double dx = v * dt * std::cos(state.theta);
double dy = v * dt * std::sin(state.theta);
double dtheta = v * dt * kappa;
return {
state.x + dx,
state.y + dy,
state.theta + dtheta
};
}
附录