slam稠密建图以及构建octomap

2023-10-13 00:30

本文主要是介绍slam稠密建图以及构建octomap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前总说ORB-SLAM2构建的稀疏地图,只是为了定位用的,想要使用地图导航或是别的还是得搞稠密地图,然后就运行了高翔博士改的稠密建图版本。

虽然效果看起来好看了一点,还是不知道怎么个用法,因此还需要整成八叉树地图,具体怎么整

见下方博客

https://blog.csdn.net/crp997576280/article/details/74605766

按照他的方法基本没有问题

但是这个方法是将生成的 .pcd文件,转化为八叉树地图,过程不是实时的

我想要整个实时的,最好是能接上相机,一边做slam,一边更新八叉树地图,这就必然要用到ros了,需要整个稠密建图版本的并且有ros接口的。

ORB-SLAM2 在线构建稠密点云(一)_熊猫飞天的博客-CSDN博客

有一系列文章,这里只列出一个

我在编译这个ORB_SLAM2_PointCloud遇到了一些问题

首先是pcl要求的版本必须要c++14及以上,所以我在CMakeList.txt里直接指定版本为c++14

但是又出现问题:

1.

/home/wangxudong/ORB_SLAM2_PointCloud/src/pointcloudmapping.cc:487:47: error: ‘void pcl::Registration<PointSource, PointTarget, Scalar>::setInputCloud(const PointCloudSourceConstPtr&) [with PointSource = pcl::PointNormal; PointTarget = pcl::PointNormal; Scalar = float; pcl::Registration<PointSource, PointTarget, Scalar>::PointCloudSourceConstPtr = std::shared_ptr<const pcl::PointCloud<pcl::PointNormal> >]’ is private within this context487 |     reg.setInputCloud (points_with_normals_src);

 这个错误是因为 setInputCloud() 方法在 PCL 库中被声明为私有方法。为了解决这个问题,你需要更改代码以使用公共的 setInputSource() 方法。将pointcloudmapping.cc 文件中的第 487 行 ---chatgpt

2.

/home/wangxudong/ORB_SLAM2_PointCloud/src/pointcloudmapping.cc:43:47: error: expected primary-expression before ‘>’ token43 |     Part_tem = boost::make_shared< PointCloud >( );

将boost直接改成std

确保使用正确的命名空间。PointCloud 类应该使pcl::PointCloud<pcl::PointXYZRGBA> 类型,而不是简写

Part_tem = boost::make_shared< PointCloud >( );

替换为:

Part_tem = boost::make_shared< pcl::PointCloud<pcl::PointXYZRGBA> >( );

完事应该就编译过了

跑一个实例,运行起来没啥问题,但是保存时出现问题了

3.

terminate called after throwing an instance of 'pcl::IOException'what():  : [pcl::PCDWriter::writeASCII] Could not open file for writing!
已放弃 (核心已转储)

额额原来我保存pcd文件的路径没有改还是人家的!!!这不报错才怪,改了之后就OK了

我想的是要整个实时的稠密点云重建,所以需要编译ros'版本的,继续跟着这个博主熊猫飞天 搞事情 ,哈哈

首先让我下载ORB-SLAM2 修改后的代码 必须切换到V1.0.0这个分支,注意master分支是原版的ORB-SLAM2

下载了后 编译报了个小错

4.

/usr/include/c++/9/bits/stl_map.h:122:71: error: static assertion failed: std::map must have the same value_type as its allocator122 |       static_assert(is_same<typename _Alloc::value_type, value_type>::value,

小问题  换成KeyFrame* const 就好了

编译ros版本 ./build_ros.sh  出错

5.

make[2]: *** 没有规则可制作目标“../../../../lib/libboost_system.so”,由“../indemind” 需求。 停止。
make[2]: *** 没有规则可制作目标“../../../../lib/libboost_system.so”,由“../RGBD” 需求。 停止。
make[2]: *** 正在等待未完成的任务....
make[2]: *** 正在等待未完成的任务....
make[2]: *** 没有规则可制作目标“../../../../lib/libboost_system.so”,由“../Mono” 需求。 停止。
make[2]: *** 正在等待未完成的任务....
make[2]: *** 没有规则可制作目标“../../../../lib/libboost_system.so”,由“../MonoAR” 需求。 停止。

看起来与博主说的一样,是boost库的问题

set(LIBS 
${OpenCV_LIBS} 
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
-lboost_system

加上去就好了

随后出现了opencv版本问题了,我丢

6.

/usr/bin/ld: warning: libopencv_imgcodecs.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.3.4
/usr/bin/ld: warning: libopencv_imgproc.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_imgproc.so.3.4
/usr/bin/ld: warning: libopencv_core.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_core.so.3.4
/usr/bin/ld: CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: undefined reference to symbol '_ZNK2cv8FileNodecviEv'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libopencv_core.so.4.2.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

这就是一个opencv版本的问题,我决定都用cv4.2版本的,因为20.04安装的ros-noetic里带的好像是4.2,为了避免后期有问题,换成一样的。

因此指定  find_package(OpenCV 4 QUIET) 完事先编译 ./build.sh

结果会出错

6.1

/Examples/Monocular/mono_euroc.cc: In function ‘int main(int, char**)’:
/home/wangxudong/ORB_SLAM2_rosPointcloud/Examples/Monocular/mono_euroc.cc:73:48: error: ‘CV_LOAD_IMAGE_UNCHANGED’ was not declared in this scope73 |         im = cv::imread(vstrImageFilenames[ni],CV_LOAD_IMAGE_UNCHANGED);

在 OpenCV 4 中,CV_LOAD_IMAGE_UNCHANGED 被弃用了,取而代之的是 cv::IMREAD_UNCHANGED。要解决这个问题,你需要在代码中将所有的 CV_LOAD_IMAGE_UNCHANGED 替换为 cv::IMREAD_UNCHANGED  --chatgpt

找到出这个错的部分,都改一下,就可以用opencv4的版本了,注意dbow里边依赖的opencv版本也要修改一下。

现在 ./build.sh 可以通过,将ros版本里指定opencv也指定 opencv4 就好了

运行rgbd模式发现怎么没有画面???其实有画面,但是跟想象的不一样,没有地图点啥的,如下图

也算是成功了,下边就要考虑稠密建图

将博主说的 pointcloud_mapping 功能包clone下来,编译的时候汇报一些错误

如果pcl版本稍高,那么只支持c++14及以上的,需要在CMakeList.txt文件中指定成c++14

然后报错

7.

/home/wangxudong/catkin_ws/src/publish_pointcloud/src/publish_pointcloud.cpp:20:9: fatal error: pcl_conversions/pcl_conversions.h: 没有那个文件或目录20 | #include<pcl_conversions/pcl_conversions.h>|         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [publish_pointcloud/CMakeFiles/publish_pointcloud.dir/build.make:63:publish_pointcloud/CMakeFiles/publish_pointcloud.dir/src/publish_pointcloud.cpp.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:831:publish_pointcloud/CMakeFiles/publish_pointcloud.dir/all] 错误 2
make[1]: *** 正在等待未完成的任务....
/home/wangxudong/catkin_ws/src/pointcloud_mapping/src/pointcloud_mapping.cpp:31:10: fatal error: pcl_conversions/pcl_conversions.h: 没有那个文件或目录31 | #include <pcl_conversions/pcl_conversions.h>

原来是我没有安装pcl_conversions

执行命令

sudo apt-get install ros-noetic-pcl-conversions

问题解决,再次编译报另一个错误

8.

/home/wangxudong/catkin_ws/src/pointcloud_mapping/src/mappingWithPointCloud.cpp:232:48: error: no match for ‘operator=’ (operand types are ‘pcl::PointCloud<pcl::PointXYZRGBA>::Ptr’ {aka ‘std::shared_ptr<pcl::PointCloud<pcl::PointXYZRGBA> >’} and ‘boost::detail::sp_if_not_array<pcl::PointCloud<pcl::PointXYZRGBA> >::type’ {aka ‘boost::shared_ptr<pcl::PointCloud<pcl::PointXYZRGBA> >’})232 |  globalMap = boost::make_shared< PointCloud >( );

只要是报这种错的,我都先把boost换成std了,不知道会不会有什么问题,暂时OK,再次编译

9.

/usr/bin/ld: warning: libopencv_imgproc.so.4.2, needed by /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.4.2.0, may conflict with libopencv_imgproc.so.3.4
/usr/bin/ld: warning: libopencv_core.so.3.4, needed by /usr/local/lib/libopencv_imgproc.so.3.4.15, may conflict with libopencv_core.so.4.2

版本不对,因此我将依赖opencv的功能包里边的CMakeLists.txt 文件都设定了一下

find_package(OpenCV 4 REQUIRED)

目前主要有两个功能包分别是 pointcloud_mapping publish_pointcloud

publish_pointcloud功能包是可以将 ./pcd文件转化为八叉树地图

pointcloud_mapping 功能包利用接收ORB-SLAM2输出的位姿和关键帧这两个话题进行建图

按照指令运行后,发现稠密建图和八叉树地图模块根本没有任何动静,怀疑可能是topic没有对上之类的问题,但是我有一个疑问,我运行

rosrun ORB_SLAM2 RGBD Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM2/TUM1_ROSbag.yaml  根本没有任何topic发出啊???

按我的理解是,改变后的ORB_SLAM2会接收rosbag包里的然后发出 /camera/depth/image /camera/rgb/image_color

发出 位姿和点云的topic 然后 pointcloud_mapping功能包才能将信息用起来进行稠密建图和八叉树地图,可是我发现

检查了一下应该是pointcloud_mapping功能包的问题

我首先运行命令

1. rosrun ORB_SLAM2 astra Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM2/TUM2_ROSbag.yaml2. roslaunch pointcloud_mapping tum2.launch3. rosbag play rgbd_dataset_freiburg2_rpy.bag /camera/rgb/image_color:=/camera/rgb/image_raw /camera/depth/image:=/camera/depth/image

ORB进程没啥问题,但是 运行 第二个命令时没事

只要我运行了第三个命令,播放bag包 第二个命令窗口就会报错

10.

[pointcloud_mapping-1] process has died [pid 114920, exit code -11, cmd /home/wangxudong/catkin_ws/devel/lib/pointcloud_mapping/pointcloud_mapping __name:=pointcloud_mapping __log:=/home/wangxudong/.ros/log/a85f26a4-df7c-11ed-a4b7-8fa2f7d32c47/pointcloud_mapping-1.log].
log file: /home/wangxudong/.ros/log/a85f26a4-df7c-11ed-a4b7-8fa2f7d32c47/pointcloud_mapping-1*.log
^C[rviz-3] killing on exit
[octomap_server-2] killing on exit

但是有时候又能运行一两帧才报错,不知道为啥(其实就只看到了一次稠密图运行了一帧)

不知道啥原因啊

有一次完整的运行了,但是在运行就又不行了,暂时先放置一下这个问题,应该是内存问题

记住每次运行都要 source

 export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:~/ORB_SLAM2_rosPointcloud/Examples/ROS/ORB_SLAM2source ~/catkin_ws/devel/setup.bash

 先去解决开题的事了

这篇关于slam稠密建图以及构建octomap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

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

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

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

一、什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的。停工时间,就是不能向用户提供服务的时间。高可用,就是系统具有高度可用性,尽量减少停工时间。如何用最简单的方法来搭建一个高效率可用的服务端JAVA呢? 停工的原因一般有: 服务器故障。例如服务器宕机,服务器网络出现问题,机房或者机架出现问题等;访问量急剧上升,导致服务器压力过大导致访问量急剧上升的原因;时间和

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简