【自动驾驶】控制算法(八)横向控制Ⅳ | 调试与优化——让车辆行驶更平稳!

news2024/12/24 7:20:57

写在前面:
🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝
个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。

🔍 本文系 清流君 原创之作,荣幸在CSDN首发🐒
若您觉得内容有价值,还请评论告知一声,以便更多人受益。
转载请注明出处,尊重原创,从我做起。

👍 点赞、评论、收藏,三连走一波,让我们一起养成好习惯😜
在这里,您将收获的不只是技术干货,还有思维的火花

📚 系列专栏:【运动控制】系列,带您深入浅出,领略控制之美。🖊
愿我的分享能为您带来启迪,如有不足,敬请指正,让我们共同学习,交流进步!

🎭 人生如戏,我们并非能选择舞台和剧本,但我们可以选择如何演绎 🌟
感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行~~~


文章目录

  • 引言
  • 一、进阶横向控制与基础横向控制的区别
    • 1.1 道路坡度
    • 1.2 风阻问题
    • 1.3 识别问题
    • 1.4 车辆质量变化
  • 二、横向控制模型优化与仿真设置
    • 2.1 限幅模块的添加
    • 2.2 车辆初速度设置
  • 三、模型抖动问题的优化
    • 3.1 投影点角度算法的改进
    • 3.2 直线行驶与拐弯时抖动原因分析
  • 四、模型突变问题及其原因
  • 五、解决方案:改善规划与LQR参数调整
    • 5.1 样条曲线插值实现平滑过渡
    • 5.2 实际应用中的路径规划策略
    • 5.3 平滑转角的两种方法
  • 六、规划点密度对算法性能的影响
    • 6.1 规划点稀疏化对转角的影响
    • 6.2 规划点过稀疏的弊端
  • 七、总结
  • 参考资料


引言

  本篇博客是第八节的最后一部分,内容整理自 B站知名up主 忠厚老实的老王 的视频,作为博主的学习笔记,分享给大家共同学习。

  本篇博客把第八节第三小节所讲的模型再优化一下,而且这也是横向控制的最后一节,这一节讲完之后就不再讲横向控制了,之后讲纵向控制。

  思路是把纵向控制与横向控制的基本理论先走一遍,让大家有印象,有了印象之后再讲进阶的横向控制与纵向控制。


一、进阶横向控制与基础横向控制的区别

那么进阶的横向控制和基础的横向控制有什么区别呢?

  区别就在于考虑了更多的实际情况:

1.1 道路坡度

  道路不可能是平直的,都存在坡度。

1.2 风阻问题

  在高速控制中,风阻会成为很大的影响因素,所以要考虑风的存在,因为风阻会影响汽车的垂向力,影响汽车的侧偏刚度,所以风的影响也很重要,也要考虑在内。

1.3 识别问题

  比如要考虑坡度对控制的影响,但至少要知道坡度等于多少,即坡度该怎么测。如果无人车为了降成本,没有匹配高精地图(高精地图就是一张非常详细的地图,记载道路信息,包括坡度以及车道信息,但是高精地图非常昂贵)所以如果有的车为了降低成本而不使用高精地图,那么坡度就需要自己估算,这就是识别问题,即如何识别坡度。

1.4 车辆质量变化

  如果是普通的家用小轿车,拉人的重量和车的重量比算不了什么,不需要考虑增加载客对车辆质量的影响;但如果是专门拉货的大卡物流车,拉的货物重量可能是自身车重的好几倍,而事先不可预知拉的货到底多重,所以一旦遇到这种情况,质量就要在线估算。

那么上述这些问题如何解决呢?

  用卡尔曼滤波方法解决,不过关于卡尔曼滤波的使用,可能要到很久以后才会用到,所以现在如果不会也没关系,只要有心眼,有空就去学一学就可以了。


二、横向控制模型优化与仿真设置

  本篇博客的任务是把横向控制收尾。

  模型拿到之后不能直接用,要先跑一遍规划的代码以及离线 LQR 代码。当然前提是Carsim以及和 Simulink 的联合仿真设置好,这是一切的前提,然后再跑规划,这样和离线LQR代码在工作区里面就有 x r , y r x_r,y_r xr,yr之类的变量,然后再跑 Simulink 模型。

2.1 限幅模块的添加

  注意模型中加入了限幅模块:

在这里插入图片描述

  因为 LQR 不管物理限制,只是出算角度来。但在真实车辆上有物理限制,方向盘转角,或者车辆的前轮转角不可能转 360 360 360 度,所以在模型中也需要有这样的限制,在这里限制的就是 − 1 - 1 1 1 1 1,也就是限制前轮转角只能在 − 1 - 1 1 弧度到 1 1 1 弧度之间范围之内,不能超过范围。

  在上一节博客中跑过模型,看到了结果,当时评价是虽然有控制效果,动画也显示出控制效果:

在这里插入图片描述

  但控制效果不好,转角不停地抖来抖去,而且有突变现象,这是很不好的事情,该怎么解决?

  在写误差计算模块里面关于投影点的角度 θ r \theta_r θr 有两个算法:

  • 认为投影点的 θ r \theta_r θr 就等于匹配点的 θ r \theta_r θr,这是阿波罗算法。
projection_point_thetar=thetar(dmin);%apollo
  • 投影点的 θ r \theta_r θr,等于匹配点的 θ r \theta_r θr 在加匹配点的曲率 κ \kappa κ 再乘 e s e_s es
projection_point_thetar=thetar(dmin)+kappar(dmin)*es;%投影点的航向角

  当时用的是阿波罗算法,现在用使用第二个推荐的算法,再跑一遍模型,看一下结果:

在这里插入图片描述

  发现现在角度就平滑多了,几乎不抖动,和上面的结果相比好很多了。

2.2 车辆初速度设置

  在跑时一定要将 Carsim 里 Procedure 中的车辆初速度设为 0 0 0

在这里插入图片描述

  不能设的太快,因为默认是 120 120 120,或者干脆就不做控制。如果速度太快,道路设计又特别严苛,所以就会报错。


三、模型抖动问题的优化

再回到模型上来,可以想想为什么这么改就不抖动了。

3.1 投影点角度算法的改进

  在计算误差 e d , e ˙ d , e φ , e ˙ φ e_d,\dot e_d,e_\varphi,\dot e_\varphi ed,e˙d,eφ,e˙φ 时,都需要投影点的 θ r \theta_r θr 作为输入参数。根据阿波罗的算法,投影点的 θ r \theta_r θr 等于匹配点的 θ r \theta_r θr,然后根据离散的轨迹的规划,把匹配点定义为离车最近的规划点定义为匹配点。而车是不停运动的,在不停运动的过程中,匹配点肯定也会不停变化,这就会导致突变,因为不同点的匹配点 θ r \theta_r θr不一样,这就是抖动的根源。

3.2 直线行驶与拐弯时抖动原因分析

为什么在直线行驶时没有抖动呢?

  因为直线行驶时,所有匹配点的 θ r \theta_r θr 都一样是0,或者都是 180 180 180 度,那自然就没有抖动,但在转弯时,因为不同匹配点的 θ r \theta_r θr 不一样,所以当车在拐弯时,匹配点在切换时, θ r \theta_r θr 就会发生突变。

  这就是车辆在拐弯时,方向盘在不停抖动的根本原因,因为是离散的轨迹点,就会在匹配点之间不停的切换,就会有抖动。

那为什么加了 κ r e s \kappa_r e_s κres 就变好了?

  可以看第七节关于离散轨迹误差计算:

  【自动驾驶】控制算法(七)离散规划轨迹的误差计算

  因为加了 κ r e s \kappa_r e_s κres e s e_s es 会随着车辆的运动而连续变化。 κ r e s \kappa_r e_s κres 就是近似于连续的变化,这样就会抵消因为匹配点切换导致 θ r \theta_r θr 突变的影响,加了这项后,就变得相对连续变化了一点,当然不能完全抵消,所以还是会有抖动,但是抖动可忽略不计,可近似认为几乎连续变化的角度。


四、模型突变问题及其原因

  但代码只解决了抖动问题,突变问题还是没有解决。比如这里有很大的突变:

在这里插入图片描述

那突变是什么原因导致的呢?

  这其实是因为规划不合理而导致曲率不连续,即规划的轨迹曲率不连续,所以导致曲率突变,从而导致计算出来的前轮转角有突变。

  在图中红框拐弯处都有曲率突变的情况出现:
在这里插入图片描述

  因为规划时就比较简单粗暴,直接用直线和圆连接,并没有做很好的过渡,所以就导致在连接处曲率不连续,不连续就会导致突变。


五、解决方案:改善规划与LQR参数调整

那问题该怎么解决呢?

5.1 样条曲线插值实现平滑过渡

  其实就是做好过渡就可以了,在曲线与曲线之间的连接处,用样条曲线插值,因为样条曲线可以保证连接处的一阶导数以及二阶导数连续,如果一阶导数、二阶导数连续的话,曲率就连续,因为曲率的公式就是
κ = y ′ ′ ( 1 + y ′ 2 ) 3 2 \kappa =\frac{y''}{\left( 1+y'^2 \right) ^{\frac{3}{2}}} κ=(1+y′2)23y′′  如果的二阶导数连续,那么一阶导数也连续,也就意味着整个曲率函数就连续。

   在《车辆动力学及控制》这本书里也介绍了另一种过渡方法,使用回旋线,回旋线是一种特殊曲线,曲线的曲率和弧长成正比。

  回旋线是用参数方程描述的,参数方程是特殊函数的积分,具体可以看《车辆动力学及控制》上所介绍的回旋线,但回旋线的作用不大。因为回旋线很难用,参数方程是菲涅尔积分。菲涅尔积分是特殊函数的积分,不太好用,而且设计也不好设计,建议各位如果想过渡就用样条曲线插值就好,最简单。

  这里就不演示如何做样条曲线的插值了。因为在真实应用中,并不是这么干的,这就涉及到规划的知识了。

5.2 实际应用中的路径规划策略

在真实的应用场景中,往往有两种规划:

  • 全局路径规划
  • 局部路径规划

  在全局路径规划中可以允许曲率不连续,因为是全局路径规划,粗糙的规划就可以了,但在局部路径规划里就会对曲率有要求,所以全局路径规划和局部路径规划要结合。

  一般真实情况是这样做,开车不可能按照死的路线开,还要避让行人以及动物,或是绕过障碍物,都需要局部路径规划。

5.3 平滑转角的两种方法

  但在这里并没有讲局部路径规划,在没有局部路径规划的知识,只有全局路径规划的话,想让转角变得平缓,只有两种办法:

  • 做好过渡
    用样条曲线使过渡段的连曲率尽可能的连续。

  • 在 LQR 里把 R 调大
    意味着对前端转角给予更多的惩罚,在 LQR 里就倾向于算出比较小的转角出来,就算有突变也不会特别明显。

  所以根据样条曲线进行插值的全局路径规划就不演示了,因为几乎用不到,以后会讲全局路径和局部路径相结合的规划方式。局部路径规划需要把纵向控制学完后才能讲,因为局部路径规划是横向控制和综合控制结合在一起才会用。


六、规划点密度对算法性能的影响

6.1 规划点稀疏化对转角的影响

  算法可以大幅改进转角,不会过于抖动,所以即使规划点变稀疏,算法性能也是可以的,不妨可以试一试,把 count 的从 100 100 100 改到 30 30 30,规划点变稀疏,但转角也不会发生特别大的抖动。

  注意:规划不能特别少,特别少是不可以的,比如 count = 5

在这里插入图片描述

6.2 规划点过稀疏的弊端

  规划非常稀疏,就这么一点是不行的,用这种规划点运行,一定会报错,如果点和点之间过于稀疏的话,车很可能会绕围绕着其中一点不停打转,和其他两个点之间的距离特别远。因为 LQR 会倾向于让 e d , e ˙ d , e φ , e ˙ φ e_d,\dot e_d,e_\varphi,\dot e_\varphi ed,e˙d,eφ,e˙φ 达到最小。所以当点离其他点特别远的话,车就会倾向于靠近一点,就会出现以某一点为圆心,不停转来转去的现象。

  当转来转去时, e d , e ˙ d , e φ , e ˙ φ e_d,\dot e_d,e_\varphi,\dot e_\varphi ed,e˙d,eφ,e˙φ 就会越来越小,

为什么规划稠密了后就不会有这样的现象了?

  因为规划稠密后匹配点就换了,车在不停运动,匹配点的定义就是与车辆真实位置相比最短的点就是匹配点,如果规划点够稠密,匹配点就会沿着轨迹不停变动,从而保证车沿规划轨迹行驶。

  当点特别稀疏时,意味着车可能在很长一段时间匹配点都是同一点,所以就会倾向于往匹配点上靠近变成绕来绕去的情况,从而报错。所以规划点可以在一定程度上稀疏,但不能特别稀疏。


七、总结

  本篇博客探讨了横向控制算法的优化,重点关注了进阶横向控制与基础横向控制之间的差异,以及如何通过卡尔曼滤波等方法解决实际问题。总结了道路坡度、风阻、识别问题和车辆质量变化对横向控制的影响,并探讨了如何使用样条曲线插值和调整LQR参数来改善转角平滑度和减少突变现象。

  通过这些改进,我们发现即使在规划点稀疏的情况下,算法性能依然可以保持,也强调了规划点不能过于稀疏的重要性,因为过于稀疏的规划会导致车辆偏离预定轨迹,甚至出现异常行为。

  本篇博客把所有要讲的内容都讲完了,接下来是纵向控制,感谢大家阅读,下一篇博客讲解车辆的纵向控制。


参考资料

  【基础】自动驾驶控制算法第八讲(四) 调试与优化(第八讲完结)


后记:

🌟 感谢您耐心阅读这篇关于 横向控制算法调试与优化 的技术博客。 📚

🎯 如果您觉得这篇博客对您有所帮助,请不要吝啬您的点赞和评论 📢

🌟您的支持是我继续创作的动力。同时,别忘了收藏本篇博客,以便日后随时查阅。🚀

🚗 让我们一起期待更多的技术分享,共同探索移动机器人的无限可能!💡

🎭感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2158527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML5 Video标签的属性、方法和事件汇总,以及常用视频插件推荐

🚀 个人简介:某大型国企资深软件研发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…

PHP+uniapp微信小程序基于Android系统的旅游攻略系统cxj499

目录 技术栈和环境说明文件解析具体实现截图php技术介绍微信开发者工具HBuilderXuniapp详细视频演示开发技术简介解决的思路性能/安全/负载方面数据访问方式PHP核心代码部分展示代码目录结构解析系统测试感恩大学老师和同学源码获取 技术栈和环境说明 本系统以PHP语言实现&…

数据结构7—树(顺序存储二叉树—堆)含TOPK问题

1.树 1.1树的概念与结构 树是一种非线性的数据结构,它是由 n(n > 0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点&#x…

Linux 安装JDK8和卸载

目录 一、下载JDK8的rpm包 二、安装JDK 三、设置环境变量 Linux环境下安装JDK的方式有多种,可以通过rpm包、yum安装或者tar.gz压缩包。本章节会教大家通过前两者方式来安装JDK,压缩包的形式因为下载压缩包后上传到服务器环境下,将压缩包解…

1.6 计算机网络体系结构

参考:📕深入浅出计算机网络 常见的三种计算机网络体系结构 TCP/IP体系结构 路由器一般只包含网络接口层和网际层。 应用层TCP/IP体系结构的应用层包含了大量的应用层协议,例如HTTP、SMTP、DNS、RTP等运输层TCP和UDP是TCP/IP体系结构运输层的…

召回的在线评估与离线评估

在现代信息检索、推荐系统等应用场景中,召回阶段扮演着至关重要的角色。召回系统负责从海量候选项中筛选出潜在相关的内容,因此其效果直接影响用户的满意度和系统的效率。为了确保召回系统的性能,我们需要对其进行评估,而评估方法…

Python3爬虫教程-HTTP基本原理

HTTP基本原理 1,URL组成部分详解2,HTTP和HTTPS3,HTTP请求过程4,请求(Request)请求方法(Request Method)请求的网址(Request URL)请求头(Request H…

Cilium + ebpf 系列文章-ebpf-map(二)

前言: 上一章节讲述了什么是:ebpf. Cilium + ebpf 系列文章-什么是ebpf?(一)-CSDN博客一、We Create a container be a Server.二、We Create a container be a Client.三、Them link at a Bridge.四、 Do test.一、Test-tools。3、当你执行l s操作时,会调用open的系统调…

Vulkan 学习(8)---- vkImageView 创建

目录 OverView创建方法关键结构参考代码 OverView Vulkan 的图像视图(VkImageView) 用于描述如何访问 VkImage 对象以及访问图像的哪一部分, 图像视图定义了图像格式和访问方式,允许渲染管线和图像进行交互,无论是作为纹理,颜色附件或者深度…

HTTP.SYS远程代码执⾏(MS15-034) MS-->Microsoft 2015 -034

环境 windows server 2012 IIS8.5 复现 1.访问⽹站 2.主⻚图⽚ iis8.5的是(iis-85.png),其他的可以根据百度查,每个版本的欢迎⻚都不⼀样 3.编辑请求头,增加Range: bytes0-18446744073709551615字段,若…

车路云一体化大模型数据治理方案

车路云一体化大模型数据治理解决方案 "杭州市发改委已批复了杭州交通投资集团的智能网联汽车“车路云一体化”试点项目。这一批复体现了其对该项目可行性研究报告的肯定,预示着杭州市在智能驾驶领域的进一步发展。" 2024年6月18日,第十一届国…

Spring Boot集成Redis Search快速入门Demo

1.什么是Redis Search? RedisSearch 是一个基于 Redis 的搜索引擎模块,它提供了全文搜索、索引和聚合功能。通过 RedisSearch,可以为 Redis 中的数据创建索引,执行复杂的搜索查询,并实现高级功能,如自动完…

简历技能面试问答

变成语言和开发工具 C新特性 自动类型推导 (auto): 自动推导变量的类型,减少显式类型声明的繁琐 范围 for 循环: 用于遍历容器或数组,简化代码。 nullptr: nullptr 取代 NULL,表示空指针,类…

出海企业如何利用海外云手机开展业务?

随着全球化的持续推进,越来越多的企业将目光投向海外市场。然而,面对不同国家的网络环境、政策限制以及文化和语言的差异,出海企业在拓展海外业务时遇到了许多障碍。海外云手机作为一种创新的解决方案,为企业提供支持和帮助。 海外…

【高阶用法】uniapp的i18n/修复/增强/App无重启更换语言

痛点 在i18n多语言模块使用过程中,发现下面几个问题,需要解决 1)uni-best框架下,$t功能函数无法实时的切换语言,可能跟使用有关 2)uni-best建议的translate方式在vue块外使用太繁琐,希望不用…

verilog中非阻塞多个if 优先级判断。

always(posedge clk)beginz < 0;if(sel0)z < a;if(sel1)z < b;if(sel2)z < c;if(sel3)z < d;end 比如上述代码&#xff0c;最后一级的优先级最高。

深入理解 JavaScript 三大作用域:全局作用域、函数作用域、块级作用域

一. 作用域 对于多数编程语言&#xff0c;最基本的功能就是能够存储变量当中的值、并且允许我们对这个变量的值进行访问和修改。那么有了变量之后&#xff0c;应该把它放在哪里、程序如何找到它们&#xff1f;是否需要提前约定好一套存储变量、访问变量的规则&#xff1f;答案…

Teams会议侧边栏应用开发-会议转写

Teams应用开发&#xff0c;主要是权限比较麻烦&#xff0c;大量阅读和实践&#xff0c;摸索了几周&#xff0c;才搞明白。现将经验总结如下&#xff1a; 一、目标&#xff1a;开发一个Teams会议的侧边栏应用&#xff0c;实现会议的实时转写。 二、前提&#xff1a; 1&#x…

株洲芦淞大桥事故的深刻反思

株洲芦淞大桥事故的深刻反思 2024年9月23日清晨&#xff0c;株洲芦淞大桥上发生了一起令人痛心的交通事故&#xff0c;一辆白色小汽车被出租车追尾后失控&#xff0c;冲向对向车道&#xff0c;最终酿成6人死亡、多人受伤的惨剧。 这起事故不仅给受害者家庭带来了无法弥补的伤…

【Python机器学习系列】开发Streamlit应用程序并部署机器学习模型(案例+源码)

这是我的第357篇原创文章。 一、引言 近年来&#xff0c;随着机器学习和人工智能技术的迅猛发展&#xff0c;越来越多的研究者选择将他们的模型以应用程序&#xff08;App&#xff09;的形式进行部署&#xff0c;从而使审稿人和其他研究者可以通过简单的界面&#xff0c;输入相…