- 博客(108)
- 收藏
- 关注
原创 第6章:局部路径规划(Local Planner)
整车自动驾驶流程全局路径规划(宏观的在道路级别规划一条连接起点到终点的轨迹,这个阶段的任务是寻径);行为决策(根据当前时刻车辆的感知信息,在宏观上决定这一段时间内车辆的行驶决策,如跟车 / 避让 ...);局部路径规划(到一个更小的时空区域内,比行为决策层的任务更加具体,具体的解决车辆如何从A点行驶到B点的问题,具体到会指定到达每个路径点的时间 / 速度 / 加速度 / 朝向 ...);选择控制决策模型,并将具体控制命令传递给车辆;全局路径规划(Route Planner)
2024-07-08 16:30:30
667
原创 笔记101:OSQP求解器的底层算法 -- ADMM算法
这篇博客仅限于介绍拉格朗日乘子法,KKT条件,ALM算法,ADMM算法等最优化方法的使用以及简版代码实现,但不会涉及具体的数学推导;不过在下面我会给出具体数学推导的相关文章和截图,供学有余力的同志参考;
2024-06-26 00:44:49
1020
原创 第5章:模型预测控制(MPC)的代码实现
注:使用车辆横向动力学模型 + 纵向动力学模型(误差模型)注:详细推导见中对【线性系统 + 线性约束】问题的 QP 问题的构建过程;其中其中,因为本身车辆模型提供的状态空间方程的状态量 x 就是误差量,对于误差量而言他的目标值就是0;aaaaa。
2024-06-16 03:05:00
534
2
原创 笔记100:使用 OSQP-Eigen 对 MPC 进行求解的方法与代码
我们在对系统进行建模的时候,为了减少计算量,一般都将系统简化为线性的,系统如果有约束,也是将约束简化为线性的;aaaa。
2024-06-14 22:00:18
779
8
原创 笔记99:OSQP 求解器示例代码
OSQP 库仅支持C语言,不支持C++,所以下面的示例代码使用的是C语言;但是 OSQP 求解库提供了针对C++的接口 OSQP-EIGEN;以下代码是 OSQP 的官方文档提供的示例,我加上了详细的注释;注:涉及到 csc(按列压缩)的方式表达稀疏矩阵,在文章。
2024-06-13 23:42:25
333
原创 笔记98:按列压缩矩阵 csc_matrix 的 “含义”
按列压缩(Compressed Sparse Column -- CSC),是一种使用三个特征数组就可以表示整个矩阵的方法;一般我们在求解二次规划问题的时候,需要将矩阵 P 和 A 传入求解器;但如果我们通过一个个指定矩阵 P 和 A 的每个元素的方式定义矩阵,这样的代码可太脑瘫了;因此我们可以使用按列压缩的方式来表示一个矩阵,这样我们只需要3个特征数组,就可以知道整个矩阵到底是什么样的;需要完整的矩阵 A 和 P 时,将这3个特征数组传入函数 csc_matrix() 就可以了;
2024-06-13 23:11:45
1106
原创 笔记93:关于 C++ 中的 Eigen 库
Eigen::Vector2d x(1,2) // 2维向量Eigen::Vector3d x(1,2,3) // 3维向量Eigen::VectorXd x(n) // 自定义n维向量Eigen::Matrix2d mat // 2维矩阵Eigen::Matrix3d mat // 3维矩阵Eigen::Matrix4d mat // 4维矩阵Eigen::MatrixXd mat(m,n) // 自定义m行,n列矩阵// 自定义m行,n列矩阵。
2024-06-03 22:14:19
579
原创 第4章:车辆的横向优化控制
车辆动力学方程的详细推导 + 连续LQR控制器的详细推导 + 离散LQR控制器的详细推导 + LQR控制车辆的横向运动 + 对LQR的优化 + 代码实现
2024-06-03 00:50:26
984
2
原创 笔记92:连续状态空间方程转化为离散状态空间方程的详细推导 + 离散LQR控制器详细推导
a对LQR算法本质的总结:利用性能函数J作为目标;利用Frenet上的动力学方程作为(等式)约束条件;使用拉格朗日乘子法计算J的极小值点处U的值在这一步中经过数学推导,可以不用计算复杂的拉格朗日乘子法,直接用现成的里卡提公式就可以计算出极小值点处U的值)U_%7Bk%7DJ1%7DU_%7Bk%7D1%7DU_%7Bk%7DU_%7Bk%7D1%7DU_%7Bk%7DX_%7Bk%7DJU_%7Bk%7DJJU_%7Bk%7D1%7DU_%7Bk%7DP_%7Bk%7D。
2024-05-29 16:04:38
534
原创 笔记91:Apollo 命令
注:aem 工具是用来启动和进入 docker 容器的;注意:启动容器前需要先将当前目录切入到 Apollo 的工作空间中;
2024-05-28 14:36:51
416
原创 笔记90:C++中sort函数的使用
函数原型:sort ( iterator beg , iterator end , _Pred )作用:将迭代器beg和end之间的元素进行排序注意1:使用之前包含头文件 ,这个函数不是STL中定义的;注意2:如果用STL中定义的针对某个容器类型的sort函数,则要包含头文件 ;
2024-05-22 15:09:04
545
原创 笔记89:LeetCode_135_分发糖果
注:代码随想录中没有很清楚的提起想出方法的思路,只是给出了解决这个问题的大致思路和代码;下面我将介绍一下我的思考过程,并贴出实现代码;aaaa。
2024-05-20 21:47:59
476
原创 笔记88:LeetCode_134_加油站
这个题的题目条件给的不太严谨,题目描述中说“如果存在解,则保证它是唯一的”,通过我的实践,我发现这句话的意思其实是本题的所有样例只有两种情况,无解/有唯一解;而不可能存在多个解的情况;
2024-05-19 22:46:11
1135
原创 笔记87:Leetcode_376_摆动序列
当ptr指向绿色位置的时候就会删除这些绿色节点,这些绿色节点的前面的趋势可能是上升/下降(不可能是平),再指向红色节点对红色节点进行处理,第一种和第三种情况都是符合要求的;因为当ptr到达当前红色位置的时候,代表他前方所有的节点都已经被遍历并被处理过了,所以ptr的前方不存在对摆动毫无作用的点,所以当绿点到红点的趋势为增时,代表绿点前的趋势一定为降,绝不可能是单增/单降/单平;我们可以发现我们对数组nums中间部分的节点的处理方式,和对nums开头位置的节点的处理方式是一样的,所以主体代码可以不用改动;
2024-05-16 15:33:16
421
原创 笔记86:关于【#ifndef + #define + #endif】的用法
时,你可能会在多个源文件中包含它,以便在这些源文件中使用该头文件定义的函数、类或其他声明。如果你在多个源文件中都包含了同一个头文件,那么当你将整个工程统一编译,希望链接成一个完整的可执行文件时,就会出现大量错误,因为每一个相同的头文件都会进行所谓的“重定义”,导致重复定义的错误。后面没有跟着一个具体的值时,它实际上是定义了一个宏,但它并没有给这个宏赋予一个特定的值。在这种情况下,它通常用于条件编译,起到一个开关的作用。如果之前已经包含过,那么就不会再次包含,这样就避免了重复定义的问题。
2024-05-06 22:24:32
358
原创 笔记85:如何计算递归算法的“时间复杂度”和空间复杂度?
在节点4,5,6,7处的递归体中,这四个递归体并不是同一时间执行的,只有在执行完节点4的递归体后,才会执行节点5的递归体;同时这四个节点的递归函数体可是一样的,假设递归体中要向下传递的参数是a,那么在执行完节点4后,参数a就被释放掉了,然后到节点5,又创建了节点5中的参数a,执行完节点5这个参数a又被释放掉了;所以不可能说节点4,5,6,7的所有参数a同时存在,因此在二叉树的这一层中,只会存在一个参数a;传递给节点2和节点3的,并没有开辟新的变量,将一个变量传递给节点2,另一个传递给节点3;
2024-05-04 18:21:41
370
1
原创 第1章:自动驾驶车辆“规划”与“控制”的通用架构
2014年美国汽车工程师学会 () 定义了6个无人驾驶等级,从0级(完全手动)到5级(完全自动),这些无人驾驶等级准则已经被美国交通部采纳;该标准也被称为SAE标准;
2024-04-16 22:00:25
384
原创 笔记83:二叉树前中后序遍历(迭代法 + 栈)
以下代码均为个人尝试编写,并非力扣题解,因此时间和空间复杂度可能并不是最优的,只是记录一下自己当时写这个题的时候的思路;
2024-04-11 00:43:40
287
原创 笔记82:关于 C++ 中的 swap 函数
背景:在刷题时发现参考代码使用了swap函数,但是是用来交换一个vector容器中的两个元素的;但是我依稀记得标准模板库中vector函数自带的swap函数是用来交换两个容器内所有的元素的;
2024-03-28 15:55:14
1204
原创 笔记81:在服务器中运行 Carla 报错 “Disabling core dumps.”
背景:使用实验室提供的服务器配 Carla-ROS2 联合仿真的实验环境,在安装好 Carla 后运行但是出现报错,而且不会出现 Carla 的窗口;解决:运行以下命令解释:因为在使用下述命令的时候是按默认端口 2000 启动的,这也是 Carla 官方文档中所写的默认端口号,但是已经有人使用这个端口号在跑实验了,所以 Carla 默认端口已经被占据,因此报错;我们只需要重新指定一个没有人在用的端口号就可以了;aaaa。
2024-03-25 15:12:37
910
1
原创 笔记80:在 Ubuntu 中安装显卡驱动
显卡BIOS是存储在显卡电路板上某个芯片里的程序,这个程序只提供了最基础的输入输出功能,他不依赖任何的操作系统,这个BIOS会在电脑刚上电,操作系统还没有启动的时候就被载入电脑内存,我们在进入操作系统之前就出现的桌面就是显卡BIOS在启动的时候提供的;既然有了BIOS可以提供显示功能,那为什么还要搞个驱动程序出来?因为这个BIOS只提供了最基础的显示功能,甚至不支持高分辨率,只能提供最基础的VGA标准(640*480)/SVGA标准(800*600);
2024-03-14 10:53:57
1227
原创 笔记78:软件包管理工具 apt 详解(包含常用 apt 命令介绍)
有关内容:(1)什么是 APT 包管理工具(2)命令 apt 和 dpkg 的区别(3)update 和 upgrade 之间的区别(4)命令 apt 和 apt-get 之间的区别(5)如何更新命令 apt 使用的软件源(6)命令 apt 的常用参数
2024-03-09 18:03:23
2444
原创 笔记77:理解C++中头文件和源文件的作用【程序编译过程】
很显然,答案是不可能。但是有一个很简单地办法,可以帮助程序员们省去记住那么多函数原型的麻烦:我们可以把那几百个函数的声明语句全都先写好,放在一个文件里,等到程序员需要它们的时候,就把这些东西全部 copy 进他的源代码中。这个方法固然可行,但还是太麻烦,而且还显得很笨拙。于是,头文件便可以发挥它的作用了。所谓的头文件,其实它的内容跟 .cpp 文件中的内容是一样的,都是 C++ 的源代码。但头文件不用被编译。
2024-03-07 16:51:51
1435
原创 笔记76:32位/64位操作系统的区别
64位平台不管是在性能上,还是在功能上,都要领先于目前的32位平台,目前主流的32位处理器在性能执行模式方面存在一个严重的缺陷:当面临大量的数据流时,32位的寄存器和指令集不能及时进行相应的处理运算。显然,在工作频率相同的情况下,64位处理器的处理速度比32位的更快。我们通常说的64位技术是相对于32位而言的,这个位数指的是CPU GPRs(General-Purpose Registers,通用寄存器)的数据宽度为64位,64位指令集就是运行64位数据的指令,也就是说处理器一次可以运行64bit数据;
2024-03-07 16:31:29
879
原创 笔记74:在SLAM建图过程中,为什么要使用【障碍物点云配准算法】和【里程计(ODOM)估算算法】结合的方法
仅使用【障碍物点云配准算法】,很容易导致在一条长通道中,因为前后两帧的雷达点云图过于相似,导致特征匹配一直完全重合,使得机器人建图一直停留在原地,但实体机器人早就沿着通道跑向远端了;使用Hector_mapping建图软件包就会导致这样的问题仅使用【里程计估算算法】,虽然可以避免上面的问题,即机器人建图一直停在原地,但是机器人的轮子在转动过程中难免会打滑,这就导致仅使用里程计估算会导致预测机器人下一时刻将要到达的位置和机器人下一时刻实际到达的位置之间存在误差;最好的办法是两种方法结合起来
2024-03-03 17:53:22
782
原创 笔记73:ROS中的各种消息包
参考视频:33.ROS 的标准消息包 std_msgs_哔哩哔哩_bilibili34. ROS 中的几何包 geometry_msgs 和 传感器包 sensor_msgs_哔哩哔哩_bilibili
2024-03-01 22:15:20
580
原创 笔记72:关于IMU(惯性测量单元)传感器的作用【不涉及公式推导】
参考文章:什么是IMU? - 古月居通俗易懂的IMU讲解,这一篇就够了-CSDN博客欧拉角说明:欧拉角说明 - 简书加速度计解算姿态:加速度计解算姿态角_三轴加速度计算姿态角-CSDN博客陀螺仪解算姿态 + 姿态融合:MPU6050姿态解算2-欧拉角&旋转矩阵-CSDN博客
2024-03-01 17:04:06
923
原创 笔记70:BatchNorm / LayerNorm / GroupNorm 对比
笔记地址:D:\work_file\(4)DeepLearning_Learning\03_个人笔记\4. Transformer 网络变体。
2023-12-10 21:40:21
60
原创 笔记69:Conv1d 和 Conv2d 之间的区别
笔记地址:D:\work_file\(4)DeepLearning_Learning\03_个人笔记\4. Transformer 网络变体。
2023-12-10 16:23:42
160
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人