- 博客(92)
- 收藏
- 关注
原创 LI-Init(一)论文
注: 只是对论文的翻译,具体公式的理解结合代码LI-Init 是一种面向激光-惯性系统的鲁棒实时初始化方法。该方法能够标定激光雷达与IMU之间的时间偏移和外部参数,同时计算重力向量与IMU零偏。本方案无需依赖任何标定靶标或额外传感器、特定结构化环境、先验环境点云地图,也不要求外部参数和时间偏移的初始值。对于大多数激光雷达-惯性测程(LiDAR-inertial odometry, LIO)系统来说,准确的初始状态(包括激光雷达与六轴IMU之间的时间偏移与外参变换)起着关键作用,且通常被视为前提条件。然
2025-06-08 17:29:25
651
原创 FAST-LIO2笔记(五)FAST-LIO的应用:ikd-tree & 重定位
用于处理大规模动态点云数据,这种数据结构主要用于机器人的SLAM应用。传统的静态 kd-tree 结构存在着大量数据增删的情况下变得 unbalanced,导致深度不均衡和搜索效率下降的问题。而则设计了一套,使得可以在保证查询效率的同时,快速地处理数据点的增删操作。在删除操作中,我们使用延迟删除策略。也就是说,点不会立即从树中移除,而是通过将属性 deleted 设置为 true 来标记为“已删除”。
2025-05-14 19:32:24
965
2
原创 FAST-LIO2笔记(四)代码:迭代卡尔曼滤波更新以及话题发布
发布去畸变点云(点是世界坐标系);发布去畸变点云(点是IMU坐标系)发布里程计话题:根据最新状态量的旋转R和平移获取数据,构成位姿;:省略了 ikd-tree底层代码的阅读,后续有时间再看。同样这部分原代码还是不好理解,参考简化代码的这个函数。5.当前点转到世界坐标系,插入ikd-tree。3.迭代卡尔曼滤波更新后,得到了。点云中每个点(世界坐标系)构建。,对应论文公式14、15。
2025-05-14 00:28:21
158
原创 FAST-LIO2笔记(三)代码:前向、后向传播和地图管理
2.按时间从后往前遍历点云,假设当前点p对应的时刻为 tn,其所属的IMU区间时刻为[ tib , tie ](代码这部分设计的很巧妙),可以求得 tn 与 tib 的时间差 dt ,通过 dt 和 tib 时刻的位姿,便可求得 tn 时刻IMU的状态(位姿)。:积分计算IMU每个时刻的状态量和协方差矩阵(公式4、8),原代码的predict()函数有复杂晦涩的流行相关的计算,不好理解,这个函数内容建议参考简化版本的predict()函数,然后将更新的IMU状态量放到IMUpose中。
2025-05-13 18:50:00
846
原创 FAST-LIO2笔记(二)代码:状态估计
将当前lidar坐标系的点变换到世界坐标系,然后用ikdtree找这个的五个近邻点,只有近邻点的个数大于5 && 最远点的距离小于5m才可能构成面,然后用最小二乘法计算这个平面的法向量,并判断五个近邻点到平面的距离是否小于阈值(即所有点都足够“靠近”这个平面,才合理),如果当前点拟合平面成功,将点存到laserCloudOri点云中,平面法向量存放到corr_normvect中。:残差关于状态量的偏导,只与状态量的旋转和位置有关系,其他项是零(如果lidar和IMU的外参已经标定过)。
2025-05-12 22:42:29
404
原创 FAST-LIO笔记
从 te 时刻至 tb 时刻,对每一个点完成上述操作,系统便完成了反向传播,即将一帧中所有点云都补偿到了这一帧结束的时刻。总之,通过向前与反向传播,得到了在点云。
2025-05-07 23:22:07
1254
原创 FAST-LIO2笔记(一)论文
本文提出了一种快速、鲁棒且通用的激光雷达-惯性里程计框架:FAST-LIO2。该方法基于高效的紧耦合迭代卡尔曼滤波器,并在此基础上引入了两项关键创新,使得激光雷达导航(及建图)具备更快的速度、更强的鲁棒性以及更高的精度。在不提取特征的情况下,直接将原始点云匹配到地图上(并随后更新地图,即实现建图)。这一策略可充分利用环境中的微小特征,从而提升定位精度。与此同时,省去了人工设计的特征提取模块,也使得该方法天然地适应不同扫描模式的新型激光雷达。采用一种增量式 k-d 树结构(ikd-Tree)维护地图。
2025-05-07 23:19:56
749
原创 LIO-Livox
用单台Livox Horizon (含内置IMU) 实现高鲁棒性的激光-惯性里程计,可在各类极端场景下鲁棒运行,并达到高精度的定位和建图效果。(城区拥堵、高速公路、幽暗隧道):该系统主要面向大型室外环境中的汽车平台设计。用户可以使用 Livox Horizon 或 HAP LiDAR 轻松运行该系统。在室内环境中系统同样表现稳定,我们目前也支持面向机器人设计的 Mid-360 雷达。
2025-05-06 20:17:04
841
原创 LIO-SAM笔记(三)适配Livox 激光雷达
LOAM、Lego-LOAM、LIO-SAM使用的激光雷达Velodyne都是机械激光雷达。通过机械方式改变扫描方向。通俗点就是一个激光笔放在一个电动机上旋转,激光笔跟着电动机进行360度高速旋转。(以livox为例)通过阵列干涉或者是mems改变扫描的方向。说白了就是一个激光笔放在那不动,他可以自己改变激光射出的方向。如下就是livox激光线的示意图,“激光笔”是不动的,但是内部有阵列干涉,通过干涉、反射等操作,让“激光笔”发射的点打在不同的位置。如下图,就打出了一个类似雪花的的形状。
2025-05-05 20:35:05
916
原创 LIO-SAM 笔记(一)论文
提出了一个通过平滑与建图实现的紧耦合激光惯性里程计框架LIO-SAM,能够取得高精度、实时的移动机器人的轨迹估计和地图构建。LIO-SAM基于因子图构建,把多个相对测量数据或者绝对测量数据,包括回环检测,以因子的形式加入到系统中进行联合优化。通过IMU预积分获得的运动估计可以用于点云运动畸变的修正和作为激光里程计优化的初值。反之,基于获得的激光里程计可以估计IMU的零偏。为了保证实时性能,当位姿估计时,我们边缘化老的激光帧;而不是将雷达点云与全局地图进行匹配。
2025-04-28 19:08:44
585
原创 LeGO-LOAM笔记
LeGO-LOAM 是 Tixiao Shan 提出的⼀种基于 LOAM 的改进版本,其主要是为了定位和建图。专门为地面车辆设计SLAM算法,要求在安装的时候Lidar能以水平方式安装在车辆上;如果是倾斜安装的话,也要进行位姿转换到车辆上。而LOAM对Lidar的安装方式没有要求,即使手持都没有关系。由于搭载的是嵌入式系统,计算能力将会受限,致使无法做到实时;LOAM系统计算每个点曲率的处理频率(数据量很大,VLP-16一条线是1800个点)将难以跟上传感器的更新频率;
2025-04-26 20:42:35
565
原创 毫米波雷达笔记
毫米波雷达、摄像头和激光雷达都是利用电磁波来工作。被动式传感器。工作在可见光频段,对应的电磁波波长在360-830纳米之间;主动式传感器。工作在红外线和可见光之间频段,波长也是纳米级。常用的波长是905nm和1550nm;主动式传感器。工作波长在毫米级,波长范围1-10mm,对应频率30-300GHz,主流的是77GHz.1.穿透能力强、作用距离远;2.不受光照、大雾、沙尘等影响,可全天候工作;3.利用多普勒效应可直接测量目标径向速度;4.超视距探测能力;5.体积小、易集成、成本低廉。
2025-04-15 17:19:16
333
原创 相机标定笔记(单、双、鱼眼)
opencv 中相机标定calibrateCamera() 接口的实现,总结如下:(1. 因为镜头畸变的影响比较小,首先假定相机是理想无畸变的,根据闭式解来计算初始的相机内参;2. 估计相机位姿,也就是求解相机外参,opencv使用solvePnP来实现,支持迭代和 P3P 等多种算法求解;3. 应用最小二乘求解实际的径向畸变系数(4. 根据求解的内外参对objectPoints进行重投影,应用全局Levenberg-Marquardt优化算法来最小化重投影和原投影点之间的误差。
2025-04-07 00:03:48
904
原创 VINS-Mono学习(六):回环检测
VINS最后一个节点 pose_graph 是和回环检测相关内容。节点订阅 图像话题 和 vins_estimator节点发布的话题。1.ros初始化、设置句柄;2.创建一些publisher;3.从launch文件读取参数和参数文件config中的参数;4.回环检测下的处理,如从yaml文件读取参数、读取训练好的二进制词袋、描述子pattern、如果需要加载离线地图及对应的处理;5.订阅七个话题;6.创建五个话题的发布;7.主线程process;8.接收键盘回调值的线程,“s” 保存地图。
2025-04-01 15:31:51
990
原创 VINS-Mono学习(五):非线性优化
i++)// para_Pose是位姿 前三维是平移 后四维是旋转// para_SpeedBias是 速度、加速度计偏置、陀螺仪偏置//?为什么位姿有local_parameterization,速度、加速度计偏置、陀螺仪偏置没有local_parameterization// 因为位姿中的旋转使用四元数表示,四元数带约束,PoseLocalParameterization类中重载了Plus()函数类需要重载类的两个函数:Plus。
2025-03-29 20:47:00
781
原创 VINS-Mono学习(四):关键帧和初始化
到此,已经求解了陀螺仪零偏Bgs、所有帧在自己坐标系中的速度、第0帧的重力方向、和尺度s。①获取滑动窗口内所有图像帧相对于第l帧的位姿信息,并设置为关键帧// 计算滑窗帧的位姿Ps、Rs,并将其置为关键帧// initialStructure函数虽然计算了所有帧all_image_frame的位姿 frame_it->second.R 和frame_it->second.T,// 但是并没有存到Ps和Rs中,这里我们把这些位姿存到Ps和Rs中,并且把这些帧的is_key_frame标志位置为true。
2025-03-25 01:43:14
877
原创 VINS-Mono学习(二):feature_tracker
以运行数据集为例,运行命令:第一行命令是启动VINS系统,第二行是打开配置好的可视化界面,第三行播放数据。通过euroc.launch 启动了三个结点:feature_tracker、vins_estimator、pose_graph。feature_tracker总体的作用是接收图像,使用KLT光流算法跟踪;vins_estimate包含相机和IMU数据的前端预处理(也就是预积分过程)、单目惯性联合初始化(在线的标定过程)、基于滑动窗口的BA联合优化、全局的图优化和回环检测等通过rqt_graph命
2025-03-21 22:34:41
649
原创 VINS-Mono学习(一):论文
一个鲁棒的基于紧耦合的滑动窗非线性优化的单目视觉惯性里程计(VIO)。单目VIO模块不仅提供精确的局部姿态、速度和方位估计,而且还以在线方式执行摄像机IMU外部校准和IMU偏置校正。使用DBoW2进行回环检测。重新定位是在对单目VIO进行特征级别融合的紧耦合设置中完成。这使得重新定位具有鲁棒性和精确性且有最小的计算代价。最后,几何验证的回环被添加到位姿图中,并且由于来自单目VIO的可观测的翻滚角和俯仰角,生成四自由度(DOF)位姿图以确保全局一致性。:ORB-SLAM 采用,由于单目相机无法直接感知。
2025-03-20 18:38:18
646
原创 VIO笔记(包括预积分推导)
记录笔记快速运动融合过程本身会影响视觉和IMU中的参数(如IMU的零偏和视觉的 尺度)。典型方案为MSCKF和非线性优化。VIO使用紧耦合原因:视觉存 在尺度不确定性、IMU存在零偏导致漂移。将IMU定位与视觉的位姿直接进行融合,融合过程对二者本 身不产生影响,作为后处理方式输出。典型方案为卡尔曼滤波器。IMU坐标系到世界坐标系的外参矩阵Twb 的平移部分可直接视作IMU在世界中的坐标。IMU坐标系的原点Pb = [0,0,0] 因此Pw = t_wb。
2025-03-13 01:12:26
685
原创 ORB-SLAM2源码学习:总结篇(一)
跟踪线程中的SLAM模式和纯定位模式就是在可视化界面进行修改的。③然后计算图一特征点和在图二找到的最佳匹配点的角度差,通过直方图统计 特征点的角度差值主流的前三个区域(因为所有的特征点的角度变化应该是一致的),其余的匹配认为是误匹配。对pKF和F中的特征点进行快速匹配,不属于同一node的特征点直接跳过匹配(只有属于同一node,才有可能是匹配点);对当前关键帧和 共视关键帧 中的特征点进行快速匹配,不属于同一node的特征点直接跳过匹配(只有属于同一node,才有可能是匹配点);
2025-03-11 00:38:46
938
原创 ORB-SLAM2源码学习(八):LoopClosing线程
目录1.回环检测 DetectLoop()2.Sim3 计算 ComputeSim3()2.1 构造Sim3Solver对象2.2 Sim3具体计算2.3 将闭环匹配上的关键帧以及相连关键帧的MapPoints投影到当前关键帧进行投影匹配 SearchByProjection()3.闭环矫正 3.1 矫正当前帧的共视关键帧位置和地图点3.2 地图点融合 SearchAndFuse()3.3 更新共视图3.4 本质图优化3.5 全局BA优化loopclosing线程在 实例化 ORB_SLAM2::Sys
2025-03-09 17:06:51
1006
原创 ORB-SLAM2源码学习(七):LocalMapping线程
LocalMapping线程在实例化ORB_SLAM2::System对象的时候就已经运行了。线程函数Run()中会一直执行死循环(因为这个时候等待处理的关键帧为空)。直到Tracking线程的最后生成了关键帧,并且放到等待处理的关键帧列表mlNewKeyFrames,才真正开始LocalMapping线程。1.将关键帧插入地图中 ProcessNewKeyFrame()①从 mlNewKeyFrames 中取出列表最前面的关键帧,随后马上把列表中的该关键帧删除,然后对该关键帧进行处理;
2025-03-08 01:00:01
905
原创 ORB-SLAM2源码学习(六):相机跟踪(局部地图跟踪和关键帧创建)
目录1.局部地图跟踪1.1 更新局部关键帧UpdateLocalKeyFrames1.2 更新局部地图点(来自局部关键帧)UpdateLocalPoints()1.3 投影匹配2. 对比四种跟踪方式以及使用的投影匹配3.关键帧创建3.1 判断是否需要创建新关键帧: NeedNewKeyFrame()3.2 关键帧的创建CreateNewKeyFrame()当初始位姿估计成功(参考关键帧来跟踪、恒速模型跟踪、重定位跟踪跟踪成功)后需要进行局部地图跟踪TrackLocalMap()。初始位姿估计只是跟踪一帧得到
2025-03-06 00:04:36
1096
原创 docker使用记录
在ubuntu22.04中使用docker拉取ubuntu20.04镜像,后续安装ros1以及相机和激光驱动。只是记录使用docker的一些命令,防止以后忘记。
2024-06-19 20:25:38
387
原创 多线程c++
1. join会阻塞当前的线程,直到运行的线程结束。(例如第二段代码主线程被阻塞,直到子线程执行完才会执行join之后的主线程代码)2.detach从线程对象中分离出执行线程,允许线程独立的执行。(第三段代码,主线程和两个子线程独立的执行)
2024-01-30 17:20:23
1312
原创 ROS2学习记录
1.创建编辑.msg文件功能包下新建msg文件夹,文件夹中创建.msg文件2.编辑配置文件package.xml中添加依赖包--编译依赖-->--执行依赖-->--声明当前包所属的功能包组--><export></export></package>cmakelists.txt添加编译colcon build --packages-select 功能包3.测试编译完成,在工作空间下的install目录下将生成xxx.msg文件对应的C++和Python文件。
2023-12-27 19:07:32
946
原创 STL--关联式容器底层实现
unordered_set、unordered_map、unordered_multiset和unordered_multimap。结合数组查找数据快和链表插入删除效率高优点得到一个寻址容易,插⼊删除也容易的数据结构。查找、增删数据时间复杂度(O(1))红黑树的查找,插入和删除操作,时间复杂度都是O(logn)。红⿊树的每个节点上都有存储位表示节点的颜⾊,可以是红或⿊。:set、map、multiset和multimap ②。
2023-12-12 16:56:05
459
原创 ORB-SLAM2源码学习(四):单目初始化
从代码框架中知道GrabImageMonocular()函数主要做了两件事:对当前帧进行构造(Frame)和调用Track()对当前帧进行跟踪。前者已经介绍过了,本篇博客是对Track()函数中单目初始化的介绍。函数主要分为三步:Code:Tracking.cc初始化成功条件:①前后两帧提取的特征点大于100 ②两帧匹配的特征点对大于100ORB-SLAM2中特征点匹配均采用了各种技巧减小特征点匹配范围,特征点通过描述子匹配后会进行旋转一致性检测,并且要求最佳匹配特征点要明显优于次优匹配点。关键点匹配
2023-10-18 16:55:07
112
原创 OrbbecSDK_ros关于imu数据的发布
orbbec官方提供ros版本的sdk还不支持imu数据获取,貌似下个版本更新后就可以得到imu数据的话题。参考c++版本的sdk对ros的sdk进行修改,最后将imu数据以topic的形式发布。参考的c++_sdk关于imu数据获取代码。
2023-09-14 19:20:58
525
原创 ORB-SLAM2源码学习(三):构造Frame
目录1.提取OBR特征ExtractORB()1.1计算图像金字塔ComputePyramid()1.2 提取特征点ComputeKeyPointsOctTree()1.2.1 CELL网格1.2.2 四叉树筛选特征点1.3计算描述子computeDescriptors()2.去畸变UndistortKeyPoints()3.计算去畸变后图像边界ComputeImageBounds()4.特征点分配AssignFeaturesToGrid()提取图像的ORB特征点,提取的关键点存放在mvKeys,描
2023-07-16 20:37:35
58
原创 使用kalibr对相机和IMU标定
分别是包含标定相机和IMU数据的rosbag,IMU内参yaml,相机内外参yaml,标定板yaml.②IMU内参yaml、相机内外参yaml、标定板yaml。标定好的参数包括各方向的随机噪声与随机游走。acc_w 加速计偏置随机工作噪声标准偏差。gyr_w 陀螺仪偏差随机工作噪音标准偏差。acc_n 加速度计测量噪音标准偏差。关于需要下载的环境和具体的包参考【gyr_n 陀螺仪测量噪音标准偏差。相机-IMU联合标定总共需要准备好。2)相机内外参yaml用之前得到的。①录制相机和imu的rosbag。
2023-07-11 14:09:23
1730
原创 视觉SLAM ch13 设计SLAM系统
(一种特殊的函数,它作为参数传递给另一个函数,并在被调用函数执行完毕后被调用)如果是类的成员函数,这时想把成员函数设置给一个回调函数指针往往是不行的。:插入图像帧,提取图像特征,然后与上一帧进行光流追踪,通过光流结果计算该帧的位姿。必要时补充新的特征点并作三角化。前后端在分别的线程中处理数据,前端负责在地图中添加路标点,后端检测到地图更新以后优化路标点,并将旧的路标点删除掉,保持一定的规模。地图以hash的形式记录了所有的关键帧和对应的路标点,同时维护一个被激活的关键帧和地图点,激活的意思就是。
2023-05-13 20:47:00
1369
7
原创 工厂模式:简单工厂模式、工厂方法模式和抽象工厂模式
某厂有两个加工厂A和B分别生产鞋和衣服,随着订单的增加,A厂所在地有了衣服的订单,B厂所在地有了鞋子的订单,再开新的工厂显然是不现实的,因此在原来的工厂增加生产需求的功能,即A生产鞋+衣服,B生产衣服+鞋。将“类实例化的操作”与“使用对象的操作”分开,让使用者不用知道具体参数就可以实例化出所需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦。将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。具体的工厂负责实现具体的产品实例。
2023-04-24 22:05:30
647
原创 记录关于GPT的应用
但是也有一些缺点:代码不能保证准确性,对于较难的代码需要很多时间,python相对其他代码更准确。也可以全选输入Ctrl + K,对代码进行修改,如图片路径为 D:\\image。:openai账户里应该是送了18刀,每次提问都会扣除一定费用,N不要太大。如果运行的时候代码有问题,可以把问题丢给它,让它帮我们debug.选中某一行代码进行解释: Ctrl + L。如果让他写代码,生成的内容保存在。
2023-04-20 22:19:29
841
原创 opencv实现卡尔曼滤波
opencv自带程序:建立一个绕某一圆心做匀速圆周运动的小球,但是实际中它会受到系统噪声影响从而其角度和角速度有所变化,通过带有噪声的观测值(真实值+观测噪声)和匀速运动模型的预测值为输入使用KF得到估计值。原有的代码中比较的是真实值与预测值、真实值与观测值的偏差,没有用到估计值,因此我在上述代码中加入了真实值与估计值的比较。在更新阶段,滤波器利用对当前状态的观测值优化在预测阶段获得的预测值,以获得一个更精确的新估计值。x(k) = A*x(k-1) + B*u(k)+w(k) 运动方程。
2023-04-19 20:34:20
2731
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人