
(02)Cartographer源码无死角解析-收费
文章平均质量分 95
适合自动驾驶、服务/仓储/扫地机器人等领域的工程师、在读学生、教师等。史上最新最全Cartographer讲解,不漏任何一个细节推理,无死角的公式推导与源码解析,并讲解算法落地的工程实践技巧,代码改进方向等,快速上手做项目
江南才尽,年少无知!
志在九天不为乡愁换白发,偏偏年少白衣博天涯!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
(02)Cartographer源码无死角解析-(80) 核心要点→local坐标系、子图坐标系、切片坐标系、地图坐标系等相转换与联系
该篇博客应该是深入理解代码,工程落地相关最重要的一篇文章了。前面分析过程中,本人绘画的图像与坐标系,并没有严格的按照论文,或者源码实现的逻辑进行绘画。前面分析中,并不需要显示地图 ,只要理解其逻辑就可以了,但是现在不行了,因为现在要显示地图,必须弄清楚各个坐标系之间的关系,才能够很好的进行图下的变换,保证通过 ROS 发布的图像是正确的。疑问1疑问1。原创 2023-07-12 21:59:03 · 1804 阅读 · 1 评论 -
(02)Cartographer源码无死角解析-(81) ROS栅格地图→服务接收子图、cairo图像绘详解、OccupancyGrid地图发布
疑问1疑问1src/cartographer/cartographer/mapping/2d/probability_grid.cc 文件中的 ProbabilityGrid::DrawToSubmapTexture 函数的 proto::SubmapQuery::Response::SubmapTexture* 示例对象 texture 中texture->mutable_slice_pose() 的含义具体是什么。原创 2023-07-12 23:04:41 · 1661 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(73) 2D后端优化→OptimizationProblem2D-landmark残差细节分析
个人理解个人理解后端优化是在图优化的框架下,通过调整节点和子图的位姿,以最大程度地满足各种约束条件,使得整个系统的位姿估计更加准确和一致。在后端优化中,节点和子图的位姿是通过最小化误差函数来进行调整的。这个误差函数可以包含多种约束,如里程计测量、IMU数据、固定的参考帧位姿、特征点观测等等。优化的目标是找到一组位姿,使得所有的约束都得到满足,并且使得整个系统的一致性最好。在优化的过程中,为了保证约束的准确性,需要对位姿进行调整,同时也要考虑到不同节点和子图之间的关系,以及它们与前端位姿估计的一致性。原创 2023-07-04 19:11:02 · 960 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(72) 2D后端优化→OptimizationProblem2D-约束残差、landmark残差
在继续分析 OptimizationProblem2D::Solve() 函数之前,这里把之前本人的一些理解再重复一次。个人理解个人理解这里,本人抛砖引为引玉,谈一下个人对后端优化的理解。首先后端优化是从一个整理来考虑的,其基于 global 系。利用到到了子图与子图之间的变换关系,可以在前端(基于local系)过程中,子图单个相对于 local系 的位姿,可以说他们是没有直接联系到一起的。原创 2023-07-03 20:56:03 · 1101 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(68) 2D后端优化→FastCorrelativeScanMatcher2D -分支定界算法(BranchAndBound)2
(02)Cartographer源码无死角解析-(67) 2D后端优化→FastCorrelativeScanMatcher2D -分支定界算法1。原创 2023-07-02 15:51:31 · 665 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(61) 2D后端优化→ComputeConstraintsForNode() 与 什么是约束-白话篇
通过前面两篇博客,已经知道了如何使用 Cartographer 中的线程池,且为为线程池添加任务。疑问1疑问1global_submap_poses 等价于 PoseGraph2D::data_.global_submap_poses_2d 是何时进行优化的。疑问2疑问2为什么要等待约束计算完成之后再调用 PoseGraph2D::HandleWorkQueue(),同时源码又是如何实现的。原创 2023-05-17 15:34:59 · 846 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(59) 2D后端优化→ 线程池: DrainWorkQueue()、AddWorkItem()
/ 把计算约束的工作放入workitem中等待执行 AddWorkItem([ = ]() LOCKS_EXCLUDED(mutex_) {});其作用就是把计算约束的这样一个任务添加到线程池中,然后等待空闲线程的执行。那么问题来了,线程池是如何构建的,又是如何运行的呢?原创 2023-03-03 14:29:27 · 1171 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(56) 2D后端优化→class MapById、ConstIterator、ConstTrajectoryIterator
/ 将节点在local坐标系下的坐标转成global坐标系下的坐标 const transform :: Rigid3d optimized_pose(GetLocalToGlobalTransform(trajectory_id) * constant_data -> local_pose);原创 2023-02-21 18:00:43 · 1101 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(52) 2D点云扫描匹配→ceres扫描匹配:CeresScanMatcher2D→栅格地图残差
在上一篇博客中,对ceres扫描匹配的平移与旋转优化部分进行了详细的讲解,知道关于ceres的使用核心在于禅茶的构建。疑问1\color{red}疑问1疑问1与疑问2\color{red}疑问2疑问2整合:CeresScanMatcher2D::Match()函数中,为什么平移残差优化的目标是 target_translation(由推断器或者暴力匹配获得),为什么旋转的残差目标值设置为 ceres_pose_estimate[2]。暂且记住这两个疑问,看下接下来的分析中是否能够找到答案。原创 2023-01-31 09:04:10 · 1414 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(49) 2D点云扫描匹配→相关性暴力匹配1:SearchParameters
在上一篇博客中,大致对扫描匹配暴力求解的原理进行了讲解,同时列举了比较形象的例子。虽然说原理不是很复杂,但是代码实现起来还是存在一定难度的。// 根据参数决定是否 使用correlative_scan_matching对先验位姿进行校准 if(options_ . use_online_correlative_scan_matching()) {原创 2023-01-12 14:12:49 · 1510 阅读 · 1 评论 -
(02)Cartographer源码无死角解析-(46) 2D栅格地图→RayToPixelMask()与贝汉明(Bresenham)算法
疑问1\color{red} 疑问1疑问1→ 为什么Grid2D::FinishUpdate()函数中,栅格值为什么需要减去 kUpdateMarker?疑问3\color{red} 疑问3疑问3→ ProbabilityGrid::ApplyLookupTable() 函数中对于cell的更新比较奇怪,代码为:*cell = table[*cell]。原创 2023-01-05 11:29:02 · 1625 阅读 · 1 评论 -
(02)Cartographer源码无死角解析-(45) 2D栅格地图→ProbabilityGridRangeDataInserter2D
通过一系列的分析,对于 ActiveSubmaps2D、Submap2D、Submap、Grid2D 、ProbabilityGrid 的了解相对来说比较深刻了。疑问1\color{red} 疑问1疑问1→ 为什么Grid2D::FinishUpdate()函数中,栅格值为什么需要减去 kUpdateMarker?疑问3\color{red} 疑问3疑问3。原创 2023-01-03 17:58:50 · 971 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(43) 2D栅格地图→ValueConversionTables、Grid2D
(02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式这篇博客钟保存的地图:该栅格地图可以理解为一个灰度图,颜色约白的像素,说明该像素对应地图坐标系中 cell 被占用的概率越少,这里的占用可以理解为障碍物。也就是说,越黑的区域其是障碍物的概率越大,如上图中墙壁是黑色的,等价于障碍物。另外,在地图的外面,也就是上图中的灰色区域,表示没有探测的区域,其对应的 cell 区域有可能没有被占用,也可能被占用了。原创 2023-01-01 15:05:16 · 1509 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(38) PoseExtrapolator→AdvanceImuTracker()、ImuTracker姿态推断
/ 根据加入的pose计算线速度与角速度 UpdateVelocitiesFromPoses();// 将imu_tracker_更新到time时刻 AdvanceImuTracker(time , imu_tracker_ . get());原创 2022-12-16 13:24:35 · 923 阅读 · 1 评论 -
(02)Cartographer源码无死角解析-(37) PoseExtrapolator→AddPose()、旋转向量(求导)变换成角速度
讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下:(02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.youkuaiyun.com/weixin_43013761/article/details/127350885 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\c原创 2022-12-11 17:09:23 · 1093 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(35) PoseExtrapolator→接口解剖,学会框架分析与架构设计
接下来的讲解,与前面的可能不太一样了。之前的是为了分析代码而分析代码,后续,是为了了解整体设计,而分析代码。总的来说,学习过程中,是需要递进与增加深度的。后面要教会大家的能力是如何看懂别人的代码,而不是代码为什么要这样写。通过前面一系列博客,对于点云数据的处理基本差不多了,剩下一些关于点云的核心算法,如扫描匹配等。原创 2022-12-09 09:29:05 · 1254 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(34) LocalTrajectoryBuilder3D→3D点云数据处理,大致流程梳理
通过前面一系列的博客,对于 LocalTrajectoryBuilder2D 关于激光雷达数据的处理可谓是比较熟悉了,当然这里关于点云匹配的知识点暂时还没有讲解,不过没有关系,后续会进行详细的讲解。LocalTrajectoryBuilder3D 与LocalTrajectoryBuilder2D 存在很多相同的部分,所以这里不会做十分细致的分析了,不太明白的点,参靠前面的博客应该是可以找到答案的。原创 2022-12-07 19:32:31 · 882 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(31) LocalTrajectoryBuilder2D::AddRangeData()→点云数据重力对齐,Z轴过滤
讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下:(02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.youkuaiyun.com/weixin_43013761/article/details/127350885 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\c原创 2022-11-29 11:40:00 · 1210 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(27) 数据订阅、变换、排序、转发→总体复盘
通过前面一系列的博客,相信对于 Cartographer 数据的初步处理已经有了一定了解,接下来会一个总结,把之前的所有知识都串联起来。其主要分二个部分进行讲解:1.回调函数的注册与绑定。2.数据流向与分发。那么下面就开始把通过该篇博客,我们可以说是对 Cartographer 数据的分发十分了解了,知道七传感器的数据,最终都传递给了 GlobalTrajectoryBuilder 进行处理。原创 2022-11-21 20:35:27 · 969 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(20) MapBuilder→MapBuilder()构造函数
通过前面的一系列博客,已经对 SensorBridge 这个类进行了十分细致的讲解,也就是说,目前对于 Cartographer 数据预处理的部分已经比较了解,接下将围绕 MapBuilder 这个类进行展开,其头文件路径为 src/cartographer/cartographer/mapping/map_builder.h。原创 2022-11-15 17:17:24 · 1145 阅读 · 0 评论 -
(02)Cartographer源码无死角解析-(12) Node类初探→构造函数与开始轨迹
/ MapBuilder类是完整的SLAM算法类 // 包含前端(TrajectoryBuilders,scan to submap) 与 后端(用于查找回环的PoseGraph) auto map_builder = cartographer :: mapping :: CreateMapBuilder(node_options . map_builder_options);原创 2022-11-01 10:04:21 · 1339 阅读 · 2 评论 -
(02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
通过上一篇博客,对ROS进了十分简单的介绍,对其有了一定了解,不过上一篇博客讲解的东西,都是通用的,列举的例子基本都是与Cartographer没有太大相关性,当然,其中和很多东西都是相通的。那么接下来,就以 Cartographer 熟悉一下如何使用通用的命令,以及其独有的脚本。原创 2022-10-22 16:11:26 · 1692 阅读 · 3 评论