无人机避障——XTDrone中运行VINS-Fusion+Ego-planner进行路径规划

news2025/3/12 22:36:35

本文聚焦于无人机避障技术领域的经典方案,重点探讨视觉双目VINS-Fusion建图与Ego-planner路径规划的组合应用。通过视觉双目VINS-Fusion实现精准的环境建图与自身定位,结合Ego-planner的高效路径规划能力,使无人机在复杂环境中实现自主避障飞行。基于XTDrone平台,采用PX4固件和Mavros协议进行仿真测试,验证了该技术方案的可行性和有效性,展示了其在实际应用中的潜力和优势。

参考链接:

视觉惯性里程计(VIO) · 语雀VINS-Mono编译首先参考这里配置依赖,然后编译c...https://www.yuque.com/xtdrone/manual_cn/vio#luwyy

VINS-Fusion仿真

遇到报错问题:

基本报错参考链接:

Ubuntu20.04运行Vins-fusion_ubuntu20.04 vins-fussion-CSDN博客

原文中:

在报错的项目的CMakeList里的
set(CMAKE_CXX_FLAGS “-std=c++11”)
改成
set(CMAKE_CXX_STANDARD 14)

实际上:

Vins-fusion中的文件夹下的功能包的CMake.list都需要进行以上修改。

原文中:

但在Opencv4中,CV_LOAD_IMAGE_GRAYSCALE找不到,经过查看Opencv的API可知,CV_LOAD_IMAGE_GRAYSCALE已改为 IMREAD_GRAYSCALE,修改即可。

实际上:

将CV_LOAD_IMAGE_GRAYSCALE改为cv::IMREAD_GRAYSCALE

 其他报错:

 /usr/bin/ld: /usr/local/lib/libgflags.a(gflags.cc.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `_ZN3fLS20StringFlagDestructorD1Ev' which may bind externally can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libgflags.a(gflags.cc.o): in function `_GLOBAL__sub_I__ZN3fLS14FLAGS_flagfileB5cxx11E':
gflags.cc:(.text.startup+0x60): 危险的重寻址: unsupported relocation
/usr/bin/ld: /usr/local/lib/libgflags.a(gflags.cc.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `_ZN22gflags_mutex_namespace5MutexD1Ev' which may bind externally can not be used when making a shared object; recompile with -fPIC
gflags.cc:(.text.startup+0x280): 危险的重寻址: unsupported relocation
/usr/bin/ld: /usr/local/lib/libgflags.a(gflags.cc.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `_ZNSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EED1Ev' which may bind externally can not be used when making a shared object; recompile with -fPIC
gflags.cc:(.text.startup+0x2fc): 危险的重寻址: unsupported relocation
/usr/bin/ld: /usr/local/lib/libgflags.a(gflags_reporting.cc.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `_ZN3fLS20StringFlagDestructorD1Ev' which may bind externally can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libgflags.a(gflags_reporting.cc.o): in function `_GLOBAL__sub_I__ZN3fLB10FLAGS_helpE':
gflags_reporting.cc:(.text.startup+0x60): 危险的重寻址: unsupported relocation
/usr/bin/ld: /usr/local/lib/libgflags.a(gflags_completions.cc.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `_ZN3fLS20StringFlagDestructorD1Ev' which may bind externally can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libgflags.a(gflags_completions.cc.o): in function `_GLOBAL__sub_I__ZN3fLS25FLAGS_tab_completion_wordB5cxx11E':
gflags_completions.cc:(.text.startup+0xa0): 危险的重寻址: unsupported relocation
collect2: error: ld returned 1 exit status
[ 43%] Generating EusLisp code from gazebo_msgs/SetLinkProperties.srv
make[2]: *** [VINS-Fusion/camera_models/CMakeFiles/camera_models.dir/build.make:352:/home/nvidia/catkin_ws/devel/lib/libcamera_models.so] 错误 1
make[1]: *** [CMakeFiles/Makefile2:916:VINS-Fusion/camera_models/CMakeFiles/camera_models.dir/all] 错误 2
make[1]: *** 正在等待未完成的任务....

解决:

根本原因:

错误信息中的 relocation R_AARCH64_ADR_PREL_PG_HI21 表明在生成动态库(.so)时,链接了未启用 -fPIC 的静态库 libgflags.a

ARM架构(如AArch64)要求动态库的所有依赖库必须编译为位置无关代码(PIC),否则无法正确处理地址重定位

libgflags.a 是静态库且未启用 -fPIC,导致其代码段包含绝对地址,无法被动态库共享使用


解决方案
1. ​重新编译gflags并强制启用-fPIC

步骤:​

# 卸载旧版本gflags
sudo rm -rf /usr/local/lib/libgflags* /usr/local/include/gflags

# 下载源码并编译
git clone https://github.com/gflags/gflags.git
cd gflags
mkdir build && cd build

# 通过CMake启用位置无关代码并生成动态库
cmake .. -DBUILD_SHARED_LIBS=ON -DGFLAGS_NAMESPACE=google -DCMAKE_INSTALL_PREFIX=/usr/local
make -j$(nproc)
sudo make install
2. ​验证gflags安装

检查新生成的库文件是否为动态库:

ls /usr/local/lib | grep libgflags
# 正确输出应包含 libgflags.so,而非 libgflags.a
3. ​更新动态库缓存
sudo ldconfig  # 刷新动态库路径
4. ​修改项目CMake配置

camera_modelsCMakeLists.txt 中,确保链接到动态库:

# 添加以下内容以强制链接动态库
find_package(gflags REQUIRED)
target_link_libraries(camera_models PRIVATE gflags_shared)  # 使用动态库目标名
 5. 以下是更改的CMakeLists.txt文件:
cmake_minimum_required(VERSION 2.8.3)
project(camera_models)

set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -fPIC")

find_package(catkin REQUIRED COMPONENTS
    roscpp
    std_msgs
    )

find_package(Boost REQUIRED COMPONENTS filesystem program_options system)
include_directories(${Boost_INCLUDE_DIRS})

find_package(OpenCV REQUIRED)

# set(EIGEN_INCLUDE_DIR "/usr/local/include/eigen3")
find_package(Ceres REQUIRED)
include_directories(${CERES_INCLUDE_DIRS})
find_package(gflags REQUIRED) # 第一条加在这里

catkin_package(
    INCLUDE_DIRS include
    LIBRARIES camera_models
    CATKIN_DEPENDS roscpp std_msgs
#    DEPENDS system_lib
    )

include_directories(
    ${catkin_INCLUDE_DIRS}
    )

include_directories("include")

add_executable(Calibrations 
    src/intrinsic_calib.cc
    src/chessboard/Chessboard.cc
    src/calib/CameraCalibration.cc
    src/camera_models/Camera.cc
    src/camera_models/CameraFactory.cc
    src/camera_models/CostFunctionFactory.cc
    src/camera_models/PinholeCamera.cc
    src/camera_models/PinholeFullCamera.cc
    src/camera_models/CataCamera.cc
    src/camera_models/EquidistantCamera.cc
    src/camera_models/ScaramuzzaCamera.cc
    src/sparse_graph/Transform.cc
    src/gpl/gpl.cc
    src/gpl/EigenQuaternionParameterization.cc)

add_library(camera_models
    src/chessboard/Chessboard.cc
    src/calib/CameraCalibration.cc
    src/camera_models/Camera.cc
    src/camera_models/CameraFactory.cc
    src/camera_models/CostFunctionFactory.cc
    src/camera_models/PinholeCamera.cc
    src/camera_models/PinholeFullCamera.cc
    src/camera_models/CataCamera.cc
    src/camera_models/EquidistantCamera.cc
    src/camera_models/ScaramuzzaCamera.cc
    src/sparse_graph/Transform.cc
    src/gpl/gpl.cc
    src/gpl/EigenQuaternionParameterization.cc)

target_link_libraries(Calibrations ${Boost_LIBRARIES} ${OpenCV_LIBS} ${CERES_LIBRARIES})
target_link_libraries(camera_models ${Boost_LIBRARIES} ${OpenCV_LIBS} ${CERES_LIBRARIES})
target_link_libraries(camera_models PRIVATE gflags_shared)# 第二条加在这里

 编译成功:

 [注明]:已经修改好VINS_Fusion资源链接:

https://download.csdn.net/download/weixin_45390670/90477246 

PX4飞控EKF配置:

修改定位方式:

打开文件:

gedit ~/PX4_Firmware/ROMFS/px4fmu_common/init.d-posix/rcS

找到GPS、气压计、视觉选择的部分,我们用的是VINS-Fusion双目视觉所以需要修改

修改前:

# GPS used
param set EKF2_AID_MASK 1
# Vision used and GPS denied
#param set EKF2_AID_MASK 24

# Barometer used for hight measurement
param set EKF2_HGT_MODE 0
# Barometer denied and vision used for hight measurement
#param set EKF2_HGT_MODE 3

 修改后:

# GPS used
#param set EKF2_AID_MASK 1
# Vision used and GPS denied
param set EKF2_AID_MASK 24
# Barometer used for hight measurement
#param set EKF2_HGT_MODE 0
# Barometer denied and vision used for hight measurement
param set EKF2_HGT_MODE 3

使修改生效:

rm ~/.ros/eeprom/parameters*
rm -rf ~/.ros/sitl*

 运行Vins-Fusion:

roslaunch px4 indoor1.launch

cd ~/catkin_ws
bash scripts/xtdrone_run_vio.sh

cd ~/XTDrone/sensing/slam/vio
python vins_transfer.py iris 0

cd ~/XTDrone/communication
python multirotor_communication.py iris 0 

cd ~/XTDrone/control/keyboard
python multirotor_keyboard_control.py iris 1 vel

运行视频:

Vins_Fusion

Ego-planner三维路径规划仿真

编译Ego-planner报错:

报错1:

解决1:

问题核心是 ​CMake无法找到PCL(Point Cloud Library)的配置文件。

安装PCL核心开发组件:

sudo apt-get install libpcl-dev pcl-tools

报错2:

解决2:

pcl_conversions.h 属于ROS的 pcl_conversions 包,需单独安装:

# 安装ROS版本的PCL转换工具包
sudo apt-get install ros-noetic-pcl-conversions ros-noetic-pcl-ros

编译成功

 [注明]:已经修改好的Ego_Planner链接:

 https://download.csdn.net/download/weixin_45390670/90477164

 代码运行整合:

#整理的运行代码
#启动仿真程序
roslaunch px4 indoor1.launch

#启动Vins-Fusion
cd ~/catkin_ws
bash scripts/xtdrone_run_vio.sh

#由于VINS-Fusion发布的是Odometry类型的话题,要将其对应转为PX4所需的话题
cd ~/XTDrone/sensing/slam/vio
python vins_transfer.py iris 0

#然后建立通信,键盘控制起飞即可
cd ~/XTDrone/communication
python multirotor_communication.py iris 0 

cd ~/XTDrone/control/keyboard
python multirotor_keyboard_control.py iris 1 vel

#转换相机位姿的坐标系方向
cd ~/XTDrone/motion_planning/3d
python ego_transfer.py iris 0

#启动rviz
cd ~/XTDrone/motion_planning/3d
rviz -d ego_rviz.rviz

#启动ego_planner
roslaunch ego_planner single_uav.launch 

按顺序运行代码:

 运行结果:

VINS-fusion+Ego-planner

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2313960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【沐渥科技】氮气柜日常如何维护?

氮气柜的维护是确保其长期稳定运行、延长使用寿命和保持环境控制精度的关键。以下是沐渥氮气柜的日常维护和定期保养指南: 一、日常维护 柜体清洁 定期用软布擦拭柜体表面和内部,避免灰尘堆积。避免使用腐蚀性清洁剂,防止损伤密封条或传感器。…

MATLAB 控制系统设计与仿真 - 24

PID 控制器分析- 控制器的形式 连续控制器的结构: 为滤波时间常数,这类PID控制器在MATLAB系统控制工具箱称为并联PID控制器,可由MATLAB提供的pid函数直接输入,格式为: 其他类型的控制器也可以由该函数直接输入&#x…

linux(权限)

sudo 主要用来短暂的提权 权限 就是 >角色目标属性 这里面的角色就是---拥有者----所属组----other 所属组的目的? 更细化的管理 chmod 就是修改权限制 我们要是想要切换到体育的账号,我们可以去看一下有几个账号,我…

《OpenCV》—— dlib(换脸操作)

文章目录 dlib换脸介绍仿射变换在 dlib 换脸中的应用 换脸操作 dlib换脸介绍 dlib 换脸是基于 dlib 库实现的一种人脸替换技术,以下是关于它的详细介绍: 原理 人脸检测:dlib 库中包含先进的人脸检测器,如基于 HOG(方向…

修改Flutter项目使用的JAVA版本

使用Android studio开发Flutter过程中,会默认使用Android studio自带的JDK。因为新版Android studio中的JDK版本过高,导致项目编译时总是无法完成,报【 unsupported class file major version 65】错误,如下: 解决这个…

虚拟dom的diff中的双端比较算法

‌双端比较算法是Vue中用于高效比较新旧VNode子节点的一种策略‌。该算法的核心思想是,通过从新旧VNode子节点的两端开始比较,逐步向中间靠拢,以找到最小的差异并据此更新DOM。以下是双端比较算法的大致流程: ‌初始化指针‌&…

VMware安装Windows server 2016

1、新建虚拟机,选择自定义模式 2、选择兼容性 4、命名虚拟机 5、固件类型 EFI 虚拟磁盘类型,不同电脑推荐的类型不同,用默认的就行 删除声卡和打印机 检查网络配置 选择本地的Windows server 2016的系统镜像,系统镜像可以去Window…

HippoRAG 2 原理精读

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 整体流程离线索引阶段在线检索和问答阶段 总结 整体流程 从上图可以看出,整个流程分为两个阶段 1、离线索引阶段 2、在线检索和问答阶段 离线索引阶段…

三:FFMPEG拉流读取模块的讲解

FFMPEG拉流读取模块在远程监控项目最核心的作用是读取UVC摄像头传输的H264码流,并对其码流进行帧的提取,提取完成之后则把数据传输到VDEC解码模块进行解码。而在我们这个项目中,UVC推流的功能由FFMPEG的命令完成。 FFMPEG拉流读取模块的API…

《苍穹外卖》SpringBoot后端开发项目核心知识点与常见问题整理(DAY1 to DAY3)

目录 一、在本地部署并启动Nginx服务1. 解压Nginx压缩包2. 启动Nginx服务3. 验证Nginx是否启动成功: 二、导入接口文档1. 黑马程序员提供的YApi平台2. YApi Pro平台3. 推荐工具:Apifox 三、Swagger1. 常用注解1.1 Api与ApiModel1.2 ApiModelProperty与Ap…

QT系列教程(20) Qt 项目视图便捷类

视频连接 https://www.bilibili.com/video/BV1XY41127t3/?vd_source8be9e83424c2ed2c9b2a3ed1d01385e9 Qt项目视图便捷类 Qt项目视图提供了一些便捷类,包括QListWidget, QTableWidget, QTreeWidget等。我们分别介绍这几个便捷类。 我们先创建一个Qt …

动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南

目录 一、典型案例:系统发布后的GC雪崩事件 (一)故障现象 1. 刚刚启动时 GC 次数较多 2. 堆内存锯齿状波动 3. GC日志特征:Allocation Failure (二)问题定位 二、原理深度解析:JVM内存弹…

AI智能眼镜主控芯片:技术演进与产业生态的深度解析

一、AI智能眼镜的技术挑战与主控芯片核心诉求 AI智能眼镜作为XR(扩展现实)技术的代表产品,其核心矛盾在于性能、功耗与体积的三角平衡。主控芯片作为设备的“大脑”,需在有限空间内实现复杂计算、多模态交互与全天候续航&#xf…

微服务拆分-远程调用

我们在查询购物车列表的时候,它有一个需求,就是不仅仅要查出购物车当中的这些商品信息,同时还要去查到购物车当中这些商品的最新的价格和状态信息,跟购物车当中的快照进行一个对比,从而去提醒用户。 现在我们已经做了服…

[网络爬虫] 动态网页抓取 — Selenium 介绍 环境配置

🌟想系统化学习爬虫技术?看看这个:[数据抓取] Python 网络爬虫 - 学习手册-CSDN博客 0x01:Selenium 工具介绍 Selenium 是一个开源的便携式自动化测试工具。它最初是为网站自动化测试而开发的,类似于我们玩游戏用的按…

【RAGFlow】windows本地pycharm运行

原因 由于官方只提供了docker部署,基于开源代码需要实现自己内部得逻辑,所以需要本地pycharm能访问,且docker运行依赖得其余组件,均需要使用开发服务器得配置。 修改过程 安装python 项目依赖于Python 版本:>3.1…

树莓派5首次开机保姆级教程(无显示器通过VNC连接树莓派桌面)

第一次开机详细步骤 步骤一:树莓派系统烧录1 搜索打开烧录软件“Raspberry Pi Imager”2 选择合适的设备、系统、SD卡3 烧录配置选项 步骤二:SSH远程树莓派1 树莓派插电2 网络连接(有线或无线)3 确定树莓派IP地址 步骤三&#xff…

html-表格标签

一、表格标签 1. 表格的主要作用 表格主要用于显示、展示数据,因为它可以让数据显示的非常的规整,可读性非常好。特别是后台展示数据 的时候,能够熟练运用表格就显得很重要。一个清爽简约的表格能够把繁杂的数据表现得很有条理。 总…

大模型安全新范式:DeepSeek一体机内容安全卫士发布

2月以来,DeepSeek一体机几乎成为了政企市场AI消费的最强热点。 通过一体机的方式能够缩短大模型部署周期,深度结合业务场景,降低中小企业对于大模型的使用门槛。据不完全统计,已约有超过60家企业基于DeepSeek推出一体机产品。 但…

数据分析绘制随时间顺序变化图加入线性趋势线——numpy库的polyfit计算一次多项式拟合

import pandas as pd import numpy as np import matplotlib.pyplot as plt# 导入数据 data pd.read_csv(rC:\Users\11712\notebooktrain1.csv)# 假设数据包含 date_time 和 speed 列 data[date_time] pd.to_datetime(data[date_time]) # 确保时间列是 datetime 类型 data.s…