自动驾驶控制算法-横向控制与流程代码仿真

devtools/2024/12/27 11:23:42/

本文是学习自动驾驶控制算法第八讲(一)横向控制算法与流程图以及后续两节的学习笔记。

1 1. 算法流程图

在这里插入图片描述

2 A,B计算模块

A = [ 0 1 0 0 0 C α f + C α r m v x − C α f + C α r m a C α f − b C α r m v x 0 0 0 1 0 a C α f − b C α r I v x − a C α f − b C α r I a 2 C α f + b 2 C α r I v x ] \begin{equation} A=\begin{bmatrix} 0&1&0&0 \\ 0&\frac{C_{\alpha{f}}+C_{\alpha{r}}}{mv_x} &-\frac{C_{\alpha{f}}+C_{\alpha{r}}}{m}&\frac{aC_{\alpha{f}}-bC_{\alpha{r}}}{mv_x} \\ 0&0&0&1 \\ 0&\frac{aC_{\alpha{f}}-bC_{\alpha{r}}}{Iv_x}&-\frac{aC_{\alpha{f}}-bC_{\alpha{r}}}{I}&\frac{a^2C_{\alpha{f}}+b^2C_{\alpha{r}}}{Iv_x} \end{bmatrix} \end{equation} A= 00001mvxCαf+Cαr0IvxaCαfbCαr0mCαf+Cαr0IaCαfbCαr0mvxaCαfbCαr1Ivxa2Cαf+b2Cαr
B = [ 0 − C α f m 0 − a C α f I ] \begin{equation} B=\begin{bmatrix} 0\\ -\frac{C_{\alpha{f}}}{m} \\ 0 \\ -\frac{aC_{\alpha{f}}}{I} \end{bmatrix} \end{equation} B= 0mCαf0IaCαf
注意需要考虑 v x = 0 v_x=0 vx=0时的奇异性。

3 LQR计算模块

整车参数可近似认为不变,但是车辆急加速或急减速时前后承载力变化,轮胎侧偏刚度会变化,高速过弯时(比如 a y > 0.4 g a_y>0.4g ay0.4g时),车辆左右不对称,自行车模型不适合。
在整车参数可近似认为不变的假设下, A ( A ˉ ) , B ( B ˉ ) A(\bar{A}),B(\bar{B}) A(Aˉ),B(Bˉ)只与 v x v_x vx有关,那么由
K = l q r ( A ˉ , B ˉ , Q , R ) \begin{equation} K=lqr(\bar{A},\bar{B},Q,R) \end{equation} K=lqr(Aˉ,Bˉ,Q,R)
可知每个 v x v_x vx对应一个 K K K,这样可以提前计算好 v x v_x vx K K K的查找表,不用再去解Riccati方程。 v x v_x vx 0.01 m / s 0.01m/s 0.01m/s为间隔,算到 50 m / s 50m/s 50m/s

for i=1:5000vx=0.01*i;A=[0,1,0,0;0,(cf+cr)/(m*vx),-(cf+cr)/m,(a*cf-b*cr)/(m*vx);0,0,0,1;0,(a*cf-b*cr)/(Iz*vx),-(a*cf-b*cr)/Iz,(a*a*cf+b*b*cr)/(Iz*vx)];B=[0;-cf/m;0;-a*cf/Iz];Q=1*eye(4);R=10;k(i,:)=lqr(A,B,Q,R);
end

这里车速最小是 0.01 m / s 0.01m/s 0.01m/s,后续计算车速为0时令 K = 0 K=0 K=0,另外这里的 A A A B B B是连续状态方程中的表达式,使用matlab中lqr函数计算 K K K值。
之前的章节中,计算了离散的状态方程
x ( t + d t ) = ( I − A d t 2 ) − 1 ( I + A d t 2 ) x ( t ) + ( I − A d t 2 ) − 1 B d t u ( t ) ≈ ( I − A d t 2 ) − 1 ( I + A d t 2 ) x ( t ) + B d t u ( t ) \begin{equation} \begin{split} x(t+dt) &= (I-\frac{Adt}{2})^{-1}(I+\frac{Adt}{2})x(t)+(I-\frac{Adt}{2})^{-1}Bdtu(t) \\ &≈(I-\frac{Adt}{2})^{-1}(I+\frac{Adt}{2})x(t)+Bdtu(t) \end{split} \end{equation} x(t+dt)=(I2Adt)1(I+2Adt)x(t)+(I2Adt)1Bdtu(t)(I2Adt)1(I+2Adt)x(t)+Bdtu(t)
x k + 1 = A ˉ x k + B ˉ u k \begin{equation} x_{k+1}=\bar{A}x_k+\bar{B}{u_k} \end{equation} xk+1=Aˉxk+Bˉuk
这里试一下用 A ˉ \bar{A} Aˉ B ˉ \bar{B} Bˉ来计算 K K K,使用matlab中的dlqr,取 d t = 0.1 dt=0.1 dt=0.1

for i=1:5000vx=0.01*i;A=[0,1,0,0;0,(cf+cr)/(m*vx),-(cf+cr)/m,(a*cf-b*cr)/(m*vx);0,0,0,1;0,(a*cf-b*cr)/(Iz*vx),-(a*cf-b*cr)/Iz,(a*a*cf+b*b*cr)/(Iz*vx)];B=[0;-cf/m;0;-a*cf/Iz];A=inv((eye(4)-dt/2*A))*(eye(4)+dt/2*A);B=dt*B;Q=1*eye(4);R=10;k(i,:)=dlqr(A,B,Q,R);
end

两种方式计算得到的控制量 u u u的结果对比如下:
在这里插入图片描述

4 预测模块

前面计算的误差都是相对于自车当前位置的投影点来做计算的,正常人开车都会有一定的预见性,会朝着前方的某个目标点开,这里就假设自车在预测时间 t s t_s ts内匀速行驶
x p r e d = x + v t s cos ⁡ θ = x + v t s cos ⁡ ( β + φ ) = x + v x t s cos ⁡ φ − v y t s sin ⁡ φ \begin{equation} x_{pred}=x+vt_s\cos{\theta}=x+vt_s\cos{(\beta+\varphi)}=x+v_xt_s\cos{\varphi}-v_yt_s\sin{\varphi} \end{equation} xpred=x+vtscosθ=x+vtscos(β+φ)=x+vxtscosφvytssinφ
y p r e d = y + v t s sin ⁡ θ = x + v t s sin ⁡ ( β + φ ) = x + v x t s cos ⁡ φ + v y t s sin ⁡ φ \begin{equation} y_{pred}=y+vt_s\sin{\theta}=x+vt_s\sin{(\beta+\varphi)}=x+v_xt_s\cos{\varphi}+v_yt_s\sin{\varphi} \end{equation} ypred=y+vtssinθ=x+vtssin(β+φ)=x+vxtscosφ+vytssinφ
φ p r e d = φ + φ ˙ t s \begin{equation} \varphi_{pred}=\varphi+\dot{\varphi}t_s \end{equation} φpred=φ+φ˙ts
v x p r e d = v x \begin{equation} v_{xpred}=v_x \end{equation} vxpred=vx
v y p r e d = v y \begin{equation} v_{ypred}=v_y \end{equation} vypred=vy
φ ˙ p r e d = φ \begin{equation} \dot{\varphi}_{pred}=\varphi \end{equation} φ˙pred=φ

5 误差和曲率计算模块

注意角度的多值性,代码实现中使用
e φ = sin ⁡ ( φ − θ r ) \begin{equation} e_{\varphi}=\sin(\varphi-\theta_r) \end{equation} eφ=sin(φθr)
替代
e φ = φ − θ r \begin{equation} e_{\varphi}=\varphi-\theta_r \end{equation} eφ=φθr

6 前馈控制计算模块&控制计算模块

实现很简单,把前面计算的结果按公式算一下就好

function forword_angle = fcn(vx,a,b,m,cf,cr,k,kr)forword_angle=kr*(a+b-b*k(3)-(m*vx*vx/(a+b))*((b/cf)+(a/cr)*k(3)-(a/cr)));
end
function angle = fcn(k,err,forword_angle)angle=-k*err+forword_angle;
end

运行代码,效果如下:
在这里插入图片描述


http://www.ppmy.cn/devtools/145800.html

相关文章

C++中的类型转换

类型转换 概述: 将一个类型显式地转换为另一个类型的过程 C风格的强制转换: double pi 3.14; int iPi (int)pi;不安全性:可能会导致一些隐式转换被执行,转换失败没有明显的错误提示不推荐 static_cast(静态转换&…

Junit如何禁用指定测试类,及使用场景

在JUnit中禁用指定测试类可以通过多种方式实现,具体取决于使用的JUnit版本(JUnit 4 或 JUnit 5)。以下是针对两个版本的详细说明以及它们可能的使用场景: JUnit 4 禁用整个测试类 可以使用Ignore注解来忽略整个测试类。这将导致…

前端实现PDF预览的几种选择(pdfjs-dist、react-pdf、pdf-viewer)

记录 PDF预览的选型 对于浏览器自带的PDF预览 如果能直接使用,那自然最好不过了,但考虑多种因素,比如权限问题,禁止用户去下载PDF、预览样式不统一(不同浏览器PDF预览的实现不同),所有最终放弃…

HuaWei、NVIDIA 数据中心 AI 算力对比

HuaWei Ascend 910B Ascend 910B 是 HuaWei 于 2023 年推出的高性能 AI 处理器芯片,其对标产品为 Nvidia A100/A800,其算力表现如下: 峰值算力:Ascend 910B 的半精度(FP16)算力达到 256 TFLOPS(…

《英雄联盟》d3dcompiler_47.dll缺失是什么原因?d3dcompiler_47.dll缺失要怎么解决?

一、d3dcompiler_47.dll缺失的成因与影响 成因: DirectX版本不兼容:d3dcompiler_47.dll是DirectX的一个组件,负责Direct3D着色器编译。如果系统中安装的DirectX版本过低或过高,与游戏所需的版本不匹配,就可能导致d3d…

基于Spring Boot的工商局商家管理系统

一、系统背景与意义 随着市场经济的不断发展,商家数量日益增多,工商局对商家的管理需求也日益复杂。传统的管理方式存在诸多弊端,如信息不透明、管理效率低下等。因此,开发一种高效、便捷、智能化的工商局商家管理系统显得尤为重…

Linux 下的 GPT 和 MBR 分区表详解

在Linux系统中,分区表是描述存储设备上分区布局和属性的一种结构化数据。常见的分区表格式有MBR(Master Boot Record)和GPT(GUID Partition Table)。以下是这两种分区表的详解: MBR(Master Boot…

PTA数据结构编程题7-1最大子列和问题

我参考的B站up的思路 题目 题目链接 给定K个整数组成的序列{ N 1 ​ , N 2 ​ , …, N K ​ },“连续子列”被定义为{ N i ​ , N i1 ​ , …, N j ​ },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 1…