模型预测控制器(MPC)系列: 1.建立车辆横向动力学模型_mpc动力学模型-程序员宅基地

技术标签: 模型预测控制  控制器  

勘误 Update 02/23/2021

之前的文章中有不严谨的地方,这里做一个勘误.错误就在下面描述坐标系的图中.<更正后的图已覆盖到坐标系小节下>
在这里插入图片描述在这个图中,我指出ENU坐标下,车自身的朝向角 ψ \psi ψ 近似等于理想路径上匹配点(最近的一个点)的朝向角 ψ m a t c h \psi_{match} ψmatch. 其实这是不成立的.考虑以下这个场景,理想轨迹平行于ENU坐标x轴,即朝东.此时车身朝向东偏北,显然车身朝向角 ψ \psi ψ 与理想路径上匹配点(距车辆最近的一个点)的朝向角 ψ m a t c h \psi_{match} ψmatch不相同,详见下图.
在这里插入图片描述
那么我一开始是怎么得出错误的结论呢?这就要回到百度apollo的MPC相关代码中. 其中计算横向误差的代码为

  const double dx = x - matched_point.path_point().x();
  const double dy = y - matched_point.path_point().y();

  const double cos_matched_theta = std::cos(matched_point.path_point().theta());
  const double sin_matched_theta = std::sin(matched_point.path_point().theta());
  // d_error = cos_matched_theta * dy - sin_matched_theta * dx;
  debug->set_lateral_error(cos_matched_theta * dy - sin_matched_theta * dx);

可以看到,计算横向误差 e 1 e_1 e1 时, Apollo 的开发者使用的是理想轨迹上匹配点的朝向角 ψ m a t c h \psi_{match} ψmatch,即代码中的matched_point.path_point().theta()
这个操作,就是把 E N U ENU ENU世界坐标系下的位置误差dx,dy,转到了 F r e n e t Frenet Frenet坐标系下表述.需要注意的是,所有的受力分析均是在 F L U FLU FLU车身坐标系下完成的,也就是说所有的状态量,包括横向误差 e 1 e_1 e1也应是在 F L U FLU FLU坐标系下表述.所以,计算横向误差 e 1 e_1 e1时,应该采用车身的朝向角 ψ \psi ψ.

代入到我刚才举得例子中,如果采用理想轨迹上匹配点的朝向角计算,会得到
已 知 : d x = 0 , d y = l 1 ψ m a t c h = 0 , ψ ≠ 0 因 此 : e 1 = c o s ψ m a t c h d y − s i n ψ m a t c h d x = d y = l 1 \begin{aligned} 已知:&\\ &dx=0,dy=l_1\\ &\psi_{match}=0,\psi \neq 0 \\ 因此:&\\ &e_1 = cos\psi_{match}dy - sin\psi_{match}dx = dy = l_1 \end{aligned} ::dx=0,dy=l1ψmatch=0,ψ=0e1=cosψmatchdysinψmatchdx=dy=l1
若采用车身的朝向角计算,会得到
e 1 = c o s ψ d y − s i n ψ d x = l 2 \begin{aligned} &e_1 = cos\psi dy - sin\psi dx = l_2 \end{aligned} e1=cosψdysinψdx=l2
显然, F L U FLU FLU坐标系下的横向误差,即 β \beta β方向的横向误差应是 l 2 l_2 l2.

为了比较两种计算方法对MPC控制性能的影响,我跑了几次仿真,结果影响并不是很大.但是我始终觉得这样做不严谨,我并不清楚 Apollo 开发者这么写的理由是什么?不知道是否有工程上的考量?如果有大神了解或者有任何想法,可以在评论区一起讨论,非常感谢.

Hi All

新年挖新坑,今日开启船新连载.内容是无人车的横向控制,整体涵盖从0-1为车辆横向控制设计MPC控制器设计与MPC+MRAC耦合控制.大家有问题,有兴趣可以在评论区多多交流.原图如下

车辆横向动力学模型

引言

首先我们要问:针对车辆横向控制的问题,我们为什么需要建立动力学模型?
简单来说,当车辆在较高速度下行驶时,运动学模型(自行车模型)中提出"汽车轮胎速度方向与车辆朝向相同"的假设不再成立.车辆受到的横向力将不可忽视,如向心力将随着速度的增大而平方倍地增大.因此引入动力学模型,旨在建立更高阶量之间的联系,以更好地描述车辆转弯的非线性特性.

那么,让我们开始吧.为了在不失一般性的前提下尽可能简化模型,动力学模型将建立在以下几个假设上
1.轮胎速度方向与车辆纵向方向( x )的夹角 θ v (后统称轮胎速度方向角)较小且满足小角度假设: a )   θ v ≈ t a n θ v 2.轮胎转角( δ )与轮胎速度方向角( θ v )的夹角 α (后统称轮胎侧滑角)较小 3.车辆纵向速度维持不变: a )   V x : = C o n s t a n t 4.忽略路堤角( ϕ )对横向控制的影响 \begin{aligned} &\text{1.轮胎速度方向与车辆纵向方向($x$)的夹角$\theta_v$(后统称轮胎速度方向角)较小且满足小角度假设:}\\ &\qquad a) \ \theta_v \approx tan\theta_v \\ &\text{2.轮胎转角($\delta$)与轮胎速度方向角($\theta_v$)的夹角$\alpha$(后统称轮胎侧滑角)较小} \\ &\text{3.车辆纵向速度维持不变:} \\ &\qquad a) \ V_x : = Constant \\ &\text{4.忽略路堤角($\phi$)对横向控制的影响} \end{aligned} 1.轮胎速度方向与车辆纵向方向(x)的夹角θv(后统称轮胎速度方向角)较小且满足小角度假设:a) θvtanθv2.轮胎转角(δ)与轮胎速度方向角(θv)的夹角α(后统称轮胎侧滑角)较小3.车辆纵向速度维持不变:a) Vx:=Constant4.忽略路堤角(ϕ)对横向控制的影响

坐标系

本模型在 F L U (Front-Left-Universe) FLU \text{(Front-Left-Universe)} FLU(Front-Left-Universe) 惯性坐标系下建立.坐标系原点固定在车辆质心位置, x x x轴方向为车辆纵向方向,指向车头前方. y y y轴方向与x轴垂直且指向车辆左侧, z z z轴方向垂直于 x x x, y y y轴且指向天空.值得注意的是,全局(地图)坐标系为ENU(East-North-Universe),其xyz指向规则于FLU相似,分别指向东北天.还有一个局部坐标系为Frenet坐标系,其固定在理想轨迹上,这里就不展开讲了,详见下图.
在这里插入图片描述

受力分析

车辆受力分析图如下
在这里插入图片描述

根据牛顿第二定律,对车辆y方向(横向)进行受力分析
F y f + F y r = m a y F_{yf} + F_{yr} = ma_y Fyf+Fyr=may
其中 F y f F_{yf} Fyf F y r F_{yr} Fyr 分别是车辆前轮和后轮在 y y y方向受到的力, m m m为车辆质量, a y a_y ay为车辆在 y y y方向上的加速度.

车辆在 y y y方向上的加速度由两部分构成:
1.因车辆在 y y y方向上运动产生的加速度,定义为 y ¨ \ddot{y} y¨.
2.车辆的向心加速度,记为 a y c a_{yc} ayc.
a y = y ¨ + a y c = y ¨ + ω 2 R = y ¨ + ψ ˙ 2 R = y ¨ + V x ψ ˙ a_y = \ddot{y}+a_{yc} = \ddot{y}+\omega^2R = \ddot{y}+\dot{\psi}^2R = \ddot{y}+V_x\dot{\psi} ay=y¨+ayc=y¨+ω2R=y¨+ψ˙2R=y¨+Vxψ˙

因此
F y f + F y r = m ( y ¨ + V x ψ ˙ ) F_{yf} + F{yr} = m(\ddot{y}+V_x\dot{\psi}) Fyf+Fyr=m(y¨+Vxψ˙)

对z轴进行偏航动力学分析,由力矩平衡可得
I z ψ ¨ = l f F y f − l r F y r I_z\ddot{\psi}=l_fF_{yf} - l_rF_{yr} Izψ¨=lfFyflrFyr
其中 l f l_f lf l r l_r lr 分别是车辆前轮和后轮距离车辆重心的距离.

下一步,我们要对横向力 F y f F_{yf} Fyf F y r F_{yr} Fyr 进行分析.实验表明,当轮胎侧滑角 α \alpha α 较小时,轮胎受到的横向力的大小与轮胎侧滑角成正比.其中轮胎侧滑角被定义为轮胎转角与轮胎速度方向角的夹角.

因此,前轮(方向轮)侧滑角 α f \alpha_f αf
α f = δ − θ v f \alpha_f = \delta - \theta_{vf} αf=δθvf
其中 δ \delta δ为前轮转角, θ v f \theta_{vf} θvf 为前轮速度方向角.

同理,后轮(假定后轮无法转向)侧滑角为
α r = 0 − θ v r = − θ v r \alpha_r = 0 - \theta_{vr} = - \theta_{vr} αr=0θvr=θvr
其中 θ v r \theta_{vr} θvr 为后轮速度方向角.

基于上述两点推断, 轮胎横向力可被改写为以下形式
F y f = 2 C α f ( δ − θ v f ) F y r = − 2 C α r θ v r \begin{aligned} &F_{yf} = 2C_{\alpha_f}(\delta - \theta_{vf}) \\ &F_{yr} = -2C_{\alpha_r}\theta_{vr} \end{aligned} Fyf=2Cαf(δθvf)Fyr=2Cαrθvr
其中 C α f C_{\alpha_f} Cαf C α r C_{\alpha_r} Cαr 分别为前轮与后轮的侧滑刚度系数.

由小角度假设与牵连运动公式可得
θ v f ≈ t a n ( θ v f ) = y ˙ + l f ψ ˙ V x θ v r ≈ t a n ( θ v r ) = y ˙ − l r ψ ˙ V x \begin{aligned} &\theta_{vf} \approx tan(\theta_{vf}) = \frac{\dot{y} + l_f\dot{\psi}}{V_x} \\ &\theta_{vr} \approx tan(\theta_{vr}) = \frac{\dot{y} - l_r\dot{\psi}}{V_x} \end{aligned} θvftan(θvf)=Vxy˙+lfψ˙θvrtan(θvr)=Vxy˙lrψ˙

综上可得

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42623186/article/details/113887445

智能推荐

class和struct的区别-程序员宅基地

文章浏览阅读101次。4.class可以有⽆参的构造函数,struct不可以,必须是有参的构造函数,⽽且在有参的构造函数必须初始。2.Struct适⽤于作为经常使⽤的⼀些数据组合成的新类型,表示诸如点、矩形等主要⽤来存储数据的轻量。1.Class⽐较适合⼤的和复杂的数据,表现抽象和多级别的对象层次时。2.class允许继承、被继承,struct不允许,只能继承接⼝。3.Struct有性能优势,Class有⾯向对象的扩展优势。3.class可以初始化变量,struct不可以。1.class是引⽤类型,struct是值类型。

android使用json后闪退,应用闪退问题:从json信息的解析开始就会闪退-程序员宅基地

文章浏览阅读586次。想实现的功能是点击顶部按钮之后按关键字进行搜索,已经可以从服务器收到反馈的json信息,但从json信息的解析开始就会闪退,加载listview也不知道行不行public abstract class loadlistview{public ListView plv;public String js;public int listlength;public int listvisit;public..._rton转json为什么会闪退

如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet-程序员宅基地

文章浏览阅读219次。如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet

系统项目报表导出功能开发_积木报表 多线程-程序员宅基地

文章浏览阅读521次。系统项目报表导出 导出任务队列表 + 定时扫描 + 多线程_积木报表 多线程

ajax 如何从服务器上获取数据?_ajax 获取http数据-程序员宅基地

文章浏览阅读1.1k次,点赞9次,收藏9次。使用AJAX技术的好处之一是它能够提供更好的用户体验,因为它允许在不重新加载整个页面的情况下更新网页的某一部分。另外,AJAX还使得开发人员能够创建更复杂、更动态的Web应用程序,因为它们可以在后台与服务器进行通信,而不需要打断用户的浏览体验。在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种常用的技术,用于在不重新加载整个页面的情况下,从服务器获取数据并更新网页的某一部分。使用AJAX,你可以创建异步请求,从而提供更快的响应和更好的用户体验。_ajax 获取http数据

Linux图形终端与字符终端-程序员宅基地

文章浏览阅读2.8k次。登录退出、修改密码、关机重启_字符终端

随便推点

Python与Arduino绘制超声波雷达扫描_超声波扫描建模 python库-程序员宅基地

文章浏览阅读3.8k次,点赞3次,收藏51次。前段时间看到一位发烧友制作的超声波雷达扫描神器,用到了Arduino和Processing,可惜啊,我不会Processing更看不懂人家的程序,咋办呢?嘿嘿,所以我就换了个思路解决,因为我会一点Python啊,那就动手吧!在做这个案例之前先要搞明白一个问题:怎么将Arduino通过超声波检测到的距离反馈到Python端?这个嘛,我首先想到了串行通信接口。没错!就是串口。只要Arduino将数据发送给COM口,然后Python能从COM口读取到这个数据就可以啦!我先写了一个测试程序试了一下,OK!搞定_超声波扫描建模 python库

凯撒加密方法介绍及实例说明-程序员宅基地

文章浏览阅读4.2k次。端—端加密指信息由发送端自动加密,并且由TCP/IP进行数据包封装,然后作为不可阅读和不可识别的数据穿过互联网,当这些信息到达目的地,将被自动重组、解密,而成为可读的数据。不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。2.使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。_凯撒加密

工控协议--cip--协议解析基本记录_cip协议embedded_service_error-程序员宅基地

文章浏览阅读5.7k次。CIP报文解析常用到的几个字段:普通类型服务类型:[0x00], CIP对象:[0x02 Message Router], ioi segments:[XX]PCCC(带cmd和func)服务类型:[0x00], CIP对象:[0x02 Message Router], cmd:[0x101], fnc:[0x101]..._cip协议embedded_service_error

如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控件中的MFC类_vs添加mfc库-程序员宅基地

文章浏览阅读2.4k次,点赞9次,收藏13次。有时候我们在MFC项目开发过程中,需要用到一些微软已经提供的功能,如VC++使用EXCEL功能,这时候我们就能直接通过VS2019到如EXCEL.EXE方式,生成对应的OLE头文件,然后直接使用功能,那么,我们上篇文章中介绍了vs2017及以前的版本如何来添加。但由于微软某些方面考虑,这种方式已被放弃。从上图中可以看出,这一功能,在从vs2017版本15.9开始,后续版本已经删除了此功能。那么我们如果仍需要此功能,我们如何在新版本中添加呢。_vs添加mfc库

frame_size (1536) was not respected for a non-last frame_frame_size (1024) was not respected for a non-last-程序员宅基地

文章浏览阅读785次。用ac3编码,执行编码函数时报错入如下:[ac3 @ 0x7fed7800f200] frame_size (1536) was not respected for anon-last frame (avcodec_encode_audio2)用ac3编码时每次送入编码器的音频采样数应该是1536个采样,不然就会报上述错误。这个数字并非刻意固定,而是跟ac3内部的编码算法原理相关。全网找不到,国内音视频之路还有很长的路,音视频人一起加油吧~......_frame_size (1024) was not respected for a non-last frame

Android移动应用开发入门_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量-程序员宅基地

文章浏览阅读230次,点赞2次,收藏2次。创建Android应用程序一个项目里面可以有很多模块,而每一个模块就对应了一个应用程序。项目结构介绍_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量

推荐文章

热门文章

相关标签