无人机避障——卡内基梅隆大学(CMU)CERLAB 无人机自主框架复现

#VibeCoding·九月创作之星挑战赛#

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_flight

git 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 COMPONENTS
  roscpp
  rospy
  std_msgs
  cv_bridge
  message_filters
  image_transport
  vision_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 COMPONENTS
  roscpp
  rospy
  std_msgs
  octomap_ros
  map_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 opencv
	libopencv_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.2406(即 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

现在,动态导航节点不报错,其他两个节点也不报错:

rviz初始结果如图:

gazebo初始结果

在rviz上给定一个目标点,无人机将进行自主避障导航到目标点,结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Perishell

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值