记2020江苏省电子设计竞赛D题四旋翼

前言:2020的秋来得如此快,大一军训已穿上了外套,金桂也只残存晚到的点点花朵,秋风不时吹过林间,树梢翻滚着,鸟鸣穿梭其中。2020暑假参加了飞思卡尔智能车,全国数学建模,江苏省电设,电设最后比赛延期到10月10日,也是对大二竞赛的终结,10月16号去南京验收完了无人机,实现了所有功能但撞杆一次扣5分,11月19日,成绩出了,一等奖。这里记下我从8月19号到10月省电设的所有过程,过程大致分做3个阶段:1.接触飞机,阅读飞控,魔改;2.校赛;3.省赛;4.感想。

接触飞机,阅读飞控,魔改

接触飞机

为什么做无人机

学校2020届的学长在2019电赛国赛无人机得了国一,学校为发扬无人机传统,成立了电赛无人机大队。2019大一的我也参加了电赛,做的无线充电小车,死在了没用看门狗复位上。2020校无人机招新时,想到无人机可以提前准备,况且每年都有无人机题目都近似,觉得做无人机比赛的把握更大,于是入坑。(笔者以前也做过一些科技类竞赛,会stm32,接触过robomaster,大一参加过全国起重机创意大赛)

飞机选择

lack of money,于是我们得到了上一届的一个老飞机(当然不是国一那个),附带一份飞控资料,记得机架有一处断了的,没摄像头,到处都是热熔胶,很是难看。经过两天的打理,终于拼出了一个无人机,淘宝一查,飞机飞控是匿名的,遥控器是天地飞,带有老版本光流,就这样我们完成了飞机选择。(后面我们意识到不应该使用旧的飞控与旧版本光流)

阅读飞控

最初的想法

最初,想着飞机不过是几个传感器加四个电机,先看看别人的开源代码,再自己写一个出来飞控代码,多输入的系统大不了就串级pid嘛!但随着飞控代码的深入查看,我知道我太天真了,后来本着保护生命的原则,决定用匿名开源的飞控代码。

飞控代码的深入阅读

1.匿名飞控程序在main函数中运用系统时钟实现了代码的分时调用,在"Ano_Scheduler.c"中设置了不同调用周期的函数,有实时性高的1ms执行一次,也有实时性低的500毫秒执行一次,运用函数指针对不同函数调用。这里我决定可以使用freertos或者至少使用定时中断调用,这样来保证强实时性。

2.在"Ano_Scheduler.c"中可以看见大多数执行的函数,也可见得四旋翼的控制是串级控制的,其中我觉得重要的有:
“Motor_Ctrl_Task(2)” 电机控制
"Swtich_State_Task(1)"根据传感器状态开关量选择
"Flight_State_Task(1,CH_N)"飞行状态任务,程控的pitch,roll控制要加在其中
"Att_2level_Ctrl(10e-3f,CH_N)"姿态控制,程控的yaw要加入其中
"Alt_2level_Ctrl(10e-3f)"高度控制,程控的alt要加入其中
"WCZ_Fus_Task(10)"高度数据融合,后期的高度魔改有必要
当然其它的可能也很重要,只是我的大多数代码修改都放在这里面

3.上位机数据调试,在"Ano_DT.c"中,可以通过usb串口以及匿名数传传回数据,其中我常用修改"ANO_DT_Send_RCData()"去查看飞控的一些数据,当然这个函数原本是产看的是遥控器通道值的。

4.初始化,在"BSP_init.c"中,其中的串口2用于上位机调试,串口四用作光流,我们把串口一用于和k210通信,串口二用于和openmv通信,其余也有一些小的修改。

魔改

魔改遥控器通信

在飞控"Ano_RC.c"中,遥控器的通信有pwm通信(每个通道一根线,总之需要很多线),ppm 通信(慢),DBUS通信(信号加载到串口上,只要一根线)。我们选择了DBUS,但是当用上位机查看接收通道值时发现十分异常,延时也很大,再者天地飞的遥控器油门不可以自动归中,以及一系列奇葩的解锁操作,我们决定分析深入源码,修改遥控器为大疆ROBOMASTER中的遥控器:

在这里插入图片描述

后来发现遥控器会接收大量数据,这飞控中竟然没用DMA,用的循环接收,也没有用校验,之后魔改了接收底层,采用DMA接收,采用大疆的遥控器与接收 机,采用CRC16校验,从新定义了控制逻辑,也从新加了锁(只要拨码拨到最上就解锁),发现遥控器的信号接收优异(后来我们学校有的组用天地飞遥控器调试时出现失控,我决定和没有校验以及pwm接收信号线太多容易松动有关)

魔改串口,加舵机

我们把串口一用于和k210通信,串口二用于和openmv通信,都运用了CRC16校验,之后家里一个云台电机,占用了一个pwm引脚。

魔改加程控代码

把alt,roll,pitch,yaw的程控变量控制加入其中,注意要放在光流环之前。后来发现新版代码中自带程控接口变量。

魔改去除接收机,实现一键起飞

这个需要修改"Ano_RC.c"中大量内容,并且要关注:
flag.taking_off ; main_key_flag; flag.unlock_sta ; flag.unlock_cmd; flag.flying
等标志位。这是很需要注意的一个地方,其中还有一些伪看门狗程序。

校赛

题目:校赛考虑到我们的能力有限,题目设计较为简单,如下:

在这里插入图片描述

方案1:既识别红色十字也识别黑色圆,通过识别视野内最大黑色圆纠正roll,通过红色十字降落。

方案2:起飞前摄像头朝向对面的红色十字,起飞后盲飞向前,直到摄像头视野中识别到红色十字,进行roll纠正,直到飞机飞到十字上方,降落。

由于飞行路径简单,识别物也简单,场地光流优秀,我们选择了方案2。同时,为了快速找到红色十字,我们添加了一个pitch方向的舵机用于控制相机视野。如下图所示:
在这里插入图片描述

没有识别到时,打角为25度,识别到后离红色十字越近,打角越小,就这样我们最快20秒内完成了任务。

省赛

10月9日晚,题目意外提前发布,当然就4天4夜了:

在这里插入图片描述

绕杆方案1:设计双轴舵机云台,保持飞机yaw轴不懂,绕杆时仅pitch,roll轴转动(光流建模的前提条件有坐标轴不旋转),找下一根杆以及找下一个圆都通过云台旋转来找。

绕杆方案2:架设3个摄像头,一个如同校赛中的舵机摄像头,另外两个用碳杆支出来架设,一前一后,先用前方相机绕一杆,当后方相机第二次看到另一杆后则跑向另一杆,下方舵机摄像头用于找黑圆。

绕杆方案3:架设两个摄像头,一个如同校赛中的舵机摄像头,另外一个用碳杆支出来架设,同时识别两杆,先用相机绕一杆,当第二次看到两根杆后避障飞向另一根杆,下方舵机摄像头用于找黑圆。

绕杆方案4:架设两个摄像头,一个如同校赛中的舵机摄像头,另外一个用碳杆支出来架设,一个时候只识别一根杆,延时与yaw角判断是否绕完一周,绕完后,yaw轴旋转,找下一根杆,下一根杆绕完后,也旋转yaw角找黑圆,最后降落。

现在看来方案1 better than 方案2 better than 方案3 better than 方案4,但没时间准备云台,也只有两个相机,我们选择了方案3

对于绕杆次序的选择,我们选择先远后近,保证可以看到降落点,通过按键调节识别不同颜色杆的先后。
飞机飞行路径示意图如下:
在这里插入图片描述
对于绕杆,我们用的k210 maixpy中找颜色块的函数,飞机与杆的距离通过对最大颜色快的像素值之和除以色块高度得到,roll与yaw配合绕杆。
对于降落,我们修改了校赛中的降落程序,我们把摄像头反向打角,如下图所示:
在这里插入图片描述
在绕最后一根杆的时,第二次看到降落点时进入降落程序,飞机上的舵机打角随着靠近降落点不断放平。
做比赛时第一次可以飞完全程时的视频如下:
video

感想

1.头不铁不要做飞机,我做飞机之前参加过大大小小的各类比赛,至少可以保证2天之内看懂别人代码的总体思路。
2.飞机飞行状态和电池的状态有很大关系。
3.前期做好防护措施,但真正做好飞机后是不需要防护的(你已经信任你的飞机了)。
4.炸机一定要找到原因后再飞,否则一直炸机。
5.飞机在进行自动时,只要检测到遥感操作,立即退出自动飞行模式,进入手动控制模式,并且一定要设计出稳健的遥控器一键断电。
6.建议不用天地飞遥控器。
7.仰望星空,脚踏实地,力争上游
欢迎批评指正

猜你喜欢

转载自blog.csdn.net/libizhide/article/details/109132642
今日推荐