如何使用 OAK 通过视觉 SLAM 执行定位

如何使用 OAK 通过视觉 SLAM 执行定位

视觉同步定位和测绘(SLAM)正迅速成为嵌入式视觉的一个重要进展,有许多不同的可能应用。从商业上讲,这项技术仍处于起步阶段。然而,这是一项很有前途的创新,它解决了其他视觉和导航系统的缺点,具有巨大的商业潜力。

视觉SLAM是一种特殊类型的SLAM系统,当环境和传感器的位置都不知道时,利用3D视觉来执行定位和绘图功能。如果你想了解更多关于VSLAM的信息,如视觉SLAM技术是如何工作的,你可以点击这里!

关于OAK的更多信息,你可以到这里来!

现在让我们来学习如何使用OAK来进行视觉SLAM的定位。

1.下载并安装depthai-core

cd ~
mkdir oak
cd ~/oak
git clone --recursive https://github.com/luxonis/depthai-core.git --branch ros2-main-gen2
cd depthai-core
mkdir build && cd build
cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=/usr/local ..
make -j4
sudo make install

2.创建ROS工作区并下载代码

cd ~/oak
mkdir -p ros_workspace/src
cd ~/oak/ros_workspace
wget https://raw.githubusercontent.com/luxonis/depthai-ros/noetic-devel/underlay.repos
vcs import src < underlay.repos
rosdep install --from-paths src --ignore-src -r -y

3.升级cmake

cd ~
wget http://www.cmake.org/files/v3.17/cmake-3.17.2.tar.gz
tar xf cmake-3.17.2.tar.gz
cd cmake-3.17.2
./configure
make -j4
sudo make install
sudo update-alternatives --install /usr/bin/cmake cmake /usr/local/bin/cmake 1 --force
cmake --version

4.编译代码

cd  ~/oak/ros_workspace
sudo apt install python3-vcstool
catkin_make
source devel/setup.bash
# add the setup.bash address
# address :source ~/oak/ros_workspace/devel/setup.bash
gedit ~/.bashrc
source ~/.bashrc

5.运行VINS_GPU算法

5.1  安装 Eigen3.3.90

git clone https://github.com/eigenteam/eigen-git-mirror
cd eigen-git-mirror
mkdir build && cd build
cmake ..
sudo make install

5.2 安装 Ceres2

sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev
git clone https://ceres-solver.googlesource.com/ceres-solver
cd ceres-solver
mkdir build && cd build
cmake ..
make -j4
sudo make install

5.3 安装 Opencv3.4.14

  • 安装 OpenCV 相关的依赖
sudo apt-get install build-essential pkg-config
sudo apt-get install cmake libavcodec-dev libavformat-dev libavutil-dev libglew-dev libgtk2.0-dev libgtk-3-dev libjpeg-dev libpng-dev libpostproc-dev libswscale-dev libtbb-dev libtiff5-dev libv4l-dev libxvidcore-dev libx264-dev qt5-default zlib1g-dev libgl1 libglvnd-dev pkg-config libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev mesa-utils
sudo apt-get install python2.7-dev python3-dev python-numpy python3-numpy
  • 解决 OpenGL 冲突
cd /usr/lib/aarch64-linux-gnu/
sudo ln -sf libGL.so.1.0.0 libGL.so
sudo gedit /usr/local/cuda/include/cuda_gl_interop.h
# Comment (line #62~68) of cuda_gl_interop.h
//#if defined(__arm__) || defined(__aarch64__)
//#ifndef GL_VERSION
//#error Please include the appropriate gl headers before including cuda_gl_interop.h
//#endif
//#else
#include <GL/gl.h>
//#endif
  • 查看你使用的Jetson的计算能力
cd /usr/local/cuda/samples/1_Utilities/deviceQuery
sudo make
sudo ./deviceQuery

执行后出现以下信息,Jetson NX 安装的 Cuda 版本为10.2,计算能力版本为7.2。

  • 编译和安装OpenCV建议你在主目录下安装OpenCV。点击这里下载OpenCV,并在主目录下解压。注意:当你执行cmake的命令行时,将CUDA_ARCH_BIN改为你自己平台的计算能力版本,NX平台是7.2。
cd ~/opencv-3.4.14
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON -D CUDA_ARCH_BIN=7.2 -D CUDA_ARCH_PTX="" -D ENABLE_FAST_MATH=ON -D CUDA_FAST_MATH=ON -D WITH_CUBLAS=ON -D WITH_LIBV4L=ON -D WITH_GSTREAMER=ON -D WITH_GSTREAMER_0_10=OFF -D WITH_QT=ON -D WITH_OPENGL=ON -D CUDA_NVCC_FLAGS="--expt-relaxed-constexpr" -D WITH_TBB=ON ..
make -j4

5.4 编译和安装cv_bridge

cd ~/oak
git clone https://github.com/ArduCAM/OAK_Nvidia_Jetson_ROS_SLAM_VINS.git
cd ~/oak/OAK_Nvidia_Jetson_ROS_SLAM_VINS/cv_bridge_melodic  
catkin_make
source devel/setup.bash
# add setup.bash address as the following figure
gedit ~/.bashrc
source ~/.bashrc  

5.5 编译VINS_GPU算法

cd ~/oak/OAK_Nvidia_Jetson_ROS_SLAM_VINS/VINS_GPU
catkin_make
#Add bash file
source devel/setup.bash
#Add setup.bash directory
gedit ~/.bashrc
source ~/.bashrc

5.6 运行VINS_GPU算法

roslaunch vins oak.launch   # Enable OAK
rosrun vins vins_node ~/oak/OAK_Nvidia_Jetson_ROS_SLAM_VINS/VINS_GPU/src/VINS-GPU/config/oak/oak.yaml
roslaunch vins vins_rviz.launch

6.故障排除

integer_sequence_algorithm.h:64:21:error:‘integer_sequence’ is not a member of  ‘std’

由于cmake的版本不同,用于指定C++的命令也不同。

要使用本文中的cmake 3.17.2,相应的命令是: set(CMAKE_CXX_STANDARD 11)