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 context
  487 |     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 ‘>’ token
   43 |     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 allocator
  122 |       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 scope
   73 |         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.yaml

2. roslaunch pointcloud_mapping tum2.launch

3. 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_SLAM2


source ~/catkin_ws/devel/setup.bash

 先去解决开题的事了

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值