无人机避障——XTDrone中运行VINS-Fusion+Ego-planner进行路径规划
本文聚焦于无人机避障技术领域的经典方案,重点探讨视觉双目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_models 的 CMakeLists.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 COMPONENTSroscppstd_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 includeLIBRARIES camera_modelsCATKIN_DEPENDS roscpp std_msgs
# DEPENDS system_lib)include_directories(${catkin_INCLUDE_DIRS})include_directories("include")add_executable(Calibrations src/intrinsic_calib.ccsrc/chessboard/Chessboard.ccsrc/calib/CameraCalibration.ccsrc/camera_models/Camera.ccsrc/camera_models/CameraFactory.ccsrc/camera_models/CostFunctionFactory.ccsrc/camera_models/PinholeCamera.ccsrc/camera_models/PinholeFullCamera.ccsrc/camera_models/CataCamera.ccsrc/camera_models/EquidistantCamera.ccsrc/camera_models/ScaramuzzaCamera.ccsrc/sparse_graph/Transform.ccsrc/gpl/gpl.ccsrc/gpl/EigenQuaternionParameterization.cc)add_library(camera_modelssrc/chessboard/Chessboard.ccsrc/calib/CameraCalibration.ccsrc/camera_models/Camera.ccsrc/camera_models/CameraFactory.ccsrc/camera_models/CostFunctionFactory.ccsrc/camera_models/PinholeCamera.ccsrc/camera_models/PinholeFullCamera.ccsrc/camera_models/CataCamera.ccsrc/camera_models/EquidistantCamera.ccsrc/camera_models/ScaramuzzaCamera.ccsrc/sparse_graph/Transform.ccsrc/gpl/gpl.ccsrc/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.launchcd ~/catkin_ws
bash scripts/xtdrone_run_vio.shcd ~/XTDrone/sensing/slam/vio
python vins_transfer.py iris 0cd ~/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
相关文章:
无人机避障——XTDrone中运行VINS-Fusion+Ego-planner进行路径规划
本文聚焦于无人机避障技术领域的经典方案,重点探讨视觉双目VINS-Fusion建图与Ego-planner路径规划的组合应用。通过视觉双目VINS-Fusion实现精准的环境建图与自身定位,结合Ego-planner的高效路径规划能力,使无人机在复杂环境中实现自主避障飞…...
【沐渥科技】氮气柜日常如何维护?
氮气柜的维护是确保其长期稳定运行、延长使用寿命和保持环境控制精度的关键。以下是沐渥氮气柜的日常维护和定期保养指南: 一、日常维护 柜体清洁 定期用软布擦拭柜体表面和内部,避免灰尘堆积。避免使用腐蚀性清洁剂,防止损伤密封条或传感器。…...
MATLAB 控制系统设计与仿真 - 24
PID 控制器分析- 控制器的形式 连续控制器的结构: 为滤波时间常数,这类PID控制器在MATLAB系统控制工具箱称为并联PID控制器,可由MATLAB提供的pid函数直接输入,格式为: 其他类型的控制器也可以由该函数直接输入&#x…...
C# Excel开源操作库MiniExcel使用教程
简介 MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。 目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB࿰…...
linux(权限)
sudo 主要用来短暂的提权 权限 就是 >角色目标属性 这里面的角色就是---拥有者----所属组----other 所属组的目的? 更细化的管理 chmod 就是修改权限制 我们要是想要切换到体育的账号,我们可以去看一下有几个账号,我…...
paimon---同步mysql数据到paimon表中
1.1、mysql源表 CREATE TABLE mysql_orders (order_id varchar(100) NOT NULL,user_id varchar(100) DEFAULT NULL,amount decimal(10,2) DEFAULT NULL,update_time timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),PRIMARY KEY (order_i…...
《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。以下是双端比较算法的大致流程: 初始化指针&…...
# 如何确认elementary os (linux)使用的是Wayland而不是x11?
如何确认elementary os (linux)使用的是Wayland而不是x11? 文章目录 如何确认elementary os (linux)使用的是Wayland而不是x11?**方法 1:使用 loginctl 命令(systemd 系统࿰…...
VMware安装Windows server 2016
1、新建虚拟机,选择自定义模式 2、选择兼容性 4、命名虚拟机 5、固件类型 EFI 虚拟磁盘类型,不同电脑推荐的类型不同,用默认的就行 删除声卡和打印机 检查网络配置 选择本地的Windows server 2016的系统镜像,系统镜像可以去Window…...
K8s 1.27.1 实战系列(十)PV PVC
一、核心概念与关系 1、PV(Persistent Volume) PV 是集群中的持久化存储资源,由管理员预先创建并配置,独立于 Pod 生命周期。它抽象了底层存储(如 NFS、云存储等),定义存储容量、访问模式(如 ReadWriteOnce)、回收策略(Retain/Delete/Recycle)等属性。例如,一…...
HippoRAG 2 原理精读
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 整体流程离线索引阶段在线检索和问答阶段 总结 整体流程 从上图可以看出,整个流程分为两个阶段 1、离线索引阶段 2、在线检索和问答阶段 离线索引阶段…...
三:FFMPEG拉流读取模块的讲解
FFMPEG拉流读取模块在远程监控项目最核心的作用是读取UVC摄像头传输的H264码流,并对其码流进行帧的提取,提取完成之后则把数据传输到VDEC解码模块进行解码。而在我们这个项目中,UVC推流的功能由FFMPEG的命令完成。 FFMPEG拉流读取模块的API…...
linux makefile tutorial
一个makefile的教程,几个小时就能看完,对makefile有个总体加细节的系统了解,非常不错: Learn Makefiles With the tastiest examples 中文翻译版: 起步 - Makefile 教程 (gavinliu6.github.io) gcc官网手册&#x…...
【从零开始学习计算机科学】操作系统(五)处理器调度
【从零开始学习计算机科学】操作系统(五)处理器调度 处理器调度一些简单的短程调度算法的思路先来先服务(First-Come-First-Served,FCFS)优先级调度及其变种最短作业优先调度算法(SJF)--非抢占式最短作业优先调度算法(SJF)--抢占式最高响应比优先调度算法轮转调度算法…...
视觉图像处理
在MATLAB中进行视觉图像处理仿真通常涉及图像增强、滤波、分割、特征提取等操作。以下是一个分步指南和示例代码,帮助您快速入门: 1. MATLAB图像处理基础步骤 1.1 读取和显示图像 % 读取图像(替换为实际文件路径) img = imread(lena.jpg); % 显示原图 figure; subplot(2…...
从零开始设计一个完整的网站:HTML、CSS、PHP、MySQL 和 JavaScript 实战教程
前言 本文将从实战角度出发,带你一步步设计一个完整的网站。我们将从 静态网页 开始,然后加入 动态功能(使用 PHP),连接 数据库,最后加入 JavaScript 实现交互功能。通过这个教程,你将掌握一个…...
JavaScript(Web APIs)
这个阶段两天也能看完 目录 壹_DOM-获取元素 00、获取DOM元素(根据CS选择器来获取DOM元素) 01、修改元素内容 02、修改CSS 03、H5自定义属性 04、定时器 贰_DOM-事件基础 00、事件监听 01、事件类型 02、事件对象 03、环境对象 04、回调函数 叁_DOM-事…...
Global top sap abap 和deepseek对话,测试其abap推理能力
我提交给deepseek一段代码 FUNCTION zXXX_hr_pafm_pannnn_up. *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" VALUE(IS_PRELP) TYPE PRELP OPTIONAL *" VALUE(IV…...
Android DUKPT - 3DES
一、DUKPT概述 DUKPT 即Derived Unique Key Per Transaction(每个事务的派生唯一密钥)。ANSI X9.24规范定义的密钥管理体系,主要用于对称密钥加密场景(如MAC、PIN等敏感数据保护)。通过动态生成唯一交易密钥ÿ…...
机器学习数学基础:45.多重响应分析
多重响应分析超详细教程:手把手教你分析多选题数据 一、深入理解多重响应分析的背景 问卷调查中,问题分为单选题与多选题: 单选题:如“你的性别?1.男 2.女”,答题者仅选一个选项,分析时直接统…...
《苍穹外卖》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…...
企业安全—对数据和资产进行识别和分类
0x00 前言 针对数据和资产的保护刻不容缓,这个是每一个做企业安全建设不容放过的一环,那么在识别数据和资产已经对这些数据分类就是必须要了解和掌握的内容。 这里不仅是针对商业机密,还有用户数据,前者在于保护公司利益&#x…...
QT系列教程(20) Qt 项目视图便捷类
视频连接 https://www.bilibili.com/video/BV1XY41127t3/?vd_source8be9e83424c2ed2c9b2a3ed1d01385e9 Qt项目视图便捷类 Qt项目视图提供了一些便捷类,包括QListWidget, QTableWidget, QTreeWidget等。我们分别介绍这几个便捷类。 我们先创建一个Qt …...
Spring Boot 调用DeepSeek API的详细教程
目录 前置准备步骤1:创建Spring Boot项目步骤2:配置API参数步骤3:创建请求/响应DTO步骤4:实现API客户端步骤5:创建控制器步骤6:异常处理步骤7:测试验证单元测试示例Postman测试请求 常见问题排查…...
动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南
目录 一、典型案例:系统发布后的GC雪崩事件 (一)故障现象 1. 刚刚启动时 GC 次数较多 2. 堆内存锯齿状波动 3. GC日志特征:Allocation Failure (二)问题定位 二、原理深度解析:JVM内存弹…...
AI智能眼镜主控芯片:技术演进与产业生态的深度解析
一、AI智能眼镜的技术挑战与主控芯片核心诉求 AI智能眼镜作为XR(扩展现实)技术的代表产品,其核心矛盾在于性能、功耗与体积的三角平衡。主控芯片作为设备的“大脑”,需在有限空间内实现复杂计算、多模态交互与全天候续航…...
微服务拆分-远程调用
我们在查询购物车列表的时候,它有一个需求,就是不仅仅要查出购物车当中的这些商品信息,同时还要去查到购物车当中这些商品的最新的价格和状态信息,跟购物车当中的快照进行一个对比,从而去提醒用户。 现在我们已经做了服…...
[网络爬虫] 动态网页抓取 — Selenium 介绍 环境配置
🌟想系统化学习爬虫技术?看看这个:[数据抓取] Python 网络爬虫 - 学习手册-CSDN博客 0x01:Selenium 工具介绍 Selenium 是一个开源的便携式自动化测试工具。它最初是为网站自动化测试而开发的,类似于我们玩游戏用的按…...

