
slam
文章平均质量分 82
jiajiading
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ORB-slam2源码分析(2)- 程序入口system类
ORB-slam2源码分析(2)- 程序入口system类 system构造函数TrackMonocular 单目相机入口orb-slam2支持单目,双目,rgbd三种类型摄像机进行slam,其整个程序入口和出口均在system类中。因此如果需要将orb-slam2在ros中运行,可将system类进行重新封装(其他都可不做修改),在ros节点中调用system类即可,这点非常友好。system构造函数system函数为整个算法的入口,包括所有线程的开辟,各个模块的初始化,及其摄像机类型的选择;//原创 2021-11-29 17:26:16 · 497 阅读 · 1 评论 -
ORB-slam2源码分析(1)- 整体框架
ORB-slam2源码分析(1) 前言整体框架TrackingLocal mappingLoop closing总结前言非科班出身,也非擅长业务,仅用来学习记录,扩展知识。主要熟悉的是激光slam,但vslam与激光slam整体框架理论基本相同,但是具体技术细节差距较大,希望从中获取更多知识点,可取长补短。从技术角度看,相结合是趋势;从实际出发,需具体看产品定位;vslam包含许多视觉相关知识点,相对于laser,知识点及其理论都较为复杂,基于学习目的和精力有限,文档仅分析整个框架和记录部分核心功能源原创 2021-11-29 17:25:57 · 2460 阅读 · 0 评论 -
lego-loam代码分析(2)-corner和surface特征点提取
lego-loam代码分析(2)-角点和平面点提取坐标修正(adjustDistortion)计算平滑参数 (calculateSmoothness)点云屏蔽标记(markOccludedPoints)平面点和角点提取 extractFeatures()角点特征点提取地平面特征点提取相对较平的平面点云总结FeatureAssociation.cpp同样为独立线程,主要功能是根据带有聚类后地面和非地面的点云数据进行特征值提取,主要提取其平面特征、角点特征;同时采用匹配算法计算前后两帧激光视角下的位姿转换;从原创 2020-12-16 17:25:20 · 2026 阅读 · 0 评论 -
lego-loam代码分析(1)-地面提取和点云类聚
lego-loam代码分析(1)-地面提取和点云类聚概述imageProjecion.cpp获取点云角度范围 (findStartEndAngle())无序的点云变为有序(projectPointCloud())地面分割groundRemoval()点云聚类(cloudSegmentation)点云发布概述目前最新开源的3d slam算法lego-loam,为loam的改进版。同时另有高人进行了工程优化。其原作者github其工程优化的github个人对其工程优化后的代码和原理进行了基本分析;包原创 2020-12-10 13:19:57 · 4364 阅读 · 0 评论 -
cartographer 代码思想解读(19)-算法思想总结
cartographer 代码思想解读(18)- 算法思想总结前端处理整体思想前端处理流程后端处理闭环检测后端处理流程总结引入cartographer算法官方框架图。从cartographer官方结构框图可看出,其算法整体结构遵从slam基本结构,包括前端处理和后端处理两部分。其中前端处理即cartographer中的Local SLAM,其主要功能是输入传感器信息通过scan-match获取帧间相对位姿关系,构建submap并获取laser-scan与submap相对位姿关系;而后端处理即为ca原创 2020-12-02 09:10:43 · 2484 阅读 · 4 评论 -
cartographer 代码思想解读(18)- PoseGraph2D整体处理流程2
cartographer 代码思想解读(18)- PoseGraph2D整体处理流程2后端(后台)任务压栈AddWorkItem后台任务执行循环DrainWorkQueue后端图优化任务管理函数HandleWorkQueue优化函数RunOptimization总结接上篇。后端(后台)任务压栈AddWorkItem后端优化的操作基本都是采用线程池在后台运行,cartographer采用了一个个任务放入任务队列work_queue_中,然后排队调用执行。// 将一个函数地址加入到一个工作队列中v原创 2020-11-27 11:32:46 · 1339 阅读 · 2 评论 -
cartographer 代码思想解读(17)- PoseGraph2D整体处理流程1
cartographer 代码思想解读(14)- PoseGraph2D整体处理流程前面分析了位姿图结构,优化的原理,约束的形成以及优化求解等具体实现,同时也提前介绍了PoseGraph2D内的成语变量。本节作为最后一节将整个后端的优化的流程(包括如何调用约束以及求解器)进行分析。...原创 2020-11-25 16:41:38 · 2059 阅读 · 0 评论 -
cartographer 代码思想解读(16)-后端优化求解器optimization_problem_具体实现
cartographer 代码思想解读(16)- 后端优化求解器optimization_problem_具体实现OptimizationProblem2D成员构造函数优化对象接口优化求解实现Solve总结根据前面分析的图优化基本结构可知,已知节点、约束和闭环约束条件后,则可进行超定方程组求解,即求解所有节点的最佳位姿,使得超定方程组误差最小。optimization_problem_则是优化求解器,采用的是SPA(Sparse Pose Adjustment)方法进行优化,较早的开源SLAM算法kat原创 2020-11-24 16:46:43 · 1831 阅读 · 1 评论 -
cartographer 代码思想解读(15)- ConstraintBuilder2D约束构造器
cartographer 代码思想解读(10)- ConstraintBuilder2D约束构造器ConstraintBuilder2D成员ConstraintBuilder2D构造约束构建器主要是完成创建和维护节点与submap之间的位置关系,其中闭环检测则是由ConstraintBuilder2D完成,即submap与历史节点的约束,或者节点与历史submap之间的约束。ConstraintBuilder2D成员 // 约束器配置内容 const constraints::proto:原创 2020-11-24 11:39:31 · 1922 阅读 · 0 评论 -
cartographer 代码思想解读(14)- 后端优化核心类PoseGraph2D简介
cartographer 代码思想解读(14)- 后端优化核心类PoseGraph2DMapbuilder中引入了整个slam分为前端和后端两部分,其中后端核心接口为PoseGraph,并且分为2d和3d两种情况,2d声明接口为PoseGraph2D。global_trajectory_builder中引入了后端PoseGraph2D核心类接口的调用,即前端匹配的后的结果类matching_result加入到后端````AddNode``。...原创 2020-11-23 17:30:20 · 1561 阅读 · 0 评论 -
cartographer 代码思想解读(13)- 后端优化基本思想
cartographer 代码思想解读(12)- 后端优化基本思想原创 2020-11-23 11:28:30 · 2403 阅读 · 3 评论 -
cartographer 代码思想解读(12)- local SLAM和global SLAM链接global_trajectory_builder
cartographer 代码思想解读(12)- local SLAM和global SLAM链接global_trajectory_builderGlobalTrajectoryBuilder2D 创建GlobalTrajectoryBuilder 构造函数和成员变量从上节map_builder代码分析可看出,cartographer SLAM和传统SLAM一致,分为前端和后端两部分:local_trajectory_builder和pose_graph,而将两者如何结合在一起,则采用了Global原创 2020-11-18 11:24:19 · 1502 阅读 · 1 评论 -
cartographer 代码思想解读(11)-顶层map_bulider类解析
cartographer 代码思想解读(11)- 顶层map_bulider类解析map_builder成员MapBuilder构建函数关键核心函数AddTrajectoryBuilderFinishTrajectory 完成并结束一条轨迹其他函数接口总结从本博客开始分析cartographer中的后端代码,无闭环的SLAM的算法代码和思想已基本分析完成。本节开始首先引入顶层接口类map_bulider类,实际上SLAM的顶层接口,并由cartographer_ros调用,不详细分析,主要是可说明car原创 2020-11-17 15:08:08 · 988 阅读 · 1 评论 -
cartographer 代码思想解读(10)- slam前端LocalTrajectoryBuilder2D类(主流程)
cartographer 代码思想解读(10)- slam前端LocalTrajectoryBuilder2D类(主流程)local_trajectory_builder_2d处理流程local_trajectory_builder_2d类定义类含有变量输出结果MatchingResult结构体Odometry输入接口AddOdometryDataIMU输入接口AddImuData点云输入接口AddRangeData(核心处理方法)点云投影和滤波TransformToGravityAlignedFrame原创 2020-09-30 15:01:33 · 2650 阅读 · 0 评论 -
cartographer 代码思想解读(9)- 激光雷达畸变矫正
cartographer 代码思想解读(9)- 激光雷达畸变矫正本节为cartographer前端匹配算法中最后一个核心算法实现内容,下节将会这9节内容串起来构成cartographer中2dslam的前端总体接口local_trajectory_builder_2d类。此节激光矫正具体实现就是在local_trajectory_builder_2d实现的,单独列出来进行分析。是因为至今我使用的SLAM从未进行过矫正考虑,是因为室内机器人速度较低,同时雷达采用性能较好雷达,则可做简单的假设,认为影响较少。原创 2020-09-28 18:03:11 · 2932 阅读 · 2 评论 -
cartographer 代码思想解读(8)- 多激光传感器同步融合RangeDataCollator
cartographer 代码思想解读(8)- 多激光传感器同步融合RangeDataCollatorRangeDataCollator类定义AddRangeData()CropAndMerge()前面已经分析了cartographer前端的主要核心算法如插入更新和匹配算法等,其中激光雷达点云数据均为作为主要输入,使用时无需考虑具体几个传感器,传感器类型,可通认为是一个雷达产生的点云数据。但实际cartographer通过RangeDataCollator类将多种传感器进行了融合,并进行了时间同步,最后形原创 2020-09-28 17:26:13 · 3004 阅读 · 1 评论 -
cartographer 代码思想解读(7)-位姿估计器PoseExtrapolator实现
cartographer 代码思想解读(7)- 位姿估计器PoseExtrapolator实现pose_extrapolator类定义插入IMU数据 AddImuData()插入里程计数据 AddOdometryData()UpdateVelocitiesFromPoses()插入历史位置AddPose()航向角积分实现AdvanceImuTracker()ImuTracker类定义获取预测位置ExtrapolatePose(const common::Time time)思想总结cartographer原创 2020-09-25 17:02:36 · 3546 阅读 · 5 评论 -
cartographer 代码思想解读(6)- submap封装与维护
cartographer 代码思想解读(6)- submap封装与维护前面两节描述了submap2d的存储形式、表示形式、概率地图、继承关系,同时也包含了submap具体的初始化、更新原理和过程,即算法核心具体实现。这节主要描述下cartographer如何在代码中进行封装和调用的。cartographer代码中并没有直接调用submap的类进行处理,而是将submap类封装成submap2d进行调用,同时将其submap2d重新封装成了ActiveSubmaps2D类进行维护和管理。其代码目录如下:原创 2020-09-21 14:55:43 · 3614 阅读 · 0 评论 -
cartographer 代码思想解读(5)- probability grid地图更新2
cartographer 代码思想解读(5)- probability grid地图更新2gridmap插入新的rangesubmap和submap2d两个类含义submap2d 插入器CastRays实现gridmap更新查询表上节讲解了probability类以及基类grid存储内容,同时也分析了cartographer采用的概率初始化和更新的思想。本节接上节,分析cartographer概率更新代码具体实现。gridmap插入新的rangecartographer将新的一帧激光scan经过前端匹原创 2020-09-17 13:06:23 · 2996 阅读 · 0 评论 -
cartographer 代码思想解读(4)- probability grid地图更新1
cartographer 代码思想解读(4)- probability grid地图更新grid mapprobability mapprobability map cell 初始化probability grid地图更新前面3节分析cartographer 2d算法中的前端和闭环使用的匹配原理分析,采用的匹配方法均是采用scan-to-map的方法,比scan-to-scan的方法累计误差有所提高。其中匹配方法中的map如何获取,具体意义,本节通过分析相关源代码进行记录。在第一节已经讲过,由于cart原创 2020-09-16 16:35:57 · 4346 阅读 · 3 评论 -
cartographer 代码思想解读(3)- ceres优化库scan-match
cartographer 代码思想解读(3)- ceres优化库scan-matchceres匹配简单总结扫描匹配OccupiedSpaceCostFunction2D总结前两节分析了cartographer 中的相关匹配思想和相关匹配优化快速实现,但cartographer之所以局部slam即前端匹配的准确度极高,因为最终采用了优化匹配的方法,即比栅格化的地图相关匹配准确度更高。而cartographer将匹配转换成最小二乘思想,并采用自家的ceres库完成优化匹配。其详细的代码解释可参考他人博客:原创 2020-09-07 16:24:59 · 4960 阅读 · 1 评论 -
cartographer 代码思想解读(2)- 分支定界快速相关匹配
cartographer 代码思想解读(2)- 分支定界快速相关匹配分支界定基本原理源码解读顶层函数分层地图栈 PrecomputationGridStack2D上节描述cartographer中算法中的相关匹配算法,为前端的scan-match,由于其初始位置有一定确定和分布性,故采用基本的暴力扫描方法。本节描述相关匹配一种快速实现,主要应用于loop-scan。回环检测为后端处理重要步骤,即检测当前位置是否曾经来过,即采用当前scan在历史中搜索是否匹配。故其搜索范围及其位置不确定性较大,故carto原创 2020-09-04 13:52:16 · 6310 阅读 · 4 评论 -
cartographer 代码思想解读(1)- 相关匹配
cartographer 代码思想解读(1)- 相关匹配前端栅格地图相关匹配疑问点cartographer在2016年开源后一直在使用,但是一直未仔细阅读并分析其核心代码结构。目前网上可以找到许多博主对其分析和理解。其cartographer的基本思想可参考他人的博主博客。本博客主要目的根据其框架思想,将其核心算法进行提取,方便后续学习和移植。其google开源的代码量太大,层次太多,大量虚函数,继承关系,功能齐全,并且采用大量的C++11.0新特性等许多原因,导致阅读代码难度加大。因此此次阅读仅对sla原创 2020-08-28 13:24:36 · 4499 阅读 · 2 评论 -
基于g2o图优化slam方案(1)
基于g2o图优化slam方案(1)基于图优化的SLAM主要内容组成位姿预测位姿修正构建图优化所使用的顶点与边闭环检测图优化地图构建并发布总结基于图优化的SLAM主要内容组成slam主要包括2d slam 和 3d slam,本文以激光2d slam为背景进行描述位姿预测位姿修正构建图优化所使用的顶点与边闭环检测图优化地图构建并发布位姿预测slam是实时建图与定位,实际在算法...原创 2019-09-27 11:29:34 · 1664 阅读 · 0 评论 -
无人驾驶与室内移动机器人对比思考
激光slam相关问题思考室外无人驾驶slam室内室外低速机器人slam室外无人驾驶slam虽说无人驾驶很火,尤其近几年。但是基于目前实际街道场景、安全、成本、存储、法律法规等,以及更多实际的未能预料的“坑”,估计短时间内会一直维持现状,难以实现真正的上路。实际上无人驾驶技术整体上已经非常成熟,整个技术环节也都已完善,在高速路段也许可以真正放开双手,但是在城市到路上个人觉得暂时真的需要打个“...原创 2020-05-04 15:35:35 · 2314 阅读 · 0 评论 -
vslam中词袋模型练习
vslam中词袋模型词袋模型的意义词袋模型词袋模型的意义在slam中无论是视觉slam还是激光slam,在做前端处理,即根据相邻两帧数据进行匹配获得里程计,必然会导致累计误差,因此长期运行必然导致结果不可靠,即地图重影现象,因此现通用做法为回环检测;即当前经过的环境是曾经已经经过的位置。然后在进行后端全局约束进行优化,常用做法采用图优化方案进行全局估计。如何闭环检测,则是关键,主要包括以下两种...原创 2019-12-02 17:08:01 · 337 阅读 · 0 评论 -
loam代码分析(3)
loam代码分析(3)mapOptmization世界坐标系转换提取submap(extractSurroundingKeyFrames)非闭环处理闭环处理当前帧降采样(downsampleCurrentScan)scanTOmap优化匹配(scan2MapOptimization)存储当前帧pose信息和cloud(saveKeyFramesAndFactor)闭环检测闭环优化目前最新开源的3...原创 2019-11-02 14:55:03 · 1249 阅读 · 0 评论 -
loam代码分析(2)
loam代码分析(2)FeatureAssociation畸变矫正(adjustDistortion)计算平滑参数 (calculateSmoothness)特征点屏蔽标记(markOccludedPoints)平面点和角点提取 extractFeatures()角点特征点提取平面特征点提取计算两帧位姿转换(updateTransformation)里程计获取(integrateTransform...原创 2019-10-31 10:11:23 · 1811 阅读 · 0 评论 -
loam代码分析(1)
loam代码分析(1)概述imageProjecion.cpp获取点云角度范围 (findStartEndAngle())无序的点云变为有序(projectPointCloud())地面分割groundRemoval()点云聚类(cloudSegmentation)点云发布概述目前最新开源的3d slam算法lego-loam,为loam的改进版。同时另有高人进行了工程优化。其原作者gith...原创 2019-10-28 16:40:55 · 3469 阅读 · 2 评论