当前位置: 首页 > news >正文

【自动驾驶】控制算法(一)绪论与前期准备

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

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

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

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

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

文章目录

  • 引言
  • 一、谨慎、批判、怀疑的态度
  • 二、常用工具
    • 1、Google
    • 2、Github
  • 三、软件组合
    • 1、Matlab + Carsim
    • 2、Linux + ROS
  • 四、书籍推荐
    • 1、《无人驾驶车辆模型预测控制》龚建伟
    • 2、《车辆动力学及控制》拉杰什·拉贾马尼 (Rajesh Rajamani)
  • 五、自动驾驶技术路线
  • 六、感知技术的各研究方向
    • 1、基于视觉的感知
    • 2、基于激光雷达的感知
    • 3、多传感器融合感知
      • a)视觉与其他传感器的融合
      • b)加入高精地图的融合
  • 七、自动驾驶中的芯片难题
    • 1、芯片计算速度
    • 2、芯片发热问题
    • 3、芯片可靠性要求
  • 八、总结
    • 1、跨学科挑战与心理准备
    • 2、对待新技术的态度
  • 参考资料


引言

  各位小伙伴们大家好,本篇博客开一个新的系列,自动驾驶控制算法。内容整理自 B站知名up主 忠厚老实的老王 的视频,作为博主的学习笔记,分享给大家共同学习。

  自动驾驶是比较新、也比较火的技术,这个系列介绍自动驾驶关于控制方面的算法。


一、谨慎、批判、怀疑的态度

  在开启这一系列的介绍之前,要先提醒大家一句:请以审慎批判和怀疑的眼光审视目前市面上所有关于自动驾驶技术方面的书籍、教程、文献以及论文。其原因在于,新兴技术往往伴随着模糊性和争议性。自动驾驶技术,作为一项相对较新的领域,自然也不例外。

  自动驾驶技术的创新速度之快,使得它不同于那些已经发展了几百年甚至几千年的学科,如数学和物理。后者的发展已经相当成熟,相关的教科书通常不会存在模糊性或争议,也不会有明显的错误。

  然而,自动驾驶技术则不同,由于其新颖性,目前学术界和工业界都尚未形成一个成熟的、总结性的文献或著作。虽然网络上充斥着大量介绍自动驾驶技术的文章,市面上也有许多相关书籍销售,但不可避免的是,这些资料普遍存在错误,即便是出自知名人士或机构之手的论文和文章也不例外。

  无论是斯坦福、麻省理工的学者,还是参与 863 计划的科学家,他们所出版的书籍和论文中也存在诸多错误。

  因此,我们在对待这些资料时应持批判性思维,取其精华,去其糟粕,切不可盲目迷信权威。这也适用于本博客所写的教程,大家在学习时也应保持谨慎、批判和怀疑的态度。


二、常用工具

  下面介绍一下学习自动驾驶的常用工具,不限于控制算法,如果想做其他的关于自动驾驶的研究,这些工具也是必不可少的,最有力的工具就是谷歌和GitHub。

1、Google

  有人可能会问,就用百度搜索行不行?

  百度的话主要是搜不到GitHub,所以建议大家不要用百度了,直接用 Google浏览器 就行

2、Github

  GitHub 上面有很多自动驾驶相关的文献以及相关代码,而且 GitHub 上有很多做自动驾驶的技术牛人,跟他们学习对自己的提高非常快。


三、软件组合

1、Matlab + Carsim

  软件需要 Matlab,最好是 Matlab R2020a + Carsim 2019.1,主要是这两个软件。

  Casim 是车辆动力学仿真软件,对 Matlab的版本有要求,如果用其他版本的Matlab可能不兼容,所以推荐版本是 Matlab R2020a + Carsim 2019.1 的组合。

  这两个软件是用来做自动驾驶仿真的 ,Matlab 主要用来写控制算法的程序,然后把程序送到 Carsim 仿真。

2、Linux + ROS

  如果学得更深入一点,就涉及到 ROS 和 Linux 。


四、书籍推荐

  主要推荐两本书。

1、《无人驾驶车辆模型预测控制》龚建伟

在这里插入图片描述
  第一本是《无人驾驶车辆模型预测控制》,由北京理工大学的龚建伟教授团队编写,这本书在车辆动力学建模方面的内容较为全面,读者在阅读时应持有批判和怀疑的态度,客观审视,理性分析。

2、《车辆动力学及控制》拉杰什·拉贾马尼 (Rajesh Rajamani)

在这里插入图片描述
  第二本是《车辆动力学及控制》,这是原版《Vehicle Dynamics and Control》的中译本。百度 Apollo 的算法就是基于此书中的原理,可见其内容具有很强的实用性和参考价值。


五、自动驾驶技术路线

  下面探讨自动驾驶技术,该技术大致可以分为四个部分:

感知
决策
规划
控制

  虽然控制理论在严格意义上来说也具有一定的难度,但相对来说,控制领域更为成熟。通常涉及的控制方法有三种:

  • 比例-积分-微分控制器(Proportional-Integral-Derivative Controller, PID)
  • 线性二次调节器(Linear Quadratic Regulator, LQR)
  • 模型预测控制(Model Predictive Control, MPC)

  控制理论相对较为成熟。控制的难点并不在于理论本身,而在于有时候理论计算可能非常精确,但实际操作中却可能出现与理论不符的情况。

  控制技术的路线相对来说已经较为明确,方法有限,因此相对来说控制技术更容易学习。


六、感知技术的各研究方向

  感知技术的每个研究方向都有其各自的优点和缺点:

1、基于视觉的感知

  基于视觉的感知方法,即利用摄像头进行环境感知。

  在这一领域,特斯拉的方案尤为著名,特斯拉采用的是纯视觉感知方案。然而,这种方案的局限性在于,在夜间或浓雾等能见度较低的环境条件下,其感知性能会显著下降。

2、基于激光雷达的感知

  采用基于激光雷达技术的方案,即使用激光雷达进行环境感知。

  大多数创业公司基本上采用的是激光融合技术。缺点就是激光雷达的成本较高。不过,最近激光雷达在成本方面取得了一些突破,未来激光雷达的成本有望降低。个人认为激光雷达技术具有很好的发展前景。

3、多传感器融合感知

a)视觉与其他传感器的融合

  主流方案的是视觉融合其他传感器,但不是视觉和激光雷达的融合,因为激光雷达太贵了,而是比如毫米波雷达超声波雷达之间的融合,主要因为便宜。

b)加入高精地图的融合

  高精地图是一个未来的发展方向,但是现在还进展还比较缓慢,主要是因为高精地图的绘制费时费力,而且可能属涉及国家安全,并不是所有企业和个人都有资格测绘高精地图。

  因此,感知模块的技术路线目前尚未明确,各种方法均在探索之中,包括基于视觉的、基于激光的,以及多传感器融合的方法都有研究者在研发。目前来看,这一模块相对而言不够成熟,并且是自动驾驶技术中较难的部分。


七、自动驾驶中的芯片难题

1、芯片计算速度

  自动驾驶技术的一个难点在于芯片的计算速度。由于自动驾驶系统需要进行大量计算,其所需的芯片性能大致相当于台式机级别,这一点看似容易实现,因为高性能的台式机芯片,如英特尔和AMD生产的芯片早已普及。但实际上这一要求在自动驾驶领域的应用并非简单事。

2、芯片发热问题

  车载芯片的工作环境极其恶劣,远比台式机的环境要严苛得多。

  我们在电脑上使用的CPU,需要额外安装风冷或水冷系统来控制其功耗,防止因过热而降频。而在车辆中,芯片的工作环境更为恶劣。

  在家中使用电脑时,温度通常只是室温,最多达到30至40度,而车辆中的芯片却要面对更高的温度问题。如果是燃油车,发动机燃烧时产生的温度极高,可达几百度。即便是电动车,电机和电池在运行时也会产生大量热量,温度同样很高。

3、芯片可靠性要求

  此外,车辆在行驶过程中还会遭受震动和冲击,这些都可能影响芯片的可靠性。芯片的计算速度慢并不是最严重的问题,最怕的是芯片损坏。在完全自动驾驶的车辆中,一旦芯片损坏,可能会导致灾难性的后果。电脑CPU损坏顶多导致黑屏,但车辆芯片的损坏则可能危及人身安全。

  因此,车载芯片对在恶劣环境下的稳定性和抗冲击能力有更高的要求。它们需要在高温环境下稳定工作,同时能够承受突如其来的猛烈冲击,且不能出现故障。这样的技术难度是相当大的。

  不过,这些内容与本博客的教程无关,只是顺便提及,我们的教程主要还是讲解控制方面的内容。


八、总结

  本篇博客不讲具体的控制算法,只是告诉大家要用哪些工具、软件、书籍,要把这些东西准备好。

1、跨学科挑战与心理准备

  在一般的课程中,通常会有一些入门的门槛,也就是说,需要学习过某些特定的课程之后,才能够完全理解这门课程。但在此处不明确指出具体的学习门槛,原因在于涉及的学科范围过于广泛。基本没有任何一门专业能够全面覆盖所有这些学科。因此,无论读者来自哪个学校、哪个专业,后面讲述的内容中必然包含一些不属于所学学科的知识点。因此,需要做好相应的心理准备。这门课程的难度恰恰在于其跨学科的广泛性,涉及的学科领域实在太多了。

2、对待新技术的态度

  最后,赠予大家一句忠告:不要盲目崇拜所谓的专家或权威,也不要对书籍和学术论文过于迷信。面对新技术的任何技术性资料,我们都应保持审慎的态度。在学习过程中,不可避免地会遇到一些超出自己舒适区的跨学科知识。尽管博主会尽力将这些内容讲解得简洁明了,但对于某些人来说,可能仍然会有一定的畏惧感。所以有几点比较重要:

  • 第一就是要自信,其实没什么难的。
  • 第二就是要勇敢,勇于探索,这才是最重要的。

  特别是在学习新技术时,往往缺乏现成的资料可供查阅,也没有现成的技术博客可供参考,所有的知识和技能都是通过自己一点一滴的努力逐渐积累起来的。当真正掌握了这些知识,成功攻克了难关之后,会意识到这一切并没有想象中那么困难。任何学科知识,一旦被写入书籍,就意味着它已经被人类掌握。尤其是像控制学这样较为成熟的学科,其实并无可惧之处,尽管它涉及多个学科领域,但仍然不必感到害怕,要对自己充满信心。

  从下一篇博客开始正式讲解无人驾驶的控制算法!欢迎关注!


参考资料

  【基础】自动驾驶控制算法第一讲 绪论与前期准备


后记:

🌟 感谢您耐心阅读这篇关于 自动驾驶控制算法 | 绪论与前期准备 的技术博客。 📚

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

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

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

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

相关文章:

【自动驾驶】控制算法(一)绪论与前期准备

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

CSDN创作一周年总结

一周年总结 文章目录 一周年总结我的第一篇文章这一年我收获到了什么?1.培养了逻辑能力2.形成了自己的知识库,知识网络3.功利性的收获 我的第一篇文章 不知不觉之间,也已经过去一年了。还记得第一次决定在csdn上写博客,是因为进入…...

World of Warcraft [CLASSIC] the Eye of Eternity [EOE] P1-P2

World of Warcraft [CLASSIC] the Eye of Eternity [EOE] 永恒之眼(蓝龙) 第一阶段 第二阶段 第三阶段 载具1-6技能介绍 World of Warcraft [CLASSIC] the Eye of Eternity [EOE]_永恒之眼 eoe-CSDN博客 永恒之眼怎么出副本呢,战斗结束&am…...

一键翻译全球:多语言支持下的英文翻译工具

随着科技的飞速发展,一系列英文翻译工具应运而生,它们以人工智能为驱动,极大地简化了跨语言交流的过程。本文将带您一窥英文翻译工具探索那些能够帮助我们跨越语言鸿沟的神奇工具。 1.福昕在线翻译 链接直达>>https://fanyi.pdf365.c…...

水战再起波澜,“怡宝”要下好怎样一盘棋?

不少投资者常把那些刚需性强、永远也不可能淘汰的产业称为“日不落产业”,从细分板块来看,水无疑具有一定代表性。农夫山泉掌门人钟晱晱曾直言:“我选择了一个日不落的产业,你永远要喝水,不可能不喝水。” 多年下来&a…...

使用maven快速生成打包文件3

这里再介绍一种打包方式&#xff0c;依赖包分开打包&#xff0c;直接将需要部署的文件打包成一个要锁文件&#xff0c;比如kafka-roma-bin.tar.gz&#xff0c;这里需要两个文件&#xff0c;一个pom2.xml&#xff0c;一个package.xml。 pom2.xml <?xml version"1.0&q…...

Excel技巧(一)

快捷键技巧 原文链接 选取某一行的数据直到最后一行&#xff1a;【CTRL SHIFT ↓ 】或者选取一行后按住SHIFT键&#xff0c;双击下边线就可以快速选取区域。 如果表格中有多行空行&#xff0c;可以先按CTRL SHIFT END&#xff0c;再按CTRL SHIFT 上下键调整&#xff0c;…...

C语言:文件复制

文本文件复制&#xff1a; #include<stdio.h>int main() {FILE* pFile1 NULL;FILE* pFile2 NULL;fopen_s(&pFile1,"D:\\11111.txt","r");fopen_s(&pFile2,"D:\\222.txt", "w");char c;while((cfgetc(pFile1))!EOF){f…...

谈谈建筑项目管理:类型、流程和工具

无论是在材料采购还是供应商管理方面&#xff0c;确保建筑项目按计划进行并控制在预算内始终是一项挑战。 如今&#xff0c;建筑项目管理正逐步采用软件驱动的方法来提升其效率。这一转型显著优化了项目规划、调度和资源配置&#xff0c;使建筑管理更加精确和高效。 什么是建…...

【Vue】生命周期函数

系列文章目录 第五章 生命周期函数 文章目录 系列文章目录 生命周期函数代表的是Vue实例&#xff0c;或者是Vue组件&#xff0c;在网页中各个生命阶段所执行的函数。生命周期函数可以分为创建阶段、挂载阶段、更新阶段以及卸载阶段。 创建阶段&#xff1a;setup挂载阶段&…...

C++系列-文件操作

文件操作 文件类型文本文件二进制文件 文件操作的三大类文件的打开方式ios::app(append)和 ios::ate(at end) 写文件写文件文件步骤读文件文件步骤二进制文件读写写一般数据写特殊数据 程序运行时产生的数据都属于临时数据&#xff0c;一旦程序运行完毕&#xff0c;就会释放&am…...

ES6解构赋值详解;全面掌握:JavaScript解构赋值的终极指南

目录 全面掌握&#xff1a;JavaScript解构赋值的终极指南 一、数组解构赋值 1、基本用法 2、跳过元素 3、剩余元素 4、默认值 二、对象解构赋值 1、基本用法 2、变量重命名 3、默认值 4、嵌套解构 三、复杂的嵌套结构解构 四、函数参数解构赋值 1、对象解构作为函…...

2-73 基于matlab的weber能量法求解齿轮时变啮合刚度的程序

基于matlab的weber能量法求解齿轮时变啮合刚度的程序&#xff0c;能够跑出刚度图&#xff0c;通过求解轮齿部分变形、基体变形及局部接触变形这三部分的变形&#xff0c;进而求得综合弹性变形&#xff0c;最终求出时变啮合刚度。程序已调通&#xff0c;可直接运行。 2- 73 齿轮…...

[C++]set和map的介绍及使用

关于set和map的接口函数部分&#xff0c;只重点介绍一些相较于别的容器有特殊地方的接口&#xff0c;set和map的接口可以触类旁通。 一、概念 &#xff08;一&#xff09;、关联式容器 关联式容器存储的元素是一个个的键值对<key,value>。通过键&#xff08;key&#x…...

【MySQL】MySQL学习笔记(持续更新)

1. 安装MySQL&#xff08;windows环境&#xff09; &#xff08;1&#xff09;在http://www.mysql.com下载*.msi的安装文件&#xff0c;并运行安装&#xff1a; 如&#xff1a;mysql-installer-community-8.0.39.0.msi 全部安装包含如下内容&#xff1a; …...

ArcGIS如何将投影坐标系转回为地理坐标系

有时候两个数据&#xff0c;一个为投影坐标系&#xff0c;另一个为地理坐标系时&#xff0c;在GIS软件中位置无法叠加到一起&#xff0c;这需要将两个或多个数据的坐标系统一&#xff0c;可以直接将地理坐标系的数据进行投影&#xff0c;或将投影坐标系转为地理坐标系。下面介绍…...

Parallels Desktop 19 for Mac 安装虚拟机需要激活吗

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机&#xff0c;并于其中装设不同的操作系统&#xff0c;如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时&#xff0c;您可在 …...

wps题注为表格或图片编号

word中为表格添加题注&#xff1a; 问题&#xff1a;多次或多人编辑导致--序号不能联动更新&#xff08;域代码不一致,如图&#xff09; 所以是否可以批量替换word里的域代码&#xff1f;如果可以这问题就解决了————失败 解决办法&#xff1a; 如图&#xff0c;复制表头&…...

集成测试怎么做?

任何产品想要长期保持高质量运行&#xff0c;集成测试正是实现这一目标必不可少的工具。 本文重点介绍集成测试实现的流程&#xff0c;而非测试工具本身。我们的目的是聚焦于创建测试过程中你可能遇到的问题&#xff0c;以便你能自主地推进工作。 缺陷的成本 细节决定成败&a…...

java mybatis 使用work id

在 MyBatis-Plus 中&#xff0c;如果你想要使用 WORK_ID 作为 ID 生成策略的一部分&#xff0c;通常是指使用雪花算法&#xff08;Snowflake Algorithm&#xff09;的一种变体来生成全局唯一 ID。雪花算法能够生成一个递增的 64 位整数作为 ID&#xff0c;这种 ID 在分布式系统…...

MySQL 的子查询(Subquery)

在数据库查询中&#xff0c;有时候我们需要从一个查询的结果集中获取数据&#xff0c;再将这些数据作为另一个查询的一部分来使用。MySQL 提供了子查询&#xff08;Subquery&#xff09;这一强大工具&#xff0c;帮助我们实现嵌套查询&#xff0c;从而解决复杂的数据检索需求。…...

后端Web之数据库(以MySQL为例)

目录 1.概述 2.MySQL 3.DDL 4.DML 5.DQL 1.概述 对于我们自己写的一些小功能&#xff0c;数据一般存储在文件中&#xff0c;比如XML文件。而在实际项目中&#xff0c;数据都是存放在数据库中的。数据库&#xff08;DataBase &#xff09;是一个存储数据的集合&#xff0c…...

委托发布 | 进迭时空联合移动云能力中心实现业界首个RISC-V IO虚拟化方案

仟江水商业电讯&#xff08;8月22日 北京 委托发布&#xff09;虚拟化是云计算技术基石&#xff0c;是RISC-V走进云计算等高性能计算场景的必然要求。RISC-V国际基金会2021年制定了Hypervisor 1.0规范&#xff0c;2023年制定了AIA 1.0规范和IOMMU 1.0规范&#xff0c;这3个规范…...

3-Electron打开新窗口,并跳转到指定的路由

需要配置路由。src/router/index.js {path: "/selectMode",name: "selectMode",component: () > import("//view/selectMode/index.vue"),},src/**.vue import { ipcRenderer } from "electron";const openNewTab () > {let p…...

comfyUI和SD webUI都有哪些差别呢?

ComfyUI和SD WebUI都是用于AI绘画的用户界面&#xff0c;它们各自有着不同的特点和适用场景。以下是两者之间的一些关键差别&#xff1a; 1、用户体验与界面友好性: SD WebUI&#xff08;Stable Diffusion Web User Interface&#xff09;以其直观易用著称&#xff0c;特别受初…...

MySql中常用的sql语句大全(工作常用篇)

1. DDL 1.1 操作数据库 --创建库 create database 库名;--创建库时判断库是否存在&#xff0c;不存在则创建 create database if no exists 库名;--查看所有数据库 show databases;--使用指定数据库 use 库名;--查看当前指定数据库包含的数据表 show tables;--查看数据库的结…...

React+Vis.js(03):vis.js设置节点形状

文章目录 Vis支持的形状类型代码实现完整代码实现效果Vis支持的形状类型 circle(圆形)box(盒子)dot(点)star(五角星)triangle(三角形)ellipse(椭圆形)triangleDown(倒三角形)diamond(菱形)代码实现 通过shape属性来定义每个节点的形状 const nodes = new vis…...

Pod和Deployment

一、pod Evicted状态&#xff1a; 在Kubernetes中&#xff0c;当节点资源紧张时&#xff0c;Kubelet可能会驱逐节点上的一些Pods以释放资源。当这种情况发生时&#xff0c;Pod的状态会被设置为"Evicted"。 1.pod的探针 1.就绪性探针&#xff1a; 一般用于探测容器…...

7. 数据结构—二叉树(链式存储)

1. 内容 包括链式存储二叉树的 递归与非递归实现的先序、中序以及后序遍历、层序遍历、创建二叉树、计算深度、总节点数。 2. 实现代码 注意&#xff1a;只是伪代码&#xff0c;如果想要运行的话在细节方面需要自己修正&#xff0c;栈和队列的方法实现需要引进或者使用其C自…...

AScript 的UI asui模板的导入

两种方案&#xff1a; 第一种直接在web端&#xff0c;右击UI文件夹 第二种在pycharm&#xff0c;也是右击UI文件夹 调用UI&#xff0c;在init类中直接调用即可...