赛前指导:第二届未来飞行器挑战赛实践赛道之技术详解

本文主要是介绍赛前指导:第二届未来飞行器挑战赛实践赛道之技术详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2022(第二届)四川省大学生未来飞行器挑战赛正在火热进行中,本次挑战赛中的实践类赛道将面向全省高校大学生个人或团队征集未来先进侦察打一体化无人机的实地竞赛,主要考察路劲规划、视觉目标搜索、舵机控制、车机协同等需要团队协作的多方面技术能力。

 

主办方将在赛场内提供 UWB 基站信号覆盖,参赛队伍可以自主选择目标识别和定位方式。阿木实验室作为大赛技术支持方,为给参赛队员提供更全面的指导,在赛事中更好地发挥,我们根据实践类比赛规则做了一版实践类赛道仿真demo,供参赛队员参考~

仿真效果展示

本功能包(future_aircraft)为Prometheus仿真功能包之一,主要用于实现2022(第二届)四川省大学生未来飞行器挑战赛的实践类仿真,仿真效果如下:

2022年四川省大学生未来飞行器挑战赛-实践类赛道仿真demo_哔哩哔哩_bilibili

首先我们需要通过gazebo仿真器搭建比赛区域,增加飞机模型以及相机模型,此时无人机将由H位置一键起飞,起飞后无人机会立即转换为自动模式,开始通过机载传感器(下视相机)自主搜索目标标靶,并在目标标靶上方保持动态跟踪悬停(precision loiter)尽可能模拟投掷子弹状态。

若您对于实践类赛道仿真demo有任何疑问或建议,欢迎在文章下方给我们留言发起讨论~接下来我们将给大家分享该仿真场景的一些代码设计思路。

代码设计思路

该仿真场景的代码设计主要由控制部分和视觉识别部分组成,具体介绍如下:

控制部分

根据比赛要求,我们可以将该比赛区域分割为三部分,如下图所示:

在三部分区域中,设计10种状态机分别为:

当无人机执行起飞命令,起飞完成后会进入航点1阶段,进而进入搜索状态,以绕圈的方式进行搜索目标标靶;如果搜索到目标标靶,就将进入跟踪状态机,跟踪状态机进行跟踪并且在目标标靶上方保持悬停,这时候区域1任务结束。

接着无人机将继续执行区域2任务,先进入航点2阶段,再进入搜索状态,搜索目标标靶,当搜索到目标标靶后会进入跟踪状态并在目标标靶上方保持悬停,此时区域2任务结束。

最后无人机执行任务3进行动态跟踪,首先执行航点3飞行,飞行完成后无人机将在上空进行识别移动的目标标靶,识别到之后进入动态跟踪阶段并实时保持上方动态跟踪,此时区域3任务结束。

视觉部分

视觉部分采用的是椭圆检测识别方法:

​其中图像处理的过程如下:

第一步:图像去噪声,去除图像中的椒盐噪声。

第二步:弧检测,挑选出可能为弧的对象。

第三步:弧分类,判定弧属于四个象限中的哪一类。

​第四步:弧过滤,运用两段弧约束、CNC约束(三段弧约束),过滤不满足要求的弧。

第五步:椭圆估计,在剩下的四个象限的弧中进行排列组合,使用优化算法,通过4个弧线估计一个椭圆。

第六步:椭圆打分,使用特定打分算法,计算椭圆与4个弧线的拟合程度,给椭圆打分,最后选出得分较高的椭圆。

用到了哪些技术

航点状态机的实现,更多的是依赖于如何使用Prometheus控制子模块,因此也建议各位开发者在学习该仿真场景之前,先参考Prometheus使用手册学习Prometheus的控制子模块的内容。以下为用到的技术以及对应的代码实现:

WAY* 航点状态机:使用惯性系或者机体系下的位置控制。

WAY1:uav_command.header.frame_id = "ENU";uav_command.Agent_CMD = prometheus_msgs::UAVCommand::Move;uav_command.Move_mode = prometheus_msgs::UAVCommand::XYZ_POS;uav_command.position_ref[0] = waypoint1[0];uav_command.position_ref[1] = waypoint1[1];uav_command.position_ref[2] = waypoint1[2];

搜索状态机的实现,绕圆运动进行搜寻:


SEARCH:// sleep(10);//坐标系uav_command.header.frame_id = "ENU";// Move模式uav_command.Agent_CMD = prometheus_msgs::UAVCommand::Move;// Move_modeuav_command.Move_mode = prometheus_msgs::UAVCommand::XY_VEL_Z_POS;//无人机按照圆形轨迹飞行uav_command.velocity_ref[0] = -line_velocity * std::sin(count * angle_increment);uav_command.velocity_ref[1] = line_velocity * std::cos(count * angle_increment);uav_command.velocity_ref[2] = 0;uav_command.position_ref[2] = 1.5;

跟踪状态机的实现,使用对无人机速度控制的P调节:


TRACKING:if (!is_detected){--loss_count;if(loss_count < 0)exec_state = RETURN;PCOUT(0, YELLOW, "Return");}//坐标系uav_command.header.frame_id = "BODY";// Move模式uav_command.Agent_CMD = prometheus_msgs::UAVCommand::Move;// 机体系下的速度控制uav_command.Move_mode = prometheus_msgs::UAVCommand::XY_VEL_Z_POS_BODY;uav_command.velocity_ref[0] = -0.9 * ellipse_det.sight_angle[0];uav_command.velocity_ref[1] = 0.9 * ellipse_det.sight_angle[1];uav_command.velocity_ref[2] = 0;uav_command.position_ref[2] = 1.5;

视觉端数据的处理,坐标系变化:

for(auto &ellipes : msg->detection_infos){ellipse_det = ellipes;if (ellipse_det.detected && ellipse_det.object_name == "T"){num_regain++;num_lost = 0;}else{num_regain = 0;num_lost++;}if(num_lost > VISION_THRES){is_detected = false;// PCOUT(1, GREEN, "no detect");}if(num_regain > VISION_THRES){is_detected = true;// PCOUT(1, GREEN, "detected");}ellipse_det.sight_angle[0] = ellipes.sight_angle[1];ellipse_det.sight_angle[1] = ellipes.sight_angle[0];

更多详情请参考:https://github.com/amov-lab/Prometheus/tree/main/Modules/future_aircraft

可能存在的问题

1、动态跟踪只有P调节的速度控制,跟踪效果并非理想情况,控制算法还需要针对比赛实际情况进行优化。

2、目前的仿真场景下暂时没有办法模拟子弹投掷至目标标靶,因此我们采取的替代方式是让无人机在目标标靶上方保持悬停一段时间,如果是在真实比赛场景下,还需要新增投掷标靶状态机。

电脑配置要求

以上内容均为阿木实验室仿真演示,各位开发者如需复现,对电脑配置会有一定的要求,Prometheus仿真环境配置主要有两种方式,分别是通过虚拟机或者实体机。

虚拟机安装的电脑配置要求

以笔者电脑为例:

具体的虚拟机安装方式可参考Prometheus使用手册中第2.2章节内容。

实体机安装的电脑配置要求

实体机的要求相对于虚拟机要低一些,具体为:内存 8GB;硬盘空间 60GB;CPU 6核12线。实体机的具体安装方式可参考Prometheus使用手册中第2.1章节内容。

这里我们推荐实体机的安装方式,相对虚拟机来说,实体机可以将全部的硬件资源利用起来,运行速度更快,bug也会更少。

Prometheus使用手册:https://wiki.amovlab.com/public/prometheus-wiki/

相关代码与资料

码云链接:https://gitee.com/amovlab/Prometheus/tree/main/Modules/future_aircraft

GitHub链接:https://github.com/amov-lab/Prometheus/tree/main/Modules/future_aircraft

与本届飞行器挑战赛实践赛道相关的代码都在“ Prometheus/Modules/future_aircraft”目录下,具体运行及使用可参考“readme”:https://github.com/amov-lab/Prometheus/blob/main/Modules/future_aircraft/readme.md

若大家在学习过程中遇到无法解决的使用场景或bug,可以在文末下方给我们留言,我们将为您提供解决思路~

如需探讨更多关于本届未来飞行器大赛的相关技术,可添加微信“jiayue199506”申请进入赛事交流群~

这篇关于赛前指导:第二届未来飞行器挑战赛实践赛道之技术详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/803964

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

SQLite3命令行工具最佳实践指南

《SQLite3命令行工具最佳实践指南》SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数... 目录1. SQLite3简介和特点2. sqlite3.exe使用概述2.1 sqlite3.exe

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2