Ubuntu20.04系统安装ROS noetic(含Gazebo11)、安装ORB-SLAM2,并在此基础上实现基于ROS与Gazebo的ORB-SLAM2测试。
Part1:ROS、ORB-SLAM2安装
如果只是使用ORB-SLAM2进行数据集或摄像头实时采集的数据测试,那么安装ORB-SLAM2非常简单,这里重点介绍支持ROS的ORB-SLAM2安装。
ROS集成了很多SLAM所需的库,在Ubuntu20.04系统上,ROS noetic集成了较高版本的库,如OpenCV4.2.0,PCL-1.10.0,以及高版本的Boost、Egien3等,所以只要安装该版本操作系统下的ROS就不需要过于麻烦的安装各种库。下面介绍如何安装ROS:
(1)设置sources.list
设置电脑以安装来自packages.ros.org的软件。
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
若下载速度缓慢,推荐就近选择一个镜像源替换上面的命令。例如,Tsinghua University为:
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
(2)设置密钥
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
若无法连接到密钥服务器,可以尝试替换上面命令中的 hkp://keyserver.ubuntu.com:80
为 hkp://pgp.mit.edu:80
。
(3)进行安装
首先,确保你的Debian软件包索引是最新的:
sudo apt update
然后选择你想安装的ROS:
完整桌面版安装(Desktop-Full):除了桌面版的全部组件外,还包括2D/3D模拟器(simulator)和2D/3D 感知包(perception package),以及Gazebo11(强力推荐)。
sudo apt install ros-noetic-desktop-full
桌面版(Desktop):包括了ROS-Base的全部组件,还有一些工具,比如rqt和rviz。
sudo apt install ros-noetic-desktop
ROS-Base(仅含骨架):ROS packaging,build,和communication库。没有图形界面(GUI)工具。
sudo apt install ros-noetic-ros-base
在ROS中还有更多可用的软件包。你可以直接安装一个特定的软件包。
sudo apt install ros-noetic-PACKAGE
例如,sudo apt install ros-noetic-slam-gmapping
,要查看或搜索所有可用的软件包,请参见ROS Index或使用:
apt search ros-noetic
(4)设置环境
在使用ROS的每个bash终端中source这个脚本。
source /opt/ros/noetic/setup.bash
每次source工作空间比较麻烦,为了每次启动新的终端窗口时自动source工作空间,可以打开终端执行命令:
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
并再次输入命令:
source ~/.bashrc
如果同时安装了好几个ROS发行版,~/.bashrc只会生效你当前使用的这个版本的setup.bash。
(5)构建包的依赖关系
到此已经安装了运行核心ROS包所需的程序。创建和管理ROS工作区,有不同的工具和需求是独立分布的。例如,rosinstall
是一个经常使用的命令行工具,能够使用一个命令轻松地下载ROS包的许多源树。
为安装此工具和构建ROS包的其他依赖项,可运行命令:
sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
在使用许多ROS工具之前,需要初始化rosdep。rosdep能够轻松地安装要编译的源代码的系统依赖项,并且是ROS运行核心组件所必需的。可执行以下步骤安装。
sudo apt install python3-rosdep
初始化rosdep:
sudo rosdep init
rosdep update
(6)ROS教程
参考:ROS教程
配置前需要下载cmake、gcc、g++和Git工具。
(1)下载cmake
sudo apt-get install cmake
(2)下载git
sudo apt-get install git
(3)下载gcc和g++
sudo apt-get install gcc g++
(4)安装Pangolin
推荐Pangolin V0.6版本,参考
(5)安装OpenCV
由于使用Ubuntu20.04,推荐OpenCV 4.2版本(ROS noetic full版本中已安装)
(6)安装Eigen
ROS noetic full版本中已安装
由于需要在ROS环境下运行ORB-SLAM2,所以必须将ORB-SLAM2和机器人的pack文件放置在同一个ROS工作区的src目录下,具体步骤为:
(1)在home/cx/cxapp下创建工作区:
mkdir -p ~/cxapp/catkin_ws/src
(2)进入ROS工作区的src文件夹:
cd ./cxapp/catkin_ws/src/
(3)下载安装ORB_SLAM2
将其下载到/cxapp/catkin_ws/src目录下:
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
(友情提示:如果git clone下载不下来,可以考虑首先将git clone的内容转到Gitee,然后再下载,具体方法自行百度)
(4)进入ORB_SLAM2文件夹:
cd ORB_SLAM2
(5)给build.sh文件权限:
chmod +x ./build.sh
(6)编译build.sh文件:
./build.sh
(7)因为需要在ROS环境下运行ORB_SLAM2,所以需要继续执行下面三条命令:
首先在/home/cx/cxapp/catkin_ws/src/ORB_SLAM2目录下打开终端,执行命令:
chmod +x build_ros.sh
然后将包含Examples/ROS/ORB_SLAM2的path添加到ROS_PACKAGE_PATH环境变量。打开第二个终端,执行gedit ~/.bashrc
打开.bashrc文件并在底部添加:
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/cx/cxapp/catkin_ws/src/ORB_SLAM2/Examples/ROS
最后在/home/cx/cxapp/catkin_ws/src/ORB_SLAM2目录下打开第三个终端,执行命令:
./build_ros.sh
(8)进入cxapp/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2文件目录,执行下列指令:
make
编译过程可能会有点慢,耐心等待哦。这里也可以使用make -j、make -j4、make -j8等命令速度会稍快一些,-j 后的的数字代表线程。但如果电脑性能不佳,可以把build.sh文件和build_ros.sh文件中的最后一句命令make -j 改为make。
1.ORB_SLAM2/src/System.cc: error: ‘usleep’ was not declared in this scope usleep(5000);
解决方案:
找到对应的System.cc文件的首部加入头文件
#include<unistd.h>
需要根据实际情况,提示哪个文件usleep有问题,就去加这个头文件。
需要增加unistd.h的文件还有:
Examples/Monocular/mono_euroc.cc
Examples/Monocular/mono_kitti.cc
Examples/Monocular/mono_tum.cc
Examples/RGB-D/rgbd_tum.cc
Examples/Stereo/stereo_euroc.cc
Examples/Stereo/stereo_kitti.cc
src/LocalMapping.cc
src/LoopClosing.cc
src/System.cc
src/Tracking.cc
src/Viewer.cc
参考教程:https://blog.csdn.net/qq_15698613/article/details/98453592
2.CMakeFiles/RGBD.dir/build.make:197: recipe for target ‘…/RGBD’ failed
解决方案:
修改catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/文件夹下的CMakeLists.txt文件,将下面代码:
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
)
修改为:
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
)
仅在后面增加了一句:-lboost_system。再次运行:
chmod +x build_ros.sh
./build_ros.sh
3.ORB-SLAM工程出了很长时间,但一直没有更新,这导致一些代码并不适合一些高版本的依赖比如opencv4.2等。
(1)首先介绍如何将OpenCV的版本替换成4.0以上版本,解决方法为将catkin_ws/src/ORB_SLAM2目录下的CMakeList.txt文件修改为:
find_package(OpenCV 4.0 QUIET)
if(NOT OpenCV_FOUND)
find_package(OpenCV 2.4.3 QUIET)
if(NOT OpenCV_FOUND)
message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
endif()
endif()
(2)出现error: ‘CV_LOAD_IMAGE_UNCHANGED’ was not declared in this scope报错,这是因为OpenCV高版本弃用了CV_LOAD_IMAGE_UNCHANGED,所以需要将其修改,解决方法为:
首先在报错.cc文件的代码头文件下面添加命名空间:
using namespace cv;
然后,将CV_LOAD_IMAGE_UNCHANGED全部换成IMREAD_UNCHANGED
4.其他报错
参考:
报错参考1
报错参考2
报错参考3