自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 自动驾驶决策规划算法——二次规划

黄色的点就意味着L的上下界,物理意义是当轨迹s=s1时,L的范围应该是(Lmin1,Lmax1)之间,这个范围就是开辟的凸空间。上面的方程组就是二规划的等式约束;恒为一个常数,那么f(s)四阶以上的导数都是0;假设在f(s)的三阶导数。

2024-05-23 21:01:31 537 1

原创 自动驾驶路径决策算法——动态规划

蓝色的线是第一次规划的结果,按照当前的规划来说100ms以后应该是绿点位置,但是由于控制本身不完美,100ms后车辆实际位置是红色点,此时同时开始第二次规划,按照规划100ms后应该是紫点位置,但是由于控制不完美,车辆实际位置是橙点。这样在控制看了规划的轨迹是割裂的。上个规划周期规划出来的轨迹是蓝色线条,本周期规划开始的时间是T,首先比较当前车辆的位置和上一个规划周期在T时刻规划出来的位置是否接近,比较接近,误差不大就是说明控制时按照规划路径走的,就可以进行轨迹拼接,规划的起点是T+100ms(绿点)。

2024-05-23 13:19:41 1739 1

原创 自动驾驶决策规划算法——参考线

遍历了10次还没找到新的极小值,这个极小值点就是匹配点,如果遍历遍历过程中发现了新的极小值点,就把这个新的极小值点存储,同时increase count就清零,再遍历这个新的极小值点后面的点,过程原理和上面一样,最后将存储到的极小值点进行比较,选择最小的。上面的算法认为参考线越接近直线,路径越平滑,但是参考线不是越平滑越好,如下,黑色是原来的,紫色是平滑后的,虽然是一条直线了,但是严重偏移原来的点。蓝色点是路径中不平滑的点。其中,曲率kappa的参考方式是L/ds^2,其中l是向量的模,是个非线性量。

2024-05-17 16:36:52 931

原创 决策规划仿真平台的搭建

在prescan的Experiments文件夹下有一些例子,例如在"C:\Users\Public\Documents\Experiments\DemoTemplates\Demo_PreScanCarSim3D\Demo_PreScanCarSim3D.cpar"中有一个cpar的车辆模型,是prescan自己做的一个和carsim联合仿真的模型接口。就是在prescan中build的simulink模型,打开这个模型会生成一个testexperiment.pb文件,在文件夹中也会生成一些相关的配置。

2024-05-15 16:40:38 868

原创 自动驾驶决策规划——坐标转换

其中隐含的限制就是f(t)的定义域和值域都应该是实数,因为s和t都是真实空间中的轨迹和时间坐标,不能有虚数。要想使得上面的那个jark最小,积分号中是平方项,也就是当其为0时最小,也就是f(t)的三阶导数为0,也就是f(t)是二次或者二次以下的函数时,三阶导数才为0。也就是求泛函在后面的那三个约束条件下极小值对应的f(t)。上面把一个带约束的泛函化成了一个无约束的泛函,但是L和f点、f两点、f三点都有关,不能直接使用上面只能处理一阶导数的欧拉——拉格朗日方程。

2024-05-13 21:52:24 1077

原创 自动驾驶纵向控制算法

第三个文件合并数据。在第161列第一个数据对应的是加速度等于0,速度也等于0(坐标是(0,0)处于停车状态),但是此时拟合出来的制动压力很大为6点几,这是因为刹车的目的最后都是加速度为0,速度为0,所有曲线的焦点都是(0,0),这个坐标具有奇异性,这里matlab取了其平均值,这里对trabebr这个表做出修改,将这个坐标位置的刹车压力设置成0.3。如上,thr是油门,就是踩不同的油门,就得到不同的速度和加速曲线,例如上面当油门开度是0.3时,速度和加速度曲线就可以画出来,速度和加速度可以合并到一个图上。

2024-05-09 21:55:45 1784

原创 自动驾驶横向控制算法

本文内容来源是B站——忠厚老实的老王。

2024-04-22 20:47:45 1100 2

原创 自动控制原理——根轨迹法

本文中所有的截图都来自于西北工业大学卢京潮教授的ppt,侵删。

2024-03-05 16:54:48 4542 1

原创 自动控制原理第三章——线性系统的时域分析和矫正

注意:这里需要注意的无差系统的是该系统在阶跃信号作为输入时没有原理性稳态误差,当输入信号变了,他可能就有稳态误差了。

2024-03-01 15:02:48 4156 3

原创 复习拉普拉斯变换

以下截图均来自于西北工业大学卢京潮教授自动控制原理的ppt。

2024-01-04 15:27:28 876

原创 控制系统的组成

第一条:因为传递函数是在零初始条件下定义的,所以它原则上不反映系统非零初始条件时系统响应的全部信息,但是可以通过它求出系统的微分方程,进一步求出非零初始情况下系统的响应,例如前面例子的第7问。第五条的意思是:将传递函数的分子等于0解出来根对应于系统的零点,将传递函数的分母等于0解出来的根是系统的极点。系统的总输出为控制输入引用的输出和干扰引起的输出的叠加,系统的总误差就是控制输入引起的误差和干扰引起的误差的叠加。是由初始条件引起的响应,系统的在某一时间的总响应就是系统的输入条件下的响应和零响应,也就是。

2024-01-04 15:26:12 1217

原创 c++学习笔记——友元、异常和其他

友元使得能够为类开发更灵活的接口,类可以将其他函数、其他类和其他类的成员函数作为友元。在某种情况下可能需要前向声明,需要注意类和方法声明的顺序,以便正确地组合友元。嵌套类是在类声明中声明的类,它有助于设计这样的助手类,即实现其他类,但不必是公有接口的组成部分。c++异常机制为处理不好的编程事件,比如说不适当的值,I/O失败等,提供了一个灵活的方式。引发异常将终止当前的执行的函数,将控制权交给匹配的catch块。

2023-11-13 22:15:46 162

原创 vs2022中“发生生成错误,是否运行上次的成功生成”对话框不弹出解决方法

(2)项目和解决方案——生成并运行——运行期间,当出现生成或者部署错误时——提示启动。(1)在工具——选项。

2023-11-12 22:15:17 2387

原创 c++学习笔记——类继承

对于没有在派生类中重新定义的成员函数,将使是该函数的积累版本,如果派生类位于派生链中,将使用。

2023-10-04 00:24:00 124

原创 c++学习笔记——复习类

这样程序能够精类对象初始成另一个对象。例如类成员中有指针,以字符串为例,应该在复制构造函数中先使用new为其开辟一个内存空间,人然后使用strcpy()函数对数据本身(而不是对其指针)进行复制粘贴。但是如果该类提供了能够返回所需内容的共有方法,则可以在运算符函数中使用这些方法,这样也就不用将其设置为友元函数。(2)如果析构函数通过对指针类成员使用delete来释放内存,则每个构造函数都应该使用new来初始化指针,或者将其设置为空指针。,都应该在类的析构函数中对其使用delete,该运算符将释放分配的内存。

2023-09-13 14:38:46 59

原创 c++学习笔记——类和动态内存分配

在类中使用动态内存分配的原因:避免占用太多内存空间,在程序运行时(而不是在编译时)确定要使用多少内存,最常用的方法就是在类构造函数中使用new运算符在程序运行时分配所需的内存。

2023-09-08 12:39:18 371 1

原创 c++学习笔记——类的自动转化和强制类型转化

如果使用关键字explicit限定了这种构造,则它只能用于显式转换。总结:使用Stonewt(double)的场合使用了explicit关键字:1、如果在函数声明中使用了explicit.关键字,则Stonewt(double)将只用于显式强制转换。没有使用关键字explicit:1、显式强制类型转换2、隐式强制类型转化:(1)将Stonewt对象初始化为double值时(先创建一个Stonewt对象,但不初始化,再将double值赋给Stonewt);

2023-09-08 11:39:24 392

原创 c++学习笔记——友元

作用:通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限,即可以像函数的公有成员函数访问该函数的私有部分。友元的三种形式:(1)友元函数(2)友元类(3)友元成员函数需要友元函数的原因:回顾之前的知识点,我们都知道重载后的也就是说A = B * 2.75这个表达式是成立的,但是将2.75和B反过来的话,也就是A = 2.75 * B;则是不成立的,因为2.75不是类对象,不能调用类的成员函数,左侧的操作数应该是调用对象才对。

2023-09-02 23:05:17 150

原创 c++学习笔记—使用类

格式就是operator+op+(),其中op就是要重载的运算符,op必须是有效的c++运算符,不能虚构一个新的符号,例如operate@()就是错的,因为c++中没有@运算符。实际上,在c++中已经有运算符被重载,例如*运算符用于地址,将得到存储在这个地址上的值,当将他用于俩个数组时,得到就是它们的乘积。重点来看下Sum()函数的代码,其中参数是引用,但是返回值不是引用,将参数声明为引用的目的是为了提高效率,此时若使用安置传递Time对象也可,但是传递引用,速度更快,使用的内存更少。

2023-09-02 08:42:13 50

原创 c++学习笔记——对象和类()

位于类声明中的函数都自动为内联函数。如果想让在类声明之外定义其成员函数为内联函数,只需要在类实现部分定义函数时使用inline限定符即可。前面的笔记中有说过内联函数要求每个使用它的文件都对其进行定义,所以一般将内联函数的定义(而不只是原型)放在头文件中。方法使用那个对象创建类对象的方法,语法如下:类名 对象名;如何使用对象的成员函数,使用成员语运算符(.)例如://这条语句调用了kate对象的show()成员。

2023-08-31 19:50:41 126

原创 c++学习笔记——存储持续性、作用域和链接性

一方面,在每个使用外部变量的文件中,都必须声明它;另一个方面,c++有“单定义规则”,变量只能有一次定义。为了满足这种需求,c++提供了两种变量声明。(1)一种是。

2023-08-27 21:44:22 197

原创 c++学习笔记——名称空间

当使用多个厂商的类库时,可能导致名称冲突。这种冲突称为名称空间问题。所以c++提供名称空间工具,可以更好地控制名称的作用域。

2023-08-27 13:48:56 70

原创 visual studio使用教程

添加类的方式:右击需要添加类的项目——找到添加按钮——然后点击"类"在弹出的窗口中输入类名,点击确定后会在相应的项目文件夹下的头文件和源文件中自动添加了CUdp.h和CUdp.cpp文件。相应的视图变成了下面这样:可以看到在类视图Client项目下多了两个类CTcp(之前新建的)和CUdp类,在资源管理器中Client项目下头文件中多了两个头文件CTcp.h和CUdp.h,在源文件下多了CTcp.cpp和CUdp.cpp。打开资源视图 (资源视图一般做msc开发或者窗口程序开发用的比较多)

2023-08-23 11:31:40 6342

原创 c++学习笔记——单独编译

一般地,假如有一个C源文件(如sourcefile.cpp),它包含两个头文件(如headfile_1.h和headfile_2.h),而头文件headfile_2.h又包含了headfile_1.h,则最终的效果是该源文件包含了两次headfile_1.h。注意:不要将函数定义和变量声明放在头文件中,因为如果在头文件中包含一个函数定义,然后在其他两个文件(属于同一个程序)中包含该头文件,则同一个程序将包含同一个函数的两个定义,除函数是内联的,否则会出错。(3)源代码文件:包含调用与结构有关的函数的代码。

2023-08-16 21:36:05 292

原创 c++学习笔记——函数探幽

函数多态(函数重载)可以使你使用多个同名的函数。可以通过使用函数重载来设计一系列函数——它们完成相同的工作,但是使用不同的参数列表。所以函数重载的关键就是函数的参数列表——也称为函数特征标。(1)如果两个函数的参数和类型相同,同时参数的排列顺序也相同,则它们的特征标相同,变量名无关紧要。(2)c++允许定义名称相同的函数,条件是它们的特征标不同。定义:函数模版是通用的函数描述,它们使用泛型来定义函数,其中的泛型可用具体的类型(例如int或者double)替换。通过将类型作为参数传递给模板。

2023-08-14 20:03:06 132

原创 c++学习笔记——字符串

C++处理字符串有两种方式:(1)C风格字符串(2)基于string类库。

2023-08-11 19:09:10 94

原创 c++学习笔记——函数小结

由于传递数据地址时,不会传输有关数组的完整性,所以通常将数组长度作为独立的参数来传递,或者传递两个指针,一个指向数组开头,另一个数组末尾的下一个元素。c++将数组名参数视为数组第一个元素的地址,但在函数中,这也还是按值传递,因为指针是原始地址的拷贝,但是函数可以使用指针访问原始数组的内容。默认情况下按值传递,意味着函数定义中的形参是新的变量,它们被初始化成函数调用所提供的值,因此c++函数通过拷贝,保护了数据的原始性。c++函数名与函数地址作用相同,将函数指针作为参数,可以传递要调用的函数的名称。

2023-08-09 10:42:02 59

原创 c++学习笔记——函数

定义格式略,与c语言相仿,这里需要注意几个点:(1)对于有返回值的函数,必须使用返回语句,返回值本身可以是变量、常量,或者表达式,但是类型必须是函数头声明的类型或者可以转化成其类型。(2)c++对于返回值的类型有一定的限制,不能时数组,但可以是其他任何类型——整数、浮点数、指针,甚至可能是结构和对象。(不能直接返回数组,但是可以将数组作为结构对象或者对象组成部分来返回)。(3)函数在执行返回语句后结束。

2023-08-09 10:14:33 124

原创 C++学习笔记——模板类vector和模板类array

与数组一样,array的长度也是固定的,使用栈·(静态内存分配),而不是自由存储区,因此其效率与数组相同,但更方便。要创建array对象,头文件必须包括array,array对象的创建语法是。首先,要使用vector对象,必须包括头文件vector。其次,vector包含在名称空间std中,最后,模板类要使用不同语法来指出它存储的数据类型,使用不同的语法来指定元素数。: 在c++11中,可将列表初始化用于vector和array对象,但是在c++98中,不能对vecto对象这样做。

2023-08-05 21:18:31 83

原创 c++学习笔记——简单文件输入和输出

(8)可结合使用ifstream对象和get()方法读取一个字符,使用ifstream和getline来读取一行字符。(3)需要声明一个或者多个ofstream变量(对象),并以对他们就行自行命名,但必须遵循常用的命名规则。(3)需要声明一个或者多个ifstream变量(对象),对其进行自行命名,条件是必须遵守命名规则。(4)必须使用名称空间std,引用元素ifstream,必须使用编译指令using或前缀std。为此,方法之一就是使用open()(6)使用完文件后,应使用close()方法将其进行关闭。

2023-08-01 13:22:15 480 1

原创 c++学习笔记——读取数字的循环

(1)重置cin以接受新的输入。(3)提示用户再输入。

2023-07-29 10:31:40 154

原创 c++学习笔记——break和continue语句

break语句使程序跳到Switch或者循环后面的语句处执行,意思就是终止整个循环。continue的作用是使程序跳过循环体中余下的代码,并开始新一轮循环。

2023-07-27 16:25:29 125 1

原创 c++学习笔记——Switch语句

Switch 并不是为了处理取值范围而设计的,Switch语句中的每一个case标签必须是一个单独的值。并且这个值必须是整数(包括char),因此Switch无法处理浮点测试。如果所以的选项都可以用整数常量来标识,这可以使用Switch和if else语句。如果选项超过两个,就代码长度和执行速度而言,Switch语句的效率更高。Switch和 if else。switch和if else。

2023-07-27 15:51:42 490 1

原创 c++学习笔记——?:运算符

该运算符常被用来代替if else语句,这个运算符被称为条件运算符(?:),基本格式是 expression1?如果expression1的值是true,则整个条件表达式的值是expression2的值,否则整个表达式的值是expression3的值。

2023-07-27 11:17:48 178 1

原创 c++学习笔记——字符函数库cctype

c++从c语言继承了一个与字符相关的、非常方便的函数软件包,它可以简化像确定字符是否是大写字母,数字或者标点之类的工作,这些函数的原型在头文件cctype中定义的。

2023-07-27 10:49:59 82 1

原创 C++学习笔记——逻辑运算符

一般情况下不使用括号也可以编写负责的复合句,但是最好使用括号将测试进行分组,这样不容易出错,并且逻辑清晰。逻辑and运算符的优先级高于or运算符,要想使or运算符高于and,注意使用括号。运算符高于所有的关系运算符和算术运算符:使用时应当注意适时添加括号。使用&&来设定取值范围。

2023-07-27 10:45:54 135 1

原创 c++学习笔记——if语句

if else 中的两种操作必须是一条语句,如果需要多条语句,需要用大括号将它们括起来,组成一个代码块。c++不会自动将if和else之间的所有代码视为一个代码块,因此必须用大括号将这些语句组成一个语句块。由于c++是自由格式语言,因此只要使用大括号将语句括起来,对大括号的位置没有任何限制,上面的书写格式是一种流行格式,下面是另一种流行格式。第一种格式强调的时语句的块结构,这种是将语句块和关键字if和else更紧密地结合在一起。if-if else-else结构。

2023-07-26 17:10:47 106 1

原创 循环和文本输入

使用cin.get(char)进行补救。

2023-07-26 09:36:30 54 1

原创 c++学习笔记——二维数组

其中,maxtemps是数组名,是一个包含4个元素的数组,其中每个元素都是一个5个整数组成的数组。可以将maxtemps看成是由4行组成,每一行有5个元素。例如:maxtemps[i][j]表示第i行,第j列的元素。例如:int maxtemps[4] [5]

2023-07-26 09:36:11 65 1

原创 c++学习笔记——循环

注意:所有的表达式加上分号都可以成为语句,但是不一定有意义。但是反过来就不对,语句去掉分号不一定是表达式,例如:int a;是语句,但是去掉分号它就是不是表达式,因为它没有值。目前使用的语句,例如for语句、声明语句和返回语句,都不满足“表达式+分号”的模式,没有值,所以不能将for循环赋值给变量。(2)其次,在for循环中,可使用初始化语句声明一个局部变量,但在while中不能这样做。(1)首先在for循环中省略了测试条件时,将认为条件是true。例如:age = 100是一个表达式。

2023-07-25 10:01:19 54

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除