无人机在做自主运动规划前一定要知道自己周围有哪些障碍物,以及这些障碍物的形状大致如何,这是它能自主行动的前提。本篇将介绍在XTDrone仿真平台下,如何使用开源代码ORB_SLAM3开启视觉SLAM。XTDrone环境搭建见链接,不再赘述。

ORB_SLAM3

下载ORB_SLAM3开源代码

cd ~/catkin_xtdrone_ws/src/
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3

复制XTDrone相关文件到ORB_SLAM3中

cp ~/XTDrone/sensing/slam/vslam/ORB_SLAM3/Examples_old/Stereo/px4_sitl.yaml ~/catkin_xtdrone_ws/src/ORB_SLAM3/Examples_old/Stereo/
cp ~/XTDrone/sensing/slam/vslam/ORB_SLAM3/Examples_old/Stereo-Inertial/px4_sitl.yaml ~/catkin_xtdrone_ws/src/ORB_SLAM3/Examples_old/Stereo-Inertial/
cp ~/XTDrone/sensing/slam/vslam/ORB_SLAM3/xtdrone* ~/catkin_xtdrone_ws/scripts/

若依赖齐全,则可以直接进行编译

cd ~/catkin_xtdrone_ws/src/ORB_SLAM3/
chmod +x build.sh
./build.sh
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/catkin_xtdrone_ws/src/ORB_SLAM3/Examples_old/ROS #将这句放到~/.bashrc中,以后使用更方便
chmod +x build_ros.sh
./build_ros.sh
#假如编译全部通过,那就说明所有东西都整好了,本篇结束

各种依赖包

建立tools文件夹用于存放一系列依赖包

cd ~/catkin_xtdrone_ws/src/ORB_SLAM3/
mkdir tools
cd tools

OpenCV

如果完整安装过ros:noetic则可以不用管OpenCV,它会自动安装opencv4.2.0,假如没安装则自行下载开源代码进行安装即可。

Eigen3

单击链接前往官方页面进行下载(建议安装Eigen3.3.7版本):Eigen3

tar -xzvf eigen-3.x.x.tar.gz

编译安装

cd eigen-3.x.x
mkdir build
cd build
cmake ..
make
sudo make install

将Eigen头文件复制到/usr/local/include/

sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include

Python

可能有部分编译过程需要用到python2,输入指令进行安装

sudo apt install libpython2.7-dev

Pangolin

Pangolin的安装依然是选择源码编译安装(建议安装Pangolin0.6版本)

git clone --recursive https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
./scripts/install_prerequisites.sh recommended
mkdir build
cd build
cmake .. -DPython_EXECUTABLE=`which python3`
make -j
sudo make install

如果碰到'catch2'相关报错,则手动安装catch2

git clone https://github.com/catchorg/Catch2.git
cd Catch2
mkdir build
cd build
cmake ..
make -j
sudo make install

ORB_SLAM3安装问题汇总

1、报错error: ‘slots_reference’ was not declared in this scope

这是c++11的问题,改成c++14进行编译:

cd ~/catkin_xtdrone_ws/src/ORB_SLAM3/
sed -i 's/++11/++14/g' CMakeLists.txt
sed -i 's/++11/++14/g' Thirdparty/DBoW2/CMakeLists.txt
sed -i 's/++11/++14/g' Thirdparty/g2o/CMakeLists.txt
sed -i 's/++11/++14/g' Thirdparty/Sophus/CMakeLists.txt

2、报错opencv cannot find或类似问题

可能是版本对不上,将上面(第1小点)所有能看到的CMaktLists.txt中关于find_package(OpenCV)的部分全部改为find_package(OpenCV 4.2)

3、报错Eigen3相关问题

可能是模块加载问题,ORB_SLAM3不需要用到Eigen3的模块,因此禁用模块即可,将上面(第1小点)所有能看到的CMakeLists.txt中关于find_package(Eigen3 3.1.0 REQUIRED)改为find_package(Eigen3 3.1.0 REQUIRED NO_MODULE)

4、报错:cv::Mat Tcw = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());相关问题

修改~/catkin_xtdrone_ws/src/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc

// cv::Mat Tcw = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
    cv::Mat Tcw;
    Sophus::SE3f Tcw_SE3f = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
    Eigen::Matrix4f Tcw_Matrix = Tcw_SE3f.matrix();
    cv::eigen2cv(Tcw_Matrix, Tcw);

5、报错vPoints.push_back(pMP->GetWorldPos());相关问题

修改~/catkin_xtdrone_ws/src/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc

// vPoints.push_back(pMP->GetWorldPos());
   cv::Mat WorldPos;
   cv::eigen2cv(pMP->GetWorldPos(), WorldPos);
   vPoints.push_back(WorldPos);
   vPointMP.push_back(pMP);

6、报错cv::Mat Xw = pMP->GetWorldPos();相关问题

修改~/catkin_xtdrone_ws/src/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc

// cv::Mat Xw = pMP->GetWorldPos();
   cv::Mat Xw;
   cv::eigen2cv(pMP->GetWorldPos(), Xw);

7、报错error: ‘eigen2cv’ is not a member of ‘cv’

修改~/catkin_xtdrone_ws/src/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.h添加头文件

#include <Eigen/Dense>
#include <opencv2/core/eigen.hpp>
#include <opencv2/opencv.hpp>

8、build_ros.sh过程报错

修改build_ros.sh为

echo "Building ROS nodes"

cd Examples_old/ROS/ORB_SLAM3
mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make -j

然后重新运行./build_ros.sh即可。

9、报错fatal error: sophus/se3.hpp: No such file or directory

Sophus没有安装,进行安装即可

cd ~/catkin_xtdrone_ws/src/ORB_SLAM3/Thirdparty/Sophus/build
sudo make install

运行视觉SLAM

运行前需要做一些准备

cd ~/catkin_xtdrone_ws/scripts

echo "rosrun ORB_SLAM3 Stereo ~/catkin_xtdrone_ws/src/ORB_SLAM3/Vocabulary/ORBvoc.txt ~/catkin_xtdrone_ws/src/ORB_SLAM3/Examples_old/Stereo/px4_sitl.yaml true /camera/left/image_raw:=/$1_$2/stereo_camera/left/image_raw /camera/right/image_raw:=/$1_$2/stereo_camera/right/image_raw /orbslam3/vision_pose/pose:=/$1_$2/mavros/vision_pose/pose" > xtdrone_run_orbslam_stereo.sh
echo "rosrun ORB_SLAM3 Stereo_Inertial ~/catkin_xtdrone_ws/src/ORB_SLAM3/Vocabulary/ORBvoc.txt ~/catkin_xtdrone_ws/src/ORB_SLAM3/Examples_old/Stereo-Inertial/px4_sitl.yaml true /camera/left/image_raw:=/$1_$2/stereo_camera/left/image_raw /camera/right/image_raw:=/$1_$2/stereo_camera/right/image_raw /imu:=/$1_$2/imu_gazebo" > xtdrone_run_orbslam_stereo_inertial.sh

chmod +x xtdrone_run_orbslam_stereo.sh
chmod +x xtdrone_run_orbslam_stereo_inertial.sh

启动仿真

roslaunch px4 indoor1.launch

另起一个终端,进行视觉SLAM试验

cd ~/catkin_xtdrone_ws/scripts
sh xtdrone_run_orbslam_stereo.sh iris 0
# xtdrone_run_orbslam_stereo_inertial.sh用法相同,加入了惯性测量单元,理论上建图会更准确

运行效果

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐