XTDrone-多无人机精准降落-配置教程

news2024/11/24 1:54:47

1 编译AprilTag_ROS

 AprilTag是一个视觉基准系统,可用于机器人,增强现实和相机校准等。 根据AprilTag可以可靠地计算标签相对于相机的3D位置,方向和ID号。这里我们使用AprilTag的ROS库来实现位姿估计与ID号计算。
编译命令如下:
sudo apt install ros-noetic-apriltag  # 根据自己的ROS版本来修改
cp -r ~/XTDrone/sensing/object_detection_and_tracking/apriltag/apriltag_ros/ ~/catkin_ws/src/
cd ~/catkin_ws/
catkin build apriltag_ros #或catkin_make
 编译成功后的结果:会看到apriltag_ros包编译成功。

XTDrone团队已经做好了三个AprilTag并排的模型(如何制作见这里),在~/XTDrone/sitl_config/models/apriltag0-2,下面我们将让三个无人机分别降落到对应ID的AprilTag上。

 2 配置PX4

在之前的任务中,我们没有让PX4 SITL发布过TF,一切坐标系转换都是依靠订阅话题+手工代码转换,由于在精准降落问题中,涉及到地图坐标系(map)、无人机坐标系(base_link)、相机坐标系(camera_link)和AprilTag坐标系(tag)四类坐标系,因此手工代码转换比较繁琐,因此我们借助ROS的TF工具来帮助我们进行转换。由于MAVROS默认不发布TF,且默认定义的坐标系不带namespace,也就是iris_0还是iris_1的机体坐标系都叫base_link,因此我们需要进行修改。
sudo cp ~/XTDrone/sitl_config/launch/px4/*  /opt/ros/noetic/share/mavros/launch/

3 修改EKF2设置

由于需要机体在Gazebo的地图坐标系下的位姿,因此定位需要使用Gazebo真值,此外使用Gazebo真值定位的精度也更高,便于事先精准降落。注意事先要修改EKF2设置,改为视觉定位模式。
所需修改部分的内容如下:
	# 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

4 启动仿真

4.1 启动三个带有下视相机的iris和带有AprilTag的无人车的仿真文件

roslaunch px4 outdoor2_precision_landing.launch 
 启动后会发现有报错:

或者如下的报错内容:
... logging to /home/ray/.ros/log/632bf21c-2b0a-11ef-ba9c-37ab60347b3f/roslaunch-ray-pc-391024.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

RLException: Invalid <param> tag: Cannot load command parameter [robot_description]: no such command [['/opt/ros/noetic/share/xacro/xacro.py', '/home/ray/catkin_ws/src/catvehicle/urdf/catvehicle1-3.xacro', 'roboname:=ugv_0']].

Param xml is <param name="robot_description" command="$(find xacro)/xacro.py '$(find catvehicle)/urdf/catvehicle1-3.xacro' roboname:='ugv_0'"/>
The traceback for the exception was written to the log file
错因分析:问题主要出在xacro命令的路径和参数配置上,官方提供的<param>标签使用的是旧的命令格式,因此运行时会报错。
解决方法:去掉launch文件中<param>标签中xacro.py.py
修改后的outdoor2_precision_landing.launch文件(该文件的目录:
/home/你的主机名/PX4_Firmware/launch)

修改后的完整代码:(可复制粘贴替换)
<launch>

    <!-- MAVROS posix SITL environment launch script -->
    <!-- launches Gazebo environment and 2x: MAVROS, PX4 SITL, and spawns vehicle -->
    <!-- vehicle model and world -->
    <arg name="est" default="ekf2"/>
    <arg name="world" default="$(find mavlink_sitl_gazebo)/worlds/outdoor2.world"/>
    <!-- gazebo configs -->
    <arg name="gui" default="true"/>
    <arg name="debug" default="false"/>
    <arg name="verbose" default="false"/>
    <arg name="paused" default="false"/>
    <!-- Gazebo sim -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="gui" value="$(arg gui)"/>
        <arg name="world_name" value="$(arg world)"/>
        <arg name="debug" value="$(arg debug)"/>
        <arg name="verbose" value="$(arg verbose)"/>
        <arg name="paused" value="$(arg paused)"/>
    </include>

    <arg name="obstaclestopper" default="false"/>
    <group ns="ugv_0">
        <param name="robot_description"
                command="$(find xacro)/xacro '$(find catvehicle)/urdf/catvehicle1-3.xacro' roboname:='ugv_0'" />
        <include file="$(find catvehicle)/launch/catvehicle.launch">
            <arg name="robot_name" value="ugv_0"/>
            <arg name="init_pose" value="-x 0 -y 0 -z 0 -R 0 -P 0 -Y 0"/>
            <arg name="config_file" value="catvehicle_control.yaml"/>
            <arg name="obstaclestopper" value="$(arg obstaclestopper)"/>
        </include>

        <!-- Uncomment this to get immediate motion from the car
        <node name="openLoopCircle" pkg="safeopenloopcircle" type="safeopenloopcircle_node"/>
        -->
    </group>

    <!-- iris_0 -->
    <group ns="iris_0">
        <!-- MAVROS and vehicle configs -->
        <arg name="ID" value="0"/>
        <arg name="ID_in_group" value="0"/>
        <arg name="fcu_url" default="udp://:24540@localhost:34580"/>
        <!-- PX4 SITL and vehicle spawn -->
        <include file="$(find px4)/launch/single_vehicle_spawn_xtd.launch">
            <arg name="x" value="-3"/>
            <arg name="y" value="0"/>
            <arg name="z" value="0"/>
            <arg name="R" value="0"/>
            <arg name="P" value="0"/>
            <arg name="Y" value="0"/>
            <arg name="vehicle" value="iris"/>
            <arg name="sdf" value="iris_downward_camera"/>
            <arg name="mavlink_udp_port" value="18570"/>
            <arg name="mavlink_tcp_port" value="4560"/>
            <arg name="ID" value="$(arg ID)"/>
            <arg name="ID_in_group" value="$(arg ID_in_group)"/>
        </include>
        <!-- MAVROS -->
        <include file="$(find mavros)/launch/px4.launch">
            <arg name="fcu_url" value="$(arg fcu_url)"/>
            <arg name="gcs_url" value=""/>
            <arg name="tgt_system" value="$(eval 1 + arg('ID'))"/>
            <arg name="tgt_component" value="1"/>
            <arg name="config_yaml" value="$(find mavros)/launch/px4_config_iris_0.yaml"/>
        </include>
    </group>

    <!-- iris_1 -->
    <group ns="iris_1">
        <!-- MAVROS and vehicle configs -->
        <arg name="ID" value="1"/>
        <arg name="ID_in_group" value="1"/>
        <arg name="fcu_url" default="udp://:24541@localhost:34581"/>
        <!-- PX4 SITL and vehicle spawn -->
        <include file="$(find px4)/launch/single_vehicle_spawn_xtd.launch">
            <arg name="x" value="-4.5"/>
            <arg name="y" value="0"/>
            <arg name="z" value="0"/>
            <arg name="R" value="0"/>
            <arg name="P" value="0"/>
            <arg name="Y" value="0"/>
            <arg name="vehicle" value="iris"/>
            <arg name="sdf" value="iris_downward_camera"/>
            <arg name="mavlink_udp_port" value="18571"/>
            <arg name="mavlink_tcp_port" value="4561"/>
            <arg name="ID" value="$(arg ID)"/>
            <arg name="ID_in_group" value="$(arg ID_in_group)"/>
        </include>
        <!-- MAVROS -->
        <include file="$(find mavros)/launch/px4.launch">
            <arg name="fcu_url" value="$(arg fcu_url)"/>
            <arg name="gcs_url" value=""/>
            <arg name="tgt_system" value="$(eval 1 + arg('ID'))"/>
            <arg name="tgt_component" value="1"/>
            <arg name="config_yaml" value="$(find mavros)/launch/px4_config_iris_1.yaml"/>
        </include>
    </group>

    <!-- iris_2 -->
    <group ns="iris_2">
        <!-- MAVROS and vehicle configs -->
        <arg name="ID" value="2"/>
        <arg name="ID_in_group" value="2"/>
        <arg name="fcu_url" default="udp://:24542@localhost:34582"/>
        <!-- PX4 SITL and vehicle spawn -->
        <include file="$(find px4)/launch/single_vehicle_spawn_xtd.launch">
            <arg name="x" value="-6"/>
            <arg name="y" value="0"/>
            <arg name="z" value="0"/>
            <arg name="R" value="0"/>
            <arg name="P" value="0"/>
            <arg name="Y" value="0"/>
            <arg name="vehicle" value="iris"/>
            <arg name="sdf" value="iris_downward_camera"/>
            <arg name="mavlink_udp_port" value="18572"/>
            <arg name="mavlink_tcp_port" value="4562"/>
            <arg name="ID" value="$(arg ID)"/>
            <arg name="ID_in_group" value="$(arg ID_in_group)"/>
        </include>
        <!-- MAVROS -->
        <include file="$(find mavros)/launch/px4.launch">
            <arg name="fcu_url" value="$(arg fcu_url)"/>
            <arg name="gcs_url" value=""/>
            <arg name="tgt_system" value="$(eval 1 + arg('ID'))"/>
            <arg name="tgt_component" value="1"/>
            <arg name="config_yaml" value="$(find mavros)/launch/px4_config_iris_2.yaml"/>
        </include>
    </group>

    <!-- <node pkg="tf" type="static_transform_publisher" name="0_base_link_to_base_link_frd"
    args="0 0 -0.05 3.1415927 0 0 /base_link_0 /base_link_frd_0 100" />
    <node pkg="tf" type="static_transform_publisher" name="1_base_link_to_base_link_frd"
    args="0 0 -0.05 3.1415927 0 0 /base_link_1 /base_link_frd_1 100" />
    <node pkg="tf" type="static_transform_publisher" name="2_base_link_to_base_link_frd"
    args="0 0 -0.05 3.1415927 0 0 /base_link_2 /base_link_frd_2 100" /> -->

</launch>
 若修改后还报错,输入如下命令检查是否安装xacro
which xacro
 若已安装,则会有类似的输出

 若没有,则输入如下命令安装xacro
sudo apt-get install ros-noetic-xacro
修改完成后再次启动仿真环境
roslaunch px4 outdoor2_precision_landing.launch 
 启动后的画面

正常启动后会发现不断报错,这是因为mavros的base_link_frd坐标系找不到base_link,因为我们给base_link加了namespace,不过这个错误不影响使用,不用理会
[ERROR] [1617509823.832162747, 3.666000000]: ODOM: Ex: Could not find a connection between 'iris_0/base_link' and 'base_link_frd' because they are not part of the same tree.Tf has two or more unconnected trees.

4.2 启动多机通信

4.2.1 修改multi_vehicle_communication.sh文件

注意事先修改好multi_vehicle_communication.sh,由于启动了3架iris无人机和1辆rover汽车,所以需要对multi_vehicle_communication.sh文件进行如下修改并保存。

4.2.2  输入如下命令启动多机通信

cd ~/XTDrone/communication
bash multi_vehicle_communication.sh
通信启动成功后会有如下提示:

 4.3 启动获取位资脚本

cd ~/XTDrone/sensing/pose_ground_truth/
python3 get_local_pose.py iris 3

4.4 启动键盘控制

cd ~/XTDrone/control/keyboard
python3 multirotor_keyboard_control.py iris 3 vel

4.5 而后启动apriltag_ros

roslaunch apriltag_ros xtdrone_detection.launch

4.6 用rviz进行可视化

cd ~/XTDrone/sensing/object_detection_and_tracking/apriltag/apriltag_ros/config
rviz -d rviz.rviz

4.7 控制三架无人机到无人车的上方

观察rviz,会发现三个tag和一个tag bundle的坐标系在闪烁,这是因为这四个坐标系由三架飞机的apriltag_ros同时估计,因此只要有一架飞机能看到tag,就能估计其位姿。注意到图像中有飞机的影子,这个影子可能会干扰识别的效果,一个简单的方法是把gazebo中的灯光进行调整,不调整一般也能实现精准降落。

 

4.8  关闭键盘控制,启动多机精准降落脚本

4.8.1 在启动multi_precision_landing.sh脚本之前,先对原脚本进行修改,用python3来启动

 4.8.2 启动多机精准降落脚本

cd ~/XTDrone/control/
bash multi_precision_landing.sh 
 降落效果展示:

 

说明:本次配置使用的是ubuntu20.04

参考: 多无人机精准降落 · 语雀

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

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

相关文章

Linux环境搭建之CentOS7(包含静态IP配置)

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;虚拟机 &#x1f320; 首发时间&#xff1a;2024年6月22日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 安装VMw…

C#健康体检信息管理系统成品源码,医院体检中心管理系统

健康体检信息管理系统覆盖体检中心的所有业务&#xff0c;完成从预约、登记、收费、检查、检验、出报告、分析、报表等所有工作&#xff0c;规范了体检流程&#xff0c;提高了工作效率。 体检系统开发环境&#xff1a; 技术架构&#xff1a;C/S架构 开发语言&#xff1a;C# …

Uniapp获取具体地理位置

使用uniapp自带uni.getLocation获取当前定位经纬度 再调用高德逆地理编码API&#xff0c;查到具体位置信息 https://restapi.amap.com/v3/geocode/regeo?location${longitude},${latitude}&key${key}&extensionsall 但是个人申请的key&#xff0c;有配额限制 最多每…

Why RAG is slower than LLM?

I used RAG with LLAMA3 for AI bot. I find RAG with chromadb is much slower than call LLM itself. Following the test result, with just one simple web page about 1000 words, it takes more than 2 seconds for retrieving: 我使用RAG&#xff08;可能是指某种特定的…

Linux下USB设备图像采集

操作系统 &#xff1a; Linux 采集方式 &#xff1a; v4l2&#xff08;video4linux2&#xff09; 设备目录 &#xff1a;/dev/video0 Linux系统 Linux采集的核心组件名称叫&#xff1a;v4l2即video4linux2的简称。是Linux中关于视频设备的内核驱动&#xff0c;在Linux中&…

Python实例:openpyxl读写单元格

原文链接&#xff1a;http://www.juzicode.com/python-example-openpyxl-access-data 本文介绍openpyxl模块几种读写单元格的方法&#xff0c;先手动创建一个表格&#xff0c;在代码里先用load_workbook()方法读取这个表格生成一个Workbook对象wb&#xff0c;再通过wb得到一个…

indexedDB---掌握浏览器内建数据库的基本用法

1.认识indexedDB IndexedDB 是一个浏览器内建的数据库&#xff0c;它可以存放对象格式的数据&#xff0c;类似本地存储localstore&#xff0c;但是相比localStore 10MB的存储量&#xff0c;indexedDB可存储的数据量远超过这个数值&#xff0c;具体是多少呢&#xff1f; 默认情…

将WIN10的wifi上网分享给以太网接口

目录 打开网络设置设置属性点这里的设置将wlan主机的以太网接口IP设为自动获取 如果连接不成功&#xff0c;拔网线重连一次 打开网络设置 设置属性 点这里的设置 将wlan主机的以太网接口IP设为自动获取 如果连接不成功&#xff0c;拔网线重连一次

什么是N卡和A卡?有什么区别?

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、什么是N卡和A卡&#xff1f;有什么区别&#xff1f;…

Desoutter智能拧紧中枢Connect过压维修

马头智能拧紧中枢过压维修是马头拧紧设备维护中的重要环节。当出现马头拧紧设备中枢过压现象时&#xff0c;会导致设备性能下降&#xff0c;甚至损坏设备&#xff0c;因此及时对过压中枢进行维修是保障设备正常运转的关键。 Desoutter电动螺丝刀控制器过压的原因可能有很多&am…

数学建模系列(3/4):典型建模方法

目录 引言 1. 回归分析 1.1 线性回归 基本概念 Matlab实现 1.2 多元回归 基本概念 Matlab实现 1.3 非线性回归 基本概念 Matlab实现 2. 时间序列分析 2.1 时间序列的基本概念 2.2 移动平均 基本概念 Matlab实现 2.3 指数平滑 基本概念 Matlab实现 2.4 ARIM…

HarmonyOS Next 系列之沉浸式状态实现的多种方式(七)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

《计算机英语》测试练习题

作业3 一、单选题 内存条 的英文翻译是 A. memory chip (内存条通常指的是内存条上的存储芯片&#xff0c;但整个内存条的英文翻译应为 "RAM"&#xff0c;即 Random Access Memory 随机存取存储器) capacitor的中文意思是 D. 电容器 relay 的解释是 A. 继电器 por…

一、docker简介及卸载、安装

目录 一、Docker 简介 二、dockers三要素 1、Docker镜像&#xff08;image&#xff09; 2、Docker仓库 3、Docker容器 三、docker架构图 四. Docker 运行的基本流程 五、docker 卸载 1、停止docker服务 2、查看yum安装的docker文件包 3、查看docker相关的rpm源文件 …

ardupilot开发 --- Jetson Orin Nano 后篇

我拼命加速&#xff0c;但贫穷始终快我一步 0~1920. visp-d455&#xff1a;基于IBVS的Pixhawk无人机视觉伺服20.1 基础关于连接、通讯、UDP forward服务&#xff1a;一些相关的、有用的例程Linux C程序的gdb断点调试搭建仿真解决【testPixhawkDroneTakeoff.cpp例程能解锁但起飞…

优选免单模式:电商销售的新篇章

随着电商市场的日益繁荣&#xff0c;各种创新销售模式层出不穷。其中&#xff0c;优选免单模式以其独特的运作方式和激励机制&#xff0c;吸引了大量消费者的目光。该模式的核心在于通过降低商品售价、引入社交元素以及设计阶梯式奖励&#xff0c;激发消费者的购买热情&#xf…

[已解决]ImportError: DLL load failed while importing win32api: 找不到指定的程序。

使用pip install pywin32302安装后import找不到win32api 失败尝试 上网找别人的解决方案&#xff0c;大部分解决方案都是通过复制下面两个dll文件到 下面这个文件夹&#xff0c;并且复制到C:\Windows\System32&#xff0c;从而解决问题&#xff0c;但是我没能成功。 解决方…

Python编辑器pycharm详细安装步骤

PyCharm 的详细安装步骤 以下是在 Windows 系统上安装 PyCharm 的详细步骤&#xff1a; 第一步&#xff1a;下载安装程序 访问 PyCharm 官方网站&#xff08;https://www.jetbrains.com/pycharm/&#xff09;&#xff0c;根据自己的需求选择社区版&#xff08;Community&…

分享uniapp + Springboot3+vue3小程序项目实战

分享uniapp Springboot3vue3小程序项目实战 经过10天敲代码&#xff0c;终于从零到项目测试完成&#xff0c;一个前后端分离的小程序实战项目学习完毕 时间从6月12日 到6月22日&#xff0c;具有程序开发基础&#xff0c;第一次写uniapp,Springboot以前用过&#xff0c;VUE3也…

docker in docker 在CI中应用解析

docker in docker 简介 docker里嵌套运行docker&#xff0c;本文讲解其在jenkins和gitlab-runner 种的调用流程 一、用于jenkins 容器化部署jenkins时调用docker命令集成CI功能 [rootops-demo~]# docker inspect jenkins --format"{{json .Mounts}}" [{"T…