- 博客(33)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 【自动驾驶/机器人面试C++/算法八股精选】专栏介绍
自动驾驶/机器人面试C++八股精选本专栏适用于C++学习或者从业人员,详细囊括但不限于自动驾驶或者机器人在算法或者开发当中的C++八股文,并且基本都有对应的代码讲解。订阅后送持续更新的飞书文档,包括Linux命令、嵌入式相关内容、ROS1、ROS2知识点、规控算法、常见的C++面试题…
2024-07-09 21:53:15
544
原创 xmake和cmake的区别
在实习过程中,项目的编译构建是基于lua语言脚本的XMake,因此学习了一下关于xmake的使用,以及与cmake的区别。
2024-09-03 12:55:17
387
原创 基于微分平坦特性进行最优化控制-轨迹规划
例如: 自动驾驶汽车使用后轴中心的x,y坐标作为平坦输出,然后将状态量(x,y,φ横摆角)和控制量(前轮转角和速度)全部由平坦输出x,y表示。在机器人进行运动规划的时候指导选择哪些输出变量进行规划,并将所有的轨迹约束条件都映射到平坦输出空间,并在输出空间中规划出最优轨迹,然后再上升回到初始的状态和输入空间中。这使得最优控制问题的维数降低到能在实际应用中实时计算的数目。因此在规划轨迹的时候只需要规划x(t)和y(t)即可,将选定的平坦输出变量参数化为合适的时间函数。
2024-08-09 22:12:47
234
原创 LQR横向控制及融合PID纵向控制C++实现
本篇文章主要介绍了自动驾驶或者机器人的底盘运动控制算法LQR(线性二次调节器)的理论推导,以及在ubuntu系统下,基于C++、Eigen库、matplotlib库,实现了对给定轨迹的LQR跟踪控制,分别展示了在恒速下(控制量为前轮转角)通过LQR对前轮转角的横向控制,以及在给定初始速度下,通过LQR对前轮转角的横向控制,P控制器施加油门的纵向控制(调节加速度)。
2024-08-09 21:58:57
859
原创 ROS八股
作为新一代的机器人操作系统,提供了更多先进的特性和改进,但。涉及更多的处理和通信开销,尤其是在服务请求和响应数据较大时。实现了去中心化的分布式通信,提高了系统的可靠性和实时性能。,采用自发现机制,从而提高了系统的稳定性和可扩展性。根据具体项目需求和开发环境,开发者可以选择适合的。开发中选择合适的通信机制,以满足不同的应用需求。仍然在许多场景中发挥着重要作用。
2024-07-31 21:55:54
899
原创 基于VScode和C++实现Protobuf数据格式的通信
protobuf也叫protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python 等,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 、json进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
2024-07-31 20:28:32
927
原创 CAN通信——车载网络通信
CAN通讯它是一种异步通讯,只具有 CAN_High 和 CAN_Low 两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。一个CAN总线上可以挂载很多设备,比如我在学校里面的项目做底盘控制的时候,底盘上的两个电机是并联在一起,然后伸出来的CAN高和CAN低线接CAN分析仪的CAN高和CAN低线,然后程序里面根据不同的电机ID就可以进行分别的控制。CAN协议由于其高可靠性、实时性和灵活性。
2024-07-29 18:18:42
360
原创 华为机考题目-C++
while (input>>str) { //input >> word 会从 input 中读取一个单词,直到遇到空格、制表符或其他空白字符。从标准输入读取一行文本,并存储在 str 中。位输出请用 printf("%lld")位输出请用 printf("%lld")位输出请用 printf("%lld")位输出请用 printf("%lld")位输出请用 printf("%lld")
2024-07-29 12:56:50
1067
原创 规控Leetcode(C++)
规控leetcode刷题,链表、队列、栈、递归、排序、贪心、dfs、bfs、回溯、二分查找、位运算、递归、分治、二叉树、图。
2024-07-22 21:24:10
127
原创 C++设计模式
C++设计模式是指在软件工程中,特别是在使用C++语言进行面向对象编程时,针对常见问题的一系列经过验证的解决方案。设计模式不是具体的代码,而是用于指导软件设计和实现的高级模板和思想。设计模式可以帮助开发者避免重复发明轮子,提高代码的可重用性、可读性和可维护性。
2024-07-18 15:17:19
230
原创 规控常见数学方法-C++
在解决问题的过程中,会使用到各种各样的算法,算法的目的就是为了达到目的的同时,并且使其在哪一方面最优,在求解时用的最多的就是优化算法。包括了计算几何学、求方程的根、无约束优化、二次规划等等。
2024-07-16 09:39:22
116
原创 C++八股(五)之Linux常用命令
另外,GDB 还提供了一些特殊的命令用于处理多进程调试,如 inferior 命令用于切换当前活动进程,detach 命令用于从进程中分离 GDB。在某些系统中,可能需要结合使用多种方法来确保主机名的更改是永久性的。此外,确保你选择的主机名符合你的网络和系统的命名约定。在终端中运行top命令,可以查看进程的CPU占用、内存占用、运行时间等信息。命令时,关键字的匹配是区分大小写的。命令时,可以结合多个选项来满足不同的需求。
2024-07-09 20:59:16
147
原创 C++八股(四)之STL
由于其底层数据结构是链表,使用了不连续分配的内存,且erase函数会返回下一个有效的迭代器,所以无论是记录下一个元素的迭代器还是使用erase返回的迭代器,两种方式都是可行的。由于其底层数据结构为红黑树,删除当前元素不会影响到下一个元素的迭代器,因此在调用erase函数之前,记录下一个元素的迭代器是一种常见的处理方式。是一个关联容器,它存储了唯一元素的集合,同样不保证元素的顺序。
2024-07-09 20:55:47
110
原创 C++八股(三)之虚函数
这样就实现了多态性,不同的派生类对象根据实际类型执行不同的操作。虚函数和模板函数在设计上有不同的目的和使用场景,但它们并不是互斥的。实现多态性的关键机制,它们使得运行时确定函数调用成为可能,同时保持了内存使用的效率。),虚函数表存储了虚函数的地址,子类继承并重写父类的虚函数时会替换相应的地址,通过。实现的,每个包含虚函数的类都有一个虚函数表,存储了每个虚函数的地址。是两个派生类,它们都重写了基类中的纯虚函数,并提供了各自的实现。
2024-07-09 20:52:01
300
原创 C++八股(二)之C++11新特性
当两个类中相互定义shared_ptr成员变量,同时对象相互赋值时,就会产生循环引用计数问题,最后引用计数无法清零,资源得不到释放。,为类增加移动构造函数。由于完美转发的存在,模板类型推导保持了参数的原始值类别,通过重载解析选取对应的函数版本进行调用。是一种通用的函数模板声明,其中函数的参数和返回类型可以使用通用的模板参数来表示。在这个例子中,add 是一个函数模板,它可以接受相同类型的参数 a 和 b,并返回它们的和。它可以让编译器根据初始化表达式的类型自动推导变量的类型,从而简化类型的声明和定义过程。
2024-07-09 20:46:59
362
原创 C++八股(一)
利用虚函数,基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),指向派生类对象时就使用派生类的成员。基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式,我们将这种现象称为多态(Polymorphism)。继承是面向对象编程中的一个重要概念,它允许一个类(派生类或子类)继承另一个类(基类或父类)的属性和方法。当两个或多个类继承自同一个基类,然后又有一个派生类继承自这两个类时,如果没有虚继承,基类的成员会被复制多次到派生类中,导致冗余。
2024-07-09 18:14:57
767
原创 Linux系统下基于VSCode和Cmake进行C++开发
在 Linux 系统中,使用 Visual Studio Code (VSCode) 和 CMake 进行 C++ 开发是十分方便的。以下是整个工作流的简介:VSCode 是由微软出品的一款轻量级、高度可扩展的代码编辑器,它支持几乎所有的主流编程语言,可以在多种操作系统(包括 Linux)上运行。CMake 是一个开源的跨平台自动化建构系统,它用于控制编译过程,使其在多个平台上能够相同。在 VSCode 中,我们使用“CMake Tools”插件来调用和使用 CMake。
2024-03-10 21:43:27
3638
1
原创 Voronoi图(泰森多边形)
Voronoi图(又称Voronoi Diagram 或 Voronoi tessellation),是由乌克兰数学家乔治·沃罗诺伊提出的一种划分平面的方法。这种方法根据给定的一组“种子点”,将平面划分为各个区域,每个区域内的所有点到该区域的种子点的距离比到其他任何种子点的距离都近。Voronoi图在许多领域都有应用,包括计算机图形学、网络通信、地理信息系统(GIS)、城市规划、机器人感知和控制等。例如,在机器人感知和控制中,可以通过创建环境的Voronoi图,来确定机器人应该通过的安全路径,避开障碍物。
2024-03-06 21:30:05
3770
4
原创 自动控制原理——卡尔曼滤波器
卡尔曼滤波器是一种优化的递归贝叶斯滤波方法,主要用于多种噪声条件下对线性动态系统状态的估计。它由Rudolf Emil Kalman在1960年代初提出,被广泛应用于导航、制导、目标跟踪等众多领域。卡尔曼滤波器的主要步骤包括两步:“预测”与“更新”。预测(Predict):这个步骤的目标就是使用系统的动态模型来预测下一个时间步的状态。这个预测的状态可以被看作是对真实状态的一个初始的、带有不确定性的估计。
2024-03-05 20:41:50
524
原创 自动控制原理——傅里叶变换
傅里叶变换是一种在数学和物理学中广泛应用的工具,他可以将一个信号或者函数从时域(空间域)转换到频域,即将一个关于时间(空间)的函数转变为关于频率的函数。简单地说,傅里叶变换可以帮助我们从不同的角度理解和分析数据,这个角度就是频率。它的最直观的理解是,将复杂的波形分解为一系列简单的正弦和余弦波,这些正弦和余弦波的幅度、频率和相位都不相同。
2024-03-05 20:09:44
680
原创 自动控制原理——系统误差、随机误差和偶然误差
只要存在测量,就一定存在测量误差,误差理论的目标就是在给定精度范围内尽可能减小测量误差。测量误差分为随机误差、系统误差、偶然误差三种。
2024-03-05 19:32:34
1006
原创 全局路径规划算法——theta*算法
Theta* 是一种在计算机科学领域中用于解决路径规划问题的算法。它是A*算法的一个变种,用于在离散空间中寻找最短路径,其特点在于它可以找到更自然、更平滑的路径。论文链接:Theta*: Any-Angle Path Planning on Grids。
2024-03-04 14:56:53
3034
原创 ROS实现A*算法
1、初始化openlist(待检查的列表)和closelist(已检查的列表),将起点(start)加入openlist中,并找出start周围可移动的栅格(八叉树),计算start到这些周围点的欧式距离g,并将start设置为父节点。3、这时openlist中存放的是start的周围点,计算每个周围点的f=g+h,其中g是起点start到当前节点的距离,h是当前节点到终点的距离(曼哈顿距离),找出周围点中f最小的节点n,并对他执行前面同样的检查。①如果周围点在closedlist中,忽略此周围点;
2024-01-17 21:12:27
3291
原创 路径规划中常用的抽稀(simplification)算法
在路径规划中,过度密集的路径点不仅会增加计算和存储的负担,还可能导致路径冗余和效率下降,因此需要进行抽稀处理,同时保留路径的形状特征和轨迹信息,确保路径规划的精度和实时性。常见的抽稀算法有Ramer-Douglas-Peucker(RDP)算法和垂距限值法。
2024-01-17 15:23:40
1278
原创 自动控制原理——PID控制基本原理
PID 控制器算法根据系统偏差(误差)的大小(比例P)、趋势(微分D)和累积值(积分I)进行响应,以调整系统的输出,以此实现对系统的精确控制。
2024-01-17 10:48:14
533
原创 自动控制原理——使用matlab进行控制系统的建模、仿真
输入信号 x(t) 的拉普拉斯变换是 X(s),系统的冲激响应 h(t) 的拉普拉斯变换是 H(s),而系统的输出 y(t) 的拉普拉斯变换为 Y(s)。其中:x是系统的状态向量(n维),u是系统的输入控制信号(标量),y是系统的输出向量(m维),ABCD是控制系统的状态空间模型参数,A是状态矩阵(n*n),B是控制(输入)矩阵(n*1维),C是系统的输出矩阵(1*n维),D是系统的转移矩阵(1维)。在时域中,系统的输入和系统的冲激响应卷积等于系统的输出,即 y(t) = x(t)*h(t)。
2024-01-17 10:20:38
4435
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人