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

写在前面:

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

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

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

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

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


文章目录


引言

本篇博客是第八节的最后一部分,内容整理自 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,这是阿波罗算法。
matlab 复制代码
projection_point_thetar=thetar(dmin);%apollo
  • 投影点的 θ r \theta_r θr,等于匹配点的 θ r \theta_r θr 在加匹配点的曲率 κ \kappa κ 再乘 e s e_s es
matlab 复制代码
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参数来改善转角平滑度和减少突变现象。

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

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


参考资料

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


后记:

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

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

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

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

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

相关推荐
18号房客几秒前
计算机视觉-人工智能(AI)入门教程一
人工智能·深度学习·opencv·机器学习·计算机视觉·数据挖掘·语音识别
百家方案2 分钟前
「下载」智慧产业园区-数字孪生建设解决方案:重构产业全景图,打造虚实结合的园区数字化底座
大数据·人工智能·智慧园区·数智化园区
APP 肖提莫2 分钟前
MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
java·前端·算法
云起无垠9 分钟前
“AI+Security”系列第4期(一)之“洞” 见未来:AI 驱动的漏洞挖掘新范式
人工智能
OTWOL10 分钟前
两道数组有关的OJ练习题
c语言·开发语言·数据结构·c++·算法
Somnus陳21 分钟前
软考架构师笔记-计算机系统组成-1
笔记·系统架构
QQ_77813297427 分钟前
基于深度学习的图像超分辨率重建
人工智能·机器学习·超分辨率重建
qq_4335545437 分钟前
C++ 面向对象编程:递增重载
开发语言·c++·算法
清 晨40 分钟前
Web3 生态全景:创新与发展之路
人工智能·web3·去中心化·智能合约
带多刺的玫瑰1 小时前
Leecode刷题C语言之切蛋糕的最小总开销①
java·数据结构·算法