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

智能推荐

python实现日历功能_Python如何绘制日历图和热力图-程序员宅基地

文章浏览阅读206次。本文以2019年全国各城市的空气质量观测数据为例,利用matplotlib、calmap、pyecharts绘制日历图和热力图。在绘图之前先利用pandas对空气质量数据进行处理。数据处理从网站下载的数据为逐小时数据,每天一个文件。如果要绘制全年的日历图或者热图,首先要将所有的数据进行合并处理。下载好数据之后,将数据解压到当前目录的2019文件夹内,然后处理数据:import globfrom d..._python绘制日历图4-6月份

Git 项目管理快速入门_git项目管理-程序员宅基地

文章浏览阅读451次。Git 项目管理快速入门,当安装完git之后应该做的第一件事就是设置用户名称与邮件地址。因为每一个git的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改。TIP- 版本库又名为仓库,英文名repositiry- 可以简单理解为一个目录,这个目录里面的所有文件都可以被git管理起来,每个文件的修改、删除,git都能跟踪,以便任何时刻都可以追踪历史,或者再将某个时刻可以“还原”。_git项目管理

memmove函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )-程序员宅基地

文章浏览阅读1.7w次,点赞20次,收藏65次。memmove函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )_memmove

JVM内存池_jvm memory pool-程序员宅基地

文章浏览阅读1.3k次,点赞2次,收藏4次。JVM内存池根据jconsole工具提供,内存池大致可分为堆 年轻代   survivor space   eden space 老年代   old Gen非堆 Metaspace(起始部分 compressed Class space) codeCache结合《内存概述与JAVA进程内存》,进一步得出运行时数据区的组成通过《JVM内存模型》我们对运行时数据有了初步的..._jvm memory pool

VUE 使用 IView 实现Table Tree进行异步数据加载_iview table tree-程序员宅基地

文章浏览阅读2.3k次。VUE 使用 IView 实现Table Tree进行异步数据加载页面布局 <Table ref="thisTab" row-key="ID" :load-data="handleLoadData" :columns="columnsList" :data="familyList" :highlight-row="true" :disabled-hover=._iview table tree

matlab飞机飞行模型,使用 MATLAB/Simulink 设计无人机飞行控制系统(二、动力学模型建立)...-程序员宅基地

文章浏览阅读8.7k次,点赞5次,收藏110次。前面一篇文章已经讲解了如何获取无人机的气动参数,本篇文章讲解如何建立无人机动力学模型。建立无人机动力学模型前面我们用 MATLAB 绘制了飞机的几何外形,并调用 DATCOM计算了无人机的气动参数。我们现在看一看 DATCOM 输出的 .out 文件是什么样的。我们又该怎么利用它呢?通过 DATCOM 计算得到的气动参数文件这是一个非常复杂的文件,里面记录了我们之前定义的各种飞行包线内的工作点上,..._大飞机数学模型matlab

随便推点

应对NBA 2K13启动时提示缺失zlib1.dll文件的全面解决方案-程序员宅基地

文章浏览阅读1k次,点赞21次,收藏20次。在享受NBA 2K13这款经典篮球模拟游戏的过程中,玩家有时会遇到启动时提示“缺少zlib1.dll”文件的困扰。这一错误信息意味着游戏在启动时无法找到或加载名为“zlib1.dll”的关键系统组件,进而导致游戏无法启动或运行异常。为帮助玩家有效地解决这一问题,本文将深入探讨zlib1.dll文件的功能、缺失原因,并提供一套详尽的解决步骤。

Kubernetes入门——Longhorn简介-程序员宅基地

文章浏览阅读3.9k次。Longhorn是由Rancher创建的一款云原生的、轻量级、可靠且易用的开源分布式块存储系统。部署到K8s集群上之后,Longhorn会自动将集群中所有节点上可用的本地存储聚集为存储集群,然后利用这些存储管理分布式、带有复制功能的块存储,支持快照和数据备份。_longhorn

abcde依次进入一个队列_程序员考试复习题-程序员宅基地

文章浏览阅读1.4k次。程序员习题1)经过以下栈运算后,x的值是_____________。InitStack(s); Push(s,a); Push(s,b); Pop(s,x);GetTop(s,x);A. aB. bC. 1D. 02) 经过以下栈运算后,StackEmpty(s)的值是___________。InitStack(s); Push(s,a); Push(s,b); Pop(s,x); Pop(s,y..._经过以下队列运算后,队头的元素是( )。

白嫖是真香,耗时半年,终于整理完成这套Java架构进阶pdf_java架构 限流框架-程序员宅基地

文章浏览阅读143次。2020年的“金九银十”就这么来了,也到了该发福利的阶段了,花了我大半个月时间收整了全套的「Java架构进阶pdf」,这一波下来,刷完你就会知道,真真香啊,我的心血果然,没白费!请注意:关于全套的「Java架构进阶pdf」,我会从面试-筑基-框架-分布式-微服务-调优的等六个方面展开,顾及篇幅,只截图展示大概内容Java架构进阶之面试篇面试这一块,分别有基础、中级、高级等三部分,一步一步检测。基础面试中级开发面试高级面试Java架构进阶之技能导图篇筑基.._java架构 限流框架

阿里云数据库RDS备份恢复_rds.tar.gz恢复到阿里云rds-程序员宅基地

文章浏览阅读452次。阿里云数据库RDS备份恢复.准备本地环境需于线上数据库RDS版本一样。.去阿里云下载RDS备份wget -c ‘<备份文件外网下载地址>’ -O <自定义文件名>.tar.gz(登录阿里云>>云数据库RDS>>实例备份>>管 理>>备份恢复>>点击下载获取下载地址)-c:启用断点续传模式。-O:将下载的结果保存为指定的文件(使用URL中包含的文件后缀 .tar.gz 、.xb.gz 或 _qp.xb)。按照_rds.tar.gz恢复到阿里云rds

【F28335】第15章 串行通讯接口SCI_f28335 sci的空闲线多处理模式-程序员宅基地

文章浏览阅读933次,点赞21次,收藏22次。整理书本内容,梳理F28335的SCI模块相关知识。_f28335 sci的空闲线多处理模式

推荐文章

热门文章

相关标签