无名小哥 2023年9月15日
飞控用户在学习了TI电赛往届真题开源方案以及用户自定义航点自动飞行功能方案讲解后,能基于二次开发模式中已有的飞行控制API函数,即自动飞行支持函数和导航控制函数去实现特定赛题飞行动作、轨迹、航点等任务,上述内容是学生在备赛阶段学习无人机二次开发时的必备技能,对这部分不熟悉的可以回顾下前几讲的教程。
针对2023年TI电赛的无人机赛题“空地协同智能消防系统”这一具体任务,简单可以分为以下三个部分的设计:
在无人机自主飞行任务设计中,关于实现基础部分飞行功能,用户可以无需编写自主飞行任务代码,直接利用程序中已有的用户自定义航点飞行功能,去通过按键或者地面站设置航点坐标即可完成基础部分飞行任务,有且仅需要做的工作是写IO控制去驱动激光笔点亮、串口通讯用数传去实时发送位置等信息给小车平台就可以,基础部分的无人机飞行任务设计只需要做很少的工作量就可以把分数拿满。
发挥部分无人机自主飞行任务设计分为航点遍历、底部视觉色块跟踪对准、驱动舵机实现投放动作,同样这三个元素在往届的赛题中均有涉及,躺赢者PRO飞控有与之配套的相关代码接口可以直接调用,如果用户在平常的训练中有跟着教程一路扎扎实实学习下来,自己编程去实现特定任务组合的任务代码应该也是驾轻就熟,对于熟练掌握的学生来讲就是用模块化的代码去搭积木的工作。
消防车自动运行与灭火任务的设计中,要求小车在行驶达到火源的过程中不得碾压街区边界线,这点需要小车事先规划好从出发点G0前往火源G处的中间路径点。小车平台上可搭载机载计算机通过激光雷达/深度相机实现全局定位,需要做的工作是实现航点遍历+视觉识别后激光笔对准,可加以云台辅助控制激光笔,实现在某一范围内激光笔动作,目的是实现快速的灭灯,具体云台单轴还是双轴需要根据实际做的模拟火源光敏电阻分布情况来。也可以不需要云台直接让视觉传感器和激光笔同轴安装,小车在视觉对准火源的过程中照射到光敏电阻就可以使得火源熄灭。
自制模拟火源中要求用电池供电的红色光源去作为模拟火源,模拟火源的亮灭可以用激光笔持续照射去控制,持续照射2秒左右开启,再持续照射2秒左右关闭,同时对模拟火源的尺寸和形状有一定的要求。
参赛学生可以通过自己熟练的任意一款单片机,简单设计基于灰度传感器、光敏传感器分压电路,加上MOS管驱动电路,编写AD电压采集、IO驱动程序,去实现这一任务,这部分代码量非常小,只要是学过单片机、懂基础的电路硬件知识的同学都能实现。设计虽然简单但是也有一些设计细节要点需要注意:
综上所述,学生在实现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的多功能控制器实现的消防车的教程和制作模拟火源的教程单独作为一节给出。