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

写在前面:
🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝
个人主页:清流君_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.xdnf.cn/news/148731.html

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

相关文章

iPhone锁屏密码忘了怎么解锁?轻松解锁攻略来了

在日常生活中,智能手机已成为我们不可或缺的伙伴。其中,iPhone以其出色的性能和优雅的设计,赢得了全球用户的喜爱。然而,即便是最忠实的iPhone用户,也可能会遇到一些棘手的问题,比如忘记了锁屏密码。面对这…

【高效且应用广泛的排序 —— 快速排序算法】

高效且应用广泛的排序 —— 快速排序算法 快速排序是一种常用的排序算法,主要采用分治的思想。以下是对快速排序算法的详细介绍及代码示例: 快速排序的基本思路是,每次将一个位置上的数据归位,使得该数左边的所有数据都比该数小…

工业物联网关为工业生产数字化转型赋能-天拓四方

一、引言 在工业4.0的大背景下,工业物联网关成为了制造业转型升级的关键技术之一。它通过连接设备和系统,实现数据的实时采集、处理和传输,从而提升生产效率、降低成本、优化资源配置,并最终推动整个制造业的数字化进程。本文将详…

AJAX 入门 day3 XMLHttpRequest、Promise对象、自己封装简单版的axios

目录 1.XMLHttpRequest 1.1 XMLHttpRequest认识 1.2 用ajax发送请求 1.3 案例 1.4 XMLHttpRequest - 查询参数 1.5 XMLHttpRequest - 数据提交 2.Promise 2.1 Promise认识 2.2 Promise - 三种状态 2.3 案例 3.封装简易版 axios 3.1 封装_简易axios_获取省份列表 3…

Android OpenGLES2.0开发(二):环境搭建

世界没有悲剧和喜剧之分,如果你能从悲剧中走出来,那就是喜剧,如果你沉缅于喜剧之中,那它就是悲剧。——科马克麦卡锡《路》 ​​​ OpenGL ES环境搭建 Android 应用中使用 OpenGL ES 绘制图形,必须创建一个显示容器。…

Rust - 字符串:str 与 String

在其他语言中,字符串通常都会比较简单,例如 “hello, world” 就是字符串章节的几乎全部内容了。 但是Rust中的字符串与其他语言有所不同,若带着其他语言的习惯来学习Rust字符串,将会波折不断。 所以最好先忘记脑中已有的关于字…

【一起学NLP】Chapter2-学习神经网络

目录 学习神经网络损失函数Tip:One-hot向量导数与梯度Tip:严格地说链式法则计算图反向传播其他典型的运算结点乘法结点分支节点Repeat节点Sum节点MatMul节点 Tip:浅拷贝和深拷贝的差异梯度的推导和反向传播的实现Sigmoid层Affine层Softmax with Loss层 权重的更新——随机梯度下…

机械手末端快换技术:工业自动化的强大新动力

在飞速发展的工业自动化领域,机械手无疑是生产线上的关键成员,其性能与效率对整个生产流程的顺畅性与高效性起着至关重要的作用。而机械手末端快换技术,作为这一领域的创新性突破,正以其卓越的优势引领着工业生产的巨大变革。 机…

迷雾大陆免费辅助:强流派推荐攻略!VMOS云手机自动辅助挂机教程!

使用VMOS云手机辅助《迷雾大陆》游戏,让你的游戏体验更轻松高效。VMOS云手机专为《迷雾大陆》提供了定制版的云手机,内置游戏安装包,无需再次下载安装。同时,VMOS云手机支持免费的辅助工具,可以24小时不间断地辅助游戏…

多肽合成的一般步骤 -- 固相合成篇

1.1 溶剂的处理 DMF、甲醇在使用前用G3孔的分子筛浸泡过夜除杂质和水。 1.2 树脂的充分溶胀 称取2.0 g 空白Wang树脂于洁净干燥的反应管中,加入15 mL DMF,室温活化30 min左右。 1.3 接第一个氨基酸 室温下,通过沙芯抽滤掉上步溶剂&#xf…

中电金信 :基于开放架构的私有云建设实践

01开放架构私有云诞生背景 随着国产化创新建设的深化,产业侧行业软件持续进行云原生改造,金融机构拥抱云和容器技术,实现数智化转型已是大势所趋。近年,云原生技术以及架构发展速度更是惊人,私有云开始有了新架构、有了…

<刷题笔记> 力扣105/106题 使用中序+前(后)序构造二叉树

在曾经的博客中,曾经记录过这样一题: 二叉树遍历_牛客题霸_牛客网 (nowcoder.com) 这是一个只需要前序就能构造二叉树的题,因为一旦遇到空,就有"#"作为返回的标志,能够立刻返回。 1. 中序前序 完全可以借鉴…

select查询表单

select查询语法: select 【1】from 【2】where 【3】 1若为*表示显示全部数据列,若为某一列列名则只显示本列内容(也可为多列列名)。若在1后面加as ‘c’,则表示把查询的列名换成c。 2为要查询的表表名。 3为查询的…

众数信科 AI智能体智慧文旅解决方案——智能旅行助手

智慧文旅解决方案 智能旅行助手方案 利用先进的AI算法 提供个性化旅游体验的智能服务 众数信科AI智能体 产品亮点 旅游路线智能规划 旅游景点智能问答 旅行游记智能生成等 构建旅行实用指南 让旅游更加便捷、高效、智能化 关于我们 众数信科成立于2021年,由…

CentOS Linux教程(6)--CentOS目录

文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑),然后C盘、D盘。 Linux系统的根目录是/,我们可以使用cd /进入根目录,然后使…

【mysql】case...when...、group...by、sum() 聚合函数... 企业组合使用实际场景示例

文章目录 查询需求场景预设查询结果SQL实现查询 查询需求场景 -- 统计当月不同流程类型的审批通过流程数、审批终止流程数、审批驳回流程数、新增流程数(归档终止退回)、申请总条目数(关联任务单申请条目数总数)-- 查询思路&…

蘑菇成熟待收检测系统源码分享

蘑菇成熟待收检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

最适配达梦、人大金仓的sql工具是什么?

SQLynx是一款功能强大的数据库管理工具,它不仅支持Oracle、MySQL等国际主流数据库,还很好地支持了武汉达梦、人大金仓等国产数据库。这款工具具有以下几个特点: 1.广泛支持:SQLynx支持多种数据库系统,包括PostgreSQL、…

ADC 位的作用

示波器的横轴表示时间基准(秒/格或 s/p),而纵轴表示电压(伏/格或 V/p)。垂直精度是指示波器显示信号电压的准确程度,这对于视觉呈现和测量至关重要。示波器屏幕上的电压读数越接近实际信号电压,…

专为工程地质领域安全监测而设计,BWII型广播预警遥测系统助您实现全面监测!

专为工程地质领域安全监测而设计,BWII型广播预警遥测系统助您实现全面监测! BWII型广播预警遥测系统是一款新型的雨量预警监测仪,具备多通道和多类型传感器接入功能。该系统能够定时采集和发送电压、电流、数字和脉冲等信息,同时结…