- 博客(59)
- 收藏
- 关注
原创 LVI-SAM中激光点云辅助视觉特征点获取深度
本文提出了一种基于激光点云辅助的视觉特征点深度估计方法。首先将视觉特征点投影到单位球面,同时对激光点云进行角度下采样并归一化到单位球面。通过构建KDTree快速搜索与视觉特征点方向最近的三个激光点,利用三点拟合平面并计算视觉射线与平面的交点,从而估计特征点深度。该方法通过球面投影消除深度影响,仅基于方向差异进行匹配,实现了视觉特征与激光点云的高效关联。
2025-12-10 18:03:20
399
原创 A-LOAM
本文介绍了激光SLAM系统的三个核心节点:scanRegistration节点负责点云预处理,包括滤波、特征提取(边缘点和平面点);alaserOdometry节点通过点线/面残差优化实现帧间位姿估计;alaserMapping节点进行全局优化消除漂移。系统采用分层处理架构,先进行局部帧间匹配(odometry),再通过地图匹配(mapping)优化全局位姿。特征点提取采用曲率计算和分段采样,位姿优化使用Ceres求解器最小化残差。整个流程实现了从原始点云到位姿估计的完整处理链。
2025-12-06 17:24:47
872
原创 LVI-SAM/LIO-SAM/LEGO-LOAM中点到线/面残差计算及其雅可比矩阵推导
摘要:本文详细解析了LOAM系列SLAM算法中激光点云特征匹配的关键计算过程。重点阐述了点到线/面残差的计算方法及其雅可比矩阵推导:1)通过PCA主成分分析进行直线拟合,使用向量叉积计算点到直线距离;2)采用最小二乘法进行平面拟合,求解点到平面距离;3)推导残差函数对位姿的偏导数构造雅可比矩阵。最后介绍了基于高斯牛顿法的线性系统求解过程,实现位姿优化。文章以LVI-SAM源码为例,系统讲解了激光SLAM中特征匹配的核心数学原理。
2025-11-20 18:44:57
648
原创 Cartographer源码-扫描匹配
本文摘要: Cartographer的扫描匹配过程分为两个主要步骤:相关性扫描匹配和基于Ceres的优化扫描匹配。 在相关性扫描匹配阶段,系统通过暴力搜索方法在指定窗口内(线性0.1m,角度20度)评估候选位姿。该过程先对点云进行多角度旋转预处理,然后计算每个候选位姿下点云与栅格地图的匹配得分,选取最优解作为初始位姿。 基于优化的扫描匹配则构建了包含三个残差项的最小二乘问题:1)地图残差,通过插值计算点云与地图的匹配程度;2)平移残差,限制位姿变化幅度;3)旋转残差,保持角度稳定性。Ceres求解器通过自动
2025-10-19 15:16:15
667
原创 Cartographer源码-激光数据走向
本文分析了Cartographer中激光雷达数据的处理流程:1. 数据订阅与回调注册:通过ROS节点订阅激光话题,使用模板函数和lambda表达式实现多参数回调;2. 数据转换:将LaserScan消息转换为带时间戳的三维点云,处理多回波数据并计算点云坐标;3. 数据分发:通过Collator和OrderedMultiQueue实现多传感器数据的时间同步;4. 扫描匹配:最终将处理后的点云数据送入LocalTrajectoryBuilder进行扫描匹配和位姿优化。系统采用分层处理架构,确保数据有序性和实时性
2025-09-28 16:13:05
1059
原创 Cartographer源码-概率栅格地图
本文主要介绍了Cartographer中2D概率栅格子图的构建过程,涉及LocalTrajectoryBuilder2D、ActiveSubmaps2D、Submap2D、ProbabilityGrid等核心类。通过扫描匹配后的点云数据被插入到两个活跃子图中,每个子图使用ProbabilityGrid存储栅格地图,并基于射线投射模型更新命中点和自由空间的概率值。文章详细分析了栅格地图的数据结构、坐标转换、概率更新机制以及地图扩容裁剪等关键实现细节。整个系统采用分层设计,通过智能指针管理地图对象。
2025-09-26 22:29:51
802
原创 Cartographer源码-位姿推测器pose_extrapolator
本文分析了Cartographer中位姿推测器(PoseExtrapolator)的实现细节。PoseExtrapolator通过融合IMU、里程计和扫描匹配数据来预测机器人位姿,主要包括: 核心组件: IMUTracker:基于IMU数据跟踪姿态和重力方向 数据队列:维护位姿、IMU和里程计的历史数据 速度估计:通过位姿变化和里程计计算线/角速度 关键流程: 数据添加:处理IMU、里程计和扫描匹配位姿 位姿预测:结合速度估计和IMU数据外推未来位姿 数据修剪:维护有效时间窗口内的数据 实现特点: 多传感器
2025-09-09 21:38:17
782
原创 Cartographer源码-扫描匹配前的点云预处理
本文分析了Cartographer中激光点云预处理的关键步骤,主要包括时间同步、去畸变和滤波处理。首先通过RangeDataCollator实现多雷达数据的时间同步;然后利用位姿推测器获取每个点采集时刻的位姿,将点云从tracking_frame转换到local_frame坐标系完成去畸变;接着通过体素滤波和自适应体素滤波减少数据量,其中自适应体素滤波会根据点云密度动态调整体素大小;最后将处理后的点云用于扫描匹配。这些预处理步骤确保了点云数据的准确性和高效性,为后续的定位和建图提供了可靠输入。
2025-09-02 21:58:35
1208
原创 Cartographer源码-从ordered_multi_queue的数据分发到GlobalTrajectoryBuilder::AddSensorData()
本文分析了Cartographer中从ordered_multi_queue的数据分发到GlobalTrajectoryBuilder::AddSensorData()流程:1) OrderedMultiQueue按时间顺序分发数据;2) 数据通过CollatedTrajectoryBuilder传递给GlobalTrajectoryBuilder;3) GlobalTrajectoryBuilder作为SLAM核心,连接前端(LocalTrajectoryBuilder)和后端(PoseGraph)
2025-09-02 13:37:28
863
原创 Cartographer中的gflag与lua文件
本文介绍了Google开源的命令行参数处理库gflags及其在Cartographer项目中的应用。gflags支持多种参数类型(bool、int、string等),通过DEFINE宏定义参数,FLAGS_name访问参数值。Cartographer通过gflags解析launch文件传入的Lua配置文件路径和名称,使用LuaParameterDictionary类读取配置内容并转换为NodeOptions和TrajectoryOptions结构体。Lua配置采用模块化设计,支持include机制和参数重写
2025-08-31 14:42:59
993
原创 catkin使用
本文介绍了ROS中创建自定义话题消息的完整流程。首先创建工作空间catkin_ws和功能包test_pkg,然后在msg目录下创建Person.msg定义消息类型。需要修改package.xml添加依赖,并在CMakeLists.txt中配置编译选项。最后给出了C++和Python两种语言的消息发布实现示例,包括初始化节点、创建发布者、填充消息内容和发布消息的过程。
2025-08-07 09:24:52
354
原创 蓝桥杯嵌入式 特殊操作
1.LCD反向显示 2.LCD一行中指定字符使用其他颜色显示 3.修改PWM的频率和占空比 4.单timer双通道测量PWM频率 5.单adc双通道测量
2025-06-11 21:55:30
385
原创 CT117E-M4 串口通信
本文介绍了基于STM32G431RBT6与DAP Link调试器的串口通信实现过程,主要用于接收串口数据并在LCD界面上显示。首先,通过CubeMX将PA10配置为USART1_RX、PA9配置为USART1_TX,并设置串口为异步通信、波特率为9600bps,同时启用中断。随后,在中断回调函数 HAL_UART_RxCpltCallback 中实现逐字节接收,并在 UART_proc() 函数中检测数据接收是否完成。若数据长度为22字节,则用 sscanf 解析成车类型、车牌号和时间信息;若长度错误,则通
2025-03-25 21:29:59
840
原创 CT117E-M4 IIC通信-EEPROM读写
1.原理图 2.CubeMX配置 3.代码编写 3.1 向EEPROM写入数据 3.2 从EEPROM读取数据 4.测试
2025-03-25 17:24:35
674
原创 CT117E-M4 模数转换ADC测量
上篇内容为,本篇笔记记录模数转换ADC。整个系列每篇笔记中的CubeMX配置、MDK-ARM配置以及代码编写,均在前一篇笔记的基础上进行,功能有关联代码会进行微调。
2025-03-25 14:44:16
354
原创 CT117E-M4 PWM信号输出
1.PWM信号输出 1.1 CubeMX配置 1.2 代码编写 2.PWM频率测量 2.1 CubeMX配置 2.2 代码编写 3.占空比测量
2025-03-25 12:48:35
1078
原创 CT117E-M4 按键短按长按
上篇内容为,本篇内容实现按键短按长按。整个系列每篇笔记中的CubeMX配置、MDK-ARM配置以及代码编写,均在前一篇笔记的基础上进行,功能有关联代码会进行微调。
2025-03-15 16:09:34
768
原创 CT117E-M4 LCD屏显示
上篇内容为LED显示,本篇内容实现LCD屏显示。整个系列每篇笔记中的CubeMX配置、MDK-ARM配置以及代码编写,均在前一篇笔记的基础上进行,功能有关联代码会进行微调。
2025-03-14 20:59:33
334
原创 CT117E-M4 CubeMX与Keil5 MDK-ARM基础配置
1.CubeMX构建项目 2.芯片时钟配置2.1 芯片引脚配置 2.2 时钟树配置 3.调试接口配置 4.项目管理器Project Manager配置4.1 project4.2 Code Generator 5. 生成代码 6.MDK_ARM配置 6.1 编译器选择 6.2 调试器配置 7. 创建本地代码文件夹 8. #include 路径设置
2025-03-10 21:13:01
1103
原创 面向对象考试
一、面向对象二、三大特性三、类间关系1.继承(泛化)2.实现3.依赖4.关联5.聚合6.组合四、设计原则(1)单一职责原则(SRP)(2)开放-封闭原则(OCP)3. 里氏替换原则(LS)五、面向对象分析设计
2024-11-21 11:07:10
1178
原创 TCP/IP网络体系结构总结整理
物理层、数据链路层、将IP数据报封装成帧或拆帧、IP地址解析为MAC地址、完成相邻机器间的寻址与数据传输、差错控制、介质访问控制、网络层、对传输层传递的数据报进行分组的组装与拆分、路由选择、路由转发、拥塞控制、传输层、解决进程在主机中通信地址标识的问题、UDP、TCP、连接实质、面向字节流的通信、差错控制、流量控制、连接管理
2023-05-19 19:40:50
2362
原创 C/C++函数调用时参数传递过程、调用约定与可变参函数的实现
参数传递过程、参数压栈顺序从右至左的影响、调用约定、__cdecl C/C++ 缺省调用方式、 __stdcall 、 __fastcall (快速调用约定,通过寄存器来传送参数)、C++的函数名修饰方式、thiscall 本身调用、C语言可变参函数的实现、可变参函数需要使用__cdecl调用约定的原因
2023-05-14 15:10:50
2201
原创 在x86-64系统上的函数调用过程(参考)
传递控制权、传递数据、分配和释放内存、运行时栈的动作与转移控制、数据传送、参数传递、需要使用栈传递参数的情况、函数返回值传递
2023-05-12 19:45:37
1396
1
原创 Linux进程通信之消息队列
Linux进程通信、消息队列、消息队列与管道的区别、函数接口:msgget创建消息队列、msgsnd将消息添加到消息队列、msgrcv从消息队列中读取一条消息、msgclt控制消息队列
2023-04-02 20:50:39
941
原创 Linux进程通信之共享内存
共享内存、共享内存接口函数、sys/shm.h、shmget、shmat、shmdt、shmctl、信号量控制访问同步
2023-04-01 00:38:48
311
原创 C++类型推导 auto、decltype
类型推导、auto占位符、auto推导的要求、当定义为指针或引用时,auto的推导结果将保持初始化表达式的cv属性(const,volatile)、auto作为函数的形参类型、decltype
2023-03-26 22:54:21
616
原创 Linux进程通信之信号量 控制进程同步
信号量、信号量接口函数、semget函数、semctl函数、semop函数、ipcs 可以查看消息队列、共享内存、信号量的使用情况,使用 ipcrm 可以进行删除操作。
2023-03-26 01:15:44
1007
原创 C++ 名字空间(namespace)
作用域、全局域、局部域、块域、类域、名字空间域、::作用域解析符、名字空间::变量名/函数名、using namespace
2023-03-21 16:41:12
167
转载 new与malloc的10点区别
new与malloc的10点区别:1. 申请的内存所在位置、2.返回类型安全性、3.内存分配失败时的返回值、4.是否需要指定内存大小、5.是否调用构造函数/析构函数、6.对数组的处理、7.new与malloc是否可以相互调用、8.是否可以被重载、9. 能够直观地重新分配内存、10. 客户处理内存分配不足
2023-02-14 12:39:39
2351
原创 C++ 缺省参数、函数重载、名字粉碎与调用约定
缺省参数、定义 、函数调用、缺省参数值的得到方法(表达式、函数调用等)、缺省参数可以有多个、缺省参数不能重复指定值、函数重载、函数重载的概念、函数重载解析的步骤、函数重载与缺省参数、函数重载与const、指针、引用相结合、、名字粉碎(名字修饰)与调用约定、_stdcall调用约定、_cdecl调用约定、_fastcall调用约定、C++编译时函数名修饰约定规则、C++可以函数重载,而C语言不能重载的原因、extern关键字
2023-02-11 20:35:14
373
原创 C++ 引用&(左值引用)
引用的定义、引用的特点、引用作为形参代替指针、const与引用、const int&、int& const、&与数组、&与指针、引用与指针的差别、不可以对函数中的局部变量或对象以引用、指针的方式返回、&实质:int &p = a; int *const p = a、分析效率 函数形参:变量、指针、引用
2023-02-08 00:13:10
695
原创 进程替换exec系列函数
进程替换,不是创建一个新进程,而是并且,进程替换是与进程复制配合进行的。在进程复制时,我们根据fork()的返回值对父子进程进行区分,使其进行不同操作。在使用进程替换后,我们就可以使新进程更加直接的执行我们想要做的操作。进程复制时,父子进程代码相同,父子进程要进行的操作在同一份代码中,根据逻辑判断才进行区分。对于父进程来说,子进程要执行操作的代码就是冗余的。使用进程替换,我们就可以将想要执行的新操作封装在一个新程序中,在原进程中只用调用进程替换函数,替换为新进程执行就可以了。
2022-12-29 09:30:00
541
【概率论与数理统计】概率公式详解及其在SLAM中的应用:条件贝叶斯公式优化机器人状态估计概率
2025-07-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅