跳转至

后记

首先感谢有人能阅读到这里,加了一个后记页面就算是留下一些心里想说的话。

文档的前世今生

文档工作的起源可以追溯到2025年的1月,那个时候笔者是刚刚接触到这个比赛,也是对整个系统进行了一些开发,产生了一些成功,怕忘记也方便组内队员传阅,就写在了一个飞书文档里,当然现在这个文档也仍然存在,只不过内容是陈旧的,没更新,如果有人想考古也贴上:传送门老文档更新到上一次被更新的时间后就停止更新了,因为当时比赛备赛时间紧张,也很忙,就没精力去完成文档内容的完善工作,比完赛之后也没再维护。然后这个文档有一次发挥作用是在2025年年末,也就是小登们加入了航模队之后,我也是通过这个文档唤起了当时的记忆,比如仿真环境的配置与启动,确实如果没有这个文档的帮助,我也记不住了。后续的发展也是意料之中,组件了今年(2026)的新队伍,参与2026CUADC的多旋翼赛道的比赛,在备赛的过程中,我就想到我们这回应该详细的记录下来我们的工作内容,为了让我们的工作能够更好的传承,也算是为我大学阶段在航模队做出的成果做一个记录。既然要做,就做的好一些,于是就有了现在大家能看到的这篇文档:DUT多旋翼无人机开发指南

我和 CUADC 多旋翼赛道

笔者加入航模队的时间是2024年的11月,当时作为大一新生的我,受前航模队长的邀请,接手多旋翼赛道的负责人。当时我所了解到的种种政策(包括学院、航模队指导教师、航模队队长)都指向用尽量少的经费去打比赛,还要争取拿奖,年轻气盛的我就觉得干,我肯定能干出一些成绩。后续的航模队招新等等工作,我也是作为航模队的电控组组长,去找一些一样志同道合的,对控制感兴趣的一些同学,去参与到这个比赛之中。 从招新到组建队伍这部分我也记不太清了,可能也没啥意义,我就不再赘述了。

让我印象深刻的是我最初看到航模队的多旋翼赛机的时候。当时的我虽然是对控制很感兴趣,也有一些自己的研究,但是也没接触过这种自组的功能复杂的飞机。基本的电机和电调这些我都能认识,但是细看上面的飞控,数传等等很多乱七八糟的就很迷糊,也不知道从哪入手。转机发生在我与宗学长建立起联系的那一刻。这个时候宗学长已经念大三了,(现在的我开学马上也是大三),大三基本上也没有谁接着带队打比赛了,所以这也是我写下这篇文档的原因。说回正题,之前的赛机正是出于宗学长带领的团队,在宗学长的详细介绍下,我很清楚的了解到了这个飞机的结构,由一台NUC与飞控通信,飞控控制多旋翼运动,再配合舵机投放器和图传等设备,就能实现比赛的任务流程了。

了解了这一切之后,2025CUADC的准备正式开始!

最早我们也是确定了比赛的整体方案:NUC运行ROS,给飞控发指令,飞控执行,利用RTK来进行高精度定位,摄像头运行YOLO模型实现目标检测,挂一个单片机控制舵机来实现投放。确定了方案之后,我们就开始着手准备比赛。那是在2025年初的寒假,组员们也是在我的带领下,从头开始学习ROS,学习自组多旋翼,PX4固件的用法。印象里进展最快的时间是快要过年,那个时候我也是很着急的想把飞机的控制研究清楚,在离校的时候我把一架赛机直接带回家了,查阅了一些资料,终于是理解了MAVROS在计算机与飞控直接通信的原理,最后也是成功实现了基础的模式控制、航点发送、解锁起飞等功能。我将他们封装成了函数,这套函数在现在最新版本的代码中仍在使用。后续经过不断完善,又写出来了一个专门负责发送航点的一个ROS节点,配合主节点来实现整个流程的控制。最终也是在寒假未结束之前,就是年后返校的备赛过程中实现了首次无人机以板外模式由机载计算机控制的飞行。

当然这个过程不是一帆风顺的,最早我们的飞机会出现乱飞的情况,比如我们把飞机从航模队搬到门外之后,每次起飞之后都以一个很大的速度冲向航模队方向,后来经过思考和仿真验证,终于发现问题所在,这个PX4固件会把飞控上电的点设置为原点(0,0,0),那么这就合理了,如果我每次把目标点设置为(0,0,2),那么确实每次都会飞往航模队方向。解决方法也很简单,只要每次起飞之前,给飞控重新上电就好了。在这里提到这个问题似乎有一些跑题了,但是类似这样的问题还要很多,由于相关资料的缺少,和国内外教程的不完善,这些坑只能我们一步步来踩。关关难过关关过,总之在2025年7月之前我们基本上能实现飞机完全按照预设的航线飞行。之后我们开始调瞄准,瞄准的思路也经过很多版本的迭代,从最早的想找利用视觉推算位置,但是考虑到定位的偏差,可能会很难投进,最终选择采用视觉伺服,也就是通过视觉读取误差来计算速度,最后发给飞控,再检测目标到投进点的偏差,到范围了进行投放。之后我们按照这个思路,一点点完善,当然细节在我们的代码包中都有体现,我也没必要在这俩多说了。总之经过我们的不断调试,终于在2025年的7月26日,我们成功实现了第一个水平的自动投放,那张照片现在我的手机里还存着![]

还有一段视频,记录着我们惊喜的欢呼。我们进步飞快,在第二天,也就是2025年的7月27日,我们就实现了两个水瓶的投进,虽然投进的是大桶和中桶,但是这证明了我们的技术方案方向没错。但是时间也是非常紧张,7月31日就是省赛的日期了,我们只有3天时间训练了。2025年的省赛有一个地理位置优势,因为2025年的省赛是由我们学校承办,比赛场地就在我们学校内,所以我们不必赶路,但是真的有主场优势吗?

当时应该是7月30日适应性训练,比赛场地设置在了我们中心体育场的红色跑道上,我们惊恐的发现视觉模型会受到地面上跑到白色的线的干扰。这个干扰可谓是非常之大,因为我们的模型是识别白色边框,中部偏暗的物体,跑到边就完美构成了类似的物体,所以整个模型完全就是错乱的。当然这个也跟我们训练模型的质量有关,但是不得不提到的是比赛场地所在的操场,我们学校的保卫处就是不让我们的飞机去练飞,说是怕产生安全隐患,怎么办手续找人都不管用,导致了我们在距离比赛只有一天的适应性训练上才发现这个致命问题。有的时候感觉这个世界确实不是很公平,场地问题按道理来说对每个学校的影响都是一样的,但是实际上,像沈阳航空航天大学他们的竞速方案是放弃投放,直接尽可能的多拿时间分,这种策略确实高明,至少如果对手投不进的话,他们就有绝对的优势,同样场地对于视觉模型识别的干扰对他们来讲也是不存在的,因为他们根本不自动识别目标。实在没办法了,于是我们熬夜重新训练模型(当然这个效果肯定不会很好了),第二天我们怀着忐忑的心情,进行第一轮次的比赛,我记得那是一个下午,我的机组所用的飞机的机载计算机出现了一个至今以来我只在那次比赛赛场上见到的一个报错,现在想来可以说是非常之神奇,甚至有一些恐怖。当时由于是比赛,这个具体的报错内容我也记不太清楚了,总之解决方法就是删除工作空间内的build和devel文件夹再重新编译就解决了问题。最后第一次比赛机会就是没有成功起飞,导致压力给到第二次。第二次好像是遇到那种启动之后GPS搜星搜不到的问题,总之可能是勉强起飞,但是结果也不是很理想。我们确实全流程练习的比较少,再加上各个设备完全正常工作的概率不高,导致想成功起飞就非常困难,当然与老飞机设备陈旧性能差绝对是有很大关系的,只可惜我后来才意识到。省赛结束,不管如何我们也是蠕进国赛。

从省赛结束到国赛期间,我们还遇到了其他的困难,比如飞机因为动力不足导致掉高,我们被迫拆掉NUC的壳子,牺牲结构稳定性换取一些重量上的减轻,最后陆陆续续调到国赛。

2025年10月,到了国赛的赛场上,我看到了其他学校的飞机,我终于认识到了一个问题,我们的飞机的硬件层次也太差了,基本上就是最差的一档。我之前一直以为每个学校的设备都是一样的,也都会遇到数传断连、地面站固件刷不出来、飞控定向不准、电装动力不足、掉高、图传连接慢、图传卡帧掉线等等一系列问题,也都需要一步步突破,但是实际上这些问题完全都可以通过更换新的硬件得到解决。经费受限的我们只能绞尽脑汁从结构设计或者算法或者准备应急预案的方式来应对,而这些问题一旦发生,对比赛成绩都有致命性的影响。结果不难预料,国赛我们只有一个机组取得了三等奖,好像是成功起飞,看到了几个侦察图标。而我所在的这组十分的悲壮,国赛期间我们为了防止RTK搜星速度慢,我们换成了NTRIP网络RTK,通过手机热点让地面计算机联网,得到地面站的位置。但是好巧不巧,比赛的时候,我们的一个水平上的挂钩掉了,手机开热点的那位同学紧急回去取水瓶,手机放在他的兜里,这样一跑远,手机的热点就断了,时间紧张的我们没注意到RTK的精度变低,直接选择了起飞,最后飞机的航线竖直方向产生了几米偏差,水瓶投放到了投放区外,遗憾结束比赛,只拿到了起飞分。这个结果我们当然都很失望,但是比赛结果已定,我们只能遗憾离场。

赛后我们总结问题,首先先从我们自身上找毛病,虽然我们在省赛时间段内就已经实现了小中桶投放,拿到1200多分的成绩,但是这个能说是偶然,也可以说是有一定的运气成分,毕竟还是有稳定性的提高空间,此外我们确实也没在赛场上发挥出来。因此其一就是系统鲁棒性不够,不能在各种环境下都成功完成任务;另一个就是全流程练习的少,这个我感觉可以算次要,因为国赛前几天我们练习的流程基本上已经很熟练了,但是赛场上发生的意外,比如说水瓶挂钩脱落,就是完全可以通过赛前检查来规避,如果那个时候发现了,可能我们组就能拿到奖了,总结来就是经验不足。客观上讲,我们输给别人也是输在了设备不够“贵”,电子产品,贵肯定有贵的道理,我们300块一对的数传肯定就没有4000块一对的数传好用,我们依靠飞控定向肯定就没有别人双天线RTK定向准确,老的NUC10、NUC11肯定就没有Jetson Orin NX好用,我们1000块不到的飞控肯定就没有其他学校的CUAV V6+飞控精度高。我可以肯定的说,我们输在了设备上,如果把我们的算法平移给其他设备更好的学校上,我坚信他们可能也能精准飞行,精准投放。其实我在国赛赛场上做过挣扎,我自费购买了一个CUAV V6+飞控,准备替换到赛机上,只可惜飞控这种东西没法空运,顺丰加急也只能在第二轮比赛当天才能邮到,我都已经下单了,但是看着快递进度,只能含泪退货。比赛已经结束,说什么也已经没有用了,再加上我还仅仅大二,还有很大的试错空间,我虽然沮丧,但是也没失去信心。同时我也暗下决心,如果2026年我还负责这个比赛,我一定要向学校争取来好用的设备,不能因为设备不如其他学校,让我们本来有优势的算法发挥不出来!

我记得在2025年的9月,就有小登们对多旋翼感兴趣,当时我印象十分深刻,在我9月30号和组员出发前往机场去浙江的路上,还给小登们讲解比赛的规则呢,到了现场还给他们分享了机库里各个学校备赛场景的照片。国赛之后,老队员就由于升到大三或者不想继续打比赛等等原因退出,我们要组建新的队伍,也十分幸运遇到了五个活泼可爱的小登(SureSure、TaoTaoTony、乐乐、一一、🐏😀),还有一个同为大二的中登(翔翔),还有一个2025年已经参与的老队员(方哥)。就这样我们组建了新的队伍。同时发生的还有航模队指导教师的变更,我们有了充足的经费来更换一批优秀的硬件(CUAV X25 EVO飞控、P8P9两对数传、双天线RTK、Jetson Orin NX、全新电装等),这个配置虽然不能说是所有学校之中最顶级的,但是绝对能超过98%以上的队伍了,当然这些离不开学校、学院、航模队指导教师的大力支持,再搭配我们去年工作的代码基础,今年我们目标就是拿下分区赛第一,国赛也要冲击国一!去年的遗憾是时候得到弥补,也到了展示我们真正技术力的时候了!

由于我们去年的代码工作已经到位,距离投进已经没有任何难度,2026备赛的任务就是更换到新的硬件,进行优化改善,不断针对比赛流程去降低出问题的概率,我相信做到这些,就能取得不错的成绩。

在2026年初,我们计划采购的机载计算机Jetson Orin NX就已经到了,还有一起采购的飞控数传等,我也是第一时间装好了机载计算机,准备进行环境配置,当然计算机开机之后,官方配的系统是Ubuntu 22.04,只能运行ROS2,而我们之前的工作都是在ROS1基础上开发的,思考了一下利弊之后,我决定还保留ROS1,不更换ROS2。在当时看来,我的决策可能是正确的,因为不需要修改代码结构,但是现在来看,我觉得可能全部更换ROS2是更好的选择,这样就能避免重新给Jetson烧录引导和系统这一十分繁杂且耗时的操作。原因也很简单,Jetson开发者社区只有Nvidia官方的论坛,互联网上基本没有重装系统的资料可参考,所以每一步都要自己摸索。好在我成功了,配置好了所有环境,并记录下详细步骤在本文档内,后人参考就很方便。

后续在三四月份,方哥带领机械组设计了我们全新的机架,参考了我们在2025年国赛看到其他学校的方框型机架,这种机架的优点就在于核心组件都由外部碳管桁架保护起来,包括桨叶,炸机损失小,好修理装配。细节都可以在本文档内找到。我们也是很快就购买碳板等,成功组装出了一架试验机,也就是我们后来的一号机。我们的首飞很顺利,代码也验证通过,承载着2025年代码研究成果的2026年新飞机出世了!

时间来到2026年的7月份,这个月是我们集中推进进度的时期,在这段时间里,我产生了无数的小巧思,针对提高比赛成绩,提高比赛稳定性,减少起飞准备时间等等各个方面进行了全面的优化,主要的小巧思如下:一是增加网络通信链路,二是增加状态机控制,三是优化定高逻辑,四是决定开发自定义地面站。

网络通信链路最早其实可以溯源到2025年的末代代码,当时在2025年的暑假我针对网络TCP通信做出了一些研究,了解了使用C++设计网络应用的方法,那么我就可以把这个网络通信嵌入我们的代码包中,来实现瞄准PID的远程调参,就解决了想调参,就要降落改参数再重新起飞的令人烦躁的问题。可惜由于上文提到了的,我们国赛之前为了减重等浪费了太多时间,这一网络通信链路也没得到实施和验证。2026年的备赛时间充足,网络通信一定要加进去,在调参的时候要用到。但是仅仅能调参肯定是不够的,我把舵机控制,飞行模式控制等都增加到了网络通信链路,后续还增加了视频流广播等,都在网络通信之间,进行数据的传递。由此我还开发了一个小型地面控制上位机,命名为QSQDroneControl,连接上网络之后,只要点击按钮就能控制舵机、更改飞行模式、发送PID参数、发送航点等,极大的提高了我们的练飞效率。

增加状态机控制也是我们2026年代码的一大突破,这个思路也是借鉴了我们学校RM战队的哨兵。在RM战队,我是做哨兵算法的,哨兵和我们的这个无人机很像,也是自动控制实现一套流程,不同之处在于我们的无人机任务流程固定,不用状态机的话,按顺序执行任务也可以,而哨兵需要在不同任务之间跳转。虽然无人机不用状态机也可以,但是如果加入状态机,就可以更加灵活的完成整个流程,于是我也把状态机的这个思路整合进我们的无人机,封装成了一个无人机类,对无人机的状态进行操作,比赛模式下能够自动切换状态,练习模式下还能依赖网络链路由上位机手动切换状态,这也极大的提高了我们的练飞效率。

优化定高逻辑,这个问题是一直以来就有的,从2025年的省赛的时候开始,我们就发现了一个问题,低空投放的时候,飞机的高度是不稳的,有可能比桶面高20cm,也可能30cm,甚至可能坐到桶里。2025年我们为了更准确的定高,还买了TOF单点激光雷达,但是效果似乎也不是很好,今年也一样有这个问题。事情的转机发生在7月的某一天,我的一个小巧思彻底解决了问题,当然详细原理在代码包里都有体现,这里不在详述。

决定开发自定义地面站的原因也是一个老问题,就是地面站在连接到飞机的时候总是没法很快的读取参数内容,导致飞机起飞前的准备时间过长,有的时候甚至会到5分钟,这种情况是我们不想在比赛现场看到的,经过资料查询和推测,我们判断是地面站软件内部逻辑的问题,实在不想承受这个风险的我决定自己重新编译地面站,彻底解决这个问题。地面站的基础还是QGC,我克隆下来源码,配置好了编译环境,终于得到了一个解决这个加载慢问题的地面站,验证效果还不错。后续经过反复的迭代,也是完全针对比赛赛场的需求,开发了一个非常之好用的地面站,取名为QSQGroundControl,这回比赛前起飞准备就非常快速了,甚至抛弃了Nomachine远程桌面,直接使用内嵌的终端来发送指令。起飞前的准备时间被我们压缩到了1分40秒、1分30秒、1分20秒。最后,赛前准备完全不是我们所担心的内容,我们有信心让飞机慢慢飞,稳稳飞,也能在规定时间内起飞并完赛。从这个角度看,选择开发自定义地面站真的是做出的最正确的选择之一。所以,QSQGroundControl,下一次起飞,从这里开始!

总之无数的小巧思,让我们实现了起飞、找桶、瞄准、投放、侦察、返航、降落的全部流程,行云流水,一气呵成。还有SureSure和TaoTaoTony训练出来的一版非常NB的模型,能精准框出桶,一瞄一个准。练习中我们也展示出了得到近1300分单轮的实力,直指国一!

时间流转到2026年的8月7日,是我们出征省赛的日子,我们前往了沈阳航空航天大学参与今年的分区赛,北部赛区的王会是我们吗?我们相当早的来到了比赛场地,进行了为期两天的练习准备,我们起飞、投中,旁边的其他学校都对我们的技术赞不绝口。我们本以为我们可以很顺利的拿下冠军,直到我们看到了组委会提供的“蓝”色背景板和没有底的容器——“筒”。这一下就打乱了我们的准备,在蓝色底训练的模型真的能识别紫色背景板的桶吗?没有底会不会影响识别?一连串的不确定性,直接影响到了我们的比赛流程,但是似乎又对其他学校没有影响,原因和去年一样,其他学校根本没计划投放,视觉识别对比赛的影响几乎没有。一样的剧本又一次上演,对组委会的失望也再一次加剧,这个比赛真的公平吗?经过与组委会的协商,他们说桶有底,但是这个紫色背景板肯定是不能换成蓝色了,时间来不及,如果对比赛结果造成了影响,我们可以再向上反映,如果没有影响就算了。那我们也没办法,只能硬着头皮继续比赛了。好在YOLO模型的鲁棒性足够,影响没大到干扰我们的瞄准投放,第一天的两组比赛中,第一组成功投放进了中桶,而第二组起飞失败。第二天我们调整心态,第一组投进了小桶,第二组投进了大桶,至此我们比赛两组都成功起飞,也拿到了不错的分数。最终也是成功拿下了北部赛区的团体第一。

虽然拿下了团体第一,但是这个成绩并不符合我们的预期,我们的目标至少是1200+,冲击1300,而最后两组都没到1000分。紫色背景板真的没啥影响吗,答案一定是否,第二天我们两组飞机都出现了两次去瞄同一个桶的情况,肯定是找桶阶段,由于背景板的影响,没找到某个桶,所以两次都锁定了看到的那个桶,导致浪费一次投放的机会。但是至少我们大中小桶都有投进的实力,也在比赛现场得到了验证,至于背景板的问题,国赛肯定就没有这种让人恼火的问题了,我们还有机会冲击1300!

简单的文字,没法描述比赛赛场我们紧张的心情。过程曲折,结果也可以接受,我们拿到了属于我们的第一名的奖牌,我们的算法得到了验证,在赛场成功投放小桶。这天是2026年的8月11日,我们从沈阳航空航天大学返回学校,迎接我们的假期,和新一轮国赛的备赛。

这个阶段我又产生了一些小巧思,比如解决网络通信断线的问题的方法,增加视觉指示灯指示计算机状态等,但是还没付诸实践,就传来了噩耗,航模队起火了?!???!!! 那是2026年8月15日,清晨,7:30分,在睡梦中的我被电话吵醒,航模队队长和指导教师接连给我打电话,告诉我航模队二楼起火了,我惊醒,迅速前往航模队查看情况。水火无情,航模队二楼基本啊烧没了,我们的两架赛机也都变成了废墟中的灰烬。造化弄人,刚刚有起色的多旋翼项目的经过大火的洗礼,瞬间变得一无所有,2026年新配置的硬件也都变成了不能再用的垃圾。火灾原因鉴定为:航模锂电池自燃(涉事航模锂电池在未充电、未使用的静置存放状态下发生自燃,起火原因为持续高温环境下电池内部热失控,排除充电操作、人为点火及其他外部火源因素)。能说我们倒霉,这种电池自燃的事情发生在我们头上,也能说我们安全意识不足,没有把电池放在防爆柜内储存,也能说学院防火安全设施不到位,没有烟雾报警器和自动消防设施。不管如何,这个意外发生在我们头上,我们只能承担这个后果。

现在我们只能等这个事情的处理结果,国赛还能参加吗?我们还有充足的经费吗?我们还有足够的时间调试新组的飞机吗?一切都是未知的,这就导致我写下这篇回忆录的时间提前到了2026年的8月末。

问题的答案,让我们交给时间……

我对多旋翼项目未来发展的期望

多旋翼项目组从我接手以来,发展到现在,可以说是从零做到全国前列。当然在这个内卷的时代,可能两三年前的多旋翼只要能起飞就能拿到国三,能侦查就能拿到国二,再顺利返航就能拿到国一。随着时代的发展,其他学校的技术也在迭代,现在想要拿到国一就得冲击1300分,国二基本上也得投进小桶,拿到1000分以上。所幸我们最早在2025年时的目标就是投进中小+侦查全对,因此我们并不会像某些学校产生技术断层,导致没有拿到更高奖项的可能。

现在这个时间点,能否参与国赛还是未知,甚至明年是否还有多旋翼项目组也是未知,有可能我所编撰的这篇文档只能作为我们工作成果的证明。但是如果幸运的得到了传承,我们在国赛前又组装出了两架飞机,那么我相信我们所做的一切都会完完整整传递给下一任接替我,接替我们代表学校参与CUADC多旋翼赛道的航模队新队员们。

从我个人来说,参与比赛的意义远远超过于保研层面上额外的加分。从最开始的机缘相识,到满怀热血的备赛,到第一年惨烈的失败,到第二年的东山再起,到分区赛夺冠,到烈火中燃烧,有技术取得突破的喜悦,有比赛意外的遗憾,有带队拿奖的自豪,也有意外归零的悲伤。所幸,我们的工作更多的是算法,云端仓库的每一次commit都见证了我们的进步,硬件的损坏也不会抹去我们的成果,如果学院支持,老师支持,我们可以一天一架,继续搓飞机!

其实我们也是幸运的,省赛我们两个机组分别投进了小中大桶,如果我们比赛的历程真的到此为止,我也没有什么可遗憾的了,毕竟我们的算法到位,确实有投进的实力,相比于2025年没飞起来或者是根本没走到瞄准的那一步,开发的算法没有在赛场上的到验证,这才是更让人遗憾的。

但是必须承认的是,当前的代码包也并不是完美的,也存在很多明显的问题,比如:瞄准耗时不固定;PID控制器的调整效果受环境(例如风速)影响明显,调节响应慢或超调;想用MPC控制器,但是参数没调好;落点预测没考虑飞行器的速度;侦查航线还有待优化以减少比赛飞行时间;代码待更新至ROS2以提高代码性能和保持先进性……等等诸多问题,如果我真的没有时间去解决这些问题,可能就得交给后人去解决。我相信在多届团队的打磨与优化下,我们的代码包会越来越好用,越来越优秀!

结语

几个代码仓库、一篇文档,这是我作为航模队电控负责人和CUADC多旋翼项目的负责人交出的答案,也是我大学燃烧两年青春做出成果的证明。

虽然我明年不会再带队负责CUADC比赛,但是我相信,我与多旋翼之间的故事还未结束!

———— 屈圣桥 于2026年8月26日

其他组员想说的话

未完待续……