模型预测控制器(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

智能推荐

前端开发之vue-grid-layout的使用和实例-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏34次。vue-grid-layout的使用、实例、遇到的问题和解决方案_vue-grid-layout

Power Apps-上传附件控件_powerapps点击按钮上传附件-程序员宅基地

文章浏览阅读218次。然后连接一个数据源,就会在下面自动产生一个添加附件的组件。把这个控件复制粘贴到页面里,就可以单独使用来上传了。插入一个“编辑”窗体。_powerapps点击按钮上传附件

C++ 面向对象(Object-Oriented)的特征 & 构造函数& 析构函数_"object(cnofd[\"ofdrender\"])十条"-程序员宅基地

文章浏览阅读264次。(1) Abstraction (抽象)(2) Polymorphism (多态)(3) Inheritance (继承)(4) Encapsulation (封装)_"object(cnofd[\"ofdrender\"])十条"

修改node_modules源码,并保存,使用patch-package打补丁,git提交代码后,所有人可以用到修改后的_修改 node_modules-程序员宅基地

文章浏览阅读133次。删除node_modules,重新npm install看是否成功。在 package.json 文件中的 scripts 中加入。修改你的第三方库的bug等。然后目录会多出一个目录文件。_修改 node_modules

【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure-程序员宅基地

文章浏览阅读883次。【代码】【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure

整理5个优秀的微信小程序开源项目_微信小程序开源模板-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏97次。整理5个优秀的微信小程序开源项目。收集了微信小程序开发过程中会使用到的资料、问题以及第三方组件库。_微信小程序开源模板

随便推点

Centos7最简搭建NFS服务器_centos7 搭建nfs server-程序员宅基地

文章浏览阅读128次。Centos7最简搭建NFS服务器_centos7 搭建nfs server

Springboot整合Mybatis-Plus使用总结(mybatis 坑补充)_mybaitis-plus ruledataobjectattributemapper' and '-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏3次。前言mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。..._mybaitis-plus ruledataobjectattributemapper' and 'com.picc.rule.management.d

EECE 1080C / Programming for ECESummer 2022 Laboratory 4: Global Functions Practice_eece1080c-程序员宅基地

文章浏览阅读325次。EECE 1080C / Programming for ECESummer 2022Laboratory 4: Global Functions PracticePlagiarism will not be tolerated:Topics covered:function creation and call statements (emphasis on global functions)Objective:To practice program development b_eece1080c

洛谷p4777 【模板】扩展中国剩余定理-程序员宅基地

文章浏览阅读53次。被同机房早就1年前就学过的东西我现在才学,wtcl。设要求的数为\(x\)。设当前处理到第\(k\)个同余式,设\(M = LCM ^ {k - 1} _ {i - 1}\) ,前\(k - 1\)个的通解就是\(x + i * M\)。那么其实第\(k\)个来说,其实就是求一个\(y\)使得\(x + y * M ≡ a_k(mod b_k)\)转化一下就是\(y * M ...

android 退出应用没有走ondestory方法,[Android基础论]为何Activity退出之后,系统没有调用onDestroy方法?...-程序员宅基地

文章浏览阅读1.3k次。首先,问题是如何出现的?晚上复查代码,发现一个activity没有调用自己的ondestroy方法我表示非常的费解,于是我检查了下代码。发现再finish代码之后接了如下代码finish();System.exit(0);//这就是罪魁祸首为什么这样写会出现问题System.exit(0);////看一下函数的原型public static void exit (int code)//Added ..._android 手动杀死app,activity不执行ondestroy

SylixOS快问快答_select函数 导致堆栈溢出 sylixos-程序员宅基地

文章浏览阅读894次。Q: SylixOS 版权是什么形式, 是否分为<开发版税>和<运行时版税>.A: SylixOS 是开源并免费的操作系统, 支持 BSD/GPL 协议(GPL 版本暂未确定). 没有任何的运行时版税. 您可以用她来做任何 您喜欢做的项目. 也可以修改 SylixOS 的源代码, 不需要支付任何费用. 当然笔者希望您可以将使用 SylixOS 开发的项目 (不需要开源)或对 SylixOS 源码的修改及时告知笔者.需要指出: SylixOS 本身仅是笔者用来提升自己水平而开发的_select函数 导致堆栈溢出 sylixos

推荐文章

热门文章

相关标签