自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 cartographer_learn_21分支定界算法

cartographer_learn_21分支定界算法续接前篇分支定界算法得分的计算及Precomputed grids和得分计算的关系续接前篇前一篇我们讨论到了计算论文中的“precompute grids”,猛一看就容易产生疑问,计算这个东西有什么用?它和分支定界有啥关系?本篇就尝试解释一个这个问题,同时也介绍一下分支定界算法的过程。本篇不会涉及代码,所以可能会比较短小,但是作者认为有必要让它独立成篇,因为只有明白了这个后才能后好的阅读后续的代码。同时这里也希望读者对照这论文《Real-Time L

2021-10-08 17:10:33 717

原创 cartographer_learn_20子图匹配器与分支定界算法初涉

cartographer_learn20续接上篇构建子图的匹配器分支定界算法(Branch-and-bound scan matching)续接上篇上一篇我们讨论到了说cartographer在做局部窗口匹配还是做全局窗口匹配前做的一些准备和计算。本篇我们先来主要讨论做局部窗口匹配的情况。在这里,作者建议各位读者先去读一篇论文——《Real-Time Loop Closure in 2D LIDAR SLAM》,对照着论文看接下来的源码部分会更佳。想想上一篇的更新已经是十几天前了,作者跑去看了一会会多视

2021-09-17 14:56:17 593

原创 cartographer_learn19子图内的约束添加及回环检测前的准备

cartographer_learn19子图内的约束添加及回环检测前的准备续接上篇子图内约束的添加回环检测前的准备续接上篇上一篇我们简单的介绍了后端用于处理优化问题的类OptimizationProblem2D,介绍了它是怎么存储数据的,存储的都是哪些数据。同时也学习了后端中轨迹的联系,及如何找出轨迹间的间接联系等(这里有点绕)。我们继续回到上一篇中的ComputeConstraintsForNode,继续看看cartographer是如何计算约束的。子图内约束的添加上代码:WorkItem::R

2021-09-05 17:16:18 743

原创 cartographer_learn_18OptimizationProblem2D介绍及轨迹间的连接关系的管理

cartographer_learn_18OptimizationProblem2D介绍及轨迹间的连接关系的管理续接上篇子图加入优化问题(OptimizationProblem2D)OptimizationProblem2D子图的加入轨迹间的连接关系的管理续接上篇上一篇我们讨论到了后端如何存储节点和子图,及节点和子图的存储过程中都是存储的那些东西。其中子图的存储时存储了一根指向submap的指针及一个set用以记录那些与子图有关联的节点,节点存储的是Data这个结构体和节点再global中的位姿。同时我

2021-09-04 17:17:44 430

原创 cartographer_learn17节点,子图的添加及线程池

cartographer_learn17节点,子图的添加及线程池续接上篇节点和子图得添加节点的生成和存储子图的存储线程池续接上篇上一篇我们讨论到了如何将一个求一个节点在global坐标系中的位姿。总结一下大致分成两种情况。一种是这个节点所属轨迹存在子图s了,我们通过wTs * sTl来求得该轨迹得local坐标系在global坐标系中得位姿,再通过wTl *lTn来求得节点再global坐标系中得位姿。另一种是没有找到这个节点所属得轨迹存储得子图,cartographer得做法是先看看这个轨迹和其他轨迹

2021-09-03 16:37:52 1973

原创 cartographer_learn_16计算节点的全局坐标系下的姿态

cartographer_learn_16续接上篇制作并存储节点计算节点的全局坐标系下的姿态在data_::global_submap_poses_2d找到对应的轨迹的情况在data_::global_submap_poses_2d找不到对应的轨迹的情况后端各种数据存储续接上篇上一篇我们正式从前端过渡到了后端,从本篇开始,我们开始正式学习讨论后端。注意我们讨论的二维的slam过程,所以对应的类是PoseGraphD。这个类再文件cartographer/cartographer/mapping/inte

2021-09-02 16:28:05 558

原创 cartographer_learn_15前端返回的结果和前后端间的联系

cartographer_learn_15前端返回的结果和前后端间的联系续接上篇返回结果与后端接收结果三级目录续接上篇前面几篇我们关注了前端的大体处理过程,大致可以分成预测每个点时间对应的tracking坐标系位姿,处理点(点在坐标系间的转换,体素滤波等等),匹配,将匹配结果结合点云写入submap,维护位姿推断器状态等等。我们关注都是前端是怎么处理的,处理得到了什么结果。我们没有留意最终前端返回了一些什么东西,我们看到LocalTrajectoryBuilder2D::AddRangeData这个函数

2021-08-24 21:26:47 343

原创 cartographer_learn_14点云写入地图

cartographer_learn_14点云写入地图续接上篇写入地图前的剩余操作栅格地图的更新中理论和实现的差别点云写入地图续接上篇回忆一下我们上一篇得到了什么结果,上一篇讨论到了使用ceres求解点云与地图匹配的问题,得到的结果是tracking坐标系再local坐标系下的位姿乘以一个旋转矩阵(imu数据计算的tracking坐标系的姿态)的逆。想必它还要恢复原本tracking坐标系的位姿,然后将点云转换到local坐标系下,最后把点云写入地图。我们来具体看看操作。写入地图前的剩余操作回到上一

2021-08-22 15:30:08 584

原创 cartographer_learn_13点云匹配

cartographer_learn_13点云匹配续接上篇匹配前剩余的一些操作自适应体素滤波地图的介绍匹配续接上篇本来估计怎么的也得一周才会更新的,没想到ceres的使用(仅仅是使用)比作者想象的简单一点。没有像学g2o的时候有一些当时看起来比较奇怪的概念(一元边(第一次接触时在想一个顶点怎么能画边呢?。。。。。。))。好了回忆一下第12篇中点云处理的结果,最终我们得到的点云是在tracking坐标系下点p乘以一个旋转(imu数据估计出来的tracking坐标系的旋转),且这里所说的tracking坐标

2021-08-21 17:03:36 471

原创 cartographer_learn_12(点云匹配前的数据处理)

cartographer_learn_12点云匹配前的数据处理写在前面odometer数据和imu数据处理odometer数据imu数据点云的处理(匹配前含位姿推断器)使用位姿推断器推断位姿位置推算姿态增量的计算将点云转换到local坐标系下点云的旋转tracking坐标系的姿态的预测对点云做处理及体素滤波写在前面作者之前急于快速的将代码阅读完,没有仔细的考虑其中的原理,导致出现了一些错误。为了避免误导读者,作者回去仔细学习其中的原理,并把之前写的第12篇删除。之前我们讨论到了位姿推断器及把多个Lase

2021-08-19 21:30:49 1049 3

原创 cartographer_learn_11

cartographer_learn_11续接上篇PoseExtrapolator成员ImuTrackerPoseExtrapolator类方法——AddPose续接上篇回到10篇的LocalTrajectoryBuilder2D::AddRangeData中。我们已经讨论了这个函数种的多传感器数据同步的问题,我们继续往下看这个行数,上代码:std::unique_ptr<LocalTrajectoryBuilder2D::MatchingResult>LocalTrajectoryBu

2021-08-12 17:14:10 471

原创 cartographer_learn_10

cartographer_learn_10续接上一篇LocalTrajectoryBuilder2D::AddRangeDataRangeDataCollator续接上一篇上一篇讨论到了说把数据TimedPointCloudData扔给了GlobalTrajectoryBuilder<LocalTrajectoryBuilder2D, mapping::PoseGraph2D>>的AddSensorData。这个函数调用了很多功能,我们来一点点的讨论。先进入这个函数查看void Ad

2021-08-12 11:51:48 457

原创 cartographer_learn_9

cartographer_learn_9写在前面ros中订阅LaserScan数据LaserScan数据介绍及处理数据格式数据处理写在前面经过前面8篇的讨论,我们终于找到了在2d的情况下究竟是哪个类真正的实现前端的功能,哪个类在正真的负责后端的算法。它们分别是:GlobalTrajectoryBuilder<LocalTrajectoryBuilder2D, mapping::PoseGraph2D>>中的类成员pose_graph_(类型是LocalTrajectoryBuilde

2021-08-11 21:44:33 345

原创 cartographer_learn_8

cartographer_learn_8续接上一篇GlobalTrajectoryBuilder的类成员GlobalTrajectoryBuilder的类方法续接上一篇上一篇讨论到了说给不同的数据配备数据队列分配处理函数,即第7篇中的最后一个函数的,最后一个函数的最后一句又调用了Dispatchable::AddToTrajectoryBuilder,代码如下:void AddToTrajectoryBuilder( mapping::TrajectoryBuilderInterface

2021-08-10 16:38:00 251

原创 cartographer_learn_7

cartographer_learn_7续接上一篇CollatedTrajectoryBuilder的类成员CollatedTrajectoryBuilder类方法续接上一篇在了解完后Collator类后我们继续往前端算法的那个方向走,回顾本系列的第4篇的前端构造那一节,我们发现这个3d和2d的情况构建的前端是不一样的,我们先来讨论较为简单的2d,这样好理解一点(其实就是作者不学无术。。。)。在map_builder.h文件中可以看到前端的类型是mapping::TrajectoryBuilderInt

2021-08-09 21:15:22 234

原创 cartographer_learn_6

cartographer_learn_6_test续接上一篇Collator类方法续接上一篇回到Collator这个类中,前文说这个类有两个我们看不懂的类成员,前文讨论了其中一个OrderedMultiQueue,总的来说它就是按轨迹id和ros的话题分门别类的存储,处理,发送数据的。第二个是一个absl::flat_hash_map<int, std::vector< QueueKey> >,百度了一下说这是谷歌开发的库,其实从名字也能看出来这个就相当于unordered_ma

2021-08-09 17:25:39 301

原创 cartographer_learn_5

cartographer_learn_5_test续接前文OrderedMultiQueue相关的定义OrderedMultiQueue的类成员OrderedMultiQueue的类方法续接前文在具体的讨论前后端前,觉得有必要讨论一下数据的处理和传输,即 unique_ptr< sensor::CollatorInterface > MapBuilder::sensor_collator_。看起来它的类型是sensor::CollatorInterface,但是F12进去后发现它仅仅是接口,

2021-08-09 16:17:46 369

原创 cartographer_learn_4

cartographer_learn_4续接前面讨论的话题MapBuilder的构造函数及类成员前端构造续接前面讨论的话题前面经过不断的学习(不断的按F12和Ctrl+Alt+"-")我们知道了先是启动Node类,Node调用MapBuilderBridge,MapBuilderBridge调用它的类成员map_builder来实现具体的功能。具体的看map_builder的类型:unique_ptr< cartographer::mapping::MapBuilderInterface >

2021-08-08 19:39:08 297

原创 cartographer_learn3

cartographer_learn3MapBuildBridgeMapBuildBridge的类方法对应的ros的服务MapBuildBridge的类方法话题的发布MapBuildBridge继续上一篇的话题,上一篇我们发现Node做了很多事情,但不都是它自己做的,而是调用别人来实现具体过程,这个被调用的对象是map_builder_bridge_。我们先来具体看看这个对象,发现它的类型是cartographer_ros::MapBuilderBridge。这类的名字叫**桥,想必它也和Node一样是

2021-08-08 16:26:24 184

原创 Cartographer_learn_2

Cartographer_learn_2#Node的一些类成员

2021-08-08 11:07:56 253

原创 Cartographer_learn_1

Catorgrapher_learn_1欢迎使用Markdown编辑器写在前面程序的入口合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你

2021-08-07 23:25:01 358

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除