自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Lio-sam代码分析(2)-图像预处理imageProjection

激光雷达点云获得原数据都是一维的,但是根据实际雷达旋转扫描的特性,将其投影映射成2维数组.例如采用16线的vld雷达,则根据实际扫描逻辑映射成16个1维数组,相当于存在16个1维平面雷达.如此可以更容易提取如地面/平面/角点/垂直线的特征点. 映射和特征提取与之前loam-slam中特征提取方案一致.不再详述,具体看lego-loam代码分析(1)-地面提取和点云类聚。

2023-08-24 16:51:19 219

原创 Lio-sam代码分析(1)-基本框架说明

LIO-SAM是Tixiao又一次的升级,主要是加入了IMU进行了紧耦合(而gps和loop可有可无,不是主要更新部分).本着学习为目的对整个工程进行了分析.但实际上这并不是一个SLAM工程,其主要是输出一个高频率的里程计信息这四个文件。

2023-08-24 16:50:26 225

原创 raspberry4 ubuntu安装ros和astra 驱动

Cmakelist中的添加libuvc是通过find_package(libuvc REQUIRED) 寻找库的,但是新安装的libuvc 0.0.6 没有生成 libuvc.cmake文件(不知道原因),所以编译时libuvc_INCLUDE_DIRS、libuvc_LIBRARIES 都是空的!解决办法:在ros_astra_camera的CmakeList.txt文件的find_package(libuvc REQUIRED)下方添加两条语句(根据你libuvc安装的地址修改),编译就OK了。

2023-08-24 16:47:29 349

原创 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 385 1

原创 ORB-slam2源码分析(1)- 整体框架

ORB-slam2源码分析(1) 前言整体框架TrackingLocal mappingLoop closing总结前言非科班出身,也非擅长业务,仅用来学习记录,扩展知识。主要熟悉的是激光slam,但vslam与激光slam整体框架理论基本相同,但是具体技术细节差距较大,希望从中获取更多知识点,可取长补短。从技术角度看,相结合是趋势;从实际出发,需具体看产品定位;vslam包含许多视觉相关知识点,相对于laser,知识点及其理论都较为复杂,基于学习目的和精力有限,文档仅分析整个框架和记录部分核心功能源

2021-11-29 17:25:57 2299

原创 hdl-graph-slam思想解读(3)-总结

hdl-graph-slam思想解读(5)-总结

2021-02-24 01:02:54 1203 3

原创 hdl-graph-slam思想解读(2)-后端处理

hdl-graph-slam思想解读(3)-后端处理

2021-02-24 01:02:40 1251 1

原创 hdl-graph-slam思想解读(1)-整体框架

hdl-graph-slam思想解读(1)-整体框架 功能介绍点云预处理平面检测激光里程计其他后端融合hdl-graph-slam是一个较为经典的3d 激光slam开源算法,其代码架构简洁,且调用通用Eigen和g2o库进行核心运算,非常适合对slam整个架构的学习。hdl-graph-slam不仅融合了imu、gps、平面、激光等多种输入,同时也带闭环检测等后端处理,即完整的一个slam架构。功能介绍hdl-graph-slam是一个非常优秀的SLAM框架,其功能较为全面(但不一定最优),包括平面

2021-02-24 01:02:23 2314 1

原创 lego-loam 同步构建2d栅格导航地图

lego-loam 同步构建2d栅格导航地图 基于目前移动机器人的应用可知,目前3d slam存储的主要为点云地图,由于其特征点比2D激光器数据更加丰富,因此用于后期的定位具有更好的抗干扰性和鲁棒性。但是用于导航的基本路径规划功能,目前仍主要依赖于2d栅格地图。其中16年开源的cartographer的3dslam则同步发布了2d map格式,而存储的点云也是基于stream自定义格式,而不是传统的点云地图。因此定位时可直接使用3d定位结果,2d地图结果进行导航。本文参考cartographer中2d

2021-01-05 09:01:16 4598 10

原创 lego-loam代码分析(4)-mapping流程

lego-loam代码分析(4)-mapping流程 run主流程transformAssociateToMap提取submap(extractSurroundingKeyFrames)非闭环处理闭环处理当前帧降采样(downsampleCurrentScan)run主流程整个mapping为一个独立线程完成,通过输入的传感器信息:特征点云和odometry两个信息,进行mapping;其程序入口为void MapOptimization::run() {}其整个slam流程如下:当前帧根据o

2021-01-05 09:00:47 1391 2

原创 lego-loam代码分析(3)-激光里程计

lego-loam代码分析(3)-激光里程计匹配初始化两次LM匹配平面匹配角点匹配上节分析了其点云特征提取,目的是用于帧间匹配获取激光里程计。而像常见的点云匹配如NDT、ICP等匹配算法,均是对整个点云进行匹配。而loam为提高效率和实时性,则采用特征点进行匹配。匹配初始化由于激光里程计相临两帧点云进行匹配获取,即当前帧与上一帧进行匹配,故开启slam收到的第一帧点云数据则需要对cloud_last进行赋值,即对上一帧进行记录和存储,不做匹配运算。 pcl::PointCloud<Point

2020-12-22 22:59:51 2186 2

原创 lego-loam代码分析(2)-corner和surface特征点提取

lego-loam代码分析(2)-角点和平面点提取坐标修正(adjustDistortion)计算平滑参数 (calculateSmoothness)点云屏蔽标记(markOccludedPoints)平面点和角点提取 extractFeatures()角点特征点提取地平面特征点提取相对较平的平面点云总结FeatureAssociation.cpp同样为独立线程,主要功能是根据带有聚类后地面和非地面的点云数据进行特征值提取,主要提取其平面特征、角点特征;同时采用匹配算法计算前后两帧激光视角下的位姿转换;从

2020-12-16 17:25:20 1590

原创 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 3569

原创 cartographer 代码思想解读(19)-算法思想总结

cartographer 代码思想解读(18)- 算法思想总结前端处理整体思想前端处理流程后端处理闭环检测后端处理流程总结引入cartographer算法官方框架图。从cartographer官方结构框图可看出,其算法整体结构遵从slam基本结构,包括前端处理和后端处理两部分。其中前端处理即cartographer中的Local SLAM,其主要功能是输入传感器信息通过scan-match获取帧间相对位姿关系,构建submap并获取laser-scan与submap相对位姿关系;而后端处理即为ca

2020-12-02 09:10:43 2053 4

原创 cartographer 代码思想解读(18)- PoseGraph2D整体处理流程2

cartographer 代码思想解读(18)- PoseGraph2D整体处理流程2后端(后台)任务压栈AddWorkItem后台任务执行循环DrainWorkQueue后端图优化任务管理函数HandleWorkQueue优化函数RunOptimization总结接上篇。后端(后台)任务压栈AddWorkItem后端优化的操作基本都是采用线程池在后台运行,cartographer采用了一个个任务放入任务队列work_queue_中,然后排队调用执行。// 将一个函数地址加入到一个工作队列中v

2020-11-27 11:32:46 1132 2

原创 cartographer 代码思想解读(17)- PoseGraph2D整体处理流程1

cartographer 代码思想解读(14)- PoseGraph2D整体处理流程前面分析了位姿图结构,优化的原理,约束的形成以及优化求解等具体实现,同时也提前介绍了PoseGraph2D内的成语变量。本节作为最后一节将整个后端的优化的流程(包括如何调用约束以及求解器)进行分析。...

2020-11-25 16:41:38 1738

原创 cartographer 代码思想解读(16)-后端优化求解器optimization_problem_具体实现

cartographer 代码思想解读(16)- 后端优化求解器optimization_problem_具体实现OptimizationProblem2D成员构造函数优化对象接口优化求解实现Solve总结根据前面分析的图优化基本结构可知,已知节点、约束和闭环约束条件后,则可进行超定方程组求解,即求解所有节点的最佳位姿,使得超定方程组误差最小。optimization_problem_则是优化求解器,采用的是SPA(Sparse Pose Adjustment)方法进行优化,较早的开源SLAM算法kat

2020-11-24 16:46:43 1427 1

原创 cartographer 代码思想解读(15)- ConstraintBuilder2D约束构造器

cartographer 代码思想解读(10)- ConstraintBuilder2D约束构造器ConstraintBuilder2D成员ConstraintBuilder2D构造约束构建器主要是完成创建和维护节点与submap之间的位置关系,其中闭环检测则是由ConstraintBuilder2D完成,即submap与历史节点的约束,或者节点与历史submap之间的约束。ConstraintBuilder2D成员 // 约束器配置内容 const constraints::proto:

2020-11-24 11:39:31 1646

原创 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 1326

原创 cartographer 代码思想解读(13)- 后端优化基本思想

cartographer 代码思想解读(12)- 后端优化基本思想

2020-11-23 11:28:30 2135 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 1201 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 851 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 2327

原创 cartographer 代码思想解读(9)- 激光雷达畸变矫正

cartographer 代码思想解读(9)- 激光雷达畸变矫正本节为cartographer前端匹配算法中最后一个核心算法实现内容,下节将会这9节内容串起来构成cartographer中2dslam的前端总体接口local_trajectory_builder_2d类。此节激光矫正具体实现就是在local_trajectory_builder_2d实现的,单独列出来进行分析。是因为至今我使用的SLAM从未进行过矫正考虑,是因为室内机器人速度较低,同时雷达采用性能较好雷达,则可做简单的假设,认为影响较少。

2020-09-28 18:03:11 2466 2

原创 cartographer 代码思想解读(8)- 多激光传感器同步融合RangeDataCollator

cartographer 代码思想解读(8)- 多激光传感器同步融合RangeDataCollatorRangeDataCollator类定义AddRangeData()CropAndMerge()前面已经分析了cartographer前端的主要核心算法如插入更新和匹配算法等,其中激光雷达点云数据均为作为主要输入,使用时无需考虑具体几个传感器,传感器类型,可通认为是一个雷达产生的点云数据。但实际cartographer通过RangeDataCollator类将多种传感器进行了融合,并进行了时间同步,最后形

2020-09-28 17:26:13 2463 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 3099 5

原创 cartographer 代码思想解读(6)- submap封装与维护

cartographer 代码思想解读(6)- submap封装与维护前面两节描述了submap2d的存储形式、表示形式、概率地图、继承关系,同时也包含了submap具体的初始化、更新原理和过程,即算法核心具体实现。这节主要描述下cartographer如何在代码中进行封装和调用的。cartographer代码中并没有直接调用submap的类进行处理,而是将submap类封装成submap2d进行调用,同时将其submap2d重新封装成了ActiveSubmaps2D类进行维护和管理。其代码目录如下:

2020-09-21 14:55:43 3036

原创 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 2583

原创 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 3643 3

原创 cartographer 代码思想解读(3)- ceres优化库scan-match

cartographer 代码思想解读(3)- ceres优化库scan-matchceres匹配简单总结扫描匹配OccupiedSpaceCostFunction2D总结前两节分析了cartographer 中的相关匹配思想和相关匹配优化快速实现,但cartographer之所以局部slam即前端匹配的准确度极高,因为最终采用了优化匹配的方法,即比栅格化的地图相关匹配准确度更高。而cartographer将匹配转换成最小二乘思想,并采用自家的ceres库完成优化匹配。其详细的代码解释可参考他人博客:

2020-09-07 16:24:59 4141 1

原创 cartographer 代码思想解读(2)- 分支定界快速相关匹配

cartographer 代码思想解读(2)- 分支定界快速相关匹配分支界定基本原理源码解读顶层函数分层地图栈 PrecomputationGridStack2D上节描述cartographer中算法中的相关匹配算法,为前端的scan-match,由于其初始位置有一定确定和分布性,故采用基本的暴力扫描方法。本节描述相关匹配一种快速实现,主要应用于loop-scan。回环检测为后端处理重要步骤,即检测当前位置是否曾经来过,即采用当前scan在历史中搜索是否匹配。故其搜索范围及其位置不确定性较大,故carto

2020-09-04 13:52:16 5051 4

原创 cartographer 代码思想解读(1)- 相关匹配

cartographer 代码思想解读(1)- 相关匹配前端栅格地图相关匹配疑问点cartographer在2016年开源后一直在使用,但是一直未仔细阅读并分析其核心代码结构。目前网上可以找到许多博主对其分析和理解。其cartographer的基本思想可参考他人的博主博客。本博客主要目的根据其框架思想,将其核心算法进行提取,方便后续学习和移植。其google开源的代码量太大,层次太多,大量虚函数,继承关系,功能齐全,并且采用大量的C++11.0新特性等许多原因,导致阅读代码难度加大。因此此次阅读仅对sla

2020-08-28 13:24:36 4015 2

原创 docker容器内的ros外设使用与远程配置

docker下ros外设使用与远程配置ros远程配置假设条件docker容器网络配置docker 容器ros网络配置主机A的ros网络配置网络永久配置ros远程配置假设条件A电脑中安装了ros, B电脑安装了docker,docker中安装了ros系统。即B电脑为机器人内部使用,B电脑为master,故需采用A电脑进行远程调试与控制。docker容器网络配置由于docker内执行ros,故主要需要配置网络,使docker内的网络与外界通信,可采用端口映射功能。这里为通用性,可采用容器与主宿机网络端

2020-07-05 19:29:49 2017 3

原创 树莓派4b 下docker ros的安装与使用

树莓派4b下安装docker,并安装ros镜像docker安装docker下安装rosdocker安装可采用自动化脚本安装,安装方便curl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.shdocker下安装ros我尝试过,在笔记本电脑(X86)上,Ubuntu16.04下安装的docker,并且生成了ros-Kinetic版本的镜像,采用docker save保存.zar,并在树莓派中采用docker lo

2020-07-05 16:36:36 868

原创 树莓派4b下安装ros

树莓派4b下安装ros说明安装步骤确认安装系统版本Setup ROS RepositoriesupdateInstall Bootstrap DependenciesInitializing rosdepCreate a catkin WorkspaceinstallResolve DependenciesResolving Dependencies with rosdepBuilding the catkin Workspace编译并安装source安装完成说明由于采用raspberry pi 4b为

2020-06-30 17:46:23 2427 1

原创 shell脚本命令记录

shell脚本命令记录set 命令set -x介绍set -eLinux 文件基本属性文件属性表示修改属性方法set 命令set -x介绍用于脚本调试,在liunx脚本中可用set -x就可有详细的日志输出.可免去echo输出如下例子:#!/bin/bashset -xyourname="hello world"输出结果+ yourname='hello world'set -e执行每条指令错误时,可直接退出,无需继续下条,防止错误放大。如下例子:set -eabc = "1

2020-06-23 15:52:41 380

原创 debian双网卡桥接配置

debian双网卡桥接配置添加bridge网络连接更改网络配置文件如果使用的pc或者工控机存在两个网卡的话,可将两个网卡配置成桥接模式,如此两个网卡相当于交换机功能,即两个网口共享一个IP,且对于本机来说将两个网口认为同一局域网内。添加bridge网络连接在配置中网络配置中增加一个连接,选择bridge选项,则会自动产生一个bridge0网络连接,并将两个网卡添加bridge中。更改网络配置文件我用于工控机配置主要用于扩展网口,可省略一个交换机,故将其配置成固定IP。1.在终端中打开配置文件s

2020-05-28 18:06:44 4502

原创 c++中static_cast用法

static_cast是指显性类型强制转换,如:int a = static_cast<int>(120.34);结果为a= 120. 和C语言学习时的显性意义一样,但是编译器会对此类型转换进行检查。另外还有另外3种转换:const属性用const_cast。基本类型转换用static_cast。多态类之间的类型转换用daynamic_cast。不同类型的指针类型转换用reinterpreter_cast。...

2020-05-19 18:03:41 12007 4

原创 无人驾驶与室内移动机器人对比思考

激光slam相关问题思考室外无人驾驶slam室内室外低速机器人slam室外无人驾驶slam虽说无人驾驶很火,尤其近几年。但是基于目前实际街道场景、安全、成本、存储、法律法规等,以及更多实际的未能预料的“坑”,估计短时间内会一直维持现状,难以实现真正的上路。实际上无人驾驶技术整体上已经非常成熟,整个技术环节也都已完善,在高速路段也许可以真正放开双手,但是在城市到路上个人觉得暂时真的需要打个“...

2020-05-04 15:35:35 1831

原创 tf变换及工具说明(3)之Eigen库使用

tf变换及工具说明之Eigen库使用demo(3))last_scan_pose # 二维平面不同坐标系下增量转换说明:机器人在A坐标系下上一时刻坐标a_pos_last,同时刻在B坐标系下坐标为b_pos_last。当前时刻时,机器人在A坐标系下运行至坐标为a_pos,则采用Eigen库可获取机器人当前时刻在B坐标系,demo如下: Eigen::Vector3f last_sc...

2020-01-04 14:16:38 1488

空空如也

空空如也

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

TA关注的人

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