- 博客(53)
- 收藏
- 关注
原创 lego-loam mapOptmization 源码注释(四)
correctPoses()主要用来判断是否发生了回环检测,如果有回环就更新当前关键帧的位姿和位置。laserCloudCornerLastDS等是当前帧的角点经位姿变化到地图坐标系下的点云数据。发布的数据有历史关键帧位置数据cloudKeyPoses3D,这就是rviz里面轨迹的那条线。至此,lego-loam主要的代码就都注释完啦!完结撒花,咱们lio-sam再见!laserCloudSurfFromMapDS是子地图数据。
2024-11-05 23:12:45 112
原创 lego-loam mapOptmization 源码注释(二)
transformAftMapped是上一帧优化后的位姿,transformTobeMapped是当前帧优化后的位姿。所以我们按cloudKeyPoses3D就是空的,先看return之后的代码,也就是下一个函数downsampleCurrentScan();初始的cloudKeyPoses3D就是空的,它的值会在saveKeyFramesAndFactor()函数中更新,所以可以。我的理解就是,当前的平移量差值△r,是在上一次位姿优化后,由于位姿变换产生的,我们先把它变换回上一次的位姿,也就是左乘。
2024-11-04 23:42:00 836
原创 lego-loam mapOptmization 源码注释(一)
在ISAM2中,由于处理的是非线性问题,状态变量的误差可能会变得非常大,导致线性化近似不再有效。当状态变量的误差超过这个阈值时,ISAM2会重新线性化这些变量,以保持优化过程的准确性。滤波器通过将点云中的点分配到一个三维体素网格中,并只保留每个体素(或“叶”)中的一个点(通常是中心点或最近的点),从而减少点云数据的数量。创建的线程是并发执行的,这意味着它们可以同时运行,而不受主线程的直接控制。下面我们来看mapOptimization的私有变量定义,不详细解释,筛一些有意思的说一下。
2024-10-30 21:02:28 664
原创 lego-loam featureAssociation 源码注释(七)
发布的数据有离群点,角特征点和面特征点。skipFrameNum初值为1。所以frameCount == 2时才发布,也就是两帧一发布,建图的频率比雷达里程计慢一半。!!终于把featureAssociation注释完啦!!下一节进入mapOptmization!!
2024-10-30 18:05:54 861
原创 lego-loam featureAssociation 源码注释(六)
回到runFeatureAssociation()函数。回到Feature Association,我们来看下一个函数:integrateTransformation();
2024-10-29 22:37:59 571
原创 lego-loam featureAssociation 源码注释(五)补充
上一节中我们看过了findCorrespondingSurfFeatures和calculateTransformationSurf函数。中求点到直线法向量的代码和findCorrespondingSurfFeatures求平面法向量有很大区别,所以我们详细介绍一下。然后calculateTransformationCorner由点到线特征的距离求雅可比来优化位姿的代码和calculateTransformationSurf类似,我们不多关注了:!!!
2024-10-29 20:02:17 183
原创 lego-loam featureAssociation 源码注释(五)
上一次我们已经看完了特征提取,这次我们进入特征匹配的内容!!!systemInitedLM的初始值为false。
2024-10-28 22:30:40 706
原创 lego-loam featureAssociation 源码注释(三)
此时点云被投影到第一个点的imu坐标系中。补充:!!!imu的测量值是变化,不可以直接累积,在imu数据预处理中,通过一重积分、二重积分,算出积分值再累积!!!//imuPointLast的初值-1。在回调函数中:插值细节补充!!!
2024-10-24 21:49:29 749
原创 lego-loam featureAssociation 源码注释(一)
这个主函数就是一个很典型的ros框架的主函数!!主要来看FeatureAssociation类和runFeatureAssociation函数!!
2024-10-23 22:03:05 715
原创 lego-loam imageProjection.cpp源码注释(三)
马上就注释完啦!!加油!!我们继续看回调函数 publishCloud()
2024-10-17 20:41:32 391
原创 lego-loam imageProjection.cpp源码注释(一)
private://常规ros初始化三板斧之一,nh非常有用,可以用来发布数据、接收数据、设置参数、获取参数。//接收原始点云数据//从发布的数据可以看出,做了哪些处理:提取地面点,分割点云(刨除聚类中比较零散的点,然后再对大的聚类做分割),刨除异常点(或者是不可视的点),保留有效点云。具体的内容看下面的代码。//解决了上一篇中的一个问题!!!之所以没有定义PointXYZIR是因为pcl中有现成的定义!!!//这两个没有看懂,后续具体看用法。
2024-10-14 21:01:56 1009
原创 lego-loam源码注释 utility.h
/用于确保在创建新对象时,对象的内存对齐符合Eigen库的要求。关键字用于声明一个变量或函数是在另一个文件中定义的。在一些激光雷达系统中,不同的环编号代表不同的扫描层或不同的方位角,这个字段有助于区分这些不同的层或角度。//两种不同的点云格式对应不同的激光雷达,对于Velodyne VLP-16这种激光雷达的数据结构就是XYZIR。分别表示边缘特征和表面特征的阈值,很奇怪边缘特征和表面特征的阈值为什么是一样的?//分别表示水平和垂直方向上的角分辨率,单位为弧度。结构体的对象在内存中正确对齐,以提高性能。
2024-10-13 16:35:45 836
原创 PCL库简单的icp配准
测试了一下PCL库的icp效果,对于40度左右的旋转的配准效果还是不好。可以看到初始点云(紫色),目标点云(白色),配准结果(蓝色)。可以看到在角度比较大的时候,icp的效果不是很好。在命令行调用生成的可执行文件。
2024-09-30 19:33:11 271
原创 简单PCL库读文件(linux vscode编译)
在linux上使用CMake编译,需要写CMakeLists文件。下面是和上面的main.cpp文件配套的CMakeLists文件,可以改一下project名称和生成的可执行文件的名称。
2024-09-29 15:28:15 517
原创 aloam框架laserMapping.cpp源码解读
/将数据从std::queue<sensor_msgs::PointCloud2ConstPtr>转为pcl::PointCloud<PointType>::Ptr。体素网格滤波器(VoxelGrid)是一种常见的点云下采样方法,它将空间划分为一个三维网格,并在每个体素内部平均或近似点云数据,以减少点的数量。//这几行用于发布数据,大概发布的是配准后的点云数据和里程计数据,具体的数据用途我们在功能函数中看。//将三维空间中的点映射到一个三维网格中,其中每个维度都被划分成了50单位大小的格子。
2024-09-26 21:36:44 730
原创 laserOdometry.cpp源码注释
/ find correspondence for plane features 面上特征点的匹配和角点特征点的匹配方法是一样的,都是先做坐标系转换,然后使用kd树找到最近邻点,再由最近邻点在同一条扫描线或相邻扫描线上找到最近邻点的最近邻点,然后构建点到面的距离最小作为损失函数。消息类型,它用于传送关于机器人的里程计数据。点云是一组在三维空间中的点的集合,每个点通常包含位置(x, y, z)和可能的其他信息,如颜色或强度。消息类型,它是一种在ROS中常用的消息,用于传送具有时间戳的位姿(位置和方向)。
2024-09-10 22:21:59 835
原创 scanRegistration.cpp源码注释
体素网格下采样通过将点云中的点分配到体素中,并在每个体素中保留一个代表性点来减少点的数量。这通常意味着点云是无组织的,即点是随机排列的,而不是按照行或扫描线排列的。在点云的情况下,它通常表示点云数据被捕捉或处理的时间。//向前检查相邻的5个点,如果它们与当前点之间的距离变化大于0.05,则停止检查。//向后检查相邻的5个点,如果它们与当前点之间的距离变化大于0.05,则停止检查。//把一个360°的水平空间分成六份,计算每一份的起始点sp和末尾点ep。//标记输出点云为密集的,这意味着点云中没有无效的点。
2024-09-10 16:49:45 882
原创 补充a-loam的另外两个头文件
这是一个非标准的预处理指令,用于在包含文件时防止同一个头文件被多次包含。它的作用类似于传统的宏保护,但它不需要在文件末尾添加取消宏定义的指令。内联函数是一种优化手段,它建议编译器在每次调用函数时直接将函数体插入到调用点,而不是进行函数调用,这样可以减少函数调用的开销。:这是一个标准的时钟类型,它提供了系统级的绝对时间。它的时间点表示的是自1970年1月1日(即Unix纪元)以来的时间。来实现的,它允许以秒为单位表示时间间隔,然后乘以1000将其转换为毫秒。:这是一个模板类,用于表示一个时间点。
2024-09-07 16:41:26 357
原创 A-loam源码注释-头文件lidarFactor.hpp
/Eigen::Quaternion<T>{(T)(T)((int)1), (T)(T)((int)0), (T)(T)((int)0), (T)(T)((int)0)},定义了一个单位四元数。//在雷达坐标系下计算残差和世界坐标系下计算残差的公式略有区别,在后续代码中再来分析原因。//将成员变量定义放在结构体或类的末尾是一种常见的编码风格。,它表示从上一个点到当前点的旋转。//通过插值的方法得到下一时刻的位姿,然后再迭代?//lpa: 表示上一个点A的三维坐标。: 点到平面的距离的负值与法向量的点积。
2024-09-07 15:50:41 896
原创 激光雷达产品介绍
与传统激光雷达线性重复式的扫描方式不同,Livox mid系列激光雷达扫描路径不会重复。且视场中激光照射到的区域面积会随时间增大,这就意味着视场覆盖率随时间推移而显著提高。内容参考自《解构大疆旗下 Livox Mid 激光雷达非重复扫描技术》作者:无人车情报局。0.1s扫描轨迹 0.2s扫描轨迹叠加Livox Mid 系列通过电磁力驱动光楔运动的方式实现光路的改变。
2024-09-03 22:26:07 513
原创 NDT算法
ndt_3d.h 以下为头文件 ------------------------------------------------------------------------------------------------在这种情况下,可以设置一个阈值,将小于该阈值的奇异值视为零,或者给它们一个非零的最小值,以避免除以零或非常小的数。上一次我们学习了高翔《自动驾驶与机器人中的SLAM技术》中的三维ICP算法,其中包括点对点、点对线、点对面的ICP算法,本次博客学习NDT算法的源码。// 最近邻点数阈值。
2024-09-03 15:56:10 1230
原创 三维ICP算法
options_.use_initial_translation_) {//是否使用初始位姿中的平移估计,默认为false。//设置雅可比矩阵的后 3x3 子块,它表示平移部分对残差的导数。
2024-09-02 20:28:58 1179
原创 Kd树与Kd树的k最近邻算法
Kd树查找的重点是剪枝,如果放宽剪枝条件D_split>D_max,添加一个比例因子α,使D_split>αD_max,整个kd树查询的速度就更快,但是不保证找到严格的最近邻。//如果未启用近似搜索,则直接使用当前最近邻点到查询点的距离平方来判断:如果到分割轴距离的平方小于当前最近邻点到查询点的距离平方。// 边界情况检查:输入的points等于同一个值,上面的判定是>=号,所以都进了右侧。/// Kd树节点,二叉树结构,内部用祼指针,对外一个root的shared_ptr。// 平方距离,用于比较。
2024-09-01 15:12:54 940
原创 栅格最近邻法与体素最近邻法
哈希函数的作用是将键(key)映射到哈希表的一个位置,这个位置通常称为“哈希桶”或“槽”(bucket)。//KeyType键类型,std::vector<size_t>值类型,哈希函数hash_vec<dim>。返回一个迭代器,表示容器的尾后位置(即容器末尾之后的位置),这是一个无效的位置。容器的一个成员函数,用于在向量的末尾就地构造并添加一个新元素。//这个头文件是 Google 的 glog 库的一部分,它提供了日志记录功能。//这是 C++17 标准库中的一个头文件,它提供了并行算法的执行策略。
2024-08-31 17:52:43 1012
原创 BFNN暴力K近邻
是 C++ 标准库中的一个头文件,它提供了与并行算法执行相关的功能。这个头文件是 C++17 标准的一部分,它引入了一种新的方式来指定并行算法的执行策略,允许开发者更轻松地利用多核处理器的并行处理能力。//这是 C++11 标准库中的头文件,它提供了线程相关的功能。此篇博客是高翔的《自动驾驶中的SLAM》书中的学习笔记,用于记录和注释书中的源码。是一个模板类,用于存储两个元素的配对,这两个元素可以是不同的类型。这是默认的执行策略,意味着没有特别的并行处理。每个元素将存储一个点的索引和它与给定点的平方距离。
2024-08-31 13:05:45 1034
原创 livox MID-360调试(解决ip设置问题)
然后我们来修改对于config文件中的ip地址,首先来看livox SDK2中的ip地址,我们要运行livox_lidar_quick_start,要修改mid360_config.json。改一下host_ip,注意修改的ip要和以太网设置的ip一致,“192.168.2.50”其中50可以改,192.168.2与livox的ip保持一致。这时候可以怀疑,是不是livox的ip不是默认ip 192.168.1.1xx,使用Tcpdump命令,来查看连接的livox的ip。这一篇博客修改了以太网的ip。
2024-08-30 11:20:08 1181 2
原创 AE开发第10天
然后第二个功能就是根据地图比例尺的变化,改变图层的颜色。首先是给地图加了一个显示比例尺的功能。蛮好玩的功能,大家可以参考。今天实现了一个挺好玩的功能。可以在地图中心显示比例尺。
2024-05-02 17:44:34 51 1
原创 数据结构——单链表(python)
要初始化链表,首先要初始化一个结点Node。然后初始化单链表,也就是初始化一个头结点。为链表添加内容,并遍历查看。查找指定元素,并返回其位置。
2024-04-30 19:49:38 185 3
原创 数据结构——顺序表(python)
首先创建一个顺序表,我一直很少用python中的类,都是直接构造函数,或者是连函数都没有,之间用轮子,一直是一个初学者的状态,我也想自己从基础学起!拓展,创建一个二维表,并且添加表头。计算班级各科成绩的平均分。第一个类 顺序表。删除指定位置中的元素。
2024-04-30 01:24:38 591 1
原创 Python批量下载hdf数据
这种方法首先要下载一个驱动,然后第一个界面会跳转到登录界面,我设置了30秒可以更改下载地址,然后输入密码和用户名。最后一个界面保持10分钟,这是因为之前总是数据没下完,代码就结束了,然后就把浏览器关了,我就想最后一次时间保持长一些,这样就可以让数据都下完。这段代码是用来检查有哪些文件下了,有哪些文件没下,我们从nasa下载的url通常有上千个,有可能出现下载不成功的情况,我们可以用这段代码检查,哪些没有下载成功。因为用nasa的代码总是报错,但是用浏览器下载数据是好的。最后就是将下载的hdf转栅格。
2024-04-12 22:31:22 256 1
原创 AE开发第九天
今天实现的主要是因子归一化。其实因子归一化的方法和之前算植被覆盖率的方法差不多,都是重分类的方法,用数组的setValue方法即可。今天整个水土流失定量分析系统的所有功能算是实现好啦。
2024-04-09 20:26:14 192
原创 AE开发第八天
今天发现一个问题,之前没写释放内存的代码,结果运行代码的时候出现内存泄漏了。这个之后再解决,还有要解决之前重分类会改变源数据的问题。今天实现的是由dem计算坡长,然后计算LS因子。主要使用的还是栅格重分类方法。
2024-04-09 12:34:48 256
原创 AE开发第7天
首先先改一个之前的bug,之前做地图代数的时候,用幂函数的式子有错误,应该用Pow而不是Power,很奇怪在arcmap里是Power但是在字符串里只能写Pow,否则会报错。今天做的是降水侵蚀度的计算,用到了地图代数和重分类的内容。就是这一段代码报错。最后做出来的效果如下。
2024-04-08 19:29:07 156
SLAM,算法,点云配准,教学
2024-09-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人