0. 简介 我们刚刚了解过DLIO的整个流程,我们发现相比于Point-LIO而言,这个方法更适合我们去学习理解,同时官方给出的结果来看DLIO的结果明显好于现在的主流方法,当然指的一提的是,这个DLIO是必须需要六轴IMU的,所以如果没有IMU的画,那只有DLO可以使用了。 1. computeMetrics、computeSpaciousness、computeSpaciousness—计算
0. 简介 我们刚刚了解过DLIO的整个流程,我们发现相比于Point-LIO而言,这个方法更适合我们去学习理解,同时官方给出的结果来看DLIO的结果明显好于现在的主流方法,当然指的一提的是,这个DLIO是必须需要六轴IMU的,所以如果没有IMU的画,那只有DLO可以使用了。 1. initializeDLIO—初始化参数 这段代码非常简单,主要作用是等待IMU数据的接收和校准,如果条件不满足则
0. 简介 对于基于环视视觉的3D检测而言,目前已经有很多文章了。因为基于视觉的3D检测任务是自动驾驶系统感知的基本任务,然而,使用单目相机的2D传感器输入数据来实现相当好的3D BEV(鸟瞰图)性能不是一项容易的任务。这篇文章《Surround-View Vision-based 3D Detection for Autonomous Driving: A Survey》就是围绕着现有的基于视觉
0. 简介 自动驾驶中的高精地图对于车辆的定位而言是非常重要的,一般来说高精地图需要耗费大量的时间完成。而随着深度学习的发展,使用深度学习来完成地图的矢量化是非常有用的一个操作。矢量化高精度(HD)地图对于自动驾驶而言至关重要,其为高级感知和规划提供了详细且精确的环境信息。然而,当前的地图矢量化方法经常出现偏差,并且现有的地图矢量化评估指标缺乏足够的灵敏度来检测这些偏差。 为了解决这些限制,《On
0. 简介 由于点云的不规则数据形式以及散点的稀疏性,当前的方法难以从点云中提取高判别性的特征,在大规模环境中使用激光雷达进行全局定位仍是一个难以解决的问题。《BVMatch: Lidar-Based Place Recognition Using Bird’s-Eye View Images》一文中将点云表示为鸟瞰(Bird’s eye View, BEV)图像,从图像特征构建的角度设计了一个二
0. 简介 对于使用C++的开发者来说,这两种用法应该是比较高级也是比较常用的。对于线程池来说,作用主要有以下几点: 提高响应速度:线程池内部维护一组预先创建好的线程,当需要处理任务时,无需新建线程,直接从池中取出空闲线程,从而大幅减小了线程创建和销毁的开销,提高了系统响应速度。 提高线程复用性:线程池管理的线程可以反复利用,完成一次任务后,不会被销毁,而是可以继续接收下一个任务。 提高资源的可
0. 简介 对于激光雷达的地面估计分割,目前其实有很多方法做了快速并鲁棒的分割,比如说我们之前写的一篇《经典文献阅读之—FEC》一文中就给出了快速分割的方案,当中第一步就是需要对地面进行分割。而我们这次看的是一篇使用均匀B样条的方法来从LiDAR数据中快速且鲁棒地估计地平面的方法。《Fast and Robust Ground Surface Estimation from LIDAR Measu
0. 简介 作为一个程序而言,benchmark是非常关键的一个衡量指标,无论是程序算法的指标还是程序运行性能的指标,这些我们都可以去完成衡量。对于性能衡量而言google benchmark无疑是一个比较好的选择 1. google benchmark安装 1.1 下载地址 https://github.com/google/benchmark 1.2 编译安装 登录 linux环境,执行以下
0. 简介 一般来说,当系统经过不规则的地形时候,机器人自身会存在激烈运动会导致激光雷达扫描中的运动畸变,从而可能降低状态估计和建图的精度。虽然已经有一些方法用于缓解这种影响,但它们仍然过于简单或计算成本过高,难以应用于资源受限的移动机器人。之前这个团队开发了《经典文献阅读之—DLO》这套方法。该团队在23年又提出了《Direct LiDAR-Inertial Odometry: Lightwei
0. 简介 强化学习在自动驾驶中的应用已经日渐普及,虽然由于一些伦理问题,目前真正的使用这种强化学习的还不是很多,但是目前已经有很多应用在自动驾驶中的强化学习的工作,但是我们发现这类方法基本都是将卷积编码器与策略网络一起训练,然而,这种范式将导致环境表示与下游任务不一致,从而可能导致次优的性能。而《RLAD: Reinforcement Learning from Pixels for Auton
0. 简介 之前作者专门为点云匹配写了几篇博客,但是我们发现最近几年有更多的新方法已经在不断地被使用。同时之前有些内容也没有很好的概括,所以这里我们将作为一篇进阶文章来介绍这些方法的使用。 1. 地面点去除 处了使用一些复杂的方法(FEC)或是一些简单的方法(根据高度来滤除)以外,还可以使用Ransac的方法完成平面拟合 #include <pcl/point_types.h> #in
0. 简介 我们刚刚了解过DLIO的整个流程,我们发现相比于Point-LIO而言,这个方法更适合我们去学习理解,同时官方给出的结果来看DLIO的结果明显好于现在的主流方法,当然指的一提的是,这个DLIO是必须需要六轴IMU的,所以如果没有IMU的画,那只有DLO可以使用了。 1. OdomNode—DLIO构造函数 OdomNode是一个ROS节点的构造函数,主要用于初始化节点的参数、订阅和发
0. 简介 之前我们讲过通过体素化分割,并通过判断这个栅格内的点云数目是否大于阈值。从而来鉴别出噪点。而我们学过最近邻搜索后,我们可以来学习一下更加先进的方法—-半径搜索噪声滤除(Radius Search Noise Filtering)。这是点云处理中一种常见的算法,其基本思想是对每一个点周围的点进行半径搜索,如果搜索到的点数小于设定的阈值,那么就认为该点是噪声点,将其删除。 1. CUDA与
0. 简介 Camera与LiDAR之间的外部标定研究正朝着更精确、更自动、更通用的方向发展,由于很多方法在标定中采用了深度学习,因此大大减少了对场景的限制。然而,数据驱动方法具有传输能力低的缺点。除非进行额外的训练,否则它无法适应数据集的变化。随着基础模型的出现,这个问题可以得到显著缓解,通过使用分割任意模型(Segment Anything Model,SAM),我们这次提出了一种新的激光雷达
0. 简介 随着chatgpt的爆火,最近也有很多大模型在不断地出现,比如说Bloom系列以及以LLAMA为基础的ziya和baichuan。这些模型相较于chatglm来说,更加具有发展前景,因为其是完全可商用,并可以不断迭代更新的。最近作者在跟着hiyouga大佬的LLaMA-Efficient-Tuning进行学习,相较于其他的项目来说,该项目是非常适合跟着学习并入门的。 1. RHLF R
0. 简介 我们知道激光雷达作为自动驾驶中最为精准的传感器,它可以在绝大多数场景下提供较为精准的定位信息,同时也有很多工作用激光做重定位工作。而《 CVTNet: A Cross-View Transformer Network for Place Recognition Using LiDAR Data》 这个工作就是基于激光雷达的地点识别(LPR)来完成在没有GPS的环境中识别以前行驶过的地点
0. 简介 对于激光SLAM来说,现在越来越多的算法不仅仅局限于点线等简答特征的场景了,文章《PLC-LiSLAM: LiDAR SLAM With Planes, Lines,and Cylinders》说到,平面、线段与圆柱体广泛存在于人造环境中。为此作者提出了一个使用这些landmark的激光雷达SLAM系统。目前已有工作做了类似于BA的平面adjustment(即.PA),但是这类工作在缺
0. 简介 最近在尝试着用SensorsCalibration这个项目来做一些工作,我们知道imu与lidar的外参比较难标定,而OpenCalib提出了手动和自动标定两种方式。我们本文将会学习如何完成Lidar_imu自动标定,并学习如何拿到自己的数据来完成离线标定。 1. 相关代码 这个lidar2imu的相关代码已经有博主注释过了,这里我们给出链接 Lidar_imu自动标定
0. 简介 上一章我们主要讲了噪声滤除这种比较高级的点云处理算法,下面这一章我们将来看一下最近邻搜索。最近邻搜索(Nearest Neighbor Search)是一种广泛应用于机器学习、计算机视觉和自然语言处理等领域的算法。它的主要目的是找到一个给定数据集中与查询数据最相似的数据点。 1. CUDA与Thrust 在传统的CPU计算中,最近邻搜索通常需要对每个数据点与查询点进行一次比较。这
0. 简介 上一节中我们讲了pcl::VoxelGrid数据中的降采样,至此为止最简单的三个部分就已经讲解完毕了,下面我们来更进阶一点,这一讲主要来看一下噪声滤除这部分的操作。噪声滤除是点云处理中的一项重要任务,可以提高点云的质量和准确性。在噪声滤除过程中,通常需要根据点云密度来估计合适的邻域半径,并在邻域内对点进行平滑处理,以消除噪声点。 1. CUDA与Thrust CUDA是一种并行计
0. 简介 各位也知道,我们在之前的博客中,介绍了很多回环的方法,比如Scan Context,Lris, BoW3D等方法。之前作者也在《重定位解析与思考》一文中,给到了一些回环检测算法的介绍。最近林博新开源了一个回环检测算法《STD: A Stable Triangle Descriptor for 3D place recognition》。我们从小乌坞博主中的实验中发现,确实效果不错,同
0. 简介 最近环视图像处理其实已经非常火了,最近地平线&华科则是提出了一种新的环视车道线地图提取工具。高清(HD)地图提供了驾驶场景丰富而精确的环境信息,是自动驾驶系统规划中基础且不可或缺的组成部分。《MapTR: Structured Modeling and Learning for Online Vectorized HD Map Construction》提出了一种用于高效在线
0. 简介 作为局部规划器而言,当机器人或无人机想要避开动态障碍物时。局部规划器就显得尤为重要了。其中基于梯度的规划器被广泛用于四旋翼无人机的局部规划,其中欧几里得符号距离场(ESDF)对于评估梯度幅度和方向至关重要。然而,由于轨迹优化过程仅覆盖了ESDF更新范围的一个非常有限的子空间,因此计算这样一个场具有很大的冗余性。《EGO-Planner: An ESDF-free Gradient-b
0. 简介 在一些比较空旷,且没有参照的场地中,我们很难利用车道线或者稠密的激光点云地图来完成定位,而本文《Monocular Simultaneous Localization and Mapping using Ground Textures》仅使用向下朝向的单目相机拍摄的地面纹理图像,就能实现令人印象深刻的定位性能。这提供了一种可靠的导航方法,能抵抗特征稀疏环境和具有挑战性的光照条件。然而
0. 简介 自动标注软件是一个非常节省人力资源的操作,而随着深度学习的发展,这些自动化标定软件也越来越多。本文章将会着重介绍其中比较经典的自动标注软件 1. AutoLabelImg AutoLabelImg 除了labelimg的初始功能外,额外包含十多种辅助标注功能,分别在Annoatate-tools和Video-tools两个新菜单栏下面,具体如下: 自动标注:基于yolov5
0. 简介 PyTorch是一个深度学习框架,它使用张量(tensor)作为核心数据结构。在可视化PyTorch模型时,了解每个张量运算的意义非常重要。张量运算作为神经网络模型中的基本操作。它们用于处理输入数据、执行权重更新和生成预测结果。同时张量运算还用于计算损失函数。损失函数衡量了模型预测与真实标签之间的差异。通过使用张量运算,可以计算出模型的预测结果与真实标签之间的差异,并将其最小化。所以
0. 简介 上一节中我们讲了点云裁剪这一手段,对应了点云中的 pcl::CropBox这种点云裁剪步骤。而我们这一节主要将围绕着降采样来进行描述。这里我们对标的是pcl::VoxelGrid。点云数据往往非常大,对于一些需要高效处理的应用来说,数据的降采样是一个非常有用的工具。 1. CUDA与Thrust CUDA和Thrust可以实现快速降采样的方法,可以大大提高降采样的速度。降采样算法
0. 简介 在机器人领域,点云已经成为一种必不可少的地图表示方式。从定位和全局路径规划等下游任务的角度来看,动态对象对应的点会对其性能产生不利影响。现有的点云动态点去除方法在对比评价和综合分析方面往往缺乏明确性。因此,《A Dynamic Points Removal Benchmark in Point Cloud Maps》提出了一个易于扩展的统一基准测试框架,用于评估地图中动态点的移除技术
0. 简介 航位推算是一个很常见的定位方法。在知道当前时刻的位置,然后通过imu等传感器去估计下一个时刻的位置。在自动驾驶车辆定位的时候,GPS提供10Hz的定位信息。这每个GPS信息来临的0.1s的间隔里面,车辆位置也会移动很多。那么这个时候就需要航位推算来判断车辆到底移动了多少距离,在哪个地方。所以,航位推算是自动驾驶车辆最基本的,也是必须的一种算法之一。比如推算车辆在隧道中的位置。
0. 简介 Apollo Cyber RT 是专为自动驾驶场景设计的开源、高性能运行时框架。 基于中心化计算模型,主要价值是提升自动驾驶系统的高并发、低延迟、高吞吐。 Apollo 并不是一开始就使用 CyberRT,在 v3.0 之前用的都是基于 ROS 框架进行开发。但在之前的版本中发现了很多问题,随着 Apollo 的发展,对最高水平的稳健性和性能的需求, Apollo Cyber RT
0. 简介 现有很多LiDAR里程计都依赖于某种形式的ICP估计帧间位姿,例如CT-ICP, LOAM等。现有的系统设计需要对机器人的运动(CT-ICP)和环境的结构(LeGO-LOAM)有一些特定的假设。而且几乎没有系统能够不需要调参(例如特征提取、面特征拟合、法向量估计、畸变矫正)就能用于不同的场景、不同的LiDAR、不同的运动模式、以及不同种类的机器人。为此《KISS-ICP: In De
0. 简介 最近激光SLAM的新工作真的是越来越多了,而大多数当前的激光SLAM系统都是在点云中构建地图,即使在人眼看来是稠密的,但当放大时,点云是稀疏的。稠密地图对于机器人应用至关重要,例如基于地图的导航。由于内存成本低,近年来,网格已成为一种有吸引力的稠密建图模型。《Real-time LiDAR Simultaneous Localization and Meshing》提出了第一个仅使用
0. 简介 MetaAI提出的能够“分割一切”的视觉基础大模型SAM提供了很好的分割效果,为探索视觉大模型提供了一个新的方向。虽然SAM的效果很好,但由于SAM的backbone使用了ViT,导致推理时显存的占用较多,推理速度偏慢,对硬件的要求较高,在项目应用上有很大的限制。 中科院自动化所近期提出了《Fast Segment Anything》,本文提出了一种具有可比性能的加
0.简介 随着chatgpt爆火,这玩意并不对国内用户开放,如果想要使用的话还要需要进行翻墙以及国外手机号才能进行注册。 对于国内来说有很多国内免费的方法,这里就整理一下,方便大家开发 1. 网站类型 下面的网站无需注册即可免费使用,大家打开网站即可使用,而且相应速度是还是比较快的,大家可以测试一下,回答的风格和chatGPT几乎无异。 1.1 chatisfy 这个网站是需要登录的,
0. 简介 自从MetaAI提出的能够“分割一切”的视觉基础大模型SAM提供了很好的分割效果,为探索视觉大模型提供了一个新的方向。虽然SAM的效果很好,但由于SAM的backbone使用了ViT,导致推理时显存的占用较多,推理速度偏慢,对硬件的要求较高,在项目应用上有很大的限制。FastSAM通过更换检测头,能够较好的完成分割的实时性,但是将SAM的”重量级”解码器替换为”轻量级”以使其可在移动
0. 简介 Yolo家族从1-8,目前已经迭代了很多次,但是他们期望的仍然是能够以更低的算力去运行精度更高更快速的算法.目前《EdgeYOLO: An Edge-Real-Time Object Detector》提出了一种基于最先进的YOLO框架的高效、低复杂度和无锚点的目标检测器,可以在边缘计算平台上实时实现。同时文中提到开发了一种增强的数据增强方法,有效抑制训练期间的过拟合,并设计了一种混
0. 简介 作为一个SLAMer来说,整个SLAM过程可以分为预处理(包含相机、激光的畸变去除,以及IMU的预积分都属于这部分操作),前端优化(这部分主要做的就是帧间匹配【scan-to-scan】,帧与地图匹配【scan-to-submap】,划窗优化,提取关键帧),后端优化(回环检测,后端地图优化)这些步骤。而上面这些我已经讲了很多了,比如划窗优化这块也是给出了对应的代码,我们这里将从cer
0. 简介 对于视觉而言,想要获得比较精细的地图信息,这离不开地图的三维重建。三维重建(3D Reconstruction)的定义就是,从一堆二维图像中恢复物体的三维结构,并进行渲染,最终在计算机中进行客观世界的虚拟现实的表达。一般的步骤如下 输入无序图像 Unstructured Images 图像对齐(Assoc.),筛选图像,构建场景图(也称为连接图)。 稀疏
0. 简介 我们在上一节主要讲了基础的点云变换,对应了pcl::transformPointCloud这种方法。而我们这一章将会讲解 pcl::CropBox这种点云裁剪步骤。点云裁剪是在点云中选择出一部分区域的过程,以便于后续的处理和分析。在点云处理领域,点云裁剪是一个非常常见的任务,因为在现实中,往往只需要关注某些区域的点云数据,而不需要处理整个点云数据集。点云裁剪通常是通过一个定义良好的几
0. 简介 我们之前经常接触的是使用激光雷达和惯性测量单元(IMU)的互补信息,但是实际使用的过程中IMU如果发生剧烈的颠簸,有可能会导致IMU失效。在广泛使用的迭代最近点(ICP)算法只能为姿态提供约束,而速度只能由IMU预积分进行约束。因此,速度估计倾向于随着姿态结果而更新。最近有一篇博客介绍了将雷达,imu,里程计融合的办法《LIW-OAM: Lidar-Inertial-Wheel Od
0. 简介 之前我们在之前的博客中说了很多关于如何通过帧与地图匹配完成重定位,从而完成位置识别的。同时也有一篇专门用于介绍重定位的博客《定位解析与思考》。目前基于LiDAR的位置识别方法通常是基于无序点或距离像等点云的表示。这些方法实现了很高的检索召回率,但在视图变化或场景变化的情况下,它们的性能可能会下降。而《BEVPlace: Learning LiDAR-based Place Recog
0. 简介 随着chatgpt的爆火,最近也有很多大模型在不断地出现,比如说Bloom系列以及以LLAMA为基础的ziya和baichuan。这些模型相较于chatglm来说,更加具有发展前景,因为其是完全可商用,并可以不断迭代更新的。最近作者在跟着hiyouga大佬的LLaMA-Efficient-Tuning进行学习,相较于其他的项目来说,该项目是非常适合跟着学习并入门的。 1. 什么
0. 简介 在没有预先计算相机姿态的情况下训练神经辐射场(NeRF)是具有挑战性的。最近在这个方向上的进展表明,在前向场景中可以联合优化NeRF和相机姿态。然而,这些方法在剧烈相机运动时仍然面临困难。我们通过引入无畸变单目深度先验来解决这个具有挑战性的问题。这些先验是通过在训练期间校正比例和平移参数生成的,从而能够约束连续帧之间的相对姿态。这种约束是通过我们提出的新型损失函数实现的。对真实世界室
0. 简介 对于视觉而言,如何使用鸟瞰图来完成车道线的识别和标定是非常重要的,对于鸟瞰图来说,其实有很多种,之前读者的博客中也已经提到过《逆透视变换(IPM)多种方式及代码总结》、《IPM 鸟瞰图公式转换与推导》。这个当然内容还是不太详细,对于各位想要复现难度会比较大,这个时候可以看一下《单应矩阵的推导与理解》这篇文章的详细推导。其实只需要知道精确的外参和内参,以及相机的高度,以及期望的W和H(
0. 简介 随着chatgpt的爆火,最近也有很多大模型在不断地出现,比如说Bloom系列以及以LLAMA为基础的ziya和baichuan。这些模型相较于chatglm来说,更加具有发展前景,因为其是完全可商用,并可以不断迭代更新的。最近作者在跟着hiyouga大佬的LLaMA-Efficient-Tuning进行学习,相较于其他的项目来说,该项目是非常适合跟着学习并入门的。 1. 二次预训
0. 简介 为了实现精确定位,自动驾驶车辆通常依靠围绕移动平台的多传感器感知系统。校准是一个耗时的过程,机械畸变会导致外部校准误差。因此,《Lidar-Visual-Inertial Odometry with Online Extrinsic Calibration》提出了一种激光雷达-视觉-惯性里程计,结合了适应性滑动窗口机制,允许在线非线性优化和外部校准。在适应性滑动窗口机制中,进行空间-
0. 简介 对于点云处理而言,最简单也逃不过的就是点云转换了,我们就从点云转换开始,来一步步完成点云加速的学习。点云基础转换是3D点云处理中的一个重要步骤。它的主要目的是将点云从一个坐标系转换到另一个坐标系中,通常是为了方便后续处理或者显示。在实际应用中,点云基础转换通常包括平移、旋转、缩放等操作。这里对应了pcl::transformPointCloud这种方法 1. CUDA与Thrust
0. 简介 神经隐式表示近年来在SLAM中,特别是在稠密视觉SLAM中,成为一种流行的表示方法。然而,此前在这一方向上的工作要么依赖于RGB-D传感器,要么需要单独的单目SLAM方法进行相机跟踪,并且不能产生高精度、高密度3D场景重建。在本文中,我们提出了NICER-SLAM,这是一个稠密的RGB SLAM系统,同时优化相机位姿和分层神经隐式地图表示,这也允许高质量的新视图合成。 为了促进地图
1. Introduction Thrust是一个基于标准模板库(STL)的C++模板库,用于CUDA。Thrust通过与CUDA C完全互操作的高级接口,使您能够以最小的编程工作量实现高性能并行应用程序。 Thrust提供了丰富的数据并行原语,如扫描、排序和归约等,可以组合在一起以实现具有简洁、可读源代码的复杂算法。通过用这些高级抽象描述计算,您为Thrust提供了自动选择最有效实现的自由。
0. 简介 对弈ros/ros2的bag而言,真的是非常好用一个产物,通过bag我们可以保证数据的多次的重复的复现,直至发现问题。而对弈ros的bag的二次开发也一直是大家关注的重点。下面我们将从ROS1开始,带领大家了解一下ROS2的内容。 1. ROS1 BAG 对于ROS1的bag,网上有比较多的例子了,比如说下面的https://zhuanlan.zhihu.com/p/150290
0. 简介 融合方案是多传感器融合方法的关键,多传感器融合方法是地下矿山和行星表面等复杂极端环境下状态估计的最有前途的解决方案。本文提出了一种基于iEKF的轻量级LiDAR惯性里程计系统,该系统采用可感知退化的模块化传感器融合管道,仅在检测到退化时才在更新过程中同时测量来自另一个里程计的LiDAR点和相对位姿。通过CRLB理论和仿真实验验证了该方法与单一观测值方法相比具有更高的精度。此外,针对各
0. 简介 对于车辆来说,我们更希望能够得到一个有效的定位系统,能够保证高精度的同时,拥有较高的鲁棒性,而《Robust SRIF-based LiDAR-IMU Localization for Autonomous Vehicles》就是这样一篇文章,在各种场景中实现了厘米级的精度和高鲁棒性。为了实现鲁棒、准确的点云特征匹配,文中提出了一种从激光雷达点云中提取结构化、高识别力特征的新方法。对
0. 简介 作为3D车道线训练来说,数据集是至关重要的,而使用点云的精确性来完成准确的车道线地图构建是一个非常重要且有趣的事情。下面我们将会从一个例子开始,分阶段来告诉大家该怎么样去完成一个简单的3D点云车道线自动识别标注工具。 1. 前言 按照《Automatic Road Markings Extraction Classification And Vectorization Mobil
0. 简介 对于激光雷达数据而言,虽然与2D图像相比,可以提供精确的物体深度信息,但也存在数据量大的问题,不便于数据存储或传输。在拿到离线数据分析的时候会发现我们很难拿到较长一段时间的激光数据,这就给我们问题的重现增加了困难。而本文《R-PCC: A Baseline for Range Image-based Point Cloud Compression》就提出了一种基于距离图像的点云压缩方
0. 简介 最近随着越来越多的团队开始注重将SLAM应用在机器人和无人驾驶上,最近SLAM的顶刊顶会也开始想着多模态和低成本这两个方向开始发力。而本文讲的这个《Wheel-SLAM: Simultaneous Localization and Terrain Mapping Using One Wheel-mounted IMU》就是讲了如何基于车轮安装低成本IMU的轮式机器人定位算法(Whee
0. 简介 在slam当中,我们在回环的时候会使用关键帧的概念,而关键帧怎么样去可视化,并将可视化的关键帧在RVIZ中显示,对于我们理解这一概念非常重要,当然目前有很多SLAM算法中已经插入了这一点,但是这一点的操作仍然值得我们去了解学习。一般在论文中我们称这类方法为Covisibility Graph可视化,它是一个无向有权图(graph),这个概念最早来自2010的文章《Closing Lo
0. 简介 相较于python而言,C++因为其复杂的环境安装一直受到很多人的诟病,比如说一个pcl的安装就需要有很多操作步骤。译过程仍然复杂和多样化。当了解了这些还不够,我们还需要考虑预先编译出哪种类型的开源库程序。比如:Debug还是Release、动态库还是静态库、MD还是MT、32位还是64位。常见的编译方式就有下面四种: 为了解决这样的问题,微软C++ 团队开发了适用于C 和C+
0. 简介 最近对大模型这部分内容比较感兴趣,作者最早接触大模型是22年下半年的时候。当时觉得非常amazing,并认为这是一个颠覆性的工作,目前随着开源大模型的逐渐变多。我觉得我们得学习并了解这些基础知识,以便后续在工作中可以学习并使用。在深度学习中,微调是一种重要的技术,用于改进预训练模型的性能。除了微调ChatGPT之外,还有许多其他预训练模型可以进行微调。以下是一些微调预训练模型的方法:
0. 简介 现有的视觉SLAM很多的算法让仍然是基于特征提取的方法来完成地图的建立,而RGB-D传感器的算法仍然是主要基于稀疏点的SLAM系统,这就导致在构建稠密点云地图的时候需要保持大量的地图点来建模环境。大量的地图点给我们带来了很高的计算复杂性,使其难以部署在移动设备上。另一方面,平面是人造环境中常见的结构,特别是在室内环境中。我们通常可以使用少量的平面来表示一个大的场景。《VIP-SLAM
0. 简介 之前我们在《经典文献阅读之—R-PCC(基于距离图像的点云压缩方法)》中提到了,我们可以通过一些算法层面来完成数据的压缩,而其实更简单或者说更直接的方法就是使用half这种形式来完成数据压缩。 1. half和float Half是用16位表示浮点数的一种数据类型,在IEEE 754中也有规定,这种数据类型在深度学习系统中的应用比较广泛。但是在当前主流cpu上,不支持half类型
0. 简介 对于深度学习而言,NeRF一定是最近两年最火的工作之一了,NeRF(Neural Radiance Fields)是最早在2020年ECCV会议上的Best Paper,其将隐式表达推上了一个新的高度,仅用 2D 的 posed images 作为监督,即可表示复杂的三维场景。NeRF迅速发展也已经被应用到了多个技术方向,例如新视点合成、三维重建等等,都取得非常好的效果。之前我们在《
0. 简介 对于最近出来的Point-LIO(鲁棒高带宽激光惯性里程计),本人还是非常该兴趣的,为此花了一些时间重点分析了Point-LIO的代码,并研究了它相较于Fast-LIO2的区别 1. laserMapping.cpp 第一部分就是实现对激光雷达视场角的图像分割。首先定义了一个BoxPointType类型的局部地图(LocalMap_Points)和一个bool类型的变量(Lo
亲爱的读者们,我今天非常荣幸地向大家推荐一本本人的全新力作——《从ROS1到ROS2无人机编程实战指南》。这本书站在初学者的角度,从入门到进阶,再到实战,循序渐进,是学习ROS1和ROS2的最佳选择。如今已在全国范围内上市,购书即可享受次日达的快捷服务! 本书的创作初衷源于帮助那些渴望投身于无人机或机器人开发的初学者。目前,国内关于ROS的书籍相当稀缺,大部分都是国外翻译版,内容可能更偏向于机器
0. 简介 对于自动驾驶以及机器人而言,除了SLAM以外,另一个比较重要的部分就是轨迹规划了。而最近作者看到了几篇比较好的文章,分别为《A Review of Motion Planning Techniques for Automated Vehicle》、《A review of motion planning algorithms for intelligent robots》、《A re
0. 简介 在了解完上面8讲内容后,基本上ROS和Matlab最关键的部分已经介绍完毕。我们最后一讲就来简单的讲述一下如何在Matlab中结合ROS来完成障碍物的识别与检测。 1. 在Matlab中使用CUDA 配置SimulinkCoder以从Simulink模型生成和构建的CUDA的ROS节点是我们这一小节需要讲的内容。以便于将模型完成配置并生成含有ROS节点的CUDA代码。然后将CUD
0. 简介 在真实的SLAM场景中,我们会发现在遇到大量动态障碍物的场景时候,特别容易造成跟丢的问题。传统的解决方法是通过将动态障碍物滤除,而本文《RigidFusion: Robot Localisation and Mapping in Environments with Large Dynamic Rigid Objects》中提到将动态物体看做刚体进行跟踪。虽然这篇文章创新点并不是很足,
0. 简介 之前作者在《深度学习之从Python到C++》介绍了一些比较传统的方法,主要侧重介绍了如何将pth和pytorch传统形式文件转化为onnx的文件,这个部分的内容,也可以主要看一下《PyTorch模型部署:pth转onnx跨框架部署详解+代码》这个文章的内容,我们发现在实际使用中,真正的TensorRT模型不是和我们之前介绍的这么简单。因为现在包含了很多第三方的依赖库,为此,我们需要
0. 简介 众所周知,ROS 2是具有不同架构的ROS的更新版本。这两个网络是分开的,在ROS和ROS 2的节点之间没有直接的通信。而ros1_bridge包则是提供了一个网桥,可以在ROS和ROS 2之间交换消息。桥接器管理所需的所有转换,并在两个网络之间发送消息。 1. ros1_bridge使用 这个例子展示了如何使用MATLAB®的键盘命令控制Gazebo中的TurtleBot3。凉
0. 简介 之前作者在《激光雷达动态障碍物滤除-调研与展望》以及《3D帧间匹配——-剔除动态障碍物》中提到了如何通过各种方法来完成动态障碍物的滤波。而本文也将围绕着如何完成动态障碍物滤波来展开,来介绍《ERASOR: Egocentric Ratio of Pseudo Occupancy-based Dynamic Object Removal for Static 3D Point Clou
0. 简介 作为路径规划而言,不单单有单个机器人自主路径规划,近年来随着机器人行业的兴起,多机器人自主路径规划也越来越受到关注,对于多智能体寻路(MAPF)。一般的操作会给定一个地图、机器人集群、以及它们的初始位置和目的地,MAPF会最终输出一组没有碰撞的路径,用于控制机器人集群完成运动。《Iterative Refinement for Real-Time Multi-Robot Path P
0. 简介 在之前,作者曾经转过一篇《一文详解ORB-SLAM3》的文章。那篇文章中提到了ORB-SLAM3是一个支持视觉、视觉加惯导、混合地图的SLAM系统,可以在单目,双目和RGB-D相机上利用针孔或者鱼眼模型运行。与ORB-SLAM2相比,ORB-SLAM3在处理大视差和长时间未观测到的场景时效果更好。它还提供了更准确的帧间运动估计和更快的处理速度。此外,ORB-SLAM3还支持更多的传感
0. 简介 终生学习作为近年来比较火的一种深度学习方式,导航终身学习(LLfN)旨在解决标准导航问题的一种新变体,在该问题中,智能体在有限的内存预算下,通过学习提高在线经验或跨环境的导航性能。而最近有一篇文章《A Lifelong Learning Approach to Mobile Robot Navigation》提出了一种新的终身学习导航(LLfN),它完全基于移动机器人自身的经验来改进
0. 简介 在我们之前接触的算法中,基本上都是要处理帧间雷达畸变的,类似于VSLAM系统,频率固定(例如10Hz), 而实际上,激光雷达点是按照不同的时间瞬间顺序采样的,将这些点累积到帧中会引入人工运动畸变,并且会对地图结果和里程计精度产生负面影响。低帧率还会增加里程计的延迟并限制可达带宽,其中里程计带宽类比于动态系统的带宽,即系统增益下降到0.707的频率。里程计带宽表示运动速度可以多快,里程
0. 简介 多波束激光雷达传感器,常用于自动驾驶汽车和移动机器人,获取三维范围扫描序列(“帧”)。由于角度扫描分辨率有限和遮挡,每帧只稀疏地覆盖场景。稀疏性限制了下游过程的性能,如语义分割或表面重建。幸运的是,当传感器移动时,从不同的视点捕获帧。这提供了补充信息,并在公共场景坐标系中累积时,产生了更密集的采样和对基础三维场景的更全面覆盖。然而,扫描的场景通常包含移动的物体。仅通过补偿扫描仪的运动
0. 简介 我们上面讲了最基础的通信机制以及在Matlab中如何使用这些通信,下面我们这一讲来主要介绍ROS当中最常用的TF坐标系在Matlab中的使用。tf是分布式的,因此所有的坐标帧信息对ROS网络中的每个节点都是可用的。所以这一节就是带领读者熟悉该怎么在Matlab中使用ROS的TF坐标系 1. TF概念 要为这个示例创建一个真实的环境,可以使用exampleHelperROSStar
0. 简介 在之前配置各种深度学习环境的时候经常需要先检测一下电脑的软硬件环境,其实整个过程比较重复和固定,所以我们是否有可能一键检测Python版本、PIP版本、Conda版本、CUDA版本、电脑系统、CPU核数、CPU频率、内存、硬盘等内容这是很多Deepper苦恼的。这里会从软件开始介绍,并最终提供一套Python脚本工具来完成检测 1. Windows 电脑环境检测 AIDA64
0. 简介 之前我们在以前的文章中介绍了很多有关于点云匹配相关的知识,最近两年处理GICP这一大一统的ICP匹配方法以外,还有一个工作对体素化和ICP这两者打起了心思,《Voxelized GICP for Fast and Accurate 3D Point Cloud Registration》提出了一种体素化的广义迭代最近点(VGICP)算法,用于快速、准确地进行三维点云配准。该方
0. 简介 对于3d bounding box而言,近几年随着自动驾驶的火热,其标注工具也日渐多了起来,本篇文章不讲具体的算法,这里主要聚焦于这些开源的3d bounding box标注工具,以及他们是怎么使用的。这里借鉴了我想静静,博主的博客作为基础,然后再结合自己的使用与了解完成扩充。 1. 3d-bat 在本文中,我们专注于在新型 3D 边界框注释工具箱 (3D BAT) 的帮助下获取
0. 简介 对于现在的VSLAM而言,现在越来越多的工作开始聚焦于如何将深度学习结合到VSLAM当中,而最近的这个工作就给出了一个比较合适的方法。《Orbeez-SLAM: A Real-time Monocular Visual SLAM with ORB Features and NeRF-realized Mapping》这篇文章,可以轻松适应新的场景,而不需要预先训练,并实时为下游任务生
0. 简介 对于ROS1而言,其在Matlab当中相较于ROS2还有一些比较高级的用法,比如说我们接下来要说的Action和Gazebo仿真。 1. ROS Action ROS的Action行为模式当中也存在有一个客户端到服务器的通信关系。Action行为模式使用ROS主题将目标消息从客户机发送到服务器。在接收到目标后,服务器对其进行处理并将信息返回给客户端。这些信息包括服务器的状态、当前
0. 简介 最近几年IPC相关的文章也出了不少,最近作者有看到了一篇比较有意思的ICP论文—-《Gravity-constrained point cloud registration》,这篇论文将传统的ICP考虑了重力因素,高频率的IMU数据弥补了低频的传感器数据。除此之外,可以从重力向量中获取三自由度姿态中的两个。在视觉里程计中,IMU已经被用来将6自由度位姿估计转换为4自由度。在lidar
0. 简介 密集的光流估计在许多机器人视觉任务中起着关键作用。随着深度学习的到来,已经比传统方法以令人满意的精度预测了它。然而,当前的网络经常占用大量参数并且需要沉重的计算成本。这些缺点阻碍了在功率或内存受限的移动设备上的应用。为了应对这些挑战,在本文《FastFlowNet: A Lightweight Network for Fast Optical Flow Estimation》中,我们
0. 简介 我们在日常使用激光SLAM算法的时候,常常会发现现有的算法只会和一些比较经典或者前作去进行比较,很多时候我们更希望对主流的激光SLAM方法进行性能比较。之前作者转载过一篇文章《常见不同3D激光SLAM方案对比》。但是对比的算法有限。现在瑞典Lule科技大学评估9种最常用的激光SLAM方法。我们下面主要来看一下性能对比部分的内容。 1. 总览所有激光slam 所有SLAM方法,所需
0. 简介 我们知道,在SLAM中,最主要也最关键的就是如何对我们设计出来的非线性问题进行求解,并计算出最优解。而在这个过程中我们用的最多的就是Ceres,之前作者在《SLAM本质剖析-Ceres》。而我们这一篇文章就来讨论一下如何使用Ceres来完成常见的优化。 1. Ceres中点到点的距离残差 下面的部分就是我们最常用的两个点到点的计算公式,其中Eigen_MAKE_ALIGNED_O
0. 简介 参数分离对于绝大多数算法开发来说收益是非常大的,因为我们都知道,随着平台的更替,很多时候如果说数据流和算法交叠在一起(即接口与实现合在一起)。这将有可能会导致在迁移平台时候会导致代码难以维护,并有可能会造成莫名的Bug。为了使代码更易于维护和扩展,在修改通信接口时不需要修改相关的算法代码,本文的下面将会介绍几种常用的方法。 1. 通过动态链接库完成链接 动态链接库(Dynamic
0. 简介 对于激光雷达和视觉摄像头而言,两者之间的多模态融合都是非常重要的,而本文《Learning Optical Flow and Scene Flow with Bidirectional Camera-LiDAR Fusion》则提出一种多阶段的双向融合的框架,并基于RAFT和PWC两种架构构建了CamLiRAFT和CamLiPWC这两个模型。相关代码可以在 https://githu
0. 简介 在前几讲我们讲了Matlab中的Message以及Topic的相关知识。而ROS主要支持的通信机制还有服务这一类。服务通过允许请求以及响应的通信方式,来给整个系统完成更紧密的耦合。服务客户端向服务服务器发送请求消息并等待响应。服务器将使用请求中的数据构造响应消息并将其发送回客户端。每个服务都有一个类型,该类型决定请求和响应消息的结构。 1. ROS1的服务端和客户端 1.1
0. 简介 我们在前面一节介绍了Matlab与Message的通信,而我们这一节主要来介绍发布者和订阅者在Matlab中的操作。这部分我们主要来看一下ROS1和ROS2中分别是如何使用Topic的 1. ROS1的消息订阅与发布 1.1 ROS1的消息订阅 在Matlab中一般使用rossubscriber订阅/scan主题。如果主题已经存在于ROS网络中(就像这里的情况一样),ros
0. 简介 之前作者前段时间在研究BEV的相关算法,当时就觉得BEV算法好是好,但是所需要的内存以及计算资源实在是太大了,无法实时在真实场景中运行。我们知道多视图(multi-view)三维目标检测具有低成本、高效率的特点,具有广阔的应用前景。然而,由于缺乏深度信息,通过透视图准确地检测目标是极其困难的。当前的方法倾向于为图像编码器采用重主干,使得它们不适用于现实世界的部署。与图像不同的是,激光
0. 简介 消息是ROS中交换数据的主要容器。主题和服务使用消息在节点之间传输数据。为了标识其数据结构,每条消息都有一个消息类型。例如,来自激光扫描仪的传感器数据通常以sensor_msgs/LaserScan类型的消息发送。每种消息类型标识消息中包含的数据元素。每个消息类型名称都是一个包名称。 MATLAB支持在机器人应用程序中经常遇到的许多ROS消息类型。这个例子展示了在MATLAB中创建
0. 简介 在20年DARPA地下挑战赛中CoSTAR队伍提出了LOCUS这个深度学习模块,在两年后LOCUS2.0出世,LOCUS 2.0包括一种新的基于法线的广义迭代最近点(GICP)公式,该公式减少了点云对齐的计算时间,一种自适应体素网格滤波器,无论环境的几何结构如何,都能保持所需的计算负荷,以及一种滑动窗口建图方法,该方法限制了内存消耗。发布了LOCUS 2.0作为一个开放源代码库,具体
0. 简介 现在的SLAM算法在静态环境中表现良好,但在动态环境中很容易失败。最近的工作将基于深度学习的语义信息引入到SLAM系统以减轻动态对象的影响。然而,在资源受限的机器人的动态环境中应用鲁棒定位仍然具有挑战性。所以《RGB-D Inertial Odometry for a Resource-Restricted Robot in Dynamic Environments》提出了一种用于动
0. 简介 最简作者在看PX4的相关内容,其中需要提取对yaw角的估计,所以针对性的对ECL EKF2中的EKF-GSF 偏航估计器进行学习。国内外相关的资料很少,这里主要基于《使用 IMU 和 GPS 进行偏航对准》这篇文章的内容,并结合PX4官网的内容,完成介绍。相关的代码在GIthub上,这里结合代码来阅读学习原作者的相关阐述。值得一提的是Github上有一位大佬提供了一套PX4 ECL
0. 简介 自从ikd-tree出来后,现在越来越多的工作瞄准了增量式这种方法,比如说激光惯导里程计(LIDAR-Inertial Odometry,LIO)的高精度跟踪通常涉及最小化点到平面距离的k最近邻(kNN)搜索,然而,这样做的成本是维护大型局部地图并为每个点执行kNN平面拟合。在《LIO-PPF: Fast LiDAR-Inertial Odometry via Incremental
0. 简介 在上一章中我们详细介绍了ROS与Matlab链接的基础用法。这一章我们将来学习如何使用Matlab当中的Simulink来完成。Simulink对机器人操作系统(ROS)的支持使我们能够创建与ROS网络一起工作的Simulink模型。ROS是一个通信层,允许机器人系统的不同组件以消息的形式交换信息。组件通过将消息发布到特定的主题(如/odometry)来发送消息。其他组件通过订阅该主
0. 简介 最近作者受到邀请,让我帮忙给刚入门的学弟讲讲滑模控制。可是作者也不知道怎么向未入门的学弟讲解这些基础知识,所以作者翻了翻近几年写的很好的文章以及视频。综合起来,来总结出一套比较基础,且适用于初学者的文章吧。这里我们先贴一下王崇卫同学的笔记。对应的视频连接在下面: [video(video-9orVpxnN-1667703763994)(type-bilibili)(url-http
0. 简介 之前我们看了许多VIO或者LIO的工作,而我们也需要关注在整个流程中GNss的作用,我们知道GNss自主系统提供全球参考定位的非常流行的手段之一。然而,信号反射与建筑物遮挡导致GNss定位性能在城市峡谷中受到很大挑战。鉴于GNss测量高度依赖环境且与时间有关,传统的基于滤波的GNss定位方法无法同时探索历史测量之间的时间相关性。因此,基于滤波的估计器对突的异常测量值很敏感。本文《To
0. 简介 商场、超市等大多数现实场景的环境随时都在变化。不考虑这些变化的预建地图很容易变得过时。因此,有必要拥有一个最新的环境模型,以促进机器人的长期运行。为此《A General Framework for Lifelong Localization and Mapping in Changing Environment》一文提出了一个通用的全生命周期同步定位和建图 (SLAM) 框架。该框
0. 简介 对于ROS来说,如果不具备一定知识的人员来使用这些我们写的算法,如果说没有交互,这会让用户使用困难,所以我们需要使用GUI来完成友善的数据交互,传统的GUI方法一般有PYQT这类GUI方法,但是这类GUI工具上手门槛较高,也不太适合快速且敏捷的可视化界面开发。NiceGUI 是一个易于使用、基于Python的用户界面框架,它显示在Web浏览器里,可创建按钮,对话框,markdown,
0. 简介 之前作者已经讲了《ROS1可视化利器—-Webviz》,然后就有读者问,ROS2有没有可以使用的可视化工具呢,答案是肯定的,除了plotjuggler这种ROS1和ROS2通用的可视化利器,还有一种全平台通用的软件FoxgloveStudio,Github开源链接为https://github.com/foxglove/studio。 1. FoxgloveStudio 说明 对
0. 简介 最近在群里被萌新询问2D激光雷达的工作还能做什么,我当时有点难以回答,cartographer作为2D的集大成者,留给后续工作者改进的地方已经很少了。直到我最近看到了这一篇文章《Dynamic Occupancy Grid Mapping with Recurrent Neural Networks》,也给我个人提供了一个比较新的方向,即动态栅格地图的更新方式。这里我们详细看一下这篇
0. 简介 作为SLAM中常用的方法,其原因是因为SLAM观测不只考虑到当前帧的情况,而需要加入之前状态量的观测。就比如一个在二维平面上移动的机器人,机器人可以使用一组传感器,例如车轮里程计或激光测距仪。从这些原始测量值中,我们想要估计机器人的轨迹并构建环境地图。为了降低问题的计算复杂度,位姿图方法将原始测量值抽象出来。具体来说,它创建了一个表示机器人姿态的节点图,以及表示两个节点之间的相对变换
0. 简介 作为激光里程计,常用的方法一般是特征点法或者体素法,最近Mars实验室发表了一篇文章《Efficient and Probabilistic Adaptive Voxel Mapping for Accurate Online LiDAR Odometry》,同时还开源了代码在Github上。文中为雷达里程计提出了一种高效的概率自适应体素建图方法。地图是体素的集合,每个体素包含一个平
0. 简介 对于视觉里程计而言,在面对低纹理场景时,往往会出现退化的问题,究其原因是人造环境往往很难找到足够数量的点特征。而其他的几何视觉线索则是比较容易找到,在城市等场景中,通常表现出结构规律,如平行性或正交性,满足曼哈顿世界的假设。之前我们已经在《经典文献阅读之—PL-SLAM》文中介绍了点线SLAM的形式,相关的具体代码我们可以在Github上找到 1. 文章贡献 在本文章中,我们则进
0. 简介 对于自动驾驶的预测和规划而言,能够有效的对目标产生可解释性是非常有必要的,而《Interpretable Goal-based Prediction and Planning for Autonomous Driving》文中就提出了一种综合的自动驾驶预测和规划系统,它利用合理的逆规划来识别其他车辆的意图。目标识别可以通过蒙特卡罗树搜索(MCTS)算法来规划自我车辆的最佳动作。逆规划
0. 简介 我们在第三章和第四章中详细介绍了如何使用URDF以及Navigation 2,而第五章开始我们将学习如何将前面所学的结合起来,来形成一个Unity与ROS完整且系统的框架 1. 创建并导入URDF 这一部分作为我们第三讲的内容,我们在之前的基础上通过使用ROS2命令操作URDF模型增加激光传感器。具体的代码如下:toio_style.urdf <?xml version=
0. 简介 Matlab作为广大学生以及算法工程师常用的软件,因其良好的可视化以及矩阵适应能力,使其得到了广泛的使用。同时ROS作为机器人、自动驾驶领域最常用的软件,其与Matlab结合在一起也是理所当然的。为此这一系列就是来带领读者熟悉并了解Matlab与ROS背后的使用关系 1. Matlab与ROS 机器人操作系统(ROS)是一种通信接口,使机器人系统的不同部分能够相互发现,并在它们之
0. 简介 作为深度学习用户,经常会听到ONNX、TensorRT等一系列常用的文件保存格式。而对于ONNX而言,经常我们会发现在利用TensorRT部署到NVIDIA显卡上时,onnx模型的计算图不好修改,在以前的操作中很多时候大佬是将onnx转换成ncnn的.paran和.bin文件后对.param的计算图做调整的。在这篇文章《TensorRT 入门(5) TensorRT官方文档浏览》和这
0. 简介 对于激光雷达而言,玻璃等场景一直是漏检的主要问题,而如何去采用一种有效地方法能够完成激光雷达对室内场景的玻璃物体的检测和包含,这一直是研究重点。当LiDAR数据是主要的外部输入时,玻璃对象不能正确配准。这是因为入射光主要穿过玻璃对象或从光源反射,导致玻璃表面的距离测量不准确。而文章《Cartographer_glass: 2D Graph SLAM Framework using L
0. 简介 相信最近大家已经被Transformer给洗脑了,作者也在《多传感器融合综述—-FOV与BEV》中提到了深度学习相关的技术。这就随之带动的就是如何使用基于纯相机的鸟瞰图(BEV)感知技术来替代昂贵的激光雷达传感器,并使其能够应用在自动驾驶上,这目前是急需解决的问题,由于现在Transformer的计算仍然需要大量资源来执行车载推理,无法满足实时性。为此我们来看一下这一篇《Fast-B
0. 简介 对于视觉SLAM而言,除了使用特征点法来完成VIO以外,还可以使用光流法来完成VIO的估计。而传统的光流法受环境,光照变化严重,所以有时候会出现光流偏差等问题。所以现在有越来越多的工作朝着深度学习的方向扩展,比如说这一篇文章《FlowFormer: A Transformer Architecture for Optical Flow》,目前已经被ECCV 2022收录。这里作者也在
0. 简介 对于Gazebo而言,我们知道其是可以通过与ROS的连接完成机器人建图导航的,那我们是否可以通过Unity来完成相同的工作呢,答案是肯定的。这一讲我们就来讲述使用Unity的“Turtlebot3”模拟环境,来运行ROS2中的“Navigation 2”以及“slam_toolbox”。 1. 代码编译 安装步骤如下所示,首先先下载“Navigation 2 SLAM Examp
0. 简介 最近几年随着自动驾驶行业的火热,对高精地图的需求也日渐庞大。由于高精(HD)地图的相关可扩展性成本,需要不断的维护,并涉及繁琐的人工标签。这就导致需要大量的人力来做这样的事情,而是否存在一些比较简单的办法来完成道路、人行道、人行横道和车道等静态地标进行自动和准确的标注,这就是科研界几年中所需要关心的内容,本文主要围绕着这篇IROS 2020的文章《Probabilistic Sema
0. 简介 最近几年随着深度学习的发展,现在通过深度学习去预估出景深的做法已经日渐成熟,所以随之而来的是本文的出现《Real-Time Dense Monocular SLAM with Neural Radiance Fields》。这篇文章是一个结合单目稠密SLAM和层次化体素神经辐射场的3D场景重建算法,能实时地用图像序列实现准确的辐射场构建,并且不需要位姿或深度输入。核心思想是,
0. 简介 这几个月,博主已经从SLAM算法的使用向着算法的数学推导进行了记录和分享,之前也分享了李群李代数关注核心一文,从现象中解释了李群和李代数表达的含义。但是这还不够,所以这次作者作为SLAM本质剖析的番外,来介绍李群李代数的微分和导数。 1. 旋转点求导 李群或者李代数上叠加微小量的情况呢?传统的求导过程中,我们常见的做法是对自变量添加一个微小值来进行: f'(x) =
0. 简介 在复杂动态环境下,如何去建立一个稳定的SLAM地图是至关重要的。但是现在当前的SLAM系统主要是面向静态场景。目前相较于点云的分类与分割而言。视觉的识别与分割会更加容易。这就可以根据语义信息提高对环境的理解。文章《Multi-modal Semantic SLAM for Complex Dynamic Environments》提出了一个鲁棒的多模态语义框架去解决slam在复杂和动
0. 简介 SLAM算法在加入回环检测与修正后,效果会显著提高。而很多人就会思考,有没有一个比较稳健的方法,能够让机器人跟丢之后重新找回当前的姿态。虽然二者目的不同,重定位主要为了恢复姿态估计,而回环为了解决飘移,提高全局精度。但是二者在匹配帧上可以共享一些算法。 1. 视觉重定位回顾 比如说对于单目VSLAM算法用的比较多的还是基于BoW的匹配方案(ORB-SLAM,VINS等),也有基于
0. 简介 对于激光SLAM而言,目前越来越多的工作开始集中在工业应用等场景,比如说我们这篇文章《Robust Odometry and Mapping for Multi-LiDAR Systems with Online Extrinsic Calibration》。文中提到多个激光雷达的组合使得机器人能够最大限度地感知周围环境并获得足够的测量信息,这对于同时定位和建图(SLAM)是
0. 简介 在面对二维与三维之间的转换时,我们常常会困惑该如何去转换,在G2O中存在有理想的坐标转换工具,但是在Sophus中却缺乏这样的手段。之前在Sophus处简要的介绍了一下SE(2)与SE(3)的转换,最近发现之前的文章这部分需要拿出来详细的说一说。 1. 欧拉角与旋转向量 欧拉角、旋转向量、四元数和旋转矩阵是Sophus中常常提到的几个名词,欧拉角和旋转向量是类似的,SO(3)的旋
0. 简介 我们在使用PCL时候,常常不满足于常用的降采样方法,这个时候我们就想要借鉴一些比较经典的高级采样方法。这一讲我们将对常用的高级采样方法进行汇总,并进行整理,来方便读者完成使用 1. 基础下采样 1.1 点云随机下采样 点云下采样是对点云以一定的采样规则重新进行采样,目的是在保证点云整体几何特征不变的情况下,降低点云的密度,进而可以降低相关处理的数据量和算法复杂度。随机下采样顾名
0. 简介 在此之前博主对Fast-LIO2和R3LIVE进行了系统性的学习。最近文章《Fast and Tightly-coupled Sparse-Direct LiDAR-Inertial-Visual Odometry》提出了FAST-LIVO,这是一种快速LiDAR惯性-视觉里程计系统,它建立在两个紧耦合的直接里程计子系统之上:VIO子系统和LIO子系统。LIO子系统将新扫描的
0. 简介 视觉里程计最近几年越来越受到学术界以及工业界的认可,以ORB和VINS为代表的视觉SLAM已经可以满足绝大多数场景,而OV2SLAM在其他VSLAM中脱颖而出,其实时性以及具体的回环性能在测试中都得到了认可。下面我们就来看一下《OV2SLAM : A Fully Online and Versatile Visual SLAM for Real-Time Applicatio
0. 简介 在我们上一章讲的对于Unity与ROS之间的通信,Toolbox等比较基础的指令。下面我们将结合代码来介绍一下如何导入URDF文件,并通过键盘完成Unity的控制。 1. URDF模型创建 首先先创建并编辑URDF文件,并命名为toio_style.urdf <?xml version="1.0"?> <robot name="toio_style"
0. 简介 最近作者希望系统性的去学习一下CUDA加速的相关知识,正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享,方便能给CUDA网络加速学习的萌新们去提供一定的帮助。 1. CUDA中的Stream和Event 1.1 CUDA stream CUDA stream是GPU上task 的执行队列,所有CUDA操作(kernel,内存拷贝等)都是在stream上
0. 简介 传统的地图生成方法一般是依靠Lidar和IMU结合的,但是问题在于,目前Lidar和IMU的紧耦合主要集中在前端里程计,基本没有涉及到后端全局优化以及建图的融合。为此文章《Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping》提出了一种改进的地图生成方法,并设计一个在所有阶段(前端里程计+后端全局优
0. 简介 最近作者希望系统性的去学习一下CUDA加速的相关知识,正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享,方便能给CUDA网络加速学习的萌新们去提供一定的帮助。 1. Cublas概念 cuBLAS是一个BLAS的实现,允许用户使用NVIDIA的GPU的计算资源。使用cuBLAS的时候,应用程序应该分配矩阵或向量所需的GPU内存空间,并加载数据,调用所需的
0. 简介 对于ROS而言,其最常用的就是Topic话题以及Service两个了。之前我们在了解Unity Robotics Hub时候就了解到基本的Unity和ROS的通讯,下面我们来详细介绍一下Unity与ROS的话题与服务。 ROS和Unity之间的通信是通过Unity的“ROS-TCP-Connector”软件包和ROS的“ROS-TCP-Endpoint”软件包进行通信的。 1.
0. 简介 PCL作为目前最为强大的点云库,内部存在有大量集成好的算法。而对于数据量大、非同源、含大量噪声且部分重叠的激光点云与影像重建点云,其稀疏程度、噪声程度等不同,非重叠区域的面积很大。真实场景的点云尤其是影像重建点云噪声较多,提取的法向量误差也很大,有的时候NDT和ICP并不能形成良好的匹配,这个时候我们该怎么样评估通过IPC或NDT算出的变换矩阵来估算出算法的精度呢?这个时候就需要通过
0. 简介 最近作者希望系统性的去学习一下CUDA加速的相关知识,正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享,方便能给CUDA网络加速学习的萌新们去提供一定的帮助。 1. 基础矩阵乘法 下图是矩阵乘法的示意图,下面我们来看一下在CPU和GPU上是怎么表达的。CPU代码示意流程: // Matrix multiplication on the (CPU) ho
1.CCPP整体算法文档 1.1 ccpp基础介绍 全路径覆盖算法(CCPP: Complete Coverage Path Planning)作为扫地机器人较为关键的组成部分,其问题的本质是:在栅格地图中,全覆盖路径规划问题就演变为寻找机器人的下一个移动位置,只有准确找出了该位置,才能使机器人自主规划出一条切实可行的无碰撞且重复率低的移动路径。 CCPP需解决的关键问题: 遍历工作区
0. 简介 Transfomer最近几年已经霸榜了各个领域,之前我们在《经典文献阅读之—Deformable DETR》这篇博客中对DETR这个系列进行了梳理,但是想着既然写了图像处理领域的方法介绍,正好也按照这个顺序来对另一个非常著名的Swin Transformer框架。Swin Transformer框架相较于传统Transformer精度和速度比CNN稍差,Swin Transforme
0. 简介 在面对复杂系统时,所有的模块不可能同时开发在一个project下的,而更多的可能就是每个人开发不同的模块,并通过一个模块将这些模块都整合到一起,这时候submodule的作用就非常明显了。通过设置submodule可以轻易地对不同的模块完成整合。同时大部分现代软件项目都需要依赖于他人的工作,当别人已经实现了一个很好的解决方案,就不需要再浪费时间再去实现一遍。因此很多项目都会以库或模块
0. 简介 CUDA作为并行加速的利器,目前已经被越来越多的利用在图像处理领域中,很多时候我们需要做耗时的图像工作时,使用GPU加速是一个很好地解决方法。充分利用CUDA架构特有的常量存储器和共享存储器对普通并行算法进行改进.讨论了如何根据程序和显卡设备的固有属性来分配线程以达到最高的GPU占用率,从而得到最优的加速效果。 1. CUDA加速 在基于GPU的并行系统中, CPU和GPU各司其
0.简介 对于Unity而言,其拥有非常完备的物理特性,这对于机器人仿真是非常有用的,但是实际上Unity和ROS之间的通信一直是摆在两者之间的难题,正好看到宇宙爆肝锦标赛冠军写的这个系列,所以个人想参照为数不多的资料来进行整理,并完成这个系列的文章。“Unity Robotics Hub”是一种基于Unity环境的机器人模拟工具、教程、资源以及文档信息的资料库。机器人工作者可以在模拟场景中使用
0. 简介 最近作者希望系统性的去学习一下CUDA加速的相关知识,正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享,方便能给CUDA网络加速学习的萌新们去提供一定的帮助。 1. GPU与CPU区别 处理器指标一般主要分为两大类,第一块主要是延迟,另一块是吞吐量。 1.1 CPU概念 对于CPU而言,首先是拥有较大的内存,其具有L1,L2,L3三级的存储。通过多级
0. 简介 作为常用的配准方法,ICP和NDT两种匹配被广泛应用于激光雷达的点云配准方法中。我们知道IPC的匹配主要是描述了点到点的匹配方法,而无法胜任点到面以及面到面的匹配,而本博客主要就是将向读者分析《Generalized-ICP》这篇论文,GICP可以通过点到点的距离作为损失函数求解point-to-point的损失函数,点到局部目标点局部拟合的平面距离作为point-to-pl
0. 简介 之前作者基本都在围绕着特征点提取的路径在学习,最近看到了最近点云PCL推送的《Structure PLP-SLAM: Efficient Sparse Mapping and Localization using Point, Line and Plane for Monocular, RGB-D and Stereo Cameras》。这个工作是基于OpenVSLAM架构的,但
0. 简介 作为Transformer在机器视觉领域的爆火,在自动驾驶领域目前很多工作都集中在前视转鸟瞰图的方法中,这里我们来讲2020年一篇经典的论文《Predicting Semantic Map Representations from Images using Pyramid Occupancy Networks》,其工作被近两年的新的BEV算法进行充分的验证以及对比,从今天的眼光来看,
0. 简介 作为SLAMer在建图时最怕的就是大量的动态障碍物存在,这会导致建图的不精确,而本文主要围绕着如何剔除动态障碍物开始讲起,并提供一种快速的过滤障碍物的方法。 1. 主要方法 在调研的过程中主要存在有两种方法,第一种如文章《通过帧间确定动态障碍物,剔除动态3D点云数据后用于生成栅格地图》所说的方法。通过扫描局部地图,并使用kd-tree完成点云的过滤,通过两帧之间的变化消除动态障碍
0. 简介 上一节中,我们过完了VIO中的状态预测以及特征点跟踪部分。此时我们已经拿到了光流的特征点信息,而这部分越来越接近我们想要去讲的帧到帧的VIO部分了。这一节,我们将围绕着VIO部分来进行讲解 1. PNP误差更新 我们从之前的博客《经典文献阅读之—R3LIVE》了解到,帧到帧的VIO是将三维地图点投影到上一个图像帧获取二维座标然后通过LK光流法获取到在当前帧的二维坐标,然后可以通过
0. 简介 对于激光和视觉里程计而言,我们在面试和日常工作中会经常听到,在长时间在平坦道路上直行会导致维度的退化。定位的退化主要是因为约束的减少,比如NDT需要三个正交方向的约束才能很好的匹配,但若在狭长的走廊上或者隧道环境,条件单一,即使人肉眼观看激光雷达数据,也很难判断机器人所处的位置。而这篇博客来回顾下LOAM的作者Ji Zhang发表在2016年IROS上的一篇关于优化问题的退化
4. 点云处理 4.1 add_point 将一个点添加到另一个点 4.2 add_value 将相同的值添加到点的每个坐标 4.3 assign_point 用另一个点指定一个点 4.4 assign_value 为点的每个坐标指定相同的值 4.5 cross_product 计算两个向量的叉积 4.7 divide_point 将一点除以另一点 4.8 divide_
1. lambda表达式(C11) 1.1 lambda表达式的组成 [=]/*1*/ ()/*2*/ mutable/*3*/ throw()/*4*/ -> int/*5*/ {}/*6*/ capture子句 参数列表(optional) 可变规范(optional) 异常定义(optional) 返回类型(optional) 函数体 1.2 即看即用
0. 简介 在上一章中,我们过完了主函数以及LIO的操作,由于这部分代码在FAST-LIO2中已经充分详细的介绍过了,所以说这里在R3LIVE中就不过多介绍了,下面我们来看一下本系列的重点,即VIO部分。 1. 主函数 我们在之前分析过,R3LIVE主要的公式推导在VIO上,所以我们来细细的分析这部分的功能。首先我们在之前的博客《经典文献阅读之—R3LIVE》提到,R3LIVE将VIO分成了
0. 简介 对于ROS1而言,rqt和plotjuggler是我们最常用的工具,这两个工具:rqt中嵌入了很多有用的小工具,但是它需要播放离线包,没有办法对离线包进行实时的分析。而plotjuggler支持对离线bag包进行分析,但是不支持可视化的工具,这两个各有千秋。而近年来,有更多的工作开始落实在可视化上。 1. SLAMer常用的可视化开源库 opengl:Open Graph
0. 简介 对于点云的深度学习分割而言,其中主要组成部分为两块,一个是点云bin文件,一个是特征的label文件,而point_labeler这个点云标注工具就能很好的让我们去标注自身想要的数据集。下面我们将来详细的介绍point_labeler这个工具的使用方法。 1. 环境安装 环境依赖: catkin Eigen >= 3.2 boost >= 1.54 QT
0. 简介 这是一片22年的ICRA 2022杰出论文《Translating Images into Maps》。来自萨里大学的研究者引入了注意力机制,将自动驾驶的 2D 图像转换为鸟瞰图,使得模型的识别准确率提升了 15%。相关的代码已经开源,下面是他们Github开源代码。这里由于作者之前并不是搞NLP的,所以也是边学边写的,如有问题请多多提出。 1. 文章贡献 与以往的方法不同,这项
0. 简介 我们在上文中提到R3LIVE主要由两个node节点所依赖的cpp文件组成,我们在上一节中完成了r3live_LiDAR_front_end 简单介绍,下面我们需要详细的看/r3live_mapping这个节点。这个节点也是我们R3LIVE的核心。 1.主函数进入 首先我们知道R3LIVE的主函数进入在r3live.cpp这个文件夹中,其中cpp文件中没有很多值得关注的东西。基本是
0. 前言 作为激光雷达的回环而言,最经典的仍然是Scan Context,但是Scan Context仍然会存在有一些缺陷,一是它只利用了最大的高度,丢失了很多点云信息,二是Scan-Context不具有旋转不变性,需要进行暴力匹配,三是Scan-Context缺少特征提取步骤。所以文章《LiDAR Iris for Loop-Closure Detection》,同时作者也将代码开源
0. 简介 管道模式,不属于23种设计模式之一(是责任链模式的一种变体),但是在我们实际业务架构中还是有很多场景适用的。尤其是在多传感器的数据流处理中会非常方便。尤其是在大型场景中使用Pipeline将复杂的进程分解成多个子任务。 1. 管道模式示意图 Pipeline模式为管道模式,也称为流水线模式。顾名思义,管道模式就像一条管道把多个对象连接起来,整体看起来就像若干个阀门嵌套在管道中,而
0. 简介 gRPC 一开始由 google 开发,高性能、开源、支持多语言的 RPC 框架。 在gRPC框架中,运行在不同机器上的客户端应用可以直接调用服务器端上提供的方法,使得我们可以更容易的创建一个分布式系统。gRPC基于定义服务(Service)的思想,指定可以使用其参数和返回类型远程调用的方法;在服务器端,服务器实现这个接口并运行一个gRPC服务器来处理客户端调用;在客户端,客户端有
0. 简介 这篇文章我们介绍一下论文“High-Definition Map Generation Technologies For Autonomous Driving: A Review“,2022年6月11日,来自加拿大Ontario Tech University。相较于网上的其他文章,本文更在意向读者更轻松全面的了解文章中介绍的方法,让读者从总体上了解高精地图生成。 高清地图近年来备
1. Open3D-ML安装和使用 首先对于Open3d,我们要先对源码下载 # make sure you have the latest pip version pip install --upgrade pip # install open3d pip install open3d 然后选择要安装兼容版本的PyTorch或TensorFlow,Open3d中提供了两种安装方式
0. 简介 boost作为C++中最常用的第三方库,很多SLAMer都在使用Geometry中的库。Geometry库里面拥有大量的开源算法。可以省去大量的重复造轮子的时间。虽然有《Boost程序库完全开发指南》这系列的书来学习Boost中的时间与日期、内存管理、工具类、字符串与文本处理、正确性测试、容器与数据结构、数学与数字、操作系统相关、回调函数、并发编程、设计模式这11个主要的部分。但是G
0. 简介 之前我们立了一个Flag,就是要对R3LIVE进行详细的分析,当时就提到R3LIVE作为一个非常经典的文章,和LVI-SAM一样都是一种激光—惯性—视觉结合的SLAM算法。对于R3LIVE而言结构还是挺清晰的,比如IMU,相机,激光雷达三个传感器分别的作用。下面我们来梳理一下整个R3LIVE算法的流程以及代码理解。 1. 前言 我们先来看一下代码多少钱一两博主绘制的节点与话题的绘
0. 前言 前段时间去大概了解了如何去滤除动态障碍物的问题,也根据调研去做了一些工作,这一篇文章主要向大家展示如何将Lidar-MOS和ROS2结合起来去使用。 1. 环境安装 文中使用了Salsanext,Rangenet ++和Mine三个模块作为baseline来设计和测试动态障碍物滤除的工作,其中的语义分割工作都是目前已有的,可以去原项目中查看。代码下载: #下载程序 git c
0. 简介 作者之前对KF,EKF,UKF,PF都进行了学习,但是有两块KF还没有进行精细的学习,而相较于IEKF而言,ESKF会在滤波和融合定位中更常使用,当然学习了KF后,对于其他的变种卡尔曼滤波理解起来会非常容易,基本上问题不是很大。状态误差卡尔曼(ESKF)的应用,它是卡尔曼滤波器的变种中应用最为广泛的一种,与EKF一样,它也是一种针对时变系统的非线性滤波器。但是与EKF不同的是,它
0. 简介 上一节我们将while内部的IKD-Tree部分全部讲完,下面将是最后一部分,关于后端优化更新的部分。 1. 迭代更新 最后一块主要做的就是,拿当前帧与IKD-Tree建立的地图算出的残差,然后去计算更新自己的位置,并将更新后的结果通过map_incremental函数插入到由ikd-Tree表示的映射中。 // 外参,旋转矩阵转欧拉角 V3D ext
0. 简介 激光雷达作为自动驾驶中最常用的传感器之一,由于其深度感知特性优良,这也让以激光SLAM为主的SLAM方法被广泛应用。但是我们发现在人员密集,车辆密集的场景经常会造成点云定位效果不佳,而这些情况传统滤波方法是没有办法解决的。本篇将主要围绕着深度学习的方法来讲述激光雷达分割的问题。 1. SLAM配准与建图 无论哪种点云配准方式(点到点/点到特征/点到栅格/NDT),都是基于静态假设
0. 简介 我们在之前的博客中讨论了一些激光回环检测的方法,但是基本都是围绕着点云特征去做的,并未涉足过深度学习的相关方法,之前作者在查找《经典文献阅读之—BoW3D》资料时看到了一个比较感兴趣的工作《OverlapNet: Loop Closing for LiDAR-based SLAM》,同时这个文章还拥有对应的开源源码Github,非常适合复现以及学习。 1. 工作重心 同时定位和映
0. 简介 上一节我们将主函数部分while外面的部分给讲完了,下面我们将深入while来学习里面的知识 1. 主函数while内部的eskf前馈 这部分是我们while内部前面的部分,内部的操作在前面几节中我们已经详细分析过了。 while (status) { // 如果有中断产生,则结束主循环 if (flg_exit)
0. 简介 相信大家在面试时候经常被问激光SLAM的回环方法。一般我们回答的比较笼统,我们在《SC-LEGO-LOAM 扩展以及深度解析》一文中提到了回环的策略,但是这两年又出来更多的方。相较于16年谷歌提出的《Real-Time Loop Closure in 2D LIDAR SLAM》2D激光雷达算法,最近文章《BoW3D: Bag of Words for Real-time
0. 简介 在激光雷达的特征提取中,对整帧的点云数据进行分割是至关重要的,但是非常明显的是在3D场景中,捕获的点云通常是稀疏且非结构化的,分割有可能误分割或者漏分割。今天我们来看一下22年的论文《FEC: Fast Euclidean Clustering for Point Cloud Segmentation》,这篇文章中提出一种新颖的快速欧几里得聚类算法,同时据作者说易于实现,具体只有40
0. 简介 这里我们介绍一篇20年的论文《A Sim2Real Deep Learning Approach for the Transformation of Images from Multiple Vehicle-Mounted Cameras to a Semantically Segmented Image in Bird’s Eye View》。这篇文章描述了一种获取360°鸟瞰图的
0. 简介 前段时间海龙老哥找我梳理。LIO-SAM中点云配准之角点面点的残差及梯度构建的算法,本人之前都是从算法层面来理解残差问题的。所以这里结合海龙老哥讨论的图形层面来分别看待LIO-SAM残差问题。阅读LIO-SAM源码的时候,发现点线残差和点面残差和雅克比构建采用了LOAM的表示方法。这里我们以电线残差的构建完成从图形和算法层面来看LIO-SAM残差问题。 1. 算法层面代码推导
0. 简介 作为ubuntu的使用者,最难过的事情就是环境的依赖和配置,其中最繁琐的就是各种动态链接库的配置。尤其是在跑ROS-SLAM等比较大的环境时候,我们会发现按照教程经常会出现安装了这个库但是在编译时爆出缺库等问题,而这些问题一般很难或者说无从查起。这种问题一般是动态链接库连接的问题,博主在经过不断地学习过后,逐渐总结了一些学习使用的技巧。这里就给各位和我拥有同样烦恼的各位读者来列举并学
0. 简介 在研究晶体振荡器和原子钟的稳定性时,人们发现这些系统的相位噪声中不仅有白噪声,而且有闪烁噪声。使用标准差分析这类噪声时发现结果是无法收敛的。为了解决这个问题,David Allan于1966年提出了Allan方差分析,该方法不仅可以准确识别噪声类型,还能精确确定噪声的特性参数,其最大优点在于对各类噪声的幂律谱项都是收敛的。对于IMU标定而言,标定可以分为确定性误差和随机误差,确定性误
0. 简介 之前作者在今年年初写了激光与摄像头混合的博客《从LVI-SAM来看激光与视觉的紧耦合系统》,当时一直想写R3LIVE的。但是一直苦于没有时间好好地去深入钻研探索。这段时间正好有比较充裕的时间做这个事情,所以这里我们对《R3LIVE: A Robust, Real-time, RGB-colored, LiDAR-Inertial-Visual tightly-coupled stat
0. 简介 在讲完前面三节后我们将开始以主函数触发,并分析ESKF和IKD-Tree中对应的算法。其中ESKF作为主要的部分来进行展开介绍 1. 主函数 作为主函数,内部主要存放了一系列的参数传入,这部分没什么好说的基本都已经注释完成。 x // FAST_LIO2主函数 int main(int argc, char **argv
0. 简介 作为一个算法开发人员,拥有一套良好的开发工具是非常有必要的,其中打交道最多的就是终端命令行。而zsh就是这样一个工具,通过zsh我们可以快速的定制我们喜欢的模型~ 1. zsh步骤 1.1 安装 zsh mac 安装: brew install zsh Ubuntu 安装: sudo apt-get install zsh CentOS 安装: yum install zs
0. openpilot是什么 首先我们需要对openpilot要有个清楚的认知,openpilot主要基于python语言编写。openpilot进程之间通过ZMQ进行通信,使用订阅者和发布者模式,进程订阅其他进程的信息,进程一系列处理,将得到的结果发布出去,让其他进程获取其处理结果。整个openpilot项目可以分为以下几个模块:定位、决策、控制这几个部分。openpilot的实现原理类似于
0. 简介 作为22年比较重磅的物体识别算法,作者觉得不得不说一说,虽然作者目前主要方向不是深度学习了,但是里面很多重要的操作还是值得回味的。这里就从想要大致了解Yolo v7同学的眼光来对v7的算法进行介绍。并按照原文《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detecto
0. 简介 关于车辆的全景环视系统网上已经有很多的资料,然而几乎没有可供参考的代码,这一点对入门的新人来说非常不友好。全景环视系统,又称AVM。在自动驾驶领域,AVM属于自动泊车系统的一部分,是一种实用性极高、可大幅提升用户体验和驾驶安全性的功能。AVM汽车环视影像系统如图所示,由安装在前保险杠、后备箱、后视镜上的四个外置鱼眼相机构成。该系统包含的算子按照先后顺序:去畸变、四路鱼眼相机联合标定、
0. 简介 在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,之前作者就专门写过两篇博客(Ubuntu环境下便于调试代码的工具、Valgrind对ROS程序的可视化分析)来介绍性能分析的问题,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。 1. Perf 基础 1.1 Perf 简介 perf是Linux下的一款性能分析工具,能够进行函数级与
0. 前言 逆透视变换(IPM),将相机视角转换成鸟瞰图。其实质是求相机平面与地面的homography矩阵。之前专门有一篇博客来讲《逆透视变换(IPM)多种方式及代码总结》。但是当中还是比较杂乱且没有详细的代码推导的。这篇文章将从三种方式来介绍逆透视变换的三种方法得到homography。这里得到的Homography是可以通过下面的$K_f$转化到现实的坐标系中的。下面的式子为转换矩阵:设
0. 简介 激光雷达作为自动驾驶最常用的传感器,经常需要使用激光雷达来做建图、定位和感知等任务。而这时候使用降低点云规模的预处理方法,可以能够去除无关区域的点以及降低点云规模。并能够给后续的PCL点云分割带来有效的收益。 1. 点云预处理 1.1 指定区域获取点云 在实际使用中,我们可以看出,虽然点云的分布范围较广,但大部分的点都集中的中间区域,距离越远点云越稀疏,相对的信息量也越小。此外
0. 简介 作为自动驾驶行业最头疼的问题之一,外参标定一直以来受到广泛的关注,尤其是最常使用的激光雷达与相机的外参标定。之前在文章:3D雷达与相机的标定方法详细教程与多传感器融合感知 —传感器外参标定及在线标定学习均有提及,但是作者在调研时候发现IROS 2022年的一篇论文也讲述了一种新型的自动标定方案《Joint Camera Intrinsic and LiDAR-Camera Extri
0. 简介 作为一名SLAMer,经常会面对一些常见的数据转换的操作,这里专门来开一节,来展示本人在日常的工作和学习中总结的工具网站。这里也是本人在最近两三年经常会使用的一些工具网站。后续也会持续维持更新………… 1. 三维在线旋转变换网站 网址地址:https://www.andre-gaschler.com/rotationconverter/ 可使用旋转矩阵、四元数、绕轴旋转、欧拉角
0. 简介 最近在看PCL滤波配准等操作,之前在自动驾驶-激光雷达预处理/特征提取和提到了一些滤除点云等操作,但是最近作者发现里面还有一些配准的方法还没有提到,所以这里重新开个章节来给大家列举一些常用的滤波方式,方便大家查阅和使用 1. 滤波&聚类 1.1 直通滤波器 void pass_through_filter(const pcl::PointCloud<pcl::Po
0. 简介 在讲述完一,二后IMU和雷达的数据输入算是讲明白了,下面几节我们将结合主程序来介绍本文最关键的迭代卡尔曼滤波器和iKD-Tree的算法。 1. 主程序 一开始在laserMapping.cpp主程序中定义了一系列待使用的变量定义,包含了ESKF和IKF-Tree的定义 #define INIT_TIME (0.1) #define LASER_POINT_COV (0.001
0. 简介 在使用python程序包时。我们最常遇到的就是使用sudo apt-get install或者pip install的方式来完成python包的安装。但是有些时候我们需要对函数包进行改动,这时候很多人就会选择使用源码进行安装。一般会找到setup.py文件并完成: python setup.py build python setup.py install 但是编者在尝试安装
0. 简介 在开发大量的程序后,我们发现每一个之前留下的BUG都需要耗费大量的时间去排查设计。这样会造成算法开发人员耗费大量的时间和精力。而gtest就是这样的一个工具,它是Google的一个开源框架,主要功能是用于编写单元测试,从而检查自己的程序是否符合预期行为。这当然是QA(测试工程师)最常用的工具,但是作为一名算法工程师也需要清楚自己的算法是否符合设计需求以及规范。 1. 认识 gtes
0. 简介 这篇SLAM论文《Direct LiDAR Odometry: Fast Localization with Dense Point Clouds》作为NASA喷气推进实验室CoSTAR团队研究和开发的新作,收到了学术界广泛的关注。其主要用作DARPA地下挑战的里程计,提出了一种能够实现高速高精度处理高速实时处理密集点云的激光里程计(LO)的思路,下面是他们的Github开源代码。
0. 简介 在上文中讲述了激光雷达的数据获取以及特征点提取的操作,这一节我们将围绕着IMU_Processing这一节来进行介绍。 1. ImuProcess类定义 在ImuProcess.hpp中,一开始就是完成了对ImuProcess类的申明,里面我们可以看到在imu中最主要的还是角速度和加速度这两项特征,这与视觉SLAM的imu融合非常相似。 //判断点的时间是否先后颠倒 cons
0. 简介 个人认为观察者模式作为行为模式中非常重要的一个部分,我们日常使用的事件机制就是一个观察者模式,当事件发生,所有的事件接收者执行事件响应函数。在ROS中的subscribers函数也是使用了类似的思想。它允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。 1. 订阅者模式示意图 从ROS的Topic层面理解,拥有一些值得关注的状态的对象通常被称为目标
0. 简介 在阅读了许多多传感器工作后,这里作者对多传感器融合的方法做出总结。本文将从单传感器讲起,并一步步去向多传感器方向总结。之前的《多传感器融合详解》博客从算法层面介绍了多传感器的分类以及数据传输的能力,而《多传感器融合感知 —传感器外参标定及在线标定学习》博客则是从标定层面向读者介绍了如何对多传感器进行先一步的标定处理。而这篇文章将从方法层面总括多传感器的分类以及作者对多传感器的理解与思
0. 前言 这篇博客给各位介绍一下在ROS环境下常用的局部/全局的导航框架。在机器人运动控制当中。路径规划作为感知定位的下一个部分,机器人需要有一个比较合适的路径规划功能才能使机器人安全的运动到目标附近。 1. move_base 上面这个图很好的展示了move_base的整个框架。同时整张图的结构都非常清晰,首先左上角的amcl(自适应蒙特卡罗定位)模块是ROS的导航定位模块,amcl通过
0. 简介 模板模式是行为模式的最后一章,也是我们设计模式的最后一章。模板模式是C++高级用法中不可或缺的一部分,也是作为我这种SLAMer必不可少的需要大量使用的模式。在Ceres,G2o中都可以看到这样的用法。它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 1. 模板模式示意图 我们可以看到模板模式结构是非常简单的设计模式。通过复用模板抽象类的方法能够
0. 简介 现在越来越多的激光雷达方法如雨后春笋一般冒了出来,最近以FAST-LIO为代表的系列渐渐地被大众接受。而FAST-LIO2的工作越来越被大众所熟知与研究。最近作者也在研究与学习FAST-LIO2的相关知识,这里将会以长文的形式来介绍FAST-LIO2.0的学习心得。本文将通过代码的形式与论文结合,直观的来分析论文的核心算法部分。也同时作为自己的学习笔记来留给后来人学习。 1. 激光
0. 简介 继LLOAM后,三维SLAM迎来了蓬勃的发展,最近一只FAST-SLAM为代表的3D-SLAM迎来了蓬勃的发展,FASTER-LIO也可以看到国内知名SLAMer高博的影子。为此我们来看一下FAST-SLAM这类SLAM算法的优势在哪里。 1. FAST-LIO 首先我们需要先明白FSAT-LIO相较于其他的LIO好处在哪里: 将IMU和Lidar特征点紧耦合在一起 使用
0. 简介 状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。这其实就有点类似算法中的有限状态机的形式。 其主要思想是程序在任意时刻仅可处于几种有限的状态中。 在任何一个特定状态中, 程序的行为都不相同, 且可瞬间从一个状态切换到另一个状态。 不过, 根据当前状态, 程序可能会切换到另外一种状态, 也可能会保持当前状态不变。 这些
0. 简介 在面对ROS环境配置时,我们会发现,有的时候非常难查的问题有时候是因为ROS的CMakeList和package配置文件写的不对导致的。ROS1的时候就很无能为力,需要熟练地了解每个模块与配置。而ROS2中就提供了一个可以检测ros2的方方面面,包括平台,版本,网络,环境,运行系统等等的工具ros2 doctor。ros2 doctor仅在Eloquent及更高的版本中可以使用。同时
0. 简介 我们在开发ROS2程序时会发现,当面对只有一个node节点时,程序的调用是线性的,这个时候就会有两种解决方式,一种就是使用rclcpp_components来完成对子节点的注册,并完成类似ROS1中Nodelets的操作。另外一种就是使用执行器和回调组完成多线程的创建。 1. ROS2中多线程—callback_group 相较于ROS1中使用MultiThreadedSpinn
0. 简介 在面对ROS这个软件时,我们会尝试着设计更多的可视化软件用于仿真,以展示我们算法程序的效果。作者就在这里向大家展示6种二次开发和可视化平台。下面我们以ROS2为主来一一说明。 1. RVIZ2 rviz2作为我们最常用的可视化软件,其也支持插件的开发使用,具体使用方法也和ROS1类似,这里之前写过一篇ros1 如何开发rviz plugin插件的文章,这里就不展开叙述了。下图为小
0. 简介 作者最近发现ROS2目前的功能越来越完善了,其中也新增了很多比较好用的高级玩法,这里作者来一个个向大家展示。这里是小鱼做的ROS2官方文档的中文翻译平台,可以学习和推荐一下 1. 动态参数 1.1 代码编写 对于动态参数,大家学过ROS1的话应该都应该有所耳闻吧,ROS1的动态参数的操作还需要dynamic_reconfigure,ROS2中我们直接使用declare_para
0. 简介 ros1中我们会经常使用Nodelets来完成多个Node节点的管理。但是在ROS2中如何使用多节点组合去完成管理,这也是我们需要去了解和学习的。 1 . ROS 1 - Node 和 Nodelets 在ROS1中你可以写一个节点也可以写一个小节点(Nodelet)。 ROS 1 的节点会被编译成一个可执行文件。 ROS 1的小节点会被编译成一个动态链接库。当程序运行的时候会被
0. 简介 之前尝试过使用plugin来实现功能的模块化.同时在ROS中,为了使核心的代码是只留下输入输出接口的,所以我们使用plugin来实现.so文件的封装以及动态调取.但是在近期接触后发现在RVIZ的插件开发中,其核心也是plugin插件性质,这里再开一篇文章来进行介绍.详细的配置可以在文章:ROS设置plugin插件中看到. 1. 内容介绍 rviz是ROS官方提供的一款3D可视化工
0. 简介 作为一名技术博主,最主要的还是需要不断地学习新的知识,而最好的学习就是不断地阅读新的文章,并不断地学习和总结前人的思路和方法。所以博主打算开一个新的系列来介绍。这里主要来介绍一下《SuMa++: Efficient LiDAR-based Semantic SLAM》这篇论文。论文原文链接为:https://www.ipb.uni-bonn.de/wp-content/paperci
0. 简介 已经好久不写深度学习相关的博客了。但是我觉得DETR值得我重新时期来进行详细介绍。Deformable DETR作为这两年来最有名的DETR变种之一,当然代码量也是比较多的。这里我们从论文到代码来详细分析Deformable DETR的精华之处。最近两年时间从Attention到NAS再到Transformer,视觉检测行业被Transformer拉到了一个新的高度。而DETR作为T
0. 简介 作为行为模式的倒数第三章,策略模式在我们编写算法时是非常重要的,它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。 1. 策略模式示意图 我们可以清晰的从图中看出策略模式本质上的操作就是定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这
0. 简介 相较于激光雷达而言,视觉SLAM除了点特征以外还多出了线特征以及面特征。相比于点特征而言,线特征和面特征在单一环境中会更有鲁棒性。这篇文章中作者将会围绕着线特征和面特征的数学特性进行介绍 1. 线特征 线特征:优点在于具有天然的光照及视角不变性,同时更高级的特征也使追踪的鲁棒性和准确性有所提高。特别是在特定的人造场景(室内,走廊)等场景,能够克服无纹理或者不可靠纹理带来的
0. 简介 在自动驾驶中,我们常常会面对这线性代数位姿表示和坐标系变换问题。之前作者陆陆续续写了一些 1. 线性代数位姿 1.1 矩阵伴随 \begin{aligned} \boldsymbol{R^\mathrm{T}}\exp{(\boldsymbol{p}^\wedge)}\boldsymbol{R} &= \exp{((\boldsymbol{R^\m
0. 简介 中介者模式和命令模式类似,都有着一层中间层来作为沟通的渠道,只是中介者模式使用了Mediator来实现实现更新函数changed。而在命令模式中使用Invoke作为最上层,用于管理具体类的操作,从而对接收者增删。简而言之,命令模式在发送者和请求者之间建立单向连接,使请求者可以调用发送者的不同方法。中介者清除了发送者和请求者之间的直接连接, 强制它们通过一个中介对象进行间接沟通。 1
0. 简介 迭代器模式是一种行为设计模式, 它可以有效管理数据流动的同时,让用户能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。 迭代器通常会提供一个获取集合元素的基本方法。 客户端可不断调用该方法直至它不返回任何内容, 这意味着迭代器已经遍历了所有元素。 1. 迭代器模式示意图 迭代器模式的使用方法和c11的迭代器使用方法类似,这是我们会根据我们的需求去建
0. 简介 反光板定位作为cartographer中landmark数据最常用的部分,其特性和AprilTag使用方法类似,在cartographer中,landmark必须是tracking frame,一般是imu、laser、camera或者base_footprint。如果提供landmark observations不低于10 Hz,那么可以设置TRAJECTORY_BUILDER.c
前言 本篇博客主要还是进行不同卡尔曼滤波的数学推导,不会具体涉及到某些传感器。在理解了卡尔曼滤波的数学模型后,对于不同传感器只需要将其测量模型套入运动/观测模型即可。关于基于不同传感器的滤波融合方案,准备之后在阅读论文时再分别整理。 1. SLAM 中的定位概率模型 在 SLAM 问题中,我们想要通过滤波方法求解的问题是:求解一个后验概率,即给定一系列观测(和输入)和初始时刻的先验位
0. 简介 作为无人车以及智能机器人而言,在装配过程中各个传感器之间的外参标定一直是比较头疼的问题。这里作者也系统的学习了一下,传感器的外参标定和在线标定问题。下图是我们常用的几个坐标系,而对于常用的外参问题经常是IMU/GNSS与车体坐标的外参、Lidar和Camera的外参、Lidar和Lidar的外参、Lidar和IMU/GNSS的外参。 1. 离线外参标定 1.1 IMU/GNSS与
0. 简介 在阅读了近些年的前视的工作后,发现现在以特斯拉为首的BEV纯视觉语义分割方法目前也越来收到关注,并吸引了大量的研究工作,但是灵活的,不依赖内外参的任意位置安装单个或多个摄像头仍然是一个挑战,而Nullmax就提出了《BEVSegFormer: Bird’s Eye View Semantic Segmentation From Arbitrary Camera Rigs》以用来解决这
0. 简介 我们在遇到类似GUI中多种Button点击功能的操作时,我们应该将请求的所有细节 (例如调用的对象、 方法名称和参数列表) 抽取出来组成命令类, 该类中仅包含一个用于触发请求的方法。 命令模式就是这样一种行为设计模式, 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 并能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。 1. 命令模式示
0. 简介 最近在群里划水时,看到很多初学的SLAMer面对精度评估这个问题无从下手。而精度评估确实是在SLAM算法实际评估中急需一种手段和工具,本文将从2维室内和3维室外两个层面来向各位展示如何通过各种手段来对SLAM算法完成。 1. 2D评估—基于cartographer 室内的评估方案比较多样,作者也选取了几种方法来实现二维层面上的室内定位性能评估 1.1 直尺和角度计 这种是作为
0. 简介 定位模块是自动驾驶最核心的模块之一,定位又包括全局定位和局部定位,对于自动驾驶,其精度需要达到厘米级别。传统的AGV使用一类SLAM(simultaneous localization and mapping)的方法进行同时建图和定位,但是该方法实现代价高,难度大,难以应用到自动驾驶领域。自动驾驶车辆行驶速度快,距离远,环境复杂,使得SLAM的精度下降,同时远距离的行驶将导致实时构建
0. 简介 对于责任链模式,其作为一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。这种处理方法类似包与包之间的调用的思路,只是其可以不在主程序中累赘的去申明一堆if else变量使得程序更加臃肿。 相比于创建设计模式的对整体架构进行的设计,和结构设计模式对对象的化繁为简的操作,作为行为设计模式,其需要我们对数据
0. 简介 相比于传统的回环检测方法,SC给激光回环带来了更多的可能性,这里我们将会对SC进行解析,也顺便为之前的两篇文章填坑了。LEGO-LOAM改进思路以及代码, SC-LEGO-LOAM 扩展以及深度解析。Scan Context 就包括空间描述子的定义方法和与之对应的匹配算法。并提供了高效的 bin 编码函数,同时这种编码对点云的密度和法向的变化不敏感。另外SC还保存点云的内部结构,并使
0. 简介 confluence 是我们日常文档的整理工具,有时候我们经常需要拉取一些好文章或是查看最近有什么更新,而可视化界面对于细节查找不太友好,这里我将尝试着使用atlassian-api对confluence实现二次开发,并将特定时间段的源码快速导出 1. Atlassian-api atlassian-api 作为一款基于python的API lib,非常适合快速开发,conful
0. 简介 外观模式作为我们常用结构模式的最后一节,一些不常用的比如说桥接、享元、代理等,这里等有时间在补充学习吧。下面我将会来继创建模式和结构模式后来讲行为模式。 外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模式定义了一个高层接口,这些接口使得这一子系统更加容易使用. 其基本的结构体大致如下
0. 简介 作为SLAMer常用的优化工具,我们会经常接触Ceres这一优化工具,但是在优化的过程中一直不支持GPU加速,这就导致优化性能难以提高,但是在Ceres2.1这一版本后,GPU加速开始适用于Ceres,为此本文来采坑看一看如何适用GPU加速Ceres。 1. 删除原本Ceres 通过find . -name ceres*函数我们可以发现ceres代码路径是存在在下面三个路径下的,
0. 前言 在C++编程中,我们经常会发现段错误这类问题,而这类问题经常是指访问的内存超出了系统所给这个程序的内存空间。一般是随意使用野指针或者数组、数组越界等原因造成的。段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。此前我们也在博客中讲述了通过GDB对ROS的调试,而段错误也会通过这样类似的形式运行
0. 简介 三角化作为SLAM中的基础问题,最近经常被提及,通过单目运动的方式可以有效的恢复深度信息 1. 线性三角化数学推导 特征点在某个相机中被观测到,根据相机位姿和观测向量可以得到3D空间中的一条从相机中心出发的观测射线,多个相机位姿观测会产生多条观测射线,理想情况下这些观测射线会相交于空间中的一点,求所有观测射线的交点就是特征点在3D空间的位置,这也就是三角化过程。$x$,$x’$为
0. 简介 在提升算法认识的同时,本人逐渐认识到有一个好的开发文档/UML图是多么方便,而很多时候代码的开发维护总是会缺少这样的工作。这里以Doxygen为主,介绍本人在Ubuntu环境下的开发操作。 1. Doxygen安装 Ubuntu/Debian安装 sudo apt-get install doxygen 生成配置文件 doxygen -g 该命令会在当前路径生成一
0. 简介 在开发大型的机器人工程时候,我们会发现团体开发以及代码的review的会非常重要。而这些离不开敏捷开发(Scrum)以及Git管理。而最常用敏捷开发流程就是DoD。本文也将介绍和学习这种方式,来辅助各位能够在实验室和工作中团体开发中有效的管理自己以及团队。 1. 常见的迭代DoD条款 所有完成的用户故事得到PO的验证 所有代码得到静态分析,纠正最高级别的不符合项 所有新增
0. 简介 最近在收到了很多读者的消息后,我觉得有必要开这个坑,来给大家阐述下如何对激光雷达点云以及图像点云去做栅格化以及体素化的操作.这部分需要各位读者拥有PCL,octomap,ROS2,C++的一些基础.好了废话不多说,我们第二章主要介绍点云的体素化. 1. octomap octomap是一种基于八叉树的三维地图创建工具, 可以显示包含无障碍区域及未映射区域的完整3D图形, 而且基于
0. 简介 作为主流框架的前端中常用的方法,划窗优化是很常见迭代策略。因为随着SLAM系统的运行,状态变量规模不断增大,如果使用滑动窗口,只对窗口内的相关变量进行优化便可以大大减小计算量。这些之前在我的博客中有提到,但是之前作者没有深入的去了解这些,只是对边缘化中的舒尔补策略进行了简略的介绍。 而作为划窗优化,我们除了创建滑动窗口的存储空间外,我们还要通过边缘化的方法保留滑窗外的状态,我们可以
0. 简介 这一次我们继续来讲结构型模式中的组合设计模式。组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。在一般组合模式中中声明所有用来管理子对象的方法,其中包括Add、Remove等,这样实现组合方法接口的所有子类都具备了Add和Remove,但是只是是虚函数,并不会去使用。 1. 组合模式结构 如下图所示为组合模式的示意图,主要的核心
0. 简介 很多时候我们在接手代码的时候会发现很多时候我们需要在原本基础的类中加入一些功能,或者要调用多个类来组合成一个新类来工作。这时候我们需要使用装饰或者适配器模式来对整个结构去聚合或者多重继承出自己想要的类型。装饰模式是一种结构型设计模式,其可以动态的为一个类增加职责(相对于继承)。 1装饰模式 部件 (Component) 声明封装器和被封装对象的公用接口。 具体部件 (Concre
0. 简介 适配器模式是一种结构型设计模式, 它能将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。 根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。他和装饰器模式一样可以动态扩展一些遗留或者不好改动的代码。
0. 简介 在深入剖析了Ceres、Eigen、Sophus、G2O后,以V-SLAM为代表的计算方式基本已经全部讲完。就L-SLAM而言,本系列也讲述了PCL、Open3D、与GTSAM点云计算部分。最近在了解boost,个人觉得这些仍然在SLAM以及自动驾驶中是必须的,打算仍然延续本质剖析的结构来续写这个系列,方便自己回顾以及后面的人一起学习。 1. C++总体介绍 通用库 Boost:Boo
0. 简介 生成器是一种创建型设计模式, 当构建一个复杂对象时,将构建过程与表示分离。使得同样的过程创建不同的对象。生成器与其他创建型模式不同, 生成器不要求产品拥有通用接口。 这使得用相同的创建过程生成不同的产品成为可能。生成器方法通常支持方法链 (例如 someBuilder->setValueA(1)->setValueB(2)->create() ),来组成复杂的对象。相
0. 简介 继单例模式写完后,我觉得对于C++的高级用法可以来开一个专栏来专门整理与阐述,这里,我将以我们最常用的工厂模式开始,来逐步的共同学习。 1. 初级工厂模式 工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。本节从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和利弊。这里借用网络上的例子
0. 简介 有时候我们在面对通用代码时候,经常会尝试着创建多个示例函数来对一个函数多次赋值,这样会损耗很多的内存空间,这对于代码来说是不利的。而单例模式可以很好的解决这个问题。但是实现一个实用的单例模式来说,这个并不容易。 1. 单例函数 1.1 饿汉模式 饿汉模式 是指单例实例在类装载时就构建,并被立即执行初始化: public class Test { private Test
0. 简介 在设计复杂的运行程序时,我们经常需要创建一定数量的线程,然而很多时候线程不都是一直执行的,会存在一些线程处于空闲状态。所以通过线程池的方式,可以有效的对线程进行分配。若线程池中有空闲线程,则从线程池中取出一个空闲的线程处理该任务,任务处理完后,该线程被放到线程池中;若线程池中无空闲线程,则将任务放入任务队列等待线程池中有线程空闲,这样的处理方式可以避免线程在建立与销毁时存在的开销。 1
0. 简介 protobuf也叫protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。 由于它是一种二进制的格式,比使用 xml 、json进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种
0. 前言 在许多优化问题中,尤其是传感器融合问题,必须对存在于称为流形的空间中的数量进行建模,例如由四元数表示的传感器的旋转/方向。其中流型中的加法用⊞表示。以旋转矩阵更新为例: LocalParameterization 接口允许用户定义参数块并与它们所属的流形相关联。它通过定义 Plus (⊞) 运算及其在 Δ=0 处相对于 Δ 的导数来实现。 class LocalParameteriza
0. 简介 最近在收到了很多读者的消息后,我觉得有必要开这个坑,来给大家阐述下如何对激光雷达点云以及图像点云去做栅格化以及体素化的操作.这部分需要各位读者拥有PCL,octomap,ROS2,C++的一些基础.好了废话不多说,我们第一章主要介绍点云的栅格化. 1. 栅格化 点云地图存储的是传感器对环境的原始扫描点云,优点是保留信息完整,缺点是计算量大、但是不能直接用于导航避障;特征地图存储的是环境
0.简介 快过年了,这里打算以这一篇长博文作为结尾,来迎向2022春节。同时也希望新的一年能够继续不断提升自我。 1. 系统介绍 本文提出了一种紧耦合的雷达视觉惯导SLAM系统,可以实时高精度鲁棒的进行状态估计和建图。LVI-SAM构建在因子图之上,由两个子系统组成: 一个视觉惯导系统 一个激光惯导系统。 下面是LVI-SAM的整体流程图,通过视觉里程计和激光里程计两个子系统紧
0. 简介 gazebo作为ros当中常用的模块,可以做很多有趣的工作,正值双旦,最近想着以平衡车为基础开一个系列来向大家展示如何搭建一个仿真机器人平台。 1. 模型的创建 首先现在solid works 里面将模型文件建立出来,注意各个坐标系以及他们之间的关系。然后根据自己创建的节点命名一个urdf文件。 在这个模型文件里,由于我还可能去添加很多其他的传感器或者是摄像头,所以我在写文件的时候才用
0. 简介 最近一直苦于自己写的代码的开发的质量不高,急需要一种可以适用于C++代码的代码质量检测工具,这里发现SonarQube可以很好的适用于Ubuntu环境,并能够很好的与Gitlab兼容,从而保证代码的敏捷式开发。 1. SonarQube安装 ubuntu中安装jdk详细过程可参考:https://blog.csdn.net/qq_26709459/article/details/80
0. 前言 最近空闲时间在看点云地图的动态加载,这部分在自动驾驶领域是非常有必要的。由于点云地图的稠密性,导致我们在大场景中没办法一次性加载所有的地图,这就需要我们将地图切分成多个子地图。 1. NDT降维 建立好的点云文件中,有很多点是重合的,需要通过采用合适的downsample_resolution以减小点云文件体积,便于传输和加载,通常降采样后体积可以降到原来的一半以下。同时由于ND
0. 简介 在VINS优化中,我们除了对IMU的P(位置),Q(旋转角),V(速度),Ba(加速度偏转角),Bg(陀螺仪偏转角)以外,我们还需要对相机本身的外参、逆深度、与时差进行优化。其中逆深度最为重要,但是网上的信息没有能够很好的对逆深度进行科学的阐释。所以本文根据自己的理解来讲述一下里程计。 1. 参数化 在了解逆深度之前,我们需要了解下为什么需要参数化。参数化作为点、线、面的slam表现形
0. 前言 在深入剖析了Ceres、Eigen、Sophus、G2O后,以V-SLAM为代表的计算方式基本已经全部讲完。就L-SLAM而言,本系列也讲述了PCL、与GTSAM点云计算部分。之前的系列部分作者本以为已经基本讲完,但是近期突然发现还有关于Open3D的部分还没有写。趁着这次不全来形成一整个系列,方便自己回顾以及后面的人一起学习。 1. Open3D环境安装 这里将Open3D的环境安装
0. 简介 Intel的CPU和ARM的CPU都有SIMD指令,可以完成CPU 指令级的并行化。这里边主要涉及CPU的汇编的知识和一些寄存器的知识。在一些耗时的SLAM优化迭代的场合,经常出现这样的指令的优化。SSE是Intel x86架构CPU的SIMD指令的简称,NEON是ARM CPU的SIMD指令的简称。 最近在jetson的ARM架构平台下发现在移植slam的代码的时候,无法快速处理,而
0. 简介 李群李代数作为SLAM当中非常重要的一部分,作者最近才对该部分有了清晰地认知,感觉有必要放出来说一说。因为李群本身存在加法不闭合性,所以李群与李代数之间的转换需要每一个slamer人有着充分清晰地认识。 1. 李群扰动 Baker-Campbell-Hausdorff公式,这个公式作为李群相乘转到李代数的式子,我们可以看到李群的相乘会带来李代数产生高次项输出。近似为在SO(3)上,我们
0.背景 在自动/辅助驾驶中,车道线的检测非常重要。在前视摄像头拍摄的图像中,由于透视效应的存在,本来平行的事物,在图像中确实相交的。而IPM变换就是消除这种透视效应,所以也叫逆透视。 而我们需要认识的变换主要分为三类透视变换、仿射变换、单应性变换: 透视变换:不能保证物体形状的“平行性”。仿射变换是透视变换的特殊形式。透视变换是将一个平面投影到另一个平面,简单理解就是把一张图片投影到另一
0.简介 作为常用的滤波器形式,低通滤波是一种适中的滤波处理方式,相较于卡尔曼滤波算法和滑动平均滤波而言。其计算量适中,同时能拿到一个较为合适的结果。低通滤波算法可以解决这种长期可靠,短期噪声大的传感器,并有效地实现噪声的滤除。 1. 相关代码 oldData表示上一次的输出Y(n-1), newData表示新的输入X(n); deltaT 采样周期, Fcut 截止频率 。 float L
0.前言 平滑技术作为事后或准实时数据处理的一种方法,可以在一定程度上提高数据处理的精度,在测绘领域获得了广泛的应用。平滑技术总的来说分为三类:固定区间平滑(Fixed—Interval Smoot—hing)、固定点平滑(Fixed—Point SmoOthing) 和 固定滞后平滑(Fixed—Lag Smoothing)。其中在数据后处理中应用最为广泛的方法就是固定区间平滑,其原理图如下图所
0. 前言 最近群里有些老哥在问cartographer配置的相关问题,将我以前自己记录的文件测试后发现竟然已经失效,其原因在于cartographer官网对程序又进行了一次升级,以前的部分操作已经无法适用,这里在此记录一下。 1. 环境配置(melodic) 安装依赖包 sudo apt-get update sudo apt-get install -y google-mock libboo
0. 简介 最近群里有些老哥在问cartographer纯定位相关问题,网上已有的方法均已失效,这里作者研究了下cartographer相关的流程以及源码,给出了一种简单的解决策略。 1. 旧版cartographer_ros launch文件的修改 在启动cartographer_occupancy_grid_node节点时,增加pure_localization参数。 <node nam
0. 前言 最近尝试着去在SLAM当中使用深度学习,而目前的SLAM基本上是基于C++的,而现有的Pytorch、Tensorflow这类框架均是基于python的。所以如何将Python这类脚本文件来在C++这类可执行文件中运行,这是非常有必要去研究的,而网络上虽然存在有例子,但是很多都比较杂乱,所以本篇文章将网络上常用的方法进行整理,以供后面初学者有迹可循 1. 模型认识 我们知道,目前基于C
0.简介 为了保证激光雷达的360°环境覆盖,我们常常需要用到多传感器的拼接,如果我们单纯的取读取激光雷达的信息会出现如下图的情况,两个激光雷达会发生重叠,这就需要我们去对激光雷达进行标定。 <arg name="device_ip1" default="192.168.1.200" /> <arg name="device_ip2" default="192.168.1.200
0. 前言 最近一直在啃SLAM优化方面的相关知识,发现以前对于se3与sim3之间的理解不太深入,这里专门开一篇文章来整理这两者之间的区别。相似变换sim(3),尺度s与R相乘,而不是t。ORB-SLAM2中使用sim3的主要原因是考虑到单目尺度漂移,这个在第一版系统的论文中的VII。 LOOP CLOSING的Compute the Simlilarity Transformation部分有提
0.前言 之前作者整理了一份ROS1中常用的GUI测试工具,最近作者在完善ROS2部分时觉得有必要写一篇关于ROS2常用命令行工具的文章来作为ROS2第一部分的一个小结。 1. 通信层面 ROS_DOMAIN_ID标记一个 ROS 域,不同的 ROS 域之间不能通信。这部分可以参照作者ROS2 DDS通信漫谈这篇文章,主要是因为ROS2本身的通讯是基于DDS的,所以存在域这个概念。 colcon_
0. 简介 本文档用于记录现ROS1与ROS2之间的区别,以及如何向ROS2移植。整体架构基于该文章 ROS2的教程参见:https://docs.ros.org/en/ros2_packages/rolling/api/ 1 工程构建 1.1 CMakeList的编写 ROS2采用ament cmake系统,最主要的区别是原先的catkin Cmake宏被取代 find_package(cat
0. 简介 最近在看点云匹配相关的知识点,而KD树和八叉树作为点云匹配中最为重要的方法,当然需要好好看看。这里写一篇博客记录一下,便于后面回顾。(最近发现SLAM、ROS方面已经基本粗略的写了一遍,后面会针对一些重要的点去零碎的填坑)。 1. KD-Tree KD-Tree, 或称 k 维树,是计算机科学中使用的一种数据结构,用来组织表示 k 维空间中的点集合。一般在会基于 FLANN 进行快速最
0. 前言 在使用深度学习时候,我们可以有效地提取出我们想要的结果,但是常常会缺少深度信息(双目测景深会耗费大量的计算资源)。因此将激光雷达和单目摄像头相结合,可以有效的补充室内环境的深度信息,而目前3D的激光雷达成本高昂,这里提供一个2D激光雷达的解决方案。 1. 相机坐标系变换 上文提过, 在相机世界中, 3D外界点转换到2D图像像素点转换方程是我们可以通过相机的内在参数 intrinsic
0. 前言 我们都知道ROS1与ROS2的通信是不一样的,而ROS2也因为DDS的通讯带来了一些问题,其中最严重的就属于在存储大数据包的时候会出现的丢帧问题。而如何解决这样的问题目前官方没有给出非常好的解决方案,所以我们只有曲线救国,通过保存图片的方式来实现bag包的完整录制。操作系统:Ubuntu 20.04版本:foxyDDS实现:Fast-RTPS客户端库(如适用):rclcpp/rclpy
0. 前言 目前是ROS1到ROS2的过度阶段,由于ROS2内部的机制大幅变动,导致我们ROS1录制的bag包和ROS2的bag包并不能通用。网上基本上均是如何将ros2录制的bag包转换为ros1格式的bag包的方案,这里做出归纳,并给出全套的解决方案。测试环境:ubuntu 20.04ROS 1 noeticROS 2 foxy两个版本的ROS 均需要按照官网教程进行安装,这里可以参照作者之前
大前提 一定要会科学上网!一定要会科学上网!一定要会科学上网!不然谷歌账号登录不了。 wget特性 这里介绍下常用的wget,及其常用命令。 wget是非交互的网络下载器。通过manpage,主要特性如下: 支持http,https, ftp以及http代理。对安全强度很高的系统而言,一般不会将自己的系统直接暴露在互联网上,所以,支持代理是下载软件必须有的功能 非交互。 可识别(fol
0. 前言 ubuntu下安装cuda、cuddn等NVIDIA机器学习、深度学习环境往往是在使用Linux中最头疼的配置步骤,同时,由于nvidia的cuda、cuddn版本众多,这让统一环境开发成为了难点。而Nvidia官方也认清楚了这一点,并基于docker开发了nvidia docker并且提供cuda镜像,这让我们完全不用考虑环境问题了 环境:ubuntu20.04docker 19.0
0. 前言 我们都知道ROS2比ROS1好很多,就比如说: 去中心化master,ROS和ROS2中间件不同之处在于,ROS2取消了master节点。在去中心化后,各个节点之间可以通过DDS的节点相互发现,各个节点都是平等的,且可以1对1、1对n、n对n进行互相通信。 不造通信的轮子,通信直接更换为DDS进行实现。通信采用采用DDS通信,使得ROS2的是实行、可靠性和连续性上都有了增强。
0. 前言 在使用ROS时候,我们常常感叹ROS的好用,但是在ROS开发方面,从前的我常常会拘泥于教程上的POP的开发方式,这样让我在开发相对大型的机器人程序时就倍感不适。而在19年开始我尝试着在ROS1中使用OOP的形式编程。但是我们知道ROS2和ROS1存在着差异性,所以我们不能直接套用ROS1的编程习惯去实现ROS2的编程。为此本文针对ROS2去给出一套POP和OOP编程以供各位对比。这里也
0. 前言 最近公司需要实现基于HD-MAP的自动驾驶定位技术,而这方面之前涉及的较少,自动驾驶这部分的定位技术与SLAM类似,但是缺少了建图的工程,使用HD-MAP的形式来实现车辆的定位(个人感觉类似机器人SLAM当中的初始化+回环定位的问题)。下面是我个人的思考与归纳 1. AVP-SLAM 从AVP-SLAM自动泊车SLAM中我们发现基础(封闭)的视觉定位模式避不开下面几个步骤 A 首先是I
0. 前言 随着ROS在机器人行业的越来越普及,机器人领域已经和ROS密不可分,无论是单体机器人还是群体机器人。而最近大热的自动驾驶行业也是以ROS为基础进行改动和开发的,但是由于ROS1自身的不足,越来越多的企业开始转投ROS2的怀抱(当然ROS1和ROS2的编程思想类似,所以转起来还是挺方便的)。最近本人也开始转ROS2,而如何科学有效地对ROS2代码的debug调试,看了全网发现都没有合适的
0. 前言 系统要求:Ubuntu20.04 ROS安装版本: Noetic 清华源配置 sudo gedit /etc/apt/sources.list #清华源 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.tuna
0. 前言 最近无事,在想着做一些工作。正好碰巧看到了yuanguobin01作者写的Lego-Loam的改进思路系列文章,这部分看完后遗憾于作者仅仅提供了一些初步的设想,而没有系统的学习代码,为此本文打算从作者提出的几个改进点来给出自己实现的策略思路。 1. 二维轮式里程计+IMU = 三维里程计 替换 原本3D激光前端里程计 这部分作者说通过二维里程计提供位移 + IMU航姿模块提供三向角度
0. 前言 在讲完激光SLAM和视觉SLAM后,个人感觉目前对这两块的基础剖析已经较为完善了。这一次也想借着这个机会来写一下外参标定相关的东西。因为对于SLAM而言,在实现多传感器融合前,就需要对每个传感器进行标定,以便于融合的精确。当一个车上装了多个/多种传感器,而它们之间的坐标关系是需要确定的。这个工作可分成两部分:内参标定和外参标定,内参是决定传感器内部的映射关系,比如摄像头的焦距,偏心和像
0. 前言 在深入剖析了Ceres、Eigen、Sophus、G2O后,以V-SLAM为代表的计算方式基本已经全部讲完,但是就L-SLAM而言我们还差一块,那就是PCL、GTSAM点云计算部分我们还没有详细的去写,正好就这个时间,我想把这块坑给填完,来形成一整个系列,方便自己回顾以及后面的人一起学习。 GTSAM系统认知 我们在一般的认知,G2O和GTSAM都做着后端图优化的功能,而他们当中的全局
0. 前言 在深入剖析了Ceres、Eigen、Sophus、G2O后,以V-SLAM为代表的计算方式基本已经全部讲完,但是就L-SLAM而言我们还差一块,那就是PCL、GTSAM点云计算部分我们还没有详细的去写,正好就这个时间,我想把这块坑给填完,来形成一整个系列,方便自己回顾以及后面的人一起学习。 1. PCL系统认知 PCL(Point Cloud Library) 是在吸收了前人点云相关研
前言 CPU并行加速 CPU并行加速的本质就是通过硬件并发(hardware concurrency)的形式来实现。这种的操作方式是通过单个进程里多线程,从而实现共享地址空间,全局变量,指针,引用。但是这种方式相对而言更加传统,但是同时更加具有普适性。其中操作是使用以pthread为代表的多线程并行加速 pthread 这是一个pthread的简单示例代码。 class helloFromObje
0.前言 局部优化作为VSLAM当中常用的策略,其作用相当于激光SLAM中的局部地图的ICP or NDT优化(scan2localmap)。如下图所示,在VIO当中,随着时间的推移,路标特征点(landmark)和相机的位姿pose越来越多,BA的计算量随着变量的增加而增加,即使BA的H矩阵是稀疏的,也吃不消。因此,我们要限制优化变量的多少,不能只一味的增加待优化的变量到BA里,而应该去掉一些变
0. 前言 随着路径的不断延伸,机器人的建图过程会存在不断地累计误差。而传统的以gmapping为代表的使用粒子滤波进行定位的slam建图方式。以及ORB-SLAM为代表包含的局部优化和全局优化来调整外。但是这些处理方式只能减缓误差累计的程度,无法消除,而现在最为常用消除累计误差的方法就是利用回环检测来优化位姿。 当新的关键帧加入到优化模型时,在关键帧附近进行一次局部优化。在全局优化中,所有的关键
0.前言 多传感器融合(Multi-sensor Fusion, MSF)是利用计算机技术,将来自多传感器或多源的信息和数据以一定的准则进行自动分析和综合,以完成所需的决策和估计而进行的信息处理过程。和人的感知相似,不同的传感器拥有其他传感器不可替代的作用,当各种传感器进行多层次,多空间的信息互补和优化组合处理,最终产生对观测环境的一致性解释。具体来讲,多传感器数据融合处理: (1)多个不同类
0. 前言 对于我们这些搞机器人的工程师来说,当前嵌入式开发板需要安装一些外网才能安装的软件包时,总需要我们从电脑下载相应的软件包然后remote到嵌入式开发板中,这导致我们配置非常繁琐,为此本文提供一套小米4C刷openwrt并配置的文章,来方便各位工程师配置嵌入式环境 1. 认识刷机 上面的图片是小米4C的配置,虽然4C没有usb口,但是搞一搞环境搭建还是ok的。 开启Telnet 和 FTP
Valgrind查找内存泄露利器 Valgrind是一个GPL的软件,用于Linux(For x86, amd64 and ppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C 语言中的malloc和free或者 C++中的new和 delete。使用Valgrind的工具包,你可以自动的检测许多内存管理和线程的bug,避免花费太多的时间在bug寻找上,
0. 前言 在了解SLAM的原理、流程后,个人经常实时困惑该如何去从零开始去设计编写一套能够符合我们需求的SLAM框架。作者认为Ceres、Eigen、Sophus、G2O这几个函数库无法避免,而作者在此之前已经对Ceres、Eigen、G2O做了详细的介绍,目前仍剩下Sophus还未进行详写,所以这篇文章作为这个系列的最后一篇文章,主要对Sophus函数库进行详细的阐述,来方便各位后续的开发。
0. 前言 在了解SLAM的原理、流程后,个人经常实时困惑该如何去从零开始去设计编写一套能够符合我们需求的SLAM框架。作者认为Ceres、Eigen、Sophus、G2O这几个函数库无法避免,尤其是Ceres函数库在激光SLAM和V-SLAM的优化中均有着大量的应用。作者分别从Ceres和Eigen两个函数进行了深入的解析,这一篇文章主要对G2O函数库进行详细的阐述,来方便各位后续的开发。 1.
0. 前言 在了解SLAM的原理、流程后,个人经常实时困惑该如何去从零开始去设计编写一套能够符合我们需求的SLAM框架。作者认为Ceres、Eigen、Sophus、G2O这几个函数库无法避免,尤其是Ceres函数库在激光SLAM和V-SLAM的优化中均有着大量的应用。所以作者已从Ceres作为开端,这一篇文章主要对Eigen函数库进行详细的阐述,来方便各位后续的开发。 1. Eigen示例 相较
0. 前言 在了解SLAM的原理、流程后,个人经常实时困惑该如何去从零开始去设计编写一套能够符合我们需求的SLAM框架。作者认为Ceres、Eigen、Sophus、G2O这几个函数库无法避免,尤其是Ceres函数库在激光SLAM和V-SLAM的优化中均有着大量的应用。所以作者从Ceres作为开端,来对手写SLAM开个头,来方便各位后续的开发。这里分享以为博主写的博客,个人看了感觉写的不错,对SL
本次工作 我首先参照网络上的文档整理了全部的代码,并对于C++和OpenCV的一些操作也进行了详细的注释,并写了这篇的博客进行全部的讲解,其中1-4章节是前端VIO信息,5章节是后端DBOW词袋回环,6-7章节是GPS与VIO融合,8章节是参考文献。 1. 程序入口rosNodeTest.cpp 1.1 定义内容 运行程序时,首先进入的是主程序vins_estimator/src/estimato
相机标定 作为t265而言,虽然官方提供了标定的出厂内参rs-enumerate-devices -c可以获得,但是我们在vins和orbslam中仍然有可能需要自己标定数据,这里给出教程。 首先我们要明确适用的模型,一般普通相机小孔模型即可,而鱼眼镜头则是适用KB4(Kannala-Brandt Camera Model)或者Mei模型 目前可以用kalibr或者vins-fusion里面的ca
简介 D455作为新一代的英特尔RealSense深度摄像头,网上的资料很少,同时除了官方的资料以外,我们很难找到相关的ROS相关的文档。同时由于D455支持的是realsense SDK2.0。所以SDK1.0的数据也不适用。本文档主要提供了一套完整的Ubuntu 18.04 + Realsense D455 + ROS melodic 的代码。 详细步骤 1.环境依赖 依赖环境 版本号
让我们看看基本的基于Python的I2C函数,这些函数经常用于Raspberry Pi上的I2C通信。 在python中开发Raspberry Pi I2C通信程序时,我们可以使用SMBus库包,它对访问I2C设备有很大的支持。因此,我们应该使用apt数据包管理器为Python添加SMBus支持, sudo apt-get install python-smbus 基于Python的I2C函数
Epuck2机器人是一款最新的科研教学实践使用的多功能移动机器人。由EPFL和GCtronic两个机构合作研发生产。这款机器人的全貌如上图所示,主控芯片是STM32F4,具备蓝牙、WIFI等通信功能。详情请参见官网:Epuck2科研教学机器人详细资料官网 由于这款机器人是从国外进口,价格比较贵(10000RMB/台),因此需要开发使用的代价成本较高。而且开发IDE采用的是基于C语言的Eclipse
树莓派读取mpu6050内容 sudo vi /etc/modules //文件的最后写入 i2c-bcm2708 i2c-dev //保存退出 然后是可选的,把设备解除屏蔽,一块全新的板子可能是没有的。 接着去树莓派选项里面,把GPIO打开: sudo raspi-config 这里有个选项回车进去会有I2C的选项,再回车选择OK就行了,之后重启树莓派 sudo reboo
1.下载镜像 我的树莓派打算基于ROS搭成一个机器人核心控制器,所以打算装一个ubuntu server。本篇文章是我踩过坑之后的分享。 ubuntu server的官方引导下载地址已经失效,只能安装20.04。 https://ubuntu.com/download/raspberry-pi/thank-you?version=20.04&architecture=arm64+raspi
1、远程桌面闪退,shell可以用的问题: (1)需要在该用户目录创建一个.xsession:touch .xsession(2)里面写“xfce4-session”一句话就行:echo xfce4-session >~/.xsession 。(3)然后进入到用户目录下,sudo chown username:username .xsession 2、windows桌面连接后远程使用Term
0 前言 最近没啥可以写博客的好点子,为此一直咕咕咕了。端午节没啥事,左右苦思冥想,发现网上针对ROS的bash启动脚本几乎还是处于0的状态。为此针对性的给ROS开一个bash脚本的教程是非常有必要的。也希望各位大佬能提点意见,如果后续合适,我会继续根据各位的意见来继续开坑的。 1 bash 脚本简介 1.1 bash 脚本基础介绍 首先我们知道常见的bash脚本是基于shell文件的。因为bas
移动机器人地图构建问题,主要以gmapping为例,讲解了地图构建的整个流程。看过前面文章的小伙伴肯定都知道,gmapping算法把SLAM问题分解成两个部分,定位问题和地图构建问题。而gmapping中的地图构建就是采用占据栅格地图构建算法实现的。 。懂了占据栅格地图构建算法,就意味着SLAM问题不再是抽象的理论公式,它变成了浮现在你我脑海里的动态构建过程。这将对我们完整理解各种激光SLAM算法
1. 问题描述 在ROS编译过程中经常会遇到找不到ROS包的情况,如下所示 CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:83 (find_package ): Could not find a package configuration file provided by "gazebo_plugin
ROS 常用GUI测试工具 作为一个成熟的ros开发工程师,我们常常会需要用到GUI工具方便我们进行调试,为此rqt工具是我们日常使用时必不可少的工具。 rqt_plot 这个命令常常是我们需要长时间观察topic数据变化所需要用的。在我们需要观看某个topic的动态参数时候会非常有用。 rosrun rqt_plot rqt_plot #画出发布在topic上的数据变化图 rqt_plo
本文借鉴文章,但是该文存在致命性问题,所以博主另开一版,来讲述如何在ubuntu16.04中安装cv_bridge。 使用ROS的时候只用了C++,没有发现cv_bridge这个坑,最近增加了一个使用pytorch的节点,为此使用Anaconda配置了一个只有Python3.5的环境,运行cv_bridge时出现报错 from cv_bridge.boost.cv_bridge_boost im
安装 Opencv 3.2 on Ubuntu 16.04 并创建node测试 —假设我们已经安装好一版OpenCV,一般都安装在/usr/local下。—如果需要安装另一个版本的OpenCV,就不能再安装到/usr/local,而是选择其他路径,否则会覆盖掉之前的版本。 step 1: 安装一些package sudo apt-get -y install libopencv-dev build
上一篇 featureAssociation.cpp 其次featureAssociation这一个node节点,主要是特征提取。代码中先初始化了lego_loam::FeatureAssociation,用来订阅了上一节点发出来的分割出来的点云,点云的属性,外点以及IMU消息,并设置了回调函数。其中IMU消息的订阅函数较为复杂,它从IMU数据中提取出姿态,角速度和线加速度,其中姿态用来消除重力对
上一篇 回环检测 在LOAM系列中回环检测主要存在有四种方法 传统的领域距离搜索+ICP匹配 基于scan context系列的粗匹配+ICP精准匹配的回环检测 基于scan context的回环检测 基于Intensity scan context+ICP的回环检测 在参考很多大佬的比对结果中我们发现,传统的领域距离搜索+ICP匹配是这三个方法中最耗时的,相较于基于scan context的
第一步 下载 QT 并安装 1 1 官网( http://download.qt.io/archive/qt/5.13/5.13.0/)下载 qt 安装包qt-opensource-linux-x64-5.13.0.run 1 2 给安装 run 文件增加执行权限并运行,安装选项全选,路径默认 sudo chmod +x qt-opensource-linux-x64-5.13.0.run 2.
前言 本作者在16年大学开始接触ROS后,逐步向着机器人建图导航方面扩展,尤其是对激光雷达方向比较感兴趣,目前打算针对近阶段的SC-LEGO-LOAM进行分析讲述。从ScanContext和Lego LOAM两个部分进行分析阐述。一方面也是记录自己的学习成果,另一方面也是帮助他人一起熟悉这篇20年的经典文章。 LOAM系列发展 LOAM LOAM作为该系列的鼻祖,在前几年kitti数据集中常年霸占
docker作为一种开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。之前网上存在一些使用docker去安装ros的相关教程。但是目前网上的教程都无法装载GAZEBO RVIZ等常用的一些软件。 在做纯编译开发时,我们不需要对CPP/Python代码进行编译,这时候能够一键安装环境的Docker就显得十分有必要,这样的方式不会考虑环境配置的差异,而且能够快速的搭建好环境。 创
构建语义地图时,用的是 octomap_server和 semantic_slam: octomap_generator,不过还是整理下之前的学习笔记。 一、Octomap 安装并使用Octomap_Server1.1 Apt 安装 Octomap 库如果你不需要修改源码,可以直接安装编译好的 octomap 库,记得把 ROS 版本「kinetic」替换成你用的: sudo apt-get in
首先为这几个坐标系的定义世界坐标(map)该map坐标系是一个世界固定坐标系,其Z轴指向上方。相对于map坐标系的移动平台的姿态,不应该随时间显著移动。map坐标是不连续的,这意味着在map坐标系中移动平台的姿态可以随时发生离散的跳变。典型的设置中,定位模块基于传感器的监测,不断的重新计算世界坐标中机器人的位姿,从而消除偏差,但是当新的传感器信息到达时可能会跳变。map坐标系作为长期的全局参考是很
ubuntu16.04+ROS+Inter D415安装本文主要参考kkruaruarua博文结合自己的实际操作写成 ROS部分安装鉴于我在安装ros和D415驱动的过程中遇到的许多问题,在此和大家分享,希望可以帮助到大家 安装ubuntu16.04,我用的是64bit的系统,安装步骤大家可以参考百度,很多更改软件源,我用的是清华的软件源,但是在我刚装好系统的时候出现了这个问题 解决办法如下:先s
WiringPi是一个用C语言编写的树莓派(RaspberryPi)软件包,可用于树莓派GPIO引脚控制、串口通信、SPI通信及I2C通信等功能,非常适合熟悉C/C++的人员在树莓派上进行软件开发。WiringPi的作者是Gordon Henderson,其官方网址为http://wiringpi.com。WiringPi遵循GNU GPLv3公约,任何人都可以免费使用该软件包。 1、Wiring
一、环境配置参考turtlebot3-多机交互程序:多机交互-创客智造小车: Ubuntu-mate16.04+ROSkinetic;必要的bringup.launch文件(包括雷达信息、IMU、编码器信息、电器驱动),详情见bringup详解。上位机: Ubuntu16.04+ROSkinetic安装多机地图合并软件包ros-kinetic-multirobot-map-merge: sudo
根据官方Distributions说明,Dashing Diademata为Ubuntu 18.04上支持最长的版本,下一个长期版本目标系统为 Ubuntu 20.04,因此作为学习的话,建议安装该版本,同时经过简单测试,当前ROS2对一般开发者并不算太友好,很多功能包也没有,不建议作为主力开发使用。ROS2架构说明可参考ROS2探索总结(六)——迎接ROS2.0时代的到来 一、安装 1.设
本文借鉴文章,但是该文存在致命性问题,所以博主另开一版,来讲述如何在ubuntu16.04中安装cv_bridge。 使用ROS的时候只用了C++,没有发现cv_bridge这个坑,最近增加了一个使用pytorch的节点,为此使用Anaconda配置了一个只有Python3.5的环境,运行cv_bridge时出现报错from cv_bridge.boost.cv_bridge_boost impo
引言在写ROS工程代码,有时候找一个bug非常麻烦,尤其是运行时出错的bug,这时候借助一些调试器可以极大的提高查找bug的效率。ROS官方列出了许多可用的IDE:http://wiki.ros.org/IDEs,如VScode, Qtcreator, Ecllipse, Clion等,而这些不方便快速的调试。 所以,下面介绍如何使用GDB调试器来进行ROS C++项目的调试 在debug模式
ZED摄像头 获得中心点深度,未考虑RGB与深度映射(可参考下面D415) #include <iostream> #include <fstream> #include <sstream> #include <algorithm> #include <dirent.h> #include <opencv2/core/core.hp
方法1: 交叉编译环境搭建流程 交叉编译环境搭建的主要思路是利用catkin提供的rostoolchain脚本设置相应的交叉编译工具、lib库地址等,中间遇到问题再针对性解决。 基础环境: 目标运行环境 arm64 cpu Ubuntu 16.04 ros kinetic for arm 编译环境 x86_64 cpu Ubuntu Kylin(16.04) ros kinetic
一、Anaconda与Virtualenv 虚拟环境Anaconda与Virtualenv可以二选一 1.1 Anaconda Tip:ros 和Anaconda 一起使用的时候,如果先安装了Anaconda,再安装ros,会报错,因此正确的联合使用方式为:先安装ros相关,后安装anaconda即可。Anaconda安装完成后会在~/.bashrc中写入如下命令: # >>>
安卓与ROS通信的现状 因为ROS官方支持的语言绑定只有C++和Python,所以目前安卓想与ROS通信,必须借助半官方的rosjava包,而Rosjava太重了,因为它跟C++/Python一样,是一个全功能的ROS绑定,意即你可以在Java(android)平台上创建Master Node,然后其他Node(C++/Python)可以连上这个Master,进行分布式通信!这对于桌面Java或
使用octomap_server创建八叉树地图和栅格地图 说明 问题1:点云与网格垂直 问题2:八叉树显示不完整 问题3:地面滤除 说明 Octomap 在ROS环境下实时显示、Lego_loam使用教程两篇博文对如何从PCD创建PointCloud2点云、如何用octomap_server创建八叉树地图和栅格地图已经说的很详细了,但是我在使用时还是遇到了一些问题。 问题1:点云与网格
近期有一个项目用到了Azure Kinect,之前Kinect 1与Kinect 2均使用过的老用户,自然不能放过这个机会。为此专门对Azure Kinect进行了学习,以下是这次自己调研摸索的一些成果 Azure Kinect简介 在芯片顶级会议 ISSCC 2018微软亮相自家的一百万像素的 ToF传感器,与此在论文发表三个月后,小型化的 Kinect for Azure (K4A)工业用开发
决定总结最近一个月的工作,这个月在orbslam2的基础上,使用kineticV2完成了稠密点云地图的重建,实现了点云的回环,并使用octomap转换成实时的八叉树地图,导航部分已经有了思路,打算下个月所一个基于octomap的航迹生成能用在视觉的导航上。 一、传感器和依赖包安装 PC性能:Dell xps13 内存16GB 硬盘SSD:500GB 显卡:Intel iris集显 操作系统:ub
前言 在使用ROS的过程中,我们常常需要使用复杂的编译源代码和相关的解析操作,才能单独对某一个任务进行启动。在修改时,也需要单独打开某个文件、编辑、保存,这个过程比较繁琐。这些数据信息均需要在终端中以字符的方式显示出来,键入命令同样需要在终端中输入字符命令,如果是用于较大的ROS工程,总不能所有调试工作,每改动一下参数都键入字符命令吧。为此人机交互界面氤氲而生,使用按钮,输入框等控件简化这一过程,
背景介绍 目前,市面上大多数的拖动试教机器人是UR的协作机器人和DLR-KUKA的iiwa机器人,相比于UR机器人,iiwa机器人在结构上有一点重要的不同。 UR在每个关节上采取的是双编码器的方式,分别测量电机角度和连杆角度。而iiwa机器人在每个关节上还加入了一个单轴力矩传感器(一般位于减速器输出端与末端连杆间),用于测量每个关节的输出力矩。如图所示,iiwa在牵引拖动时表现更好,同时iiw
正常,都是在刷指标的
核心就是这个:rclcpp::executors::MultiThreadedExecutor
那建议自己去搜一下这个版本
没有的
看一下目录中是否有这个文件
cu
chatglm是不支持二次预训练的
okk
好的,我会考虑的。目前是存货,最近时间比较少。我后面写
https://www.guyuehome.com/39781
这一块等我继续更新哈
这种有可执行文件,参考我交叉编译项目
比较类似的,道路标志一般会被滤除,如果需要加上需要使用其他方法
现在还需要吗
怀疑构造函数的类型有问题
虚拟机不支持显卡吧
安装一个yaml库即可
是devel路径的source,如果需要系统学习ros1和ros2,可以看一下《从ROS1到ROS2无人机编程实战指南》这本书
应该是缺库,建议检查环境,如果需要系统学习ros1和ros2,建议买一本《从ROS1到ROS2无人机编程实战指南》
noetic是ros-noetic-qt-build和ros-noetic-qt-create
找到了:https://github.com/liuzm-slam/multi_lidar_calibration/tree/master
需要按照流程搞一个ros空间
可以的
这个基本是工具使用,二次开发较少哦;https://blog.csdn.net/lovely_yoshino/article/details/129142048
原理上都大同小异,本质上基本都是加入依赖,然后使用,只要架构一样即可
这个好像无法获取,建议自己保存
没有了,但是代码应该都是全的
应该是base_link和地图绑在一起了
看上去像算法稳定性原因
不写博客,泡泡是吧
这个你需要询问古月官方,因为我是签约作者
研究的不太深入
最大时间,最小限位,模式
看看log信息
查了一下:https://github.com/cruise-automation/webviz/issues/442
图太小了,看上去应该是控制响应不及时,建议控制指令不要一直发送
一般来说kinect的精度还是没激光高的,如果要解决长廊,一般还是要加点障碍物或者其他全局定位方案
看一下是否ID是一致的,应该是没连接到同一个DOMIAN_ID下
你可以下载我的代码,来直接学习:https://github.com/lovelyyoshino/ROS-ROS2-BOOKS
我写的新书中也有介绍哈,有兴趣可以买来学习
嘿嘿
这个系列已经结束了
是的,可以看我github,里面主要参照了有一个算法
没问题的,看看是不是其他文件的问题呢
是的
这种一般需要其他处理的
做完了,但是没有公开
代码没有全放出来哈,你如果有需求可以在csdn上找到我,进群哈
确定一下是否有docker
G是global,I是IMU,两者不一样
需要写代码
看一下整个topic流程,怀疑订阅问题
pgm格式就行
覆盖过就不会考虑了
做成栅格地图,可以用navigation
有的,具体内容还是比较复杂的,我当时参照IMU的去写的
数据这些不开源哈
应该是没有的
应该是用的通用的矫正软件
要看角度的
不行就试一下GDB调试吧
已经加您
找到了,需要的加我微信mpl9725440吧
需要看你代码查问题
检查内存和cpu性能?