578

阿木币

1

精华

1451 小时

在线时间

管理员

Rank: 9Rank: 9Rank: 9

发表于 2022-8-27 15:47:48 2441 浏览 0 回复

[仿真开发] 赛前指导:第二届未来飞行器挑战赛实践赛道之技术详解

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

image.png

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


仿真效果展示

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



https://www.bilibili.com/video/BV1dP411577e/?vd_source=a76ee003543620cae9cdb53203e6fa58



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

image.png



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


代码设计思路

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


控制部分

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


image.png

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

image.png
微信图片_20220827143946.jpg

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

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

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


视觉部分

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


                               
登录/注册后可看大图


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

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

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

第三步:弧分类,判定弧属于四个象限中的哪一类。第四步:弧过滤,运用两段弧约束、CNC约束(三段弧约束),过滤不满足要求的弧。

image.png


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

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


用到了哪些技术

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


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

  1. WAY1:
  2.             uav_command.header.frame_id = "ENU";
  3.             uav_command.Agent_CMD = prometheus_msgs::UAVCommand::Move;
  4.             uav_command.Move_mode = prometheus_msgs::UAVCommand::XYZ_POS;
  5.             uav_command.position_ref[0] = waypoint1[0];
  6.             uav_command.position_ref[1] = waypoint1[1];
  7.             uav_command.position_ref[2] = waypoint1[2];
复制代码

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

  1. SEARCH:
  2.             // sleep(10);
  3.             //坐标系
  4.             uav_command.header.frame_id = "ENU";
  5.             // Move模式
  6.             uav_command.Agent_CMD = prometheus_msgs::UAVCommand::Move;
  7.             // Move_mode
  8.             uav_command.Move_mode = prometheus_msgs::UAVCommand::XY_VEL_Z_POS;
  9.             //无人机按照圆形轨迹飞行
  10.             uav_command.velocity_ref[0] = -line_velocity * std::sin(count * angle_increment);
  11.             uav_command.velocity_ref[1] = line_velocity * std::cos(count * angle_increment);
  12.             uav_command.velocity_ref[2] = 0;
  13.             uav_command.position_ref[2] = 1.5;
复制代码

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

  1. TRACKING:
  2.             if (!is_detected)
  3.             {
  4.                 --loss_count;
  5.                 if(loss_count < 0)
  6.                     exec_state = RETURN;
  7.                     PCOUT(0, YELLOW, "Return");
  8.             }
  9.             //坐标系
  10.             uav_command.header.frame_id = "BODY";
  11.             // Move模式
  12.             uav_command.Agent_CMD = prometheus_msgs::UAVCommand::Move;
  13.             // 机体系下的速度控制
  14.             uav_command.Move_mode = prometheus_msgs::UAVCommand::XY_VEL_Z_POS_BODY;
  15.             uav_command.velocity_ref[0] = -0.9 * ellipse_det.sight_angle[0];
  16.             uav_command.velocity_ref[1] = 0.9 * ellipse_det.sight_angle[1];
  17.             uav_command.velocity_ref[2] = 0;
  18.             uav_command.position_ref[2] = 1.5;
复制代码

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

  1. for(auto &ellipes : msg->detection_infos)
  2.     {
  3.         ellipse_det = ellipes;
  4.         if (ellipse_det.detected && ellipse_det.object_name == "T")
  5.         {
  6.             num_regain++;
  7.             num_lost = 0;
  8.         }
  9.         else{
  10.             num_regain = 0;
  11.             num_lost++;
  12.         }
  13.         if(num_lost > VISION_THRES)
  14.         {
  15.             is_detected = false;
  16.             // PCOUT(1, GREEN, "no detect");
  17.         }
  18.         if(num_regain > VISION_THRES){
  19.             is_detected = true;
  20.             // PCOUT(1, GREEN, "detected");
  21.         }
  22.         ellipse_det.sight_angle[0] = ellipes.sight_angle[1];
  23.         ellipse_det.sight_angle[1] = ellipes.sight_angle[0];
复制代码
更多详情请参考:https://github.com/amov-lab/Prom ... les/future_aircraft

可能存在的问题

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


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


电脑配置要求

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


虚拟机安装的电脑配置要求(以笔者电脑为例):

image.png

image.png

image.png



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


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


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


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


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


相关代码与资料

码云链接:https://gitee.com/amovlab/Promet ... les/future_aircraft

GitHub链接:https://github.com/amov-lab/Prom ... les/future_aircraft


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


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


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





扫一扫浏览分享
回复

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表