#include 赞 踩 本篇文章来对图优化内容进行解析。如今,图优化和卡尔曼滤波已经成为了主流的后端优化方法。 头文件 首先这个头文件和imu预积分的内容差不多,其中有几个库是imu预积分没有的,当然imu预积分没有用上那些库,所以才没有include进去。然后下面是使用了gtsam命名空间,这样的话就可以不用谢gtsam::然后啥啥啥变量了,就直接写变量名即可。然后是XVBG,这些就是起了个名字,具体的用法的话,在我的印象里X(0),类似这种,进行赋值。 变量 首先是定义了一个结构体,这个结构体里面包含了xyz RPY 还有时间戳这些非常基本的内容。然后这个EIGEN_MAKE_ALIGNED_OPERATOR_NEW是EIGEN字节对齐用的,这个不再重述了。然后下面是注册为点云格式,然后这个的话,就看看记一下格式模板即可。最后把定义的结构体重新命名一下,这样显得更加高端一些!下面就是mapOptimization类中定义的变量,首先它公有继承自ParamServer。然后下面的话就是一些列的值,这里就不过多讲解了,自己看注释。这里的话,分清作用域即可。然后下面有锁std::mutex mtx,还有一些下面函数需要单独使用的变量,哲理的话不讲解,没啥意思。 函数 构造函数,设置了阈值的数值,然后下面的话就是订阅和发布的内容,一个advertise 一个subscribe。当然subscribe里面有函数句柄,在调用这个函数的时候,这个句柄就会自动启动,然后它们做的事情,下面来讲解。然后设置体素大小,这个没啥意思,我的理解的话还是你先搞个正方体,然后把装在正方体里面的点云用一个点来表示,这样实现降采样。开始第一个函数,分配内存。 这个没啥好说的 reset resize fill 等函数操作 都是给这个板块里的变量在清除里面可能存在的数值。哲理的话,我对N_SCAN * Horizon_SCAN的理解,就是行×列,这个雷达的扫描线就是一行行的,横着扫的。这个是我的理解,同时这个的话,也是转为一维坐标的关键,知道他是按行来一个个存储的就ok。还有这个fill函数,第一次遇到,一看名字就知道他是干啥的,但是里面具体的逻辑,再读一遍的时候,细细研究。这里没啥好说的,就后面括号里面的内容 类型,和前面的变量对齐就可以了。 雷达点云的句柄,当然是subcribe雷达点云的时候启动的,一开始获取时间,然后从ROS作用域下获得点云的数据,然后上锁,下面的话,就是一系列函数,对于这些函数能干啥,都在代码里面注释了。当然这是学习了网上各路神仙以后总结下来的代码。 laserCloudInfoHandler: 1、updateInitialGuess();首先初始化 这个Guess可以想成高斯分布,完了这个我不确定,反正是初始化 2、extractSurroundingKeyFrames();这个提取周围的关键帧 3、downsampleCurrentScan(); 降采样,就是上一步可能提取的数据太多,计算机一下处理不了这么多 4、scan2MapOptimization(); 这个部分还不是很理解,大体内容的话就是cornerOptimization、surfOptimization然后combineOptimization,里面还有LMOptimization,这些优化的内容,前面的话感觉就是要找到角点和平面点,然后你算出来个coeff用在后面的优化中,后面两个的话就是不断地优化,然后他最后判断一个delta啥东西的,是两个!然后不停地迭代优化,找到最优解。就是里面的话一些变量不是很明白,我推测,应该论文原文会有,或者是一些基础的知识,但是我没看到。 5、saveKeyFramesAndFactor();这部分的话就是添加因子,然后保存关键帧的一些操作 6、correctPoses();这部分的话,没看懂的是aLoopIsClosed是啥意思,然后这个东西在if条件中用到,这个地方不是很理解,这个模块的话就是在修正位姿。 7、publishOdometry(); 发布激光里程计 8、publishFrames(); 发布帧 这两个的话可以具体到函数里面看看它到底发布了啥,这里不多讲了 一些转换的函数,可以看看里面到底谁赋值给了谁,这里我还没看,再看一遍的时候,再来注意这个地方。 上面是一些关于线程的内容,这个是在最下面的main函数里面出现的,这个main函数相比其他的话,多了两个线程。 一个初始化的操作,没啥好讲的 这个地方的逻辑很简单:使用extractSurroundingKeyFrames ->extractNearBy -> extractCloud就可以了,这个函数具体内容可以看看里面,这里就不浪费笔墨了。 降采样内容,一开始想再加一个重复的步骤,但是没编译过,不知道效果怎么样,但是作者用了两个的话,应该会有用两个的说法。 这里就是涉及到了那4个优化的函数,里面涉及到了一些数学公式的计算,这个还没搞懂,然后coeff到底赋值了些啥,上面都写得很清楚,但是intensity部分的赋值还没看懂。前两个优化,就相当于把角点和平面点匹配到map上面,然后后两个的话就是迭代找最优的X解。这里在LM优化函数里面有雷达到相机 和 相机到雷达的转换关系,这个可以适当记一下。 没怎么看上面这两个函数,应该比较简单。 添加因子的函数,哲理的话我感觉他们添加因子就是使用了gtSAMgraph.add()函数,然后最后一个参数就是噪声协方差,当然这个协方差越小越好。GPS一开始是注释掉的,等接下来把注释去掉,看看会什么样子。然后是闭环因子,这里的参数是index index pose noise。这里aLoopIsClosed被赋值为true,是不是这个和加入闭环因子有关,或者想多了,就直接理解成表面意思,感觉也可以。 这个没啥好说的,就是加因子的操作。 这些也没啥好说的感觉,就直接看代码就可以。 然后最后这个主函数,没啥好说的,前面差不多说过了,这里多了两个线程,一个是闭环的,另一个是可视化地图的,没啥好讲的,这两个线程还不是很熟悉,再读一遍代码的时候认真研究。然后spin(),然后线程的join操作,最后返回0.这个没啥好说的,本篇结束! 接下来的话,会进行视觉部分的代码解析。这个部分的话,问题好像有,但是忘记了,记得有个变量不清楚里面赋值是啥,但是后面读着读着就忘记这个变量是啥了。。。 好了 再读一遍的时候立刻解决问题!!! Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。
LVI-SAM mapOptimization 代码解析_using symbol_shorthand::x;