竞赛无人机搭积木式编程(四)
---2023年TI电赛G题空地协同智能消防系统(无人机部分)
无名小哥 2023年9月15日
- 赛题分析与解题思路综述
飞控用户在学习了TI电赛往届真题开源方案以及用户自定义航点自动飞行功能方案讲解后,能基于二次开发模式中已有的飞行控制API函数,即自动飞行支持函数和导航控制函数去实现特定赛题飞行动作、轨迹、航点等任务,上述内容是学生在备赛阶段学习无人机二次开发时的必备技能,对这部分不熟悉的可以回顾下前几讲的教程。
针对2023年TI电赛的无人机赛题“空地协同智能消防系统”这一具体任务,简单可以分为以下三个部分的设计:
- 无人机自主飞行任务设计
- 消防车自动运行与灭火任务设计
- 模拟火源的任务设计
- 无人机自主飞行任务设计概述
在无人机自主飞行任务设计中,关于实现基础部分飞行功能,用户可以无需编写自主飞行任务代码,直接利用程序中已有的用户自定义航点飞行功能,去通过按键或者地面站设置航点坐标即可完成基础部分飞行任务,有且仅需要做的工作是写IO控制去驱动激光笔点亮、串口通讯用数传去实时发送位置等信息给小车平台就可以,基础部分的无人机飞行任务设计只需要做很少的工作量就可以把分数拿满。
发挥部分无人机自主飞行任务设计分为航点遍历、底部视觉色块跟踪对准、驱动舵机实现投放动作,同样这三个元素在往届的赛题中均有涉及,躺赢者PRO飞控有与之配套的相关代码接口可以直接调用,如果用户在平常的训练中有跟着教程一路扎扎实实学习下来,自己编程去实现特定任务组合的任务代码应该也是驾轻就熟,对于熟练掌握的学生来讲就是用模块化的代码去搭积木的工作。
- 消防车自动运行与灭火任务设计概述
消防车自动运行与灭火任务的设计中,要求小车在行驶达到火源的过程中不得碾压街区边界线,这点需要小车事先规划好从出发点G0前往火源G处的中间路径点。小车平台上可搭载机载计算机通过激光雷达/深度相机实现全局定位,需要做的工作是实现航点遍历+视觉识别后激光笔对准,可加以云台辅助控制激光笔,实现在某一范围内激光笔动作,目的是实现快速的灭灯,具体云台单轴还是双轴需要根据实际做的模拟火源光敏电阻分布情况来。也可以不需要云台直接让视觉传感器和激光笔同轴安装,小车在视觉对准火源的过程中照射到光敏电阻就可以使得火源熄灭。
- 模拟火源任务的设计
自制模拟火源中要求用电池供电的红色光源去作为模拟火源,模拟火源的亮灭可以用激光笔持续照射去控制,持续照射2秒左右开启,再持续照射2秒左右关闭,同时对模拟火源的尺寸和形状有一定的要求。
参赛学生可以通过自己熟练的任意一款单片机,简单设计基于灰度传感器、光敏传感器分压电路,加上MOS管驱动电路,编写AD电压采集、IO驱动程序,去实现这一任务,这部分代码量非常小,只要是学过单片机、懂基础的电路硬件知识的同学都能实现。设计虽然简单但是也有一些设计细节要点需要注意:
- 红色光源的强度要足够,确保能满足无人机在不同环境光线下都能稳定识别。如果无人机检测火源不可靠,意味着发挥部分的无人机释放灭火包、消防车运行部分的得分会全部丢掉,即使你的无人机和小车运行的又快又稳。相当于仅可拿到基础部分的分数,从实际比赛来看,很有些队伍出现了现场火源检测不到,只拿到了基础分数。由于国测现场无人机有部分队伍现场出现炸机情况,国测现场基本只要你飞机能跑完基础部分就是国一,虽然在奖项上来看都是一等奖,但是为了不给自己留遗憾,完全可以通过合理设计光源信息避免。针对23年电赛无人机赛题中只需要检测单一火源信息的情况,可以采用红色光源+红外光源结合的设计,机器视觉模组加上红外截止滤光片能保证稳定检测识别。
- 遮光罩的材质与遮光罩的尺寸影响无人机和消防车对模拟火源的识别,为了增加红色LED灯作为光源时的发光面积和聚光效果,通常采用聚光环或者手工折叠锡箔纸去实现灯罩的设计,所以灯罩需要有一定高度并且不透光。同时发光灯珠是在灯罩底部,使得消防车上安装的摄像头从侧面上就难以看得到模拟光源灯珠发出来的光,故而消防车上的激光笔对模拟火源的照射也无法实现。实际比赛中看到有些学校采用的透光的灯罩或者将灯罩外侧单独涂红色便于小车去检测模拟火源。
- 模拟火源上光敏电阻容易对无人机上激光笔照射做出错误响应,题目中要求的是消防车照射火源时,火源才允许熄灭,但是实际赛题中在无人机识别到火源后,也需要用激光笔去照射模拟火源区并进行投放灭火包的这一动作。为了防止无人机激光笔照射到光敏电阻时,模拟火源的提前熄灭,通常需要让灯罩截面足够大,俯视投影能覆盖底下整个电路板部分,防止无人机激光笔的直射造成的误触发。或者直接将光敏电阻朝下能有效避免无人机激光笔的影响,通过调整消防车激光笔的到同一安装高度去实现稳定照射并检测。
- 光敏电阻组成的分压电路稳态电压输出值受到环境光线影响需要现场标定,由于不同环境光线下光敏输出阻抗存在差异,因此程序里面检测阈值需要现场标定,实际可以采用按键或者电位器进行现场标定。当然如果在光敏电阻朝下并且底板为深色的情况下,可无需标定。
- 激光笔的光斑比较小,需要多个光敏电阻均匀分布才能确保激光笔照射到后实现灭火,由于没办法保证激光笔光斑能严格对准某一区域的光敏电阻,往往需要依靠灯罩、电路板的间接反射才能照射到光敏电阻,并且题目要求要持续不间断照射2S才行,实际小车很难做到这一点,故可以设计两组检测回路,比如单独用一路灰度传感器去作为2S持续照射的去点亮或者关闭,另外一路光敏回路作为消防车灭火时用,只要有激光笔照射到光敏上就可以触发光源熄灭条件。
综上所述,学生在实现2023年TI电赛空地协同智能消防系统中,针对无人机自主飞行任务设计,对于平时有积累并有掌握往届真题、案例demo的同学难度基本可以忽略,只需要把通过无线数传传输无人机状态给小车,小车发送ADC按键键值去无线操控无人机解锁、上锁、SDK、降落后,基本无人机部分的工作量就能完成。消防车如果搭载有机载计算机全局定位的情况下航点遍历、视觉对准、舵机云台控制等这些属于常规项,用通用的SLAM小车套件实现难度也不大,当然没有SLAM定位情况下,单靠IMU+编码器组成的里程计系统,在选取摩擦力大的轮胎情况下也同样可以完成。最后单看模拟火源部分工作量也很少,除了上面说的一些细节要注意,对于普通电子信息相关专业学生能高效率完成。模拟火源熄灭的评分只占很少一部分,消防车能视觉对准火源照射,火源没有熄灭也不会影响学生去拿国奖。毕竟有些省份的无人机赛题只要发挥部分小车能动起来就能推优综测,综测过了,无人机国测基础部分能飞现场不炸机基本就是稳拿国一。
虽然赛题实现拆分来看每一项的工作量都不算大,单独某一项的难度可能还比不上大三大四学年的一个专业相关课程设计,但是这些都是建立在训练备赛阶段熟练掌握的已有资源的前提下。由于涉及的三个部分需要独立设计方案综合考量,并且彼此之间需要联合调试,整体上的工作量会很大,比赛阶段时间上会非常赶,特别是在自己实验室只有一组无人机队伍参赛的情况下,三个人能做好分工的情况下时间都显得捉襟见肘。
来年备战比赛的学生可以看看实际每个省无人机国赛出线或者省奖排名靠前的队伍,能取得好成绩的很多都是该校有安排多组无人机参赛队伍,像西交、上大(SHU)、东大(SEU)、重大、北邮、桂电、山大(SDU)、哈工大、南工程、杭电等这样的无人机赛题方向传统强队,多年实力霸榜垄断该省份的无人机出线名额。同赛题多组参赛队伍的好处是彼此硬件方案接近,学校资源一致,虽然电赛要求每组队伍独立参赛,但是实际很难避免实验室为了确保出线名额,其它队伍参考种子队伍的方案去比赛。这种情况下就有更多的人手去做类似消防车、模拟火源基础服务的工作,比如一个实验室有三组队伍,这就相当9个人做了3个人的活,碰到今年每项都比较基础只是总工作量大的赛题,多组队伍参赛的学校想不出线都难。无人机赛题多组队伍参赛的结果好处就是能分担工作量,学生有更多的时间去做优化,做的好的情况下就是集体出线,完全不给同省其它高校无人机参赛队伍任何机会。
单看控制方向题目,由于无人机赛题相对小车或其它控制赛题经费开销巨大,一台搭载机载计算机支持激光雷达SLAM/T265定位的无人机外加上备用件耗材基本都要到1w往上走,外加当下经费吃紧、报销流程复杂,综合来看有实力组织多组参赛队伍去做无人机赛题的高校并不多。往往需要持续多年的人员经费投入才能取得好的成绩,当然也有一些首年使用NC360竞赛无人机开发平台就获得国奖、省一的同学,这部分相对比较少,每年都只有典型的几组,更多的是需要做好传承帮带,积累资源、持续投入迭代,这样自己的学校才会在电赛无人机赛题上有一席之地。
另外纵观这么多年的电赛无人机赛题得奖情况,还有一个现象就是有些省份出线和排名靠前的队伍并不一定是该省的头部985、211高校,有些省份双非、普通二本、民办独立高校的无人机获得国奖、省一的也很多,特别是在西北、西南和部分南方省份更为明显,经过以往调查来看这些学校往往有着较为充裕的经费支持,持续的供应能让这些学校的学生能用上更为可靠的硬件平台、定位方案、机载计算机平台,平时能做多套方案验证去高效率的学习,不会因为一时的炸机而畏手畏脚进展缓慢,在备战电赛无人机也更有底气,平常处理的问题多,比赛阶段团队协作运用综合能力,选择合适方法去高效率的解决实际问题就会更得心应手。
学生的能力固然重要,但是没有学校、实验室、指导老师的持续的支持和经费投入,单凭学生的一腔热血很难持久。没有学校支持顶多就是某届某个学生能力出众凭个人能力拿个一等奖,没有持续的经费支持,后面没人接手,青黄不接后就很难再拿好名次了,特别是在前几年口罩期间这种传承断代、设备长期吃灰、临时抱佛脚、仓促应战的情况就更为明显。
- 无人机自动飞行任务的软件设计
- 第一阶段——自动起飞到航巡高度
uint8_t Auto_Takeoff(float target)//自动起飞到某一高度
函数输入参数target为目标高度,自动起飞任务分为两个线程,第一步为记录当前3维位置信息,作为导航初始原点位置。并且通过导航控制函数设置期望目标高度位置。第二步为实时检测高度偏差值,连续1S满足位置偏差在10cm以内后,函数返回值置1后,自动起飞到目标高度任务完成,当前的mode会加上task_select_cnt进而实现自主起飞任务完成后,会进入case 21/22执行航点遍历作业任务,其中task_select_cnt可以通过遥控器调节,方便现场执行不同的sdk任务。
- 基础部分——航点遍历作业任务
void Air_Ground_Extinguish_Fire_System_Basic(void)
第一步将高度期望设置成第巡逻高度180cm,水平位置期望为初始起飞时候的水平位置,并设置激光笔为持续闪烁,便于裁判判断飞机机身中心在地面上的投影位置,起飞点上方悬停时间设置为1S。
起飞点上方悬停1S后,会将键盘输入的第一个航点A点的水平坐标填入到期望的目标位置,随后飞机会执行从起飞点正上方飞向第一个航点A点的动作,在执行本任务中对水平位置误差进行实时检测,连续N次水平位置误差小于某一阈值,即可以认为到达A点正上方附近,满足达到A点条件后会将航点计数器flight_global_cnt2[n]自加,flight_subtask_cnt[n]置1,飞机会继续执行flight_subtask_cnt[n]==1中的任务,即刷新下一航点位置后再进入flight_subtask_cnt[n]==2中实时检测水平位置偏差,依次判断是否到达B、C、F、E、D航点。
当满足航点计数器flight_global_cnt2[n]>=block_navpoint_num_basic时表示所有区块都已经巡逻完毕,结束航点遍历后无人机继续执行返航降落。
无人机会执行返航动作,首先无人机飞到起飞点正上方,连续N次水平位置误差小于某一阈值即可认为达到起飞点正上方附近,满足水平抵达之后会执行原地降落至地面的任务,到达地面后无人机会满足地面检测条件自动上锁。
- 发挥部分——航点遍历+色块对准+投放动作任务
void Air_Ground_Extinguish_Fire_System_Innovation(void)
第一步将高度期望设置成第巡逻高度180cm,水平位置期望为初始起飞时候的水平位置,并设置激光笔为持续闪烁,便于裁判判断飞机机身中心在地面上的投影位置,起飞点上方悬停时间设置为1S,同时驱动排针PWM的预留PWM2对舵机进行控制实现夹住灭火包。在起飞点上方悬停完毕后会设置A点为目标航点,无人机会飞向A点。
达到A点之后的航点遍历过程,无人机会实时判断底部OPENMV视觉模拟火源情况,如果识别到了模拟火源,无人机会中止航点遍历的过程,进入色块对准模式。
线程计数器flight_subtask_cnt[n]赋值为5进入色块对准模式,为了避免初始识别到火源时位置偏差太大,调整过激,这里有对未知色块位置-速度控制器输出进行了限幅度。
色块对准的结束条件有两个,分别为时间约束和色块位置约束,无人机值执行色块对准的过程中,色块位置误差会逐渐收敛到0,如果连续N次满足色块位置误差比较小会提前结束色块对准过程。
结束色块对准后,无人机会记录当前的水平位置供后续消防车使用,之后无人机会调节高度到100cm。下降完毕后会原地悬停3S后驱动舵机投放灭火包。
投放完毕后更新火源信息,相关的坐标信息会通过串口数传发送给消防车。
最后会恢复到180cm巡逻高度,抵达后会继续识别到火源信息前的航点遍过程。
在巡逻完毕A、B、C、F、E、D后,会继续执行返航降落,这部分和基础部分代码一样,即flight_subtask_cnt为1~3的内容,故不再赘述,可参考基础部分解释。
最后给出小车无线发送ADC按键键盘AD值,消防车控制无人机解锁、上锁、SDK、自动降落的代码以及无人机发送三维位置、航程、模拟火源信息的代码段。
无线ADC按键使用相关操作教程方法见下方链接
小车上的ADC按键实现对无人机的控制与飞控发送航点/火情数据给小车平台的演示_哔哩哔哩_bilibili
由于本节内容过多,基于盘古TI MCU的多功能控制器实现的消防车的教程和制作模拟火源的教程单独作为一节给出。