ubuntu16 PL-SLAM编译 踩坑

2024-01-10 03:18
文章标签 编译 slam pl ubuntu16

本文主要是介绍ubuntu16 PL-SLAM编译 踩坑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先贴出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

这篇关于ubuntu16 PL-SLAM编译 踩坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589374

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

Golang test编译使用

创建文件my_test.go package testsimport "testing"func TestMy(t *testing.T) {t.Log("TestMy")} 通常用法: $ go test -v -run TestMy my_test.go=== RUN TestMyTestMy: my_test.go:6: TestMy--- PASS: TestMy (0.

C++/《C/C++程序编译流程》

程序的基本流程如图:   1.预处理        预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。 读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理将所有的“#define”删除,并且展开所有的宏定义处理所有的条件编译指令,如:“#if”、“

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

QT 编译报错:C3861: ‘tr‘ identifier not found

问题: QT 编译报错:C3861: ‘tr’ identifier not found 原因 使用tr的地方所在的类没有继承自 QObject 类 或者在不在某一类中, 解决方案 就直接用类名引用 :QObject::tr( )

hector_quadrotor编译总结 | ubuntu 16.04 ros-kinetic版本

hector_quadrotor编译总结 | ubuntu 16.04 ros-kinetic版本 基于Ubuntu 16.04 LTS系统所用ROS版本为 Kinetic hector_quadrotor ROS包主要用于四旋翼无人机的建模、控制和仿真。 1.安装依赖库 所需系统及依赖库 Ubuntu 16.04|ros-kinetic|Gazebo|gazebo_ros_pkgs|ge

hector_quadrotor编译总结 | ubuntu 14.04 ros-indigo版本

hector_quadrotor编译总结 | ubuntu 14.04 ros-indigo版本 基于Ubuntu 14.04 LTS系统所用ROS版本为 Indigo hector_quadrotor ROS包主要用于四旋翼无人机的建模、控制和仿真。 备注:两种安装方式可选:install the binary packages | install the source files

编译和链接那点事下

http://www.0xffffff.org/?p=357 上回书我们说到了链接以前,今天我们来研究最后的链接问题。         链接这个话题延伸之后完全可以跑到九霄云外去,为了避免本文牵扯到过多的话题导致言之泛泛,我们先设定本文涉及的范围。我们今天讨论只链接进行的大致步骤及其规则、静态链接库与动态链接库的创建和使用这两大块的问题。至于可执行文件的加载、可执行文件的运行时