当前位置: 首页 > news >正文

无人机避障——卡内基梅隆大学(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.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上给定一个目标点,无人机将进行自主避障导航到目标点,结果如下:

http://www.dtcms.com/a/389846.html

相关文章:

  • 正点原子zynq_FPGA-初识ZYNQ
  • Vue3中对比ref,reactive,shallowRef,shallowReactive
  • 通过Freemark渲染数据到Word里并生成压缩包
  • Vue 项目中使用 AbortController:解决请求取消、超时与内存泄漏问题
  • 设置管家婆服务器开机自动启动
  • ubuntu20 安装 ros2 foxy
  • 二分查找(二分查找算法)
  • 贪心算法应用:超图匹配问题详解
  • Hadoop3.3.5搭建指南(双NN版本)
  • 如何正确写Controller?参数校验、异常处理
  • 线性代数:LU与Cholesky分解
  • 饮用水在线监测设备:实时、精准地捕捉水体中的关键参数,为供水安全提供全方位保障
  • 【环境搭建】Conda安装教程
  • Java与机器学习的结合:库与应用!
  • DHCP基本原理及实验(ENSP配置)
  • 高系分十一:软件需求工程
  • MCP Server Chart AntV 项目解析
  • 2025药物市场调研分析案例(模板资源分享)
  • 飞网出口网关:安全便捷地访问受限资源
  • 大模型训练的三大显存优化策略
  • 动态加载js链接、异步传参加载组件、有趣打印
  • 【Python】Python异常、模块与包
  • 第三方网站系统测试:【基于Pytest的自动化测试框架的测试】
  • 每个 SIwave 求解器的正确激励
  • 给 C++ Protobuf“装上 Abseil”版本确认、Bazel/CMake 实战与避坑
  • Java 大视界 -- Java 大数据在智能物流运输车辆智能调度与路径优化中的技术实现
  • 电脑中的32位和64位
  • 如何免费使用AWS服务器?AWS Free Tier免费套餐申请与避坑指南
  • QML界面调用C++层阻塞函数,如何不卡界面
  • JVM GC 调优:GC 问题发现工具,五大 GC 异常模式,四大调优方案与案例实战