无人驾驶汽车系统入门(五)——运动学自行车模型和动力学自行车模型

在简要了解了PID控制以后,我们就要接触一些现代的控制算法。在了解高级的车辆控制算法之前,掌握车辆运动模型是非常有必要的。车辆运动模型就是一类能够描述我们的车辆的运动规律的模型。显然,越复杂的模型就越接近现实中的车辆运动规律,本节我们一起了解一下两个广泛使用的车辆模型——运动学自行车模型(Kinematic Bicycle Model)动力学自行车模型(Dynamic Bicycle Model)

原创不易,转载请注明出处:http://blog.csdn.net/adamshan/article/details/78696874

无人驾驶系统往往分成感知,决策和控制三个模块,其中无人车的路径规划和底层控制是工作在不同的层的,路径规划层往往会基于更加高层的(感知层,定位层)的信息和底层的(控制层)的实时信息指定行驶的路径,那么从路径规划层传来的就是车辆的参考路径,控制系统需要做的就是严格按照这个参考路径(以及速度等控制输入量)去驾驶我们的车辆,一般来说,我们会用多项式的行驶来描述这个路径曲线,如下所示的三次多项式就可以描述绝大多数的路径了:

y=ax3+bx2+cx+d

y = ax^3 + bx^2 + cx + d

无人车的控制依赖于一项称为 模型预测控制(Model Predictive Control) 的简单技术,这种控制的方法是产生一系列的可行的(也就是说在实际上车辆能够做到的)控制输入,基于一定的算法(往往是带约束的非线性优化算法)来调整这一系列的控制输入,使得一个 损失函数(cost function) 最小化,这个损失函数的求解就要依赖于车辆的运动学或者动力学模型的输出和参考的路径的差值求得,这些模型正是本节介绍的内容。

自行车模型(Bicycle Model)

首先我们要简化汽车运动,其中自行车模型就是简单且有效的简化方式。自行车模型基于如下几个假设:

  • 车辆在垂直方向的运动被忽略掉了,也就是说我们描述的车辆是一个二维平面上的运动物体(可以等价与我们是站在天空中的俯视视角)
  • 我们假设车辆的结构就像自行车一样,也就是说车辆的前面两个轮胎拥有一直的角度和转速等,同样后面的两个轮胎也是如此,那么前后的轮胎就可以各用一个轮胎来描述
  • 我们假设车辆运动也和自行车一样,这意味着是前面的轮胎控制这车辆的转角

首先我们简单的在一个二维平面上描述一个车辆:

其中 θ\theta是其在 YawYaw 方向的偏转角度,它是相对于 xx 轴的逆时针方向的角度,vv 是 θ\theta 方向的速度,LL 是车辆的轴距(前后轮胎的距离), (x,y)(x,y) 是车辆的坐标。

下图是该车辆的自行车模型:

运动学自行车模型

作为一种自行车模型,运动学自行车模型也假定车辆形如一辆自行车,整个的控制量可以简化为 (a, δf)(a, \ \delta_f),其中 aa 是车辆的加速度,踩油门踏板意味着正的加速度,踩刹车踏板意味着负的加速度。δf\delta_f 是我们的方向盘转角,我们假定这个方向盘转角就是前轮胎当前的转角。这样,我们使用两个量描述了车辆的 控制输入(control input)

然后我们定义我们模型中的状态量,运动学自行车模型使用四个状态量来描述车辆的当前状态:

  • xx : 即车辆当前的 xx 坐标
  • yy : 即车辆当前的 yy 坐标
  • ψ\psi : 即车辆当前的偏航角(YawYaw 方向的偏角,往往用弧度来描述, 逆时针方向为正)
  • vv : 即车辆的速度

一个简单的运动学自行车模型如图所示:

其中 lfl_f 和 lrl_r 为前轮和后轮到车辆重心的距离。那么更具运动学定理,运动学自行车模型中的各个状态量的更新公式如下:

xt+1=xt+vtcos(ψt+β)×dt

x_{t+1} = x_t + v_t\cos(\psi_t + \beta) \times dt

yt+1=yt+vtsin(ψt+β)×dt

y_{t+1} = y_t + v_t\sin(\psi_t + \beta) \times dt

ψt+1=ψt+vtlrsin(β)×dt

\psi_{t+1} = \psi_t + \frac{v_t}{l_r}\sin(\beta) \times dt

vt+1=vt+a×dt

v_{t+1} = v_t + a \times dt

其中 β\beta 可以由如下公式计算求得:

β=tan−1(lrlf+lrtan(δf))

\beta = \tan^{-1} \left( \frac{l_r}{l_f + l_r} \tan \left( \delta_f \right)\right)

由于绝大多数的汽车后轮都不能够偏转,所以我们的自行车模型就假定后轮的转角控制输入 δr=0\delta_r = 0,也就是说,方向盘上的控制输入,都反映到了前轮的转角上了。

那么基于这个简单的运动学自行车模型,在给定了一个时刻的控制输入以后,我们可以计算求得 dtdt 时间以后我们车辆的状态信息(坐标,偏航角以及速度),那么这个模型就可以作为我们模型预测控制下的基础车辆模型了。

动力学自行车模型

前面的车辆运动学自行车模型其实还隐含着一个重要的假设,那就是: 车前轮的方向即是车辆当前的速度方向,在实际车辆运动过程中,当车辆在以相对高的速度行驶时,车轮的方向并不一定车辆当前的速度方向,这个时候,我们引入车辆的动力学自行车模型。

车辆动力学模型通过对轮胎和路面之间的复杂相互作用来描述车辆的运动。在一个动力模型中,我们需要考虑各种各样的力的作用,他们可以大致分为两类: 纵向力(Longitudinal force)侧向力(Lateral force), 纵向力就是使车辆前后移动的力量,而侧向力则促使车辆在横向移动,在力的相互作用过程中,轮胎起着决定性的作用(根据一定的物理常识,轮胎是车辆运动的一个重要的力的来源)。

我们仍然以上图为例,考虑一个简单的动力学模型,这个模型的各个状态量为 (x˙,y˙,ψ˙,X,Y)(\dot x , \dot y, \dot \psi, X, Y), 其中 x˙\dot x 和 y˙\dot y 表示的是车身的纵向和侧向速度,ψ˙\dot \psi 表示的是偏航角速度, (X,Y)(X, Y) 表示车车身的当前坐标,这些状态量在时间尺度上的微分方程如下:

其中,mm 和 IzI_z 分别表示车辆的质量和偏航惯性(yaw inertia), Fc,fF_{c,f} 和 Fc,rF_{c,r} 分别表示的是前后轮胎受到的侧向力,他们可以通过具体的轮胎模型求得,在简单的线性轮胎模型中,Fc,i, (i=f or r)F_{c,i}, \ (i=f \ or\ r) 表示为:

Fc,i=−Cαiαi

F_{c, i} = -C_{\alpha_i}\alpha_i

其中 αi\alpha_i 是轮胎的偏转角,这个偏转角是指轮胎当前的朝向和当前的速度的夹角, CαiC_{\alpha_i} 被称为轮胎偏滚刚度(tire cornering stiffness)。

运动学自行车模型的Python实现

我们使用Python代码简单实现一个运动学自行车模型类,作为后期我们使用模型预测控制的车辆模型。

from __future__ import print_functionimport mathclass KinematicModel(object):def __init__(self, x, y, psi, v, f_len, r_len):self.x = xself.y = yself.psi = psiself.v = vself.f_len = f_lenself.r_len = r_lendef get_state(self):return self.x, self.y, self.psi, self.vdef update_state(self, a, delta, dt):beta = math.atan((self.r_len / (self.r_len + self.f_len)) * math.tan(delta))self.x = self.x + self.v * math.cos(self.psi * beta) * dtself.y = self.y + self.v * math.sin(self.psi * beta) * dtself.psi = self.psi + (self.v / self.f_len) * math.sin(beta) * dtself.v = self.v + a * dtreturn self.x, self.y, self.psi, self.v

这个简易的车辆模型中,我们的控制量包含了一个前胎的转角和一个加速度a,由于受车辆机械的限制,车辆本身有很多动作是实现不了的,比如说加速度a的值不可能过大,轮胎的转角也会有极限,我们称这种性质叫做模型非完整性(model nonholonomic)

无人驾驶汽车系统入门(五)——运动学自行车模型和动力学自行车模型相关推荐

  1. 运动学自行车模型和动力学自行车模型

    作者简介:申泽邦(Adam Shan),兰州大学在读硕士研究生,主攻无人驾驶,深度学习:文章来源:https://blog.csdn.net/adamshan/article/details/7869 ...

  2. 无人驾驶汽车系统入门(十)——基于运动学模型的模型预测控制

    无人驾驶汽车系统入门(十)--基于运动学模型的模型预测控制 在前面的第五篇博客中,我们介绍了两种常见的车辆模型--运动学自行车模型和动力学自行车模型,本节我们基于运动学车辆模型引入一种新的控制理论-- ...

  3. “无人驾驶汽车系统入门”博客专栏

    "无人驾驶汽车系统入门"专栏链接地址: https://blog.csdn.net/column/details/28410.html?&page=1 前言:随着深度学习近 ...

  4. 无人驾驶汽车系统入门

    无人驾驶汽车系统入门(一)--卡尔曼滤波与目标追踪 链接:https://blog.csdn.net/adamshan/article/details/78248421 无人驾驶汽车系统入门(二)-- ...

  5. 无人驾驶汽车系统入门(十七)——无人驾驶系统基本框架

    无人驾驶汽车系统入门(十七)--无人驾驶系统基本框架 前面的文章基本上是想写什么写什么,缺乏条理,本节我们完整的梳理一遍无人驾驶系统的基本框架,帮助读者建立对整个系统的完整认识 无人驾驶系统的核心可以 ...

  6. 无人驾驶汽车系统入门(二十五)——基于欧几里德聚类的激光雷达点云分割及ROS实现

    无人驾驶汽车系统入门(二十五)--基于欧几里德聚类的激光雷达点云分割及ROS实现 上一篇文章中我们介绍了一种基于射线坡度阈值的地面分割方法,并且我们使用pcl_ros实现了一个简单的节点,在完成了点云 ...

  7. 无人驾驶汽车系统入门(十八)——使用pure pursuit实现无人车轨迹追踪

    无人驾驶汽车系统入门(十八)--使用pure pursuit实现无人车轨迹追踪 对于无人车辆来说,在规划好路径以后(这个路径我们通常称为全局路径),全局路径由一系列路径点构成,这些路径点只要包含空间位 ...

  8. 无人驾驶汽车系统入门(二十六)——基于深度学习的实时激光雷达点云目标检测及ROS实现

    无人驾驶汽车系统入门(二十六)--基于深度学习的实时激光雷达点云目标检测及ROS实现 在前两篇文章中,我们使用PCL实现了在点云中对地面的过滤和点云的分割聚类,通常来说,在这两步以后我们将对分割出来的 ...

  9. 无人驾驶汽车系统入门(二十二)——使用Autoware实践激光雷达与摄像机组合标定

    无人驾驶汽车系统入门(二十二)--使用Autoware实践激光雷达与摄像机组合标定 单目相机分辨率高,我们可以使用各种深度学习算法完成对目标检测,但是缺乏深度,坐标等信息.激光雷达能够获得目标相当精确 ...

最新文章

  1. Docker安装Nextcloud
  2. ROS 服务和参数:ROS Services and Parameters
  3. Xcode7 无账号真机测试!!
  4. eclipse打不开,报错 java was started with exit code=13
  5. antdesignpro 重定向到登录页面_爬虫技巧:使用Charles和requests模拟微博登录
  6. 斗鱼上市,直播圈“战火”再起,海店湾:狭路相逢勇者胜!
  7. VMware16的下载安装及搭建Linux环境
  8. 怎样更改itunes备份位置_正确修改itunes备份文件路径方法
  9. phython编写图形界面
  10. AssertionError: train: No labels found in ****\train.cache报错
  11. PHP 获取浏览器以及版本号
  12. 服务器系统和win10区别,win10分区使用mbr好还是gpt好_win10系统gpt分区和mbr分区的区别...
  13. 计算机影响因子10.0什么水平,论文的影响因子是什么?由什么决定?_1 论文影响因子10.0什么水平...
  14. 计算机图形学(光栅显示系统、基于GLUT的OpenGL程序框架、基本图元光栅化)
  15. ipad1无法安装应用程序_适用于儿童的31种出色iPad应用程序
  16. NLP下游任务理解以及模型结构改变(上)
  17. 模板测试+一个好玩的顶点动画效果——UnityShader学习笔记
  18. log4j 引发的安全震荡,jdk 7的使用者如何安然处之
  19. MATLAB打开.mat图像文件
  20. ubuntu如何删除文件夹?

热门文章

  1. C++ Primer勘误
  2. 计算机是如何执行程序的(转)
  3. echarts 百万数据_GitHub - AricZhu/echarts-billion-data-disp: 针对 echarts 百万数据的折线图优化...
  4. 华清远见嵌入式班结业总结
  5. VirtualBox安装CentOS7虚拟机(超级无敌详细)
  6. 记SQL Server实战修复死锁总结
  7. java毕业设计_基于web的医院信息管理系统
  8. cesium解决DeveloperError报错‘Expected longitude to be typeof number, actual type of was string‘
  9. [vue] 11. pixiJS整合vue初体验
  10. Vue3项目基本知识点