文章目录
参考资料
模型的用处就是在当前状态给定某控制输入时,预测(估计) 系统未来的状态。控制领域利用模型设计合适的输入,以期控制系统到达目标状态。
1. 以车辆重心为中心的单车运动学模型
1.1 参数说明
一般考虑运动学模型时,将车辆模型简化成单车模型(bicycle model)。
单车模型中:
-
左右轮等效为单个轮子
左右前轮合并为单个轮子,其中心点为A点,同样后轮等效后的中心点为 B点。 -
转向角
前后轮的转向角用和表示,模型中前后轮都可以转向,对于只有前轮转向的系统,后轮转向角可以设置为0. -
重心
点 C 代表车辆的重心, A 点和 B点到重心的距离分别用 和 表示,轴距表示为。 -
速度
车辆重心的速度用表示,与车辆纵向轴的夹角为,该角度叫做车辆的滑移角。 -
运动描述
假设车辆平动,车辆运动状态可以用三个坐标量描述: 、 和 。其中代表车辆的位置,描述的是航向角(Heading Angle),指车身与X轴的夹角。 -
条件假设
假设速度矢量的方向在点点和点的方向与转向角的方向相同,换句话说,在A点的速度矢量与车辆纵轴的夹角为 ,同样 点的速度矢量与车辆纵轴的夹角为。也就是说前后轮的滑移角都为0。该条件假设成立前提的是车辆速度很低(<5m/s),此时轮胎产生的横向力很小,可以忽略。 -
轨迹半径
点 代表车辆的瞬时旋转中心,线段 与与前后两个转轮方向垂直,他们的交点即为 点,线段的长度代表车辆的轨迹半径。 -
航迹角
车辆重心处的速度垂直于 ,车辆速度矢量与车辆纵轴的夹角为,车辆的航向角为 ,则航迹角为。
1.2 几何关系
1.2.1 偏航角的关系
如上图所示,在三角形中,根据正弦定理,有:
在三角形中,根据正弦定理,有:
展开公式(1)(2)可得:
等式(3)两边同时乘 得
同理,等式(4)两边同时乘 得
联立公式(5)(6)可得:
根据条件假设,低速环境下,车辆行驶路径的转弯半径变化缓慢,此时我们可以假设车辆偏航角的变化率率可近似等于车辆的角速度。根据车辆角速度得
将公式(8)带入公式(7)中,消除 项得
1.2.1 滑移角 的关系
等式(5)乘以 得
等式(6)乘以 得
等式(10)和(11)相减得
等式(12)两端同时乘以 得
故取反三角函数得
1.2.2 运动学模型
根据上图,很容易得到方向的速度为
综上,以车辆重心为中心的运动学模型为
其中,
1.3 python 实现
class KinematicModel_1:
"""假设控制量为前后轮的转向角delta_f,delta_r和加速度a
"""
def __init__(self, x, y, psi, v, l_r, l_f, dt):
self.x = x
self.y = y
self.psi = psi
self.v = v
self.l_f = l_f
self.l_r = l_r
# 实现是离散的模型
self.dt = dt
def update_state(self, a, delta_f,delta_r):
beta = math.atan((self.l_r*math.tan(delta_f)+self.l_f*math.tan(delta_r))/(self.l_f+self.l_r))
self.x = self.x+self.v*math.cos(self.psi+beta)*self.dt
self.y = self.y+self.v*math.sin(self.psi+beta)*self.dt
self.psi = self.psi+self.v*math.cos(beta)*(math.tan(delta_f)-math.tan(delta_r))/(self.l_f+self.l_r)*self.dt
self.v = self.v+a*self.dt
def get_state(self):
return self.x, self.y, self.psi, self.v
2. 以前轮驱动的单车运动学模型
2.1 几何关系
由于绝大多数的汽车后轮都不能够偏转,所以在单车模型基础上,我们假定后轮的转角控制输入,即车辆为前轮驱动(front−wheel−only)。也就是说,方向盘上的控制输入,都反映到了前轮的转角上了,即认为方向盘的转角就等于前轮的转角。
注意:这里依旧以车辆重心为中心。
在直角三角形中,易得
将公式(8)代入公式(17)得
故前轮驱动的车辆运动学模型为
其中,的推导方式与前文一致(可直接令公式(14)的),可得
2.2 python实现
class KinematicModel_2:
"""假设控制量为前轮的转向角delta_f和加速度a
"""
def __init__(self, x, y, psi,v,l_r,l_f,dt):
self.x = x
self.y = y
self.psi = psi
self.v = v
self.l_f = l_f
self.l_r = l_r
# 实现是离散的模型
self.dt=dt
def update_state(self,a,delta_f):
beta = math.atan((self.l_r)/(self.l_f+self.l_r)*math.tan(delta_f))
self.x = self.x+self.v*math.cos(self.psi+beta)*self.dt
self.y = self.y+self.v*math.sin(self.psi+beta)*self.dt
self.psi = self.psi+self.v*math.sin(beta)/self.l_r*self.dt
self.v = self.v+a*self.dt
def get_state(self):
return self.x, self.y, self.psi, self.v
3. 以后轴中心为车辆中心的单车运动学模型
3.1 几何关系
在直角三角形中,显然有
联立公式(7),可得:
另外,根据几何关系,显然有
因此,以后轴中心为车辆中心的运动学模型为
如果使用车辆的加速度作为 控制,则再加上下面这个公式即可
但在无人车控制过程中,一般控制对象 ,则式(22)可写为:
速度 的控制主要通过刹车 (brake) 、油门 (throttle) 、档位 (gear) 等来控制,横摆角速度 主要通过转动方向盘 (steer) 来 控制。
3.2 python实现
class KinematicModel_3:
"""假设控制量为转向角delta_f和加速度a
"""
def __init__(self, x, y, psi,v,L,dt):
self.x = x
self.y = y
self.psi = psi
self.v = v
self.L = L
# 实现是离散的模型
self.dt=dt
def update_state(self,a,delta_f):
self.x = self.x+self.v*math.cos(self.psi)*self.dt
self.y = self.y+self.v*math.sin(self.psi)*self.dt
self.psi = self.psi+self.v/self.L*math.tan(delta_f)*self.dt
self.v = self.v+a*self.dt
def get_state(self):
return self.x, self.y, self.psi, self.v
所有实现代码欢迎访问我的github仓库,正在持续更新中~~
4. 阿克曼转向几何
汽车采用阿克曼转向轮。阿克曼转向几何(Ackerman Turning Geometry)是一种为了解决交通工具转弯时,内外转向轮路径指向的圆心不同的几何学。
在单车模型中,将转向时左、右前轮偏角假设为同一角度,虽然通常两个角度大致相等,但实际并不是,通常情况下,内侧轮胎转角更大。如下图所示。
和 分别为外侧前轮和内侧前轮偏角,当车辆左转时,左前轮胎为内侧轮胎,其转角 较 右前轮胎转角 更大。 为轮距, 为轴距,远远小于轨迹半径,滑移角接近于0。一般车辆模型后轴为固定轴,故后轮两轮胎转角为 ,即为0 。
当以后轴中心为参考点时,则为转向半径R。
当滑移角很小时,且后轮偏角为0时,公式(9)可近似为
由于 很小
根据公式(8)和公式(24)得
故不区分前后轴,等效转向角为
由于内外轮的转弯半径不同,根据公式(27), 外轮转角为
内轮转角为
故前轮平均转向角为
由于 项中, 远远小于 , 且 的二次项更小,故
所以等式(30)可以近似为
比较等式(28)和(29)知, 始终大于 ,故
根据公式(33)可知,前轮内外转向角的差值接近于平均转向角的二次方,所以当前轮转向角较大时, 内外轮的转向角误差就越大。
依据阿克曼转向几何设计的车辆,沿着弯道转弯时,利用四连杆的相等曲柄使内侧轮的转向角比外侧轮大大约2~4度,使四个轮子路径的圆心大致上交会于后轴的延长线上瞬时转向中心,让车辆可以顺畅的转弯。
车辆运动模型基于单车模型推导,推导过程不考虑车辆受到的横向力,故该模型只适用于车辆速度很低的情形。
根据公式(34)知,速度很小时,车辆受到的向心力可以忽略不记,所以才有公式(8)的成立。所以当车辆的运动场景速度较低时,可以使用该模型描述车辆的运动。
文章出处登录后可见!