无人机避障——卡内基梅隆大学(CMU)CERLAB 无人机自主框架复现
CMU CERLAB 无人机自主框架代码:CMU CERLAB无人机自主框架
代码功能:这是一个多功能模块化的自主无人机 (UAV) 框架。该框架包含不同的组件(模拟器、感知、测绘、规划和控制),以实现自主导航、未知搜索和目标识别。
处理板:Orin NX
Installation Guide
安装依赖
sudo apt install ros-${ROS_DISTRO}-octomap* && sudo apt install ros-${ROS_DISTRO}-mavros* && sudo apt install ros-${ROS_DISTRO}-vision-msgs
克隆相关代码
mkdir -p cmu_uav/src
cd ~/cmu_uav/src
git clone --recursive https://github.com/Zhefan-Xu/CERLAB-UAV-Autonomy.git
转到仿真的分支:
cd /home/nvidia/cmu_uav/src/CERLAB-UAV-Autonomy/autonomous_flightgit checkout simulation
编译
cd ~/cmu_uav
catkin_make
编译报错
cv_bridge路径指定
报错onboard_detector没有检测到opencv,但是查看onboard_detector功能包的CMakeList.txt文件发现,其中包括了cv_bridge,怀疑是没有检测到cv_bridge的路径,因此将路径指定补全。
报错内容
/usr/bin/ld: /home/nvidia/cmu_uav/devel/lib/libonboard_detector.so: undefined reference to `cv::Mat::Mat()'
collect2: error: ld returned 1 exit status
make[2]: *** [CERLAB-UAV-Autonomy/onboard_detector/CMakeFiles/fake_detector_node.dir/build.make:262: /home/nvidia/cmu_uav/devel/lib/onboard_detector/fake_detector_node] Error 1
make[1]: *** [CMakeFiles/Makefile2:3421: CERLAB-UAV-Autonomy/onboard_detector/CMakeFiles/fake_detector_node.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 47%] Linking CXX executable /home/nvidia/cmu_uav/devel/lib/onboard_detector/detector_node
/usr/bin/ld: /home/nvidia/cmu_uav/devel/lib/libonboard_detector.so: undefined reference to `cv::Mat::Mat()'
collect2: error: ld returned 1 exit status
make[2]: *** [CERLAB-UAV-Autonomy/onboard_detector/CMakeFiles/detector_node.dir/build.make:262: /home/nvidia/cmu_uav/devel/lib/onboard_detector/detector_node] Error 1
make[1]: *** [CMakeFiles/Makefile2:3367: CERLAB-UAV-Autonomy/onboard_detector/CMakeFiles/detector_node.dir/all] Error 2
[ 48%] Linking CXX shared library /home/nvidia/cmu_uav/devel/lib/libmap_manager.so
[ 48%] Built target map_manager
make: *** [Makefile:141: all] Error 2
Invoking "make -j8 -l8" failed
解决办法
增加cv_bridge的路径:set(cv_bridge_DIR "/home/nvidia/cv_bridge_pkg/devel/share/cv_bridge/cmake"),因为我用的是自己下的4.6的cv_bridge,因此我直接增加这一条即可。相关opencv版本的安装见我的前面文章:无人机避障——感知篇(Orin nx采用zed2双目相机进行Vins-Fusion-GPU定位,再通过位姿和深度图建图完成实时感知)
cmake_minimum_required(VERSION 3.0.2)
project(onboard_detector)## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
set(CMAKE_CXX_FLAGS "-std=c++14 ${CMAKE_CXX_FLAGS} -O3 -Wall")## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
set(cv_bridge_DIR "/home/nvidia/cv_bridge_pkg/devel/share/cv_bridge/cmake")
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgscv_bridgemessage_filtersimage_transportvision_msgs
)
Opencv库版本冲突:
警告表明,链接器检测到项目中同时引用了两个不同版本的libopencv_features2d
库(4.2
版本和406
版本,其中406
对应 OpenCV 4.6)。
报错内容:
[ 73%] Linking CXX executable /home/nvidia/cmu_uav/devel/lib/global_planner/test_dep_node
/usr/bin/ld: warning: libopencv_features2d.so.4.2, needed by /home/nvidia/cmu_uav/devel/lib/libglobal_planner.so, may conflict with libopencv_features2d.so.406
[ 73%] Built target test_dep_node
[ 74%] Linking CXX shared library /home/nvidia/cmu_uav/devel/lib/libtrajectory_planner.so
[ 74%] Built target trajectory_plan
解决方法
由于4.2版本是ROS中自带的版本,4.6是我下载的版本,我更推荐使用4.6的opencv版本,因此在global_planner功能包的CMakeLists.txt文件中给opencv的版本进行指定,如下:
cmake_minimum_required(VERSION 3.0.2)
project(global_planner)## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
set(CMAKE_CXX_FLAGS "-std=c++14 ${CMAKE_CXX_FLAGS} -O3 -Wall")## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsoctomap_rosmap_manager
)
find_package(OpenCV 4.6 REQUIRED)
在find_package(OpenCV REQUIRED)增加4.6以指定版本,最后全部编译通过。
设置环境变量
将以下内容添加到~/.bashrc中:
source ~/realsense_ws/devel/setup.bash
source ~/cmu_uav/src/CERLAB-UAV-Autonomy/uav_simulator/gazeboSetup.bash
确定好仿真分支是采用代码提供的uav_simulator还是px4
cd /home/nvidia/cmu_uav/src/CERLAB-UAV-Autonomy/autonomous_flight
git branch
看星号在simulation上就是采用uav_simulator做仿真,在px4上就是采用px4做仿真。
自主导航demo运行
在运行launch代码前,由于自带的gazebo中的model没有包含代码中的person人的模型,因此将person人的模型从路径/home/nvidia/cmu_uav/src/CERLAB-UAV-Autonomy/uav_simulator/models复制到/home/nvidia/.gazebo/models,这样一个是能够快速打开gazebo,一个是不会出现几个人全部堆一块,站在无人机附近的情况出现。
如果还是出现这种情况,就重新添加下面两条指令在.bashrc文件里面:
source ~/realsense_ws/devel/setup.bash
source ~/cmu_uav/src/CERLAB-UAV-Autonomy/uav_simulator/gazeboSetup.bash多用source ~/.bashrc一下。
启动仿真环境:
roslaunch uav_simulator start.launch
出现问题的情况
异常情况!!!
进行过source的情况
正常情况。
启动rviz建图代码
roslaunch remote_control dynamic_navigation_rviz.launch
能看到飞机的模型就行
启动动态避障导航节点
[minSnapTraj]: No Desired Acceleration Parameter. Use default: 1.0 m/s^2.
[minSnapTraj]: Corridor Radius: 0.5 m.
[minSnapTraj]: Time out is set to: 0.1 s.
[minSnapTraj]: Corridor Resolution: 5
[minSnapTraj]: Shrinking Factor: 0.5
[minSnapTraj]: Sample Time: 0.1
[minSnapTraj]: Maximum Iteration Number: 10
[BsplineTraj]: timestep: 0.1 s.
[BsplineTraj]: Distance threshold: 0.5 m.
[BsplineTraj]: Maximum velocity: 1 m.
[BsplineTraj]: Max acc: 1 m/s^2.
[BsplineTraj]: Weight distance: 1
[BsplineTraj]: Weight smoothness: 1
[BsplineTraj]: Weight feasibility: 1
[BsplineTraj]: Weight dynamic obstacle: 1
[BsplineTraj]: Plan in z axis: 0
[BsplineTraj]: Min height: 0.7
[BsplineTraj]: Max Height: 1.3
[BsplineTraj]: Uncertain aware factor: 1
[BsplineTraj]: Prediction horizon: 2
[BsplineTraj]: Dynamic obstacle distance: 0.5
[BsplineTraj]: Maximum path length: 7 m.
[BsplineTraj]: Maximum obstacle size: [5, 5, 3]m.
[BsplineTraj]: Max velocity is updated to: 1.5m/s.
[BsplineTraj]: Max acceleration is updated to: 1.5m/s^2
[dynamic_navigation_node-2] process has died [pid 53035, exit code -11, cmd /home/nvidia/cmu_uav/devel/lib/autonomous_flight/dynamic_navigation_node /mavros/local_position/odom:=CERLAB/quadcopter/odom /mavros/setpoint_raw/local:=CERLAB/quadcopter/cmd_acc __name:=dynamic_navigation_node __log:=/home/nvidia/.ros/log/bd741166-945c-11f0-94bf-48b02dd8d946/dynamic_navigation_node-2.log].
log file: /home/nvidia/.ros/log/bd741166-945c-11f0-94bf-48b02dd8d946/dynamic_navigation_node-2*.log
以下是查找dynamic_navigation_node链接了哪些opencv版本的代码以及结果:
nvidia@ubuntu:~/cmu_uav$ ldd /home/nvidia/cmu_uav/devel/lib/autonomous_flight/dynamic_navigation_node | grep opencvlibopencv_highgui.so.4.2 => /usr/lib/aarch64-linux-gnu/libopencv_highgui.so.4.2 (0x0000ffffa1530000)libopencv_features2d.so.406 => /home/nvidia/Documents/opencv-4.6.0/build/lib/libopencv_features2d.so.406 (0x0000ffffa0d70000)libopencv_dnn.so.4.2 => /usr/lib/aarch64-linux-gnu/libopencv_dnn.so.4.2 (0x0000ffffa0955000)libopencv_ml.so.4.2 => /usr/lib/aarch64-linux-gnu/libopencv_ml.so.4.2 (0x0000ffffa08af000)libopencv_photo.so.4.2 => /usr/lib/aarch64-linux-gnu/libopencv_photo.so.4.2 (0x0000ffffa0801000)libopencv_imgcodecs.so.4.2 => /usr/lib/aarch64-linux-gnu/libopencv_imgcodecs.so.4.2 (0x0000ffff9fa88000)libopencv_imgproc.so.4.2 => /usr/lib/aarch64-linux-gnu/libopencv_imgproc.so.4.2 (0x0000ffff9f6f6000)libopencv_core.so.4.2 => /usr/lib/aarch64-linux-gnu/libopencv_core.so.4.2 (0x0000ffff9f449000)libopencv_flann.so.406 => /home/nvidia/Documents/opencv-4.6.0/build/lib/libopencv_flann.so.406 (0x0000ffff9e189000)libopencv_imgproc.so.406 => /home/nvidia/Documents/opencv-4.6.0/build/lib/libopencv_imgproc.so.406 (0x0000ffff9dd4e000)libopencv_core.so.406 => /home/nvidia/Documents/opencv-4.6.0/build/lib/libopencv_core.so.406 (0x0000ffff9d719000)
分析原因,OpenCV 版本冲突是导致段错误的核心原因——dynamic_navigation_node
同时链接了两个不兼容的 OpenCV 版本(4.2
和406
(即 4.6)),不同版本的库函数 / 内存布局不匹配,会导致运行时内存访问混乱,最终触发段错误(exit code -11),最好的方法就是完全删除4.2版本的opencv,然后重新编译运行4.6版本的opencv。
卸载opencv4.2
sudo apt remove ros-noetic-opencv3 libopencv-dev libopencv-core4.2 libopencv-features2d4.2
重新编译4.6版本的opencv
编译的方法看我的另一篇文章有相关opencv4.6安装的介绍:
无人机避障——感知篇(Orin nx采用zed2双目相机进行Vins-Fusion-GPU定位,再通过位姿和深度图建图完成实时感知)
这篇文章有详细的介绍如何删除4.2版本的opencv以及如何安装自己想要的版本的opencv。
最后重新编译cmu_uav工作空间
重新启动gazebo节点,rviz建图节点以及动态导航节点:
roslaunch uav_simulator start.launch
roslaunch remote_control dynamic_navigation_rviz.launch
roslaunch autonomous_flight dynamic_navigation.launch
现在,动态导航节点不报错,其他两个节点也不报错: