ubuntu16 PL-SLAM编译 踩坑

2023-05-16

首先贴出pl-slam readme的第一句话:对pl-slam的精度不要有太高要求。

Notice that this repository is only an open-source version of PL-SLAM released with the aim of being useful for the community, however, it is far from being optimized and we are not including some features of PL-SLAM.

 

stvo-pl  plsvo  plslam 保存轨迹 完整ref:

https://zhuanlan.zhihu.com/p/157900327

 

apt-get安装依赖

yaml  

出现 ros路径下的yaml/init.py中 不存在import error问题:

取消anaconda的环境路径后,就没有问题了

 

编译安装wxwidgets-2.8:

opengl library not available, 无法找到opengl的GL和mesa库,无法完成编译。

采用apt-get下载的wxWidgets2.8库:

完成了mrpt-stvo-pl和plslam的编译,单运行时候出现,ABI 1004编译的情况与现在的编译(c++ ABI 1009)不符合,没有找到解决办法,于是

于是autoremove 卸载了 和libwxWidgets-dev有关的库 

 

编译安装wxwidgets-3.1: 在make mrpt时候出现error

修改script_opencv选择 opencv344

选择wxWidgets3.1 但是无法找到

查看了cmakemodules/ script_wxWidgets.cmake, 按照cmake中find_package的原理,这里优先采用mudule模式,在当前的cmakemodules文件夹和/usr/share/cmake-3.5/Module中寻找FindwxWidgets.cmake,由于没有wxWidgets-config.cmake或者wxWidgetsConfig.cmake,故不能采用config模式进行find_package,通过

打开查看FindwxWidgets.cmake,用message("...,${...} ")输出查看变量,发现会通过一个/usr/bin/wx-config的可执行文件获取cxx_flags准备查找合适版本的wx库,判断这个wx-config可能是之前安装wxWidgets2.8留下的,导致出现的问题。

发现/usr/bin/wx-config根本不存在

运行locate wx-config

/home/lincent/slam_sota/pl_slam/wxWidgets-3.1.2/wx-config
/home/lincent/slam_sota/pl_slam/wxWidgets-3.1.2/wx-config-inplace.in
/home/lincent/slam_sota/pl_slam/wxWidgets-3.1.2/wx-config.in
/usr/local/bin/wx-config
把这个拷贝到/usr/bin 下面一份 ,解决

再次cmake报错:

_filename, /usr/include/wx-2.8/wx/version.h
CMake Error at /usr/share/cmake-3.5/Modules/FindwxWidgets.cmake:880 (file):
  file failed to open for reading (No such file or directory):

    /usr/include/wx-2.8/wx/version.h
Call Stack (most recent call first):
  cmakemodules/script_wxwidgets.cmake:32 (FIND_PACKAGE)
  CMakeLists.txt:257 (include)
解决:

/usr/include/wx-2.8/wx/version.h这个文件不存在

在880行自己设置一下:

  SET(_filename "${wxWidgets_INCLUDE_DIRS}/wx/version.h")

安装mrpt

stvo-pl

pl-slam

配置数据集,

在bashrc写数据集的环境变量

运行

Options:
-c Config file
-o Offset (number of frames to skip in the dataset directory
-n Number of frames to process the sequence
-s Parameter to skip s-1 frames (default 1)
A full command would be:
./plslam_dataset kitti/00 -c ../config/config_kitti.yaml -o 100 -s 2 -n 1000
 

./plslam_dataset /KITTI/07 -c ../config/config/config_kitti.yaml -n 1100
// 1101 段错误

plslam: 为了保存轨迹txt

在plslam/src/slamScene.cpp 251行  bool slamScene::updateScene()中 增加:  并开头增加头文件<fstream>

ofstream f;
    f.open("../pl_pose.txt", ios::app);
    f << fixed;
    Eigen::Vector3d poseTran;
    Eigen::Vector3d t(pose.x(), pose.y(), pose.z());
    poseTran = t;
 
    Eigen::Matrix3d rotMat = pose.getRotationMatrix();
    Eigen::Quaterniond poseQuat(rotMat);

    f << setprecision(7)\
    << rotMat(0,0) << " " << rotMat(0,1) << " " << rotMat(0,2) << " " << poseTran.x() << " " \
    << rotMat(1,0) << " " << rotMat(1,1) << " " << rotMat(1,2) << " " << poseTran.y() << " " \
    << rotMat(2,0) << " " << rotMat(2,1) << " " << rotMat(2,2) << " " << poseTran.z() << endl;
    f << flush;
    f.close(); 
//重新编译
cd build; make 

补充:这样保存后看了07的轨迹,发现完全没有回环的痕迹,查看代码流程可以发现,这里保存的是stvo的每一帧位姿,没有经过全局优化和回环检测。

所以这里需要重新看一下

 

在 plslam/src/slamScene.cpp 807行updateSceneGraphs( const MapHandler* map )函数 增加在全局优化后的关键帧位姿保存,如下

ofstream f;
    f.open("../plslam_keyframe_pose.txt", ios::out);
    f << fixed;
    for( vector<KeyFrame*>::const_iterator it = map->map_keyframes.begin(); it!=map->map_keyframes.end(); it++)
    {
        if( (*it)!=NULL )
        {
            Eigen::Matrix4d rotMat= (*it)->T_kf_w;
            f << setprecision(7)\
            << rotMat(0,0) << " " << rotMat(0,1) << " " << rotMat(0,2) << " " << rotMat(0,3) << " " \
            << rotMat(1,0) << " " << rotMat(1,1) << " " << rotMat(1,2) << " " << rotMat(1,3) << " " \
            << rotMat(2,0) << " " << rotMat(2,1) << " " << rotMat(2,2) << " " << rotMat(2,3) << endl;
            f << flush;
        }
    }
    f.close(); 

 

问题:

pl-slam在kitti 07的1067帧 段错误停止

很玄学。。偶尔的 , 加了cout没事了又

 

同样的道理,可以直接运行stvo-pl。

./imagesStVO /KITTI/07 -c ../config/config/config_kitti.yaml -n 1100

在bool sceneRepresentation::updateScene(list> matched_pt, list> matched_ls )函数内部,pose = pose + x_aux;(513行左右)及初始化部分后添加上面相同的代码:(注意,必须保证每次更新轨迹时trajout.txt不存在或者为空)

 

问题:

偶尔启动出现段错误,重新运行就好,原因未知

跑数据集中途弹出,显示内存不足。
解决办法:把mrpt、plslam编译为debug模式
  1)对于mrpt,cmake mrpt时使用 cmake -DCMAKE_BUILD_TYPE=DEBUG ..
  2)对于plslam,需要在IDE中

注意:同时需要将~/config文件夹内的kitti00-02.yaml复制到/home/xxx/Desktop/data/kitti/00,并修改其名为dataset_params.yaml(读程序plslam_dataset.cpp可知原因.)
如果你的数据集图片文件夹名字有区别,请做相应修改.(灰度图片为image_0和image_1,去kitti00-02.yaml内修改.) 

Invalid vocabulary for points
 vocabulary路径问题
解决办法:找到这个pl-slam/src/slamConfig.cpp,把里面的 vocabulary_p 和 vocabulary_l 换成你自己的路径。

为什么我在ubuntu中删除一个文件夹后,还能用locate找到它:

sudo updatedb 更新即可

编译mrpt时候采用了opencv344,但是有一些关于opencv2/core/type_c.h的opencv源代码的错误,考虑可能是opencv版本太高

于是用ros的opencv3.3.1重新编译mrpt,stvo-pl,pl-slam都顺利通过

备注:造成问题的原因是ximgproc模块在opencv的扩展模块opencv_contrib中,opencv在3.2版本之后引入了ximgproc模块,模块主要进行线特征的操作(分割,提取)。

cmake原理以及find_package:

https://blog.csdn.net/sen873591769/article/details/90183015

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ubuntu16 PL-SLAM编译 踩坑 的相关文章

  • 每日浅读SLAM论文——简析Cartographer

    文章目录 二维激光SLAM 简单框架 前端 scan matching Submaps构建 后端 分支定界优化csm CorrelativeScanMatch 代码实现框架 Cartographer 论文名 Real Time Loop C
  • 大师兄!SLAM 为什么需要李群与李代数?

    from https mp weixin qq com s sVjy9kr 8qc9W9VN78JoDQ 作者 electech6 来源 计算机视觉life 编辑 Tony 很多刚刚接触SLAM的小伙伴在看到李群和李代数这部分的时候 都有点
  • 《视觉SLAM十四讲》学习笔记-第四讲部分习题的证明思路

    1 验证SO 3 SE 3 和Sim 3 关于乘法成群 证明 先看SO 3 定义为 SO 3 R R3 3 RR I det R 1 S O 3 R
  • 微信小程序SLAM AR零基础入门教程

    鬼灭之刃花街篇 开播在即 今天带大家零基础使用Kivicube制作一个炭治郎的SLAM AR云手办 可以通过微信小程序将AR版的炭治郎放置在家中 提前感受鬼灭的氛围 先上个GIF大家看看动态的展示效果 在这里先科普一下本次教程使用到的AR技
  • SLAM入门

    SLAM定义 SLAM Simultaneous localization and mapping 同时定位 我在哪里 与建图 我周围有什么 当某种移动设备 汽车 扫地机 手机 无人机 机器人 从一个未知环境的未知地点出发 在运动过程中 通
  • ubuntu系统下配置vscode编译cmake

    文章目录 一 配置vs code运行c 代码 三个关键文件介绍 1 tasks json run helloworld cpp 1 1 打开cpp文件 使其成为活动文件 1 2 按编辑器右上角的播放按钮 1 3生成task文件 1 4 此时
  • LIO-SAM:在高斯牛顿法求解过程中用SO3代替欧拉角

    LIO SAM发表于IROS2020 是一个效果非常好的惯性 激光紧耦合里程计 我打算给我们的机器人搞一个激光里程计 于是打算把LIO SAM改一改搞过来 修改过程中发现一个问题 在里程计求解 mapOptimization的LMOptim
  • Event-based Stereo Visual Odometry(双目事件相机里程计)论文学习

    本文详细介绍一篇双目事件相机里程计的论文 Event based Stereo Visual Odometry 港科大沈邵劼团队Yi Zhou和TU Berlin的Guillermo Gallego共同完成 并公布了代码 我准备在接下来一段
  • 基于深度相机的三维重建技术

    本文转载自http www bugevr com zblog id 14 原创作者bugeadmin 转载至我的博客 主要是为了备份 日后查找方便 谢谢原创作者的分享 三维重建 3D Reconstruction 技术一直是计算机图形学和计
  • ORB_SLAM3复现——上篇

    ORB SLAM3 前言 1 ORB SLAM3 2 准备环境 2 1 C 11 Compiler 2 2 Pangolin 2 3 Opencv 2 4 Eigen 3 复现ORB SLAM3 3 1 下载代码 3 2 执行build s
  • np.meshgrid()函数 以及 三维空间中的坐标位置生成 以及 numpy.repeat()函数介绍

    一 np meshgrid 函数 1 np meshgrid 介绍 X Y np meshgrid x y 代表的是将x中每一个数据和y中每一个数据组合生成很多点 然后将这些点的x坐标放入到X中 y坐标放入Y中 并且相应位置是对应的 下面是
  • SLAM评估工具evo的使用

    evo官方指南 参考博客 lt 官方手册 这篇参考博客 完全可以掌握evo的基本操作 gt Then 实践出真知 1 安装evo sudo apt install python pip pip install evo upgrade no
  • 关于GPS、惯导、视觉里程计的几个定义

    1 首先写几个定义 惯性导航系统 Inertial Navigation System INS 全球定位卫星系统 Global Navigation Satellite System GNSS GNSS 包括全球定位系统 Global Po
  • LeGO-LOAM代码详细注释版

    学习LeGO LOAM时 写的代码注释github代码链接 一部分注释来自github用户wykxwyc 一部分来自网上查阅 还有一部分是自己的理解 持续更新中
  • GMAPPING的参数设置

    二 运行gmapping 我总结了运行gmapping的两种方法 1 基于命令行 rosrun gmapping slam gmapping scan scan delta 0 1 maxUrange 4 99 xmin 5 0 ymin
  • 无人车

    1 无人车四大核心技术 自动驾驶实际包含三个问题 一是我在哪 二是我要去哪 三是如何去 第一个问题是环境感知和精确定位 无人车需要的是厘米级定位 厘米级定位是无人驾驶的难点之一 不光是车辆本身的语义级定位 还有一个绝对坐标定位 第二个问题是
  • 二.全局定位--开源定位框架livox-relocalization实录数据集测试

    相关博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 基于固态雷达的全局
  • Ubuntu18.04安装pcl(过程/坑记录式教程)

    Ubuntu18 04安装pcl 1 下载pcl 2 安装依赖项 3 编译 4 安装 5 网上教程说要安装QT5和VTK 但按照本文的 本文记录了安装时出现的问题 出错的安装命令也记录了 建议浏览一遍再参考 不要错用了错误的指令 1 下载p
  • 视觉SLAM漫谈

    视觉SLAM漫谈 1 前言 开始做SLAM 机器人同时定位与建图 研究已经近一年了 从一年级开始对这个方向产生兴趣 到现在为止 也算是对这个领域有了大致的了解 然而越了解 越觉得这个方向难度很大 总体来讲有以下几个原因 入门资料很少 虽然国
  • ORB_SLAM2运行官方数据集/自己数据集

    官方数据集运行结果 WeChat 20230210194425 可以正常运行 自己数据集运行结果 自己的数据集 主要是用手机摄像头采集的实验室进行了一下简单的运行 可以成功运行 但是由于查看的相关程序的是死循环不能像运行官方数据集那样完整保

随机推荐

  • Qt工程pro文件配置详解

    文章目录 1 pro文件常用配置1 1 注释1 2 CONFIG1 3 DEFINES1 4 FORMS1 5 HEADERS1 6 INCLUDEPATH1 7 LIBS1 8 QT1 9 SOURCES1 10 TRANSLATIONS
  • Qt配置GUI程序控制台输出

    文章目录 1 Qt配置GUI程序控制台输出 1 Qt配置GUI程序控制台输出 下面看一下如何控制GUI程序控制台输出 xff1a 在 在 pro 文件中添加 xff1a CONFIG 43 61 console 选择 xff1a 项目 gt
  • 列表框QListWidget 类

    文章目录 1 QListWidget 简介2 QListWidget 常用操作2 1 添加操作2 2 删除操作 1 QListWidget 简介 Qt 提供 QListWidget 类列表框控件用来加载并显示多个列表项 QListWidge
  • Qt中的QSpinBox

    文章目录 1 QSpinBox1 1 QSpinBox 简介1 2 QSpinBox的主要属性 1 QSpinBox 1 1 QSpinBox 简介 QSpinBox 类提供了一个微调框部件 QSpinBox 允许用户选择一个值 xff0c
  • C/C++面试题1

    目录 1 C 面向对象的三大特性是什么 谈谈你对这三大特性的认识 2 include 和 include filename
  • QCheckBox

    文章目录 1 QCheckBox1 1 QCheckBox简介 1 QCheckBox 1 1 QCheckBox简介 QCheckBox 继承自 QAbstractButton xff0c 它提供了一个带文本标签的复选框 QCheckBo
  • QSlider

    文章目录 1 QSlider1 1 QSlider 简介 1 QSlider 1 1 QSlider 简介 QSlider 部件提供了一个垂直或水平滑动条 滑块是一个用于控制有界值的典型部件 它允许用户沿水平或垂直方向移动滑块 xff0c
  • QComboBox

    文章目录 1 QComboBox1 1 QComBox简介 1 QComboBox 1 1 QComBox简介 QComboBox 是下拉列表框组件类 xff0c 它提供一个下拉列表供用户选择 xff0c 也可以直接当作一个 QLineEd
  • QTreeWidget

    文章目录 1 QTreeWidget1 1 QTreeWidget简介 1 QTreeWidget 1 1 QTreeWidget简介 在 Qt 中的树形控件称为 QTreeWidget xff0c 而控件里的树形节点称为 QTreeWid
  • QMouseEvent

    文章目录 1 QMouseEvent1 1 特别说明 2 通过QMouseEvent事件实现窗口移动 1 QMouseEvent 1 1 特别说明 QMouseEvent没啥要注意的 xff0c 就是对于mouseMoveEvent xff
  • 1.基础概念【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 ARM 我们经常听所ARM xff0c 其实ARM有两种含义 xff1a ARM是一家公司 xff0c ARM也是一种处理器架构 RISC是精简指令集 xff0c 旨在
  • 2.单片机开发模式【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 单片机上手思路 对于一款新单片机 xff0c 我们可以采取如下思路进行上手 xff1a 去芯片原厂官网 xff0c 下载资料 xff0c 主要是获取数据手册和参考手册
  • 3.时钟与GPIO【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 时钟系统 首先我们要知道时钟的主要作用是用来同步 xff0c 现代的计算机系统是必然有时钟的 并且 xff0c 对于高级的单片机系统 xff0c 还会存在着不同频率的时
  • 4.中断与串口【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 中断 我们先来看一下什么是中断 xff1a 其实这种就是前后台的程序设计模式 我们来看下CM3内核都有哪些中断 xff0c 如下表 xff1a 对于CM3内核的单片来说
  • APT Hash sum mismatch错误的常见解决方法总结

    APT Hash sum mismatch错误的常见解决方法总结 LINUX报这个错误的时候 xff0c 有很多的原因 xff0c 通常是出现在使用apt get update的时候 xff0c apt 的全称是Advanced Packa
  • 安装Nvidia驱动run文件

    本文系转载 xff0c 出处 xff1a https blog csdn net lhx 998 article details 76135936 下载指定NVIDIA驱动安装包 xff08 run格式 xff09 run格式文件安装有时比
  • 5.AT指令【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 ESP8266 本文要使用的wifi模块为ESP8266 xff0c 我们直接使用官方提供的固件即可 xff0c 无须单独开发 直接通过串口和wifi模块进行通信 xf
  • 6.编写初步程序【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 程序流程回顾 先来回顾下TCP连接的流程 xff1a 下面看下UDP连接的流程 xff1a 整个程序的框架如下 xff1a 2 代码实现 这里我们使用串口2来操作 xf
  • 7.进一步完善程序【七天物联网智能家居训练营】

    本文是百问网七天物联网智能家居训练营学习笔记 xff0c 官网链接 1 增加UDP发送函数 再来回顾下UDP发送的流程 xff1a 对于AT指令来说 xff0c 只是使用的具体指令不同而已 和TCP发送函数非常类似 xff0c 代码如下 x
  • ubuntu16 PL-SLAM编译 踩坑

    首先贴出pl slam readme的第一句话 xff1a 对pl slam的精度不要有太高要求 Notice that this repository is only an open source version of PL SLAM r