![](https://img-blog.csdnimg.cn/2020051620141373.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
slam学习
文章平均质量分 58
本硕北京理工大学。
关于slam基础和cartographer的一些深入解读,对新手有好,望支持
白色小靴
学生
展开
-
最新激光雷达闭环检测/地点识别算法CVTNet(2023)
CVTNet以激光点云多类投影生成的二维图为输入,利用cross transformer将多类信息交叉融合,为激光点云提取强特异性描述子,实现SLAM闭环检测或全局定位功能。此外,CVTNet生成的全局描述子具备车辆yaw角旋转不变性,提升车辆多视角地点识别精度。各项试验表明,CVTNet达到了SOTA的地点识别精度,且实时性适用于自动驾驶要求。代码地址:https://github.com/BIT-MJY/CVTNet。论文地址:https://arxiv.org/abs/2302.01665。原创 2023-04-01 10:26:49 · 584 阅读 · 1 评论 -
激光雷达闭环检测/地点识别算法OverlapTransformer/SeqOT(2022)
SOTA激光雷达闭环检测/地点识别算法原创 2022-07-06 21:58:00 · 927 阅读 · 0 评论 -
NCLT数据集
NCLT数据集的groundtruth文件,包含的是velodyne在odom坐标系中的位姿。原创 2022-03-14 11:07:32 · 2250 阅读 · 8 评论 -
双激光雷达标定程序
https://github.com/BIT-MJY/Multiple_Lidar_Calibration原创 2021-08-13 14:22:22 · 1546 阅读 · 1 评论 -
LEGO-LOAM(LOAM)部分公式推导---未完待续
一、featureAssociation相关推导1)高频率里程计位姿累积函数:integrateTransformation void integrateTransformation(){ float rx, ry, rz, tx, ty, tz; AccumulateRotation(transformSum[0], transformSum[1], transformSum[2], -transformCu原创 2021-07-08 22:25:05 · 1541 阅读 · 2 评论 -
PCL安装报错error: ‘shared_ptr’ does not name a type
将所有报错的位置的shared_ptr均更换为boost::shared_ptr原创 2021-06-30 00:01:28 · 937 阅读 · 1 评论 -
BLAM源码解析(五)—— 回环检测
上一节介绍了BLAM的帧间匹配和帧图匹配,代码简洁明了。本节介绍BLAM的回环检测模块。具体代码块如下: // Check for new loop closures. bool new_keyframe; if (HandleLoopClosures(msg_filtered, &new_keyframe)) { // We found one - regenerate the 3D map. PointCloud::Ptr regenerated_map(new原创 2021-06-28 11:30:37 · 577 阅读 · 3 评论 -
BLAM源码解析(四)—— 基于ICP的位姿更新
第三节我们介绍了定时器的定时回调,实现对激光数据的批量循环处理,在每一个激光数据的循环当中,除了一开始filter_的点云过滤,最重要的其实是下面的基于ICP的位姿更新,即 if (!odometry_.UpdateEstimate(*msg_filtered)) {接下来重点关注UpdateEstimate函数,此函数由第一节介绍的里程计模块实现。bool PointCloudOdometry::UpdateEstimate(const PointCloud& points)原创 2021-06-28 11:01:24 · 589 阅读 · 1 评论 -
BLAM源码解析(三)—— 定时器总揽大局
上一节介绍了激光数据的回调,最终被依次推入到容器之中,存储在pcl_pcld_queue。那么激光数据的使用是怎么实现的,就是这一节要介绍的内容。回想第一节我们介绍的定时器estimate_update_timer_,一秒进行20次的回调,进入回调函数BlamSlam::EstimateTimerCallback,接下来介绍此函数。BlamSlam::EstimateTimerCallback此函数位于src\blam_slam\src\BlamSlam.cc,内容如下:void ..原创 2021-06-28 10:04:37 · 295 阅读 · 0 评论 -
BLAM源码解析(二)—— 从激光回调入手
上一节(https://blog.csdn.net/weixin_44684139/article/details/118279360)我们介绍了系统各个模块的初始化,加载了许多的参数,创建了许多的发布者,构建了因子图、初始八叉树地图等。本节介绍激光数据回调以后的相关内容。激光雷达数据订阅者建立于src\blam_slam\src\BlamSlam.cc的 pcld_sub_ = nl.subscribe("pcld", 100, &BlamSlam::PointCloudCallb原创 2021-06-27 22:41:57 · 362 阅读 · 0 评论 -
BLAM源码解析(一)—— 模块初始化
对BLAM在线部分进行解析。blam_slam.cc文件直接进行初始化: if (!bs.Initialize(n, false /* online processing */)) {其中两个参数,n代表ros句柄,false代表不进行日志记录。让我们跳转到BlamSlam.cc,看一下初始化的作用:首先在句柄n的命名空间blam_slam中,附加命名空间BlamSlam:name_ = ros::names::append(n.getNamespace(), "Blam原创 2021-06-27 22:20:45 · 1143 阅读 · 1 评论 -
基于Mutual Information的Active SLAM《Information-Theoretic Exploration with Bayesian Optimization》
关于论文Information-Theoretic Exploration with Bayesian Optimization的解读和复现原创 2021-04-23 11:47:24 · 766 阅读 · 7 评论 -
Ubuntu20运行OverlapNet
OverlapNet源码:https://github.com/PRBonn/OverlapNet一、设置ubuntu默认使用python3:https://www.cnblogs.com/dancesir/p/14201267.html二、配置深度学习环境https://blog.csdn.net/weixin_44684139/article/details/109011361三、创建环境注意依赖库版本必须严格根据github对应conda create --name tf5 pytho原创 2021-03-17 14:10:00 · 721 阅读 · 6 评论 -
PCL点云拼接(合并,并非配准)
#include <cmath>#include <vector>#include <string>#include "montage/common.h"#include "montage/tic_toc.h"#include <nav_msgs/Odometry.h>#include <opencv/cv.h>#include <pcl_conversions/pcl_conversions.h>#include &l原创 2021-03-03 15:57:04 · 2477 阅读 · 8 评论 -
pcl安装报错undefined reference to `LZ4_compress_HC_continue‘
报错内容:kdtree.so.1.8.1:undefined reference to `LZ4_decompress_safe_continue’解决办法:/pcl/build/kdtree/CMakeFiles/pcl_kdtree.dir/下的link.txt里在末尾写上:-llz4即:/usr/bin/c++ -fPIC -std=c++11 -pthread -fopenmp -O3 -DNDEBUG -Wl,–as-needed -shared -Wl,-soname,原创 2021-01-12 12:13:12 · 3427 阅读 · 3 评论 -
3D点云标注工具
https://github.com/lcas/cloud_annotation_toolhttps://github.com/walzimmer/3d-bat原创 2020-12-24 13:29:59 · 2243 阅读 · 0 评论 -
pcl::PointXYZRGB 报错 has no member named ‘__getMD5Sum’
报错内容:/opt/ros/melodic/include/ros/message_traits.h: In instantiation of ‘static const char* ros::message_traits::MD5Sum<M>::value(const M&) [with M = pcl::PointCloud<pcl::PointXYZRGB>]’:/opt/ros/melodic/include/ros/message_traits.h:255:10原创 2020-12-18 14:48:58 · 2918 阅读 · 1 评论 -
PFH点特征直方图及其pcl用法
部分参考:https://blog.csdn.net/qq_25491201/article/details/51104390表面法线和曲率可以好的代表一个点的几何特征。然而它们算得很快,而且算法简单,但是它们不能捕获细节,它们只是点的近邻的几何特征的近似估计。作为一个直接的结论,大多数的场景往往会包括很多有着相似特征的点,这会减少它们所带来的消息量,也容易造成混淆和错误的匹配。这时候就要一个具备更加丰富信息的特征描述方法——点特征直方图Point Feature HistogramPFH的目标是通过原创 2020-12-11 12:12:25 · 1314 阅读 · 2 评论 -
计算不同维度之间的协方差
https://www.cnblogs.com/terencezhou/p/6235974.html原创 2020-12-02 15:48:15 · 1026 阅读 · 0 评论 -
基于aloam研究ceres的构建方式
aloam相比于loam增加了ceres库自动微分,而不需要手推高斯牛顿,这是非常方便的。对于aloam源码,在laserOdometry中,有关ceres的部分: ceres::LossFunction *loss_function = new ceres::HuberLoss(0.1); // 鲁棒核 ceres::LocalParameterization *q_parameterization = new ceres::EigenQuaternionParamete原创 2020-11-26 13:33:27 · 971 阅读 · 1 评论 -
ROS多机时间同步
参考:https://blog.csdn.net/hnlyzxy123/article/details/89528511设备:一台搭载ubuntu18.04的笔记本、一台搭载ubuntu20.04的笔记本(1) 服务器端配置(18.04)sudo apt install ntpsudo gedit /etc/ntp.conf在打开的文件中加入:restrict 192.168.43.0 mask 255.255.255.0 nomodify notrapserver 127.127.1.0原创 2020-11-20 12:02:24 · 1723 阅读 · 2 评论 -
Eigen四元数的坐标变换和坐标系变换
参考:https://www.cnblogs.com/jerry323/p/9097264.html一共有两个机器人,一号和二号。一号位姿 q1 = [0.35, 0.2, 0.3, 0.1],t1=[0.3, 0.1, 0.1]。二号位姿 q2=[-0.5, 0.4, -0.1, 0.2], t2=[-0.1, 0.5, 0.3]。某点在一号坐标系下坐标为p=[0.5, 0, 0.2]。求p在二号坐标系下的坐标。假设在世界坐标系中p点的坐标为P。用四元数做旋转则有(在Eigen原创 2020-11-19 16:57:01 · 4769 阅读 · 0 评论 -
LOAM编译及遇到的问题
一、依赖库安装首先进行如下依赖库的安装:sudo apt-get updatesudo apt-get install git build-essential linux-libc-devsudo apt-get install cmake cmake-gui sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-devsudo apt-get install mpi-default-dev openmpi-bin openmpi-co原创 2020-11-15 16:56:18 · 3263 阅读 · 4 评论 -
矩阵求导公式(引自维基百科)
1.总体情况2.分子布局(Numerator layout)和分母布局(Denominator layout)首先我们常说 y 对 x 求导,这里的 y 和 均x 默认为列向量,y为(mx1), x为(nx1)(1)分子布局——较为常用y 对 xT 求导,得到mxn的矩阵。比如雅可比矩阵,就是典型的分子布局。雅可比矩阵形式如下:可见y依然是竖向变化的,而横向是对不同的x求导,也就是说x是横向的。所以是y对 xT 求导。(2)分母布局yT 对 x 求导,得到nxm的矩阵。其实此矩阵是分子布局原创 2020-11-13 17:20:30 · 10180 阅读 · 0 评论 -
ubuntu18安装opencv2.4.13踩坑总结
ubuntu18安装opencv2.4.13踩坑总结一、安装流程apt-get updateapt-get install build-essentialapt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-devapt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-原创 2020-09-12 09:15:15 · 1407 阅读 · 1 评论 -
.sh脚本如何新开终端执行
在研究ROS的时候,经常为启动多个节点或者多个launch文件而发愁。因此写.sh脚本是一个很好的选择。而最近在写.sh脚本的时候,为了满足其中一个终端在执行,新开另一个终端并行执行的情况,涉及“.sh脚本如何新开终端执行”方式:gnome-terminal -t "title-name" -x bash -c "./gmappingSTEP2.sh;exec bash;"其中,title-name为新开终端的名字,./gmappingSTEP2.sh是新开的终端中要执行的命令。这里我为了需要原创 2020-09-09 09:59:24 · 4322 阅读 · 0 评论 -
ROS仿真实现move_base注意事项
move_base导航是基于gmapping所建的图。(一)安装move_base一行代码的事:sudo apt-get install ros-melodic-navigation因为需要事先保存gmapping建的图,因此需要安装map_server:sudo aptitude install ros-melodic-map-server保存地图运行的是rosrun map_server map_saver终端所在路径会得到两个文件:map.pgmmap.yaml(二)踩坑总结原创 2020-08-03 18:23:06 · 4236 阅读 · 1 评论 -
ROS仿真实现gmapping注意事项
最近在搞p3at,因此下载了p3at的urdf模型,并在其中加入了激光雷达插件、imu插件等等。然后想用现成的gmapping跑跑建图。期间遇到了无数个坑,特此记录。(一)gmapping的下载直接使用sudo install ros-melodic-.......是一定会报错的。。。很奇怪。报错内容大致为[slam_gmapping-2] process has died可能是因为ubuntu自带的gmapping版本很旧。解决办法:在工作空间的src下:git clone https:原创 2020-08-02 00:56:58 · 2057 阅读 · 2 评论 -
cartographer随记---程序脉络
我之前的一篇blog中介绍过cartographer中,传感器数据进来以后是如何被储存以及加入到位姿图中的。https://blog.csdn.net/weixin_44684139/article/details/106107610这一篇我想真正梳理一下cartographer的前端是如何实现的。包括传感器信息是如何被前端获取,又如何进行处理的。从node.cc开始// 非常重要的函数,用于创建轨迹。// 参数1:轨迹建立参数// 参数2:各个传感器消息的话题名称int Node::Add原创 2020-06-01 12:31:07 · 711 阅读 · 1 评论 -
激光雷达点云消息参数
2D激光雷达https://www.jianshu.com/p/b73ccaf19d7e如horizontal_laser_2dheader: seq: 0 stamp: secs: 1405946671 nsecs: 406303800 frame_id: "horizontal_laser_link"angle_min: -2.35183119774angle_max: 2.35183119774angle_increment: 0.0043633230961原创 2020-05-23 21:29:15 · 2015 阅读 · 0 评论 -
cartographer--后端match--减小搜索框策略(ShrinkToFit)
在fast_correlative_scan_matcher.cc文件中,FastCorrelativeScanMatcher2D::MatchWithSearchParameters 函数真正体现了后端match的策略,即fast相关方法的核心。在此函数中,在将点云离散化处理并转换到map坐标系之后,进行了搜索框压缩的步骤: search_parameters.ShrinkToFit(discrete_scans, limits_.cell_limits());因为位姿搜索框较大(在±7m范围原创 2020-05-16 19:54:36 · 1231 阅读 · 3 评论 -
梳理cartographer传感器数据流
Cartograpger_ros部分毕竟先得看ros壳,才能捋清传感器信息流Node.cc首先看node.cc首先看用户请求增加一条轨迹,那么服务端service_servers_会回调函数Node::HandleStartTrajectory service_servers_.push_back(node_handle_.advertiseService( kStartTrajectoryServiceName, &Node::HandleStartTrajectory,原创 2020-05-14 01:20:48 · 2592 阅读 · 1 评论 -
cartographer栅格地图介绍
首先,你需要知道激光slam中的栅格地图的详细含义使用概率表示的,这一栅格被占据的状态。真正表示的又不是概率,而是一种状态值,但间接反映了概率。1.什么是栅格地图https://zhuanlan.zhihu.com/p/21738718这个知乎回答已经很清楚地做了解答。2.Cartographer中的栅格地图是什么形式呢?就是一种概率栅格地图。从配置文件/home/mjy/dev/...原创 2020-05-07 17:31:03 · 5157 阅读 · 7 评论 -
cartographer原理简述
cartographer原理简述参考:https://blog.csdn.net/weixin_36976685/article/details/84994701Cartographer 能产生一个精度为5cm的2D栅格地图。前端Cartographer在前端匹配环节区别与其它建图算法的区别主要是使用了Submap这一概念,每当或得一次laser scan的数据后,便与当前最近建立的Sub...原创 2020-05-06 17:50:27 · 9748 阅读 · 2 评论 -
(转载)cartographer总结1
cartographer_node总结:cartographer启动以后,做了如下的工作:注册并发布了5个Topic, 并为5个Topic分别设置了定时器函数,在定时器函数中定期向Topic上广播数据:|===1) Topic 1: kSubmapListTopic: 广播构建出来的submap的list|-----------发布数据的函数:Node::PublishSubmapLi...原创 2020-05-04 22:14:19 · 362 阅读 · 0 评论 -
深蓝学院激光slam学习——第六章(基于图优化的激光SLAM方法(Grid-based))习题
这一章的习题主要围绕着位姿图优化进行基础概念位姿图优化的顶点和边顶点 === Ti Tj也就是 前端的结果,是scan matching的结果边 === Tij分为两类:(1)里程计边,Tij是由里程计得到。(2)回环边,Tij是由scan matching得到...原创 2020-04-29 16:48:50 · 1573 阅读 · 4 评论 -
计算机图形学——Bresenham画线算法
以下摘录自《计算机图形学》对于特殊情况(非斜率为0~1区间情况)附上栅格地图的画线算法以更新free:std::vector<GridIndex> TraceLine(int x0, int y0, int x1, int y1) // 划线算法{ GridIndex tmpIndex; std::vector<GridIndex> gridIn...原创 2020-04-29 00:47:42 · 2785 阅读 · 1 评论 -
分枝定界图解(含 Real-Time Loop Closure in 2D LIDAR SLAM论文部分解读及BB代码部分解读)
分枝定界图解网上对分枝定界的解读很多都是根据这篇必不可少的论文《Real-Time Loop Closure in 2D LIDAR SLAM》来的。分枝定界是一种深度优先的树形搜索方法,避免了暴力搜索带来的计算量庞大等问题,成为cartographer的重要组成部分。其主要用于激光slam的回环检测中。用当前的scan和全局地图global map进行匹配,以找到此帧scan的位姿。所...原创 2020-04-23 00:38:48 · 5322 阅读 · 12 评论 -
激光雷达占据栅格地图学习
知乎高赞回答:https://zhuanlan.zhihu.com/p/21738718Coursera上的课程:https://www.coursera.org/learn/robotics-learning/home/week/3?authMode=signup#原创 2020-04-22 11:48:38 · 1580 阅读 · 0 评论 -
深蓝学院激光slam学习——第三章(激光slam运动畸变去除)习题
用插值的方法,从而得到每一个小时刻的位姿,从而去除运动畸变。插值思想介绍明确几个物理量:(1)start_time : 激光数据开始的时刻。(2)end_time : endTime = startTime + ros::Duration(laserScanMsg.time_increment * beamNum); 激光数据结束的时刻。(3)frame_start_pose : 雷达...原创 2020-04-21 15:26:56 · 3733 阅读 · 29 评论