本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!