参考文献:
【1】Rajamani R. Vehicle Dynamics and Control[M]. Springer Science, 2006.
【2】https://blog.csdn.net/u013914471/article/details/82968608
1 . 单车模型(bicycle model)
假设条件:
- 假设车辆只有前后两个轮A和B,C为车辆质心;
- 车辆运动只考虑平面运动,不考虑Z方向的影响,如车辆颠簸等 ;
- 车辆低速运动,此时不需要考虑滑移角的影响,书中的原话是“This is a reasonable assumption for low speed motion of the vehicle (for example, for speeds less than 5 mls). At low speeds, the lateral force generated by the tires is small 。”
在上述假设前提下,下图中的各参数说明如下:
- δr 和 δf : 分别表示后轮和前轮相对车辆纵轴的转角,由方向盘决定。通常情况下车辆只依靠前轮进行转向操作,因此实际应用中 δr = 0 ;
- C为车辆质心位置,到前后轮胎A和B的距离为lf 和 lr , 质心C的线速度矢量表示为V,方向β表示与车身纵轴的夹角,ψ表示车身纵轴与X轴的夹角。注意:这里的X轴指的是你设定的正前方方向,这里的β指的就是假设条件里面的滑移角,低速情况下通常β值很小,也可以忽略为0;
- O为A、B、C三点(也就是车体)的瞬时旋转中心;
数学模型推导(以下公式都是针对质心C进行推导):
- △OCA 和△OCB由正弦定理得:
- 二者联立,可以得到:
- 根据V = RW 可得质心C(即车体)的角速度为:
- 最终得到车辆的状态方程为:
* 注意,这里的X、Y、ψ均带有“·” ,指归一化后的单位时间内的变化量,实际应用需要乘△t 。
2. 阿克曼转向几何(Ackerman turning geometry)
单车模型简化了汽车的前后轮胎,实际中汽车前后均有两个轮胎,如下:
对于汽车前面的两个轮胎来说,实际转角是不同的。阿克曼转向几何(Ackerman Turning Geometry)是一种为了解决交通工具转弯时,内外转向轮路径指向的圆心不同的几何学。在单车模型中,将转向时左/右前轮偏角假设为同一角度,虽然通常两个角度大致相等,但实际并不是,通常情况下,内侧轮胎转角更大。这部分我就不再推导了,文献【2】中写的很清楚。
3. 仿真实现
根据上述原理,基于C++和opencv建立了系统仿真模型,可以根据输入的车辆信息实现对车辆模型的控制。仿真模型假设图像的x方向为车辆的前行方向,能够通过'w'/'s'/'a'/'d'/'b'/' '/'c'等按键实现对车体的速度、转向、减速等控制。
车辆状态信息:
struct VehicleInfo
{
cv::Point2d location[5]; // lt rt lb rb c
double R[2]; // 质心R 和 右后轮R
cv::Size vehSize; // 车身尺寸
double acceleration = 0; // 车辆加速度
double delta_t = 1; // 时间间隔
double speed = 0; // 车速
double delta_f = 0; // 前轮和车身的夹角
double w = 0; // 车辆角速度
double yaw_angle = 0; // 偏航角,相对图像坐标系下的x轴
double beta = 0; // 滑移角
double Lw = 99.5; // pixel 轮距
double L = 188.6; // pixel 轴距
bool brake = true; // 刹车 true : speed = 0;
}vehInfo;
效果展示: