# 大疆无人机M300的立体视觉和深度感知功能 **Repository Path**: R_Breath/DJI_M300 ## Basic Information - **Project Name**: 大疆无人机M300的立体视觉和深度感知功能 - **Description**: 解决在使用大疆无人机M300立体视觉和深度感知功能中遇到的一系列问题,包括:1.带有CUDA的Opencv库的编译与安装。2.Ros包DJI_M300_ws中CMakeLists.txt文件的修改。 - **Primary Language**: C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-07-17 - **Last Updated**: 2023-09-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 大疆无人机M300立体视觉与深度感知功能的基本环境搭建 ## 介绍 解决在使用大疆无人机M300立体视觉和深度感知功能中遇到的一系列问题,包括: 1. 带有CUDA的Opencv库的编译与安装。 2. Ros包DJI_M300_ws中CMakeLists.txt文件的修改。 3. 节点stereo_vision_depth_perception_node中深度相机的yaml文件路径修改 ## 开发平台与基本环境 1. Jetson Xavier NX 2. Ros Noetic 3. Onboard SDK 目前能够在不使用无人机高级视觉功能的前提下,成功编译开源Ros功能包Onboard-SDK-ROS与开发工具包Onboard-SDK。能够开启dji_vehicle_node完成对无人机的基本运动控制。 ## 解决的问题 ### 问题一:无法打开源文件"opencv2/viz/viz3d.hpp" 报错可能是因为NX板中自带的Opencv库是不支持使用CUDA加速的。可以通过jtop查看环境中的opencv。 由于题主已经配置好了支持CUDA加速的Opencv库,因此jtop中显示的是Opencv with CUDA。 ![在jtop中查看Opencv环境](DJI_M3002023-07-21%2010-06-01%20%E7%9A%84%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE.png) #### 解决方法 ##### 步骤一:在官网下载Opencv和opencv_contrib源码 opencv下载地址:[https://opencv.org/releases/page/3/](https://opencv.org/releases/page/3/) opencv_contrib下载地址:[https://www.github.com/opencv/opencv_contrib/tree/4.5.4](https://www.github.com/opencv/opencv_contrib/tree/4.5.4) 下载好源码后,将解压过后的opencv_contrib文件夹放入opencv文件夹中。 下载相关依赖: ``` sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev ``` ##### 步骤二:编译opencv库 在opencv根目录下打开终端,输入以下指令编译opencv库: ``` mkdir build cd build cmake -DCMAKE_BUILD_TYPE=RELEASE \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.5.4/modules .. \ -DWITH_CUDA=1 \ -DWITH_CUDNN=ON \ -DOPENCV_DNN_CUDA=ON \ -DENABLE_FAST_MATH=ON \ -DCUDA_FAST_MATH=ON \ -DWITH_CUBLAS=1 \ -DOPENCV_GENERATE_PKGCONFIG=1 \ -DCUDA_GENERATION=Auto -DCUDA_ARCH_BIN=7.2 .. sudo make -j8 make install ``` 需要注意: 1. OPENCV_EXTRA_MODULES_PATH的路径为opencv_contrib文件夹的位置。 2. DCUDA_GENERATION为开发板上CUDA的架构,选择Auto时opencv在编译时会自动检测CUDA架构。 3. !!!!!!DCUDA_ARCH_BIN为开发板上显卡CUDA算力,这个值必须与实际算力一模一样(实际的CUDA_ARCH_BIN能在jtop中看到),多或少都不行(如果算力与实际值不同,编译不会出错,但在后续运行时应该会报错error:(-217:Gpu API call))。 第三点尤其需要注意,由于Opencv的编译非常耗时麻烦,在编译前一定要好好检查Cmake ..中的详细编译信息,编译信息中的NVIDIA GPU arch必须要等于10*CUDA_ARCH_BIN。 ![Cmake中的详细编译信息](DJI_M300cmake%E4%B8%AD%E7%9A%84%E7%BC%96%E8%AF%91%E4%BF%A1%E6%81%AF.png) ### 问题二:编译Ros功能包Onboard-OSDK-ROS时找不到Opencv等相关文件,不编译depth perception node 使用指令catkin make编译ROS功能包,在编译过程中终端显示: ``` Did not find required libraries, stereo vision depth perception node will not be compiled ``` 这是由于大疆开源Ros功能包Onboard-SDK-ROS在编译时cmake会检测NX板当前环境是否能够编译与高级视觉功能相关的cpp文件(需要opencv中的viz3d.hpp和disparity_filter.hpp)。这需要我们修改ROS功能包中的CMakeLists.txt文件,使cmake能够检测到我们编译好的Opencv库。 #### 解决方法 ##### 步骤一:修改Onboard-SDK-ROS中的CMakeLists.txt文件 找到~/DJI-M300_ws/src/Onboard-SDK-ROS/src/dji_osdk_ros/modules路径下的CMakeLists.txt文件,在find_path中添加文件disparity_filter.hpp和viz3d.hpp的正确路径,题主的路径如下: /usr/local/include/opencv4/opencv2/ximgproc /usr/local/include/opencv4/opencv2/viz 再修改find_package中Opencv版本号(36行)为自己电脑当前Opencv的版本号,如下: 原:find_package( OpenCV 3.3.0 REQUIRED) 改:find_package( OpenCV 4.5.4 REQUIRED) ##### 步骤二:修改Onboard-SDK中的CMakeList.txt文件 找到~/Onboard-SDK/sample/platform/linux/advanced-sensing/stereo_vision_depth_perception_sample路径下的CMakeLists.txt文件,与步骤一相同,添加文件bisparity_filter.hpp和viz3d.hpp的正确路径,并修改find_package中Opencv版本号。 ##### 步骤三:重新编译Onboard-SDK和Onboard-SDK-ROS 删除Onboard-SDK中的build文件夹,打开终端到当前路径下,输入如下指令编译Onboard-SDK: ``` sudo mkdir build cd build cmake .. sudo make -j6 install ``` 打开终端到路径~/DJI-M300_ws下,输入如下指令编译Onboard-SDK-ROS功能包: ``` catkin_make ``` 最终编译后的结果为: ![cmake ..后编译结果图](DJI_M3002023-07-17%2016-48-52%20%E7%9A%84%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE.png) ![ROS功能包的编译结果](DJI_M3002023-07-18%2010-09-16%20%E7%9A%84%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE.png) ### 问题三:运行节点stereo_vision_depth_perception_node时failed to open yaml文件 可以看到运行时抛出错误failed to open m300_front_stereo_param.yaml文件,段错误。 ![无法打开yaml文件](DJI_M300q.png) 这是由于在运行节点stereo_vision_depth_perception_node时程序会首先向大疆无人机发送get_m300_stereo_params_client的服务请求,当获得m300上深度相机的参数信息后,程序会将其写进文件m300_front_stereo_param.yaml中,之后用opencv进行一系列图像操作时,都会使用这个yaml文件中的参数信息。因此我们需要在文件stereo_vision_depth_perception_node.cpp中的第35行修改yaml文件的宏定义文件路径。 #### 解决方法 ##### 步骤一:在文件stereo_vision_depth_perception_node.cpp中修改yaml文件的宏定义文件路径 原35: #define M300_FRONT_STEREO_PARAM_YAML_NAME "m300_front_stereo_param.yaml" 改35: #define M300_FRONT_STEREO_PARAM_YAML_NAME "m300_front_stereo_param.yaml的实际文件路径" 题主写入的m300_front_stereo_param.yaml文件在.ROS/文件目录下。 ## 运行结果 运行stereo_vision_depth_perception_node节点后进入选项界面,如下图: ![深度视觉节点的选项界面](DJI_M3002023-07-21%2010-56-16%20%E7%9A%84%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE.png) 显示的点云图界面,如下图: ![节点画出的点云图](DJI_M3002023-07-21%2010-56-53%20%E7%9A%84%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE.png)