竞赛无人机搭积木式编程(三)---用户自定义航点自动飞行功能(全局定位,指哪打哪)

竞赛无人机搭积木式编程(三)---用户自定义航点自动飞行功能(全局定位,指哪打哪)

无名小哥 2023年6月10日

用户通过对前面两讲中全国大学生电子设计竞赛真题植保无人机(2021)、送货无人机(2022)完整方案的学习。细心一点的客户可以发现:在激光雷达SLAM/T265双目相机提供全局定位数据的情况下,无人机的自主飞行部分的程序设计,基本都是通过飞控代码二次开发模式中已有的飞行控制API函数,即自动飞行支持函数和导航控制函数实现。

同时需要结合底部/前向的机器视觉传感器以及激光雷达传感器对目标特征进行视觉/距离定位。比如送货无人机赛题中,达到目标航点上方后,通过视觉实现无人机的精准目标定位。通过视觉实现无人机位置的二次对准,其实就是用到的前些年赛题中的追踪移动色块的功能;

另外在植保无人机发挥部分要求中,需要识别到塔杆和条形码信息。通过激光雷达传感器识别道塔杆的水平位置、相对无人机机头方向的角度,对无人机偏航方向和机头与杆之间的距离进行控制,进而实现机头对准塔杆并调整与杆之间的间距并通过视觉识别特征这一复合的运动,这里用的就是基础飞行控制函数中的偏航控制API和速度控制API函数予以实现。

为了方便萌新用户针对具体竞赛内容实现快速的二次开发,我们新增加了用户自定义航点飞行功能,用户可以不需要自己编程去改飞控代码,就可以实现航点参数的录入,无人机能按照用户录入的航点动作进行自主飞行。这里需要注意的是默认提供的自定义航点自动飞行函数中飞行动作只是对航点的依次遍历,尚不涉及中间动作,比如需要结合视觉/激光雷达进行视觉定位、距离定位。

用户自定义航点自动飞行功能提供的是一个精简化的自主飞行框架,用户可以快速实现飞行动作的修改和编排。针对某一比赛任务设计中航点飞行任务部分用户可以无需重复设计,直接参考本框架就可以轻松实现多航点目标自动飞行任务,留足更多的时间去着手机器视觉部分和更为精细化的任务设计。另外电赛国赛测评中要求参赛者去现场编程,快速实现某一飞行动作要求变得不再有任何压力。

12_用户通过ADC按键录入自定义航点飞行功能——支持现场设置坐标参数(全局定位,指哪打哪)

演示视频:https://www.bilibili.com/video/BV1wP411z7jo/

1 五向按键的检测设计与航点参数调节界面设计

根据用户需要现场高效率的录入航点参数的这一具体要求,我们将上一版本ADC安全绳按键进行了升级,在保留原有解锁、开发、上锁、降落四个独立按键的功能的同时,新增加了一路独立的五向按键采集ADC通道,一个IO口实现了5个方向按键的检测,并可配备有短按、长按、持续按、多次点动触发等,进一步丰富了按键键值。五向按键配合扩展版上OLED显示屏可方便实现多个参数的修改与保存。

1.1ADC按键检测原理

ADC按键的检测原理为每个按键串入不同的电阻值,按键按下后偏置电压经过电阻分压作用后,由单片机的ADC端口采集,飞控程序可以通过采集到的ADC值在某个区间范围来判断是哪个按键按下,并对按下的持续时间、次数灯进行逻辑处理,实现按键事件的响应。这部分原理以往教程有详细的讲解和分析,不属于本文重点,这里不再展开,用户可以参照以下链接自行学习。

电赛飞行器安全绳+无遥控器按键控制方案 https://www.bilibili.com/read/cv11399668

电赛禁止“无线通讯及遥控”解决方案 https://www.bilibili.com/read/cv7897817

电赛神器ADC安全绳按键无遥控器控制方案https://www.bilibili.com/video/BV1Gq4y1E7XM

1.2 航点参数界面设计

OLED显示屏参数显示分为8行,第1行显示内容为页面和页码提示,第2行至第8行数据为1-7个航点的ENU(等效东北天)方向的坐标信息,其中EN方向的输入参数表示相对初始基准点的位置增/减量。它是一个相对位置坐标参数,并非实际无人机内部实时位置,二者在水平位置上相差一个初始基准点的坐标(base_position.x,base_position.y)。U方向输入的是绝对坐标信息,即无人机离地面的高度值。

五向按键的中的上下按键短按可以实现某一参数的选中,*提示光标会移动到待调整参数的前面。

五向按键的中的左右按键短按/长按可以实现某一参数的选中的自加、自减,其中短按是自加/减1,长按是自加/减50。

五向按键里面的中按键长按可以实现当前页面所有参数写入到EEPROM实现掉电存储。

2 航点自动飞行功能软件实现

用户录入的航点参数存储在飞控EEPROM内,飞控每次上电时会从EEPROM中读取航点参数并保存在param_value参数数组内,第一个航点的参数存储在该变量的第51维开始的三个变量内,航点生成函数的作用是判断param_value数组航点字节段区间的数据是否全为0,来判断航点数据是否有效。当前能录入的最大航点数量为28个,针对不同的赛题任务,客户可以自己灵活调整。

2.1第一阶段——自动起飞到航巡高度方法uint8_t Auto_Takeoff(float target)

函数输入参数target为目标高度,自动起飞任务分为两个线程,第一步为记录当前3维位置信息,作为导航初始原点位置。并且通过导航控制函数设置期望目标高度位置。第二步为实时检测高度偏差值,连续2S满足位置偏差在10cm以内后,函数返回值置1后,自动起飞到目标高度任务完成,用法参照Developer_Mode.c开发者模式中case 18用法,自主起飞任务完成后会进入case 19执行航点自动飞行功能。

2.2第二阶段——自定义航点飞行Navigation_User_Setpoint(void)

第一步将高度期望设置成第一作业高度150cm,水平位置期望为初始起飞时候的水平位置,在起飞点上方悬停时间设置为1S,悬停时间可以根据实际需要调整。

起飞点上方悬停1S后,会根据按键录入航点数据进行判断,如果航点数据有效则将此航点设置成目标航点,并且线程计数器flight_subtask_cnt[n]会赋值为2,随后进入航点任务执行线程。

在线程2中执行航点飞行任务,并实时判断无人机的三维位置偏差,连续N次满足偏差小于某一阈值时,可以认为当前航点已抵达,继续刷新下一航点信息。当所有航点遍历完毕后,跳到第3 线程中,结束整个航点遍历过程。

最后执行线程3中的原地下降任务,无人机降落到地面后会触发地面检测条件无人机会自动上锁,结束整个飞行过程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【UE 从零开始制作坦克】2-控制坦克移动(简单的移动效果)

效果 步骤 1. 新建蓝图类,父类选择“VehicleWheel(载具车轮)” 这里就命名为“TankWheel” 双击打开“TankWheel”,设置形状半径为40 2. 打开 “BP_West_Tank_M1A1Abrams” 选中“网格体(VehicleMesh)&…

JMeter参数化4种实现方式

目录 前言: 1 参数化释义 2 参数化实现 CSV实例 注意事项 前言: 在使用JMeter进行测试时,参数化允许您模拟不同的用户、不同的数据、不同的操作等,从而增加了测试的灵活性和复用性 1 参数化释义 什么是参数化?…

设计模式(十八):行为型之观察者模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

分布式数据库HBase

大数据基础-分布式数据库HBase 概述HBase简介HBase与传统关系数据库的对比分析 HBase数据模型数据模型概述数据模型相关概念数据坐标 HBase的实现原理HBase功能组件表和RegionRegion的定位HBase框架结构HMasterRegionServerHBase协作组件RegionColumnFamilyKeyValue小结 HBase运…

STM32单片机(六)TIM定时器 -> 第二节:TIM定时中断练习(定时器定时中断和定时器外部时钟)

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

docker数据管理---数据卷,数据卷容器

在Docker中,数据卷(data volumes)和数据卷容器(data volume containers)是用于在容器之间共享和持久化数据的两种不同的机制。 一、数据卷 数据卷是一个特殊的目录或目录,可以绕过容器文件系统的常规层&a…

【RabbitMQ教程】第六章 —— RabbitMQ - 延迟队列

💧 【 R a b b i t M Q 教程】第六章—— R a b b i t M Q − 延迟队列 \color{#FF1493}{【RabbitMQ教程】第六章 —— RabbitMQ - 延迟队列} 【RabbitMQ教程】第六章——RabbitMQ−延迟队列💧 🌷 仰望天空,妳我亦是行人…

2023年前端面试高频考点HTML5+CSS3

目录 浏览器的渲染过程⭐⭐⭐ CSS 、JS 阻塞 DOM 解析和渲染 回流(重排)和重绘⭐⭐ 选择器 ID选择器、类选择器、标签选择器(按优先级高到低排序)⭐⭐ 特殊符号选择器(>,,~,空格&#xff0…

Stopwatch工具类计时器探究

搬砖的我们 特别是Java开发的童鞋们, 经常需要通过记录开始时间和结束时间,然后通过计算差值,得到时间差,如下面的代码: long start System.currentTimeMillis(); long end System.currentTimeMillis(); System.out.println(…

医疗设备都在用哪些晶振?

医疗设备是指用于医疗诊断、治疗、监测等方面的各种设备。随着科技的不断发展,医疗设备的功能不断增强,精度和稳定性也得到了大幅提升。在这些医疗设备中,晶振是非常重要的元件之一。本文将介绍医疗设备中常用的晶振类型及其特点。 一、晶振…

P20[6-8]编码器接口测速(软)

与外部中断编码器逻辑不同,此处编码器使用的是定时器方法 1.Encoder编码器部分: #include "stm32f10x.h" // Device header void Encoder_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCm…

阿里云弹性公网EIP收费价格表

阿里云弹性公网EIP怎么收费?EIP地域不同价格不同,EIP计费模式分为包年包月和按量付费,弹性公网IP可以按带宽收费也可以按使用流量收费,阿里云百科分享阿里云弹性公网IP不同地域、不同计费模式、按带宽和按使用流量详细收费价格表&…

Java泛型的使用

1.什么是泛型? 所谓泛型,就是允许在定义类、接口时通过 一个标识 表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时&#…

取石子游戏——算法与编程

取石子游戏 目录 问题描述输入输出格式输入格式:输出格式: 输入输出样例输入样例#1:输出样例#1:提示信息 算法尼姆博奕 代码 问题描述 A l i c e Alice Alice和 B o b Bob Bob在玩取石子游戏,摆在他们面前的有 n n n堆…

RFID期末复习总结

一.概念部分 1.基础概念 射频识别无线电频率识别RFID 应答器:存放识别信息的电子数据载体 阅读器:将识别信息从应答器中读出(还可以写入数据) 应答器是统称,在各种专业场合有专业名字,比如射频卡&#…

2022 年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题

2022 年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题 一. 逻辑推理:第 26~55 小题,每小题 2 分,共 60 分。下列每题给出的 A、B、C、D、E 五个选项中,只有一项是符合试题要求的。 26.百年党史充分揭示了中国共产党为什么…

object类clone、finalize

2 什么是API API(Application Programming Interface,应用程序接口)是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件可以访问的一些功能集,但又无需访问源码或理解内部工作机制的细节. API是一种通用功能集,有时公…

Linux操作系统——第四章 进程间通信

目录 进程间通信介绍 进程间通信目的 进程间通信发展 进程间通信分类 管道 System V IPC POSIX IPC 管道 什么是管道 匿名管道 管道读写规则 管道特点 命名管道 创建一个命名管道 匿名管道与命名管道的区别 命名管道的打开规则 system V共享内存 共享内存示意…

TS系列之keyof详解,示例

文章目录 前言一、keyof是什么总结 前言 如果你用过TS的工具类型,Partial、Required、Pick、Record。那么你可能看过他们内部实现都有共同点就是keyof关键字。即使没有见过,那么下面就一起来了解一下,keyof关键字的详细作用吧。 一、keyof是…

基于Java家政服务网站系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…