竞赛无人机搭积木式编程(三)---用户自定义航点自动飞行功能(全局定位,指哪打哪)
无名小哥 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中的原地下降任务,无人机降落到地面后会触发地面检测条件无人机会自动上锁,结束整个飞行过程。