[随笔]2019省电赛无人机题(B题)总结

2023-05-16

  • 2019/8/7~2019/8/10在江苏赛区参加了省电子设计竞赛,这次也是省电赛和全国电赛重合的一年
  • 选择的题目是无人机题
  • 先说结果吧,直接白给了,挺遗憾的
  • 电赛结束挺久了,作为一个从飞行器设计转到计算机科学的大三学生,嵌入式和自动控制相关的东西一直作为业余爱好研究,实在占精力,转专业要好好学习,以后估计不再搞了。最后一场比赛也没取得啥成绩还是挺遗憾的, 正好替代社会实践要交总结,这里随便写点回顾总结好了

  • 想做无人机题这个想法蛮久以前就有了,当时还在做RM。一直以来做了太多控制题了,从电赛的智能窗帘、智能台灯、写字机器人,到RM的步兵车控制,再到去年电赛搞得手势识别装置,再做一个类似的东西,一来控制题通常难度不高面临的竞争压力太大,二来也没法学到什么东西,没多大意思。可能是最后一次参加电子设计类的比赛了,要做就做个难的!正好还有一个和多旋翼控制解藕相关的项目在做,于是就有了做四旋翼的念头。
  • 今年七月初开始准备电赛时统计了一下前几年的题目,根据趋势来看,传统控制题似乎在逐渐退出,取而代之的是一种人工智能题。比如去年的手势识别装置,今年的纸张检测装置似乎也是的。这些题伪装成传感器应用题,表面上看十分简单,只要把传感器调通就好了,但只这样做毫无竞争力,组委会真正想要的是让你设计一个特征,利用指定传感器检测它,并通过不断测试获取大量样本,然后用人工智能的方法去学习这个特征,这样做的队如果搞好了效果拔群,比传统方法强很多。我们去年就吃了这个亏了,印象深刻。。。。考虑到时间紧张,现在去尝试这个新题型不确定因素太多,所以更加坚定了做四旋翼题的想法。
  • 今年是ti赞助的,考虑到以前瑞萨时期限制过飞控芯片,我们需要搞一个ti传感器的飞控。最初是打算学习相关原理完全从底层写的,但是因为各种原因拖到7月放假才准备,写肯定来不及了,转而考虑用成品飞控代码改,还要自己制版仿造一个飞控,这样如果限定飞控自制也不怕啦。
  • 放假第二天,商讨后购买了匿名的tm4c版本飞控,立即开始准备。我负责飞控改编,买了和匿名同型号的tm4c123g lunchpad,开始学习ti的库函数。另一个队友G负责视觉部分,他是飞设的需要实习,于是带着openmv去西安了。还有一个队友Z,他之前也是做RM电控的,于是也在一起看飞控,队伍里只有他会制版,所以制版搞电路相关的工作也是他来搞。
  • 时间过得很快,凭借32的基础,很快就学了不少ti板子的使用方法(相关内容放在博客上了),但还是不够快,想要完全学到可以从底层写肯定来不及了,于是转而直接研究匿名的程序。
  • 不得不说匿名的代码习惯真的8行,注释太少,还有好多不知道是开发一半去掉了,还是版本变更没删的奇怪内容,看得相当费劲。不过还是基本看了大概。我是从外围的数据存储、上位机通信、任务调度开始看的,最后看到飞行控制任务、飞行数据这些,关于传感器配置什么的因为底层不太会直接没看。
  • 大概7月中旬飞控看差不多了,这时候队友G也回了,一起把飞控框架梳理了一遍。队友Z这会去苏州呆了几天,于是我和G开始搞视觉联调。
  • 先做了一个水平的色块追踪,虽然openmv帧率低点,但是因为飞机速度慢,所以表现还不错。(注意这里要调整一下openmv数据串口中断优先级到1)。做通讯的时候遇到了一些问题,因为不太会Python,所以在数据类型处理这块绕了不少弯路,好在最后也搞定了
  • 之后做了个机腹俯拍的色块追踪,对标前年跟随小车那个题。发现效果差了很多,肯定不是帧率的问题,可是pid调来调去都很晃。经过一番讨论,认定问题出在openmv的安装上,因为是直接粘在机腹的,当飞机移动时相机也会倾斜,这样色块在相机视野的位置也变了,形成了一个正反馈。找到问题后做了一个坐标变换补偿,效果就很好啦。关于这个补偿,详见 ANO匿名飞控分析(3)— 姿态解算原理及代码分析 开头简介部分的举例
  • 这期间匿名的飞控烧了好几次二极管,也不知道是为什么,虽然修好了,但是影响进度影响蛮多的,最后凑钱又买了一个新飞控以求稳妥。眼看快比赛了,前几年的题来不及搞了,最后匆匆做了一个视觉巡线,没怎么调效果也就一般吧,做好的时候已经是比赛前一天晚上了。
  • 队友Z从苏州回来后就不看好飞机题了,总觉得我们准备不行,系统稳定性太差,拿不了奖,经常劝我们改做控制。我和G都是早就想搞飞机了,但是看这个情况也难免有点动摇。Z回来之后就不看飞控了,主要在搞仿制的飞控转接版(直接插lunchpad),于是让他也搞点控制题的东西备用,到时侯看题行事。
  • 在比赛前还做了一个小东西,因为听说openmv不可以现场调阈值,担心现场灯光影响识别,我拿stm32做了一个openmv阈值调试器。大概原理就是32和omv通信,获取原始阈值和图像lab信息。因为320*240的图像lab信息有300k左右,stm32f407的RAM空间不足,直接开数组就爆栈了,所以不得已只好做成ROM暂存。ROM读写速度慢,存数据的时候搞了一个双缓冲避免丢包。利用外接编码器调整阈值,显示的时候分段读出图像lab数据,按阈值判断黑白显示在lcd屏上,每次只刷新现实颜色变化的点。最后效果还是蛮好的,可惜32的spi通讯没调通,不得已用了串口dma接受,读图速度太慢,波特率50000估计要读个3到5秒。
  • 终于到了出题的日子,看了眼题,果然又没有控制题,四旋翼出了一个电力巡线。我心里其实还是蛮高兴的,这下没有借口了,好好做好四旋翼就好了!但是队友Z闷闷不乐,后来一直劝我们搞电磁炮那个题。。。我们搞电基本没搞过,真的不怎么想弄,搞得团队士气一直不高,天天都有不少负能量。
  • 总之先做题吧,因为Z没怎么看飞控和omv,基本没法参加编程工作,感觉他一直不知道要干啥,无所事事的感觉,三个人不能齐心协力感觉真的很差,我和G的压力也更大了,贼难受。
  • 比赛第一天想了想方案,可是没啥好想法。电线太细,从侧面实在不好识别,难以做成闭环控制,B杆处的180度掉头也是难点。尝试了一下开环飞,发现飞远了就很飘,可能会撞杆或者撞线,只能作罢。这一天下午飞机还炸了一次,损坏了自制的飞控板。炸鸡原因是Z焊的xt60一转二接头虚焊。。。所幸没伤到光流什么的飞控组件,到晚上才修好
  • 晚上终于商量出一个差不多的方案,一个摄像头侧拍识别杆,一个摄像头伸出去到桨护位置并且架高,这样就可以利用较大的视野,在不把omv伸到线正上方的情况下拍到电线的俯视角度。飞行流程是:自动起飞到1m1高度,前飞直到识别到杆A,稳定一下,开环前飞50cm,慢慢左平移直到识别到线,利用线位置做闭环飞到B,利用期望速度积分推测飞行距离,快到b的时候转为开环前飞以免识别到b杆底座,找到b之后稳定一下,掉头按同样的流程飞回来。拍照选用了穿越机相机小方狗,无限连拍策略,只求拍到就可以。
  • 第二天上午搭好了初始结构,用一根5mm碳管做成L形支架把openmv架了出去,试飞的时候抖动很严重,完全没法识别。只能改方案,把架高的部分去掉,但是还是抖,再次修改成两个碳杆伸出来,中间用一个木片链接,终于不抖了。
  • 搞好结构已经晚上了,赶紧开始测试挂线,效果却不理想。分析原因是因为没有架高,视野很窄,飞机稍微调节一下就会超出视野边界。没办法重新想方案实在来不及,干脆把openmv伸远一点,直接伸到线正上方。这样再测试就可以稳定挂线了,手动控制前后飞行也不会脱出。架出去的一个问题是openmv会撞杆,这样只能靠积分测算距离,在b杆前解锁脱出,还好飞行距离较近,误差不会大到撞杆
  • 接下来的难点就在于转180度了,本来想着锁死yaw轴全程平移的,但因为飞机左右不对称,这样返航时就不能闭环了,只好选择转yaw轴掉头。转yaw轴有一个问题,就是没法闭环,因为室内磁力计误差太大,yaw指向反馈不准。虽然可以在线上靠线斜率调整,但是比较危险,所以还是希望尽量不要转yaw轴。
  • 总之先写了一个原地转动的程序试验一下,结果飞机刚转了一点就开始乱飘,差点撞墙。分析了一番,应该是光流消旋的问题。匿名的光流是闭源的,所以也没法调整。最后找到了一个折衷方案,就是减小旋转角度,加大旋转速度,这样飞机转动时间短,光流失效时间也短,不会漂太多。最终的掉头方案改为:找到b杆后,前飞50cm,左转90度,前飞直到识别到b杆,再前飞70cm,左转90度,这样就接入到重复A至B的流程中了。这里还做了一个保险,转过第一个90后的平飞段会进行积分,如果飞了很远都没检测到b杆,或者飞了很近就检测到,通通认为杆识别错误,这时就完全靠积分来确定转向时机了。
  • 这时比赛时间也差不多快要结束,队友Z写完报告后表示不玩了,于是只有我和G继续奋战。
    项目二的自动悬停测试过没啥问题,因为没仔细看规则,还以为项目二可以换程序,所以单独做了一个自动起飞悬停的程序,这也为最后的白给埋下祸根。
  • 很快比赛结束,到了测评的日子。比赛场地铺了了灰白条纹,测试飞行时直接开始乱飞了。当时直接傻了,还以为程序不对,心中做好了白给的准备。最后向评委提议,要求换到白布的场地,这才恢复正常。想来应该是光流在灰白地面上失效了。
  • 换到白布地面的第一轮飞行很成功,一路飞回了A,可惜最后自动降落不成功。第二轮试飞误识别到场地边上的窗户了,没有成功完成。这一结果可以说超出了预期,应该也是我们学校表现数一数二的队伍了,评委老师也表示我们的方案很好。
  • 接下来项目二因为程序不对直接放弃了。这个非常可惜,项目三完成得还可以,就是用时比较长。
  • 出了赛场感觉还不错,虽然项目二很可惜,但是绕杆真的完成得超出预期。听说第一天20个队只完成了2个队,心里感觉还是有个交代了
  • 过了两天出成绩了,很可惜啥都没得着。因为项目一没降落所以一分都没有,项目二也没分,相当于只有一个自主编程分,这样肯定是凉凉没跑。看了看其他队,应该是飞个悬停就可以省二的,花了那么多精力做绕杆却没拿到分,又被规则坑了一波,真的是挺伤的。
  • 虽然结果不好,但是这次电赛也是一次难忘的经历了,学到了很多东西,也做到了自己满意的程度,就写到这里吧

以下是准备比赛期间的一些学习总结,飞控分析还有几篇没写,包括pid和滤波什么的,以后有空再说吧

  • TM4C123G学习记录(1)–时钟
  • TM4C123G学习记录(2)–GPIO
  • TM4C123G学习记录(3)–外部中断
  • TM4C123G学习记录(4)–关于ROM前缀函数和HWREG函数
  • TM4C123G学习记录(5)–PWM输出
  • TM4C123G学习记录(6)–UART
  • TM4C123G学习记录(7)–输入捕获
  • ANO匿名飞控分析(1)— 遥控器解码
  • ANO匿名飞控分析(2)— 任务调度
  • ANO匿名飞控分析(3)— 姿态解算原理及代码分析

2021.9.20 update:

  • 这是我们当初赛前准备时做的飞控-视觉联调(P1)和 OpenMV 阈值调试器(P2)的测试视频:无人机视觉追踪
  • 补上两张飞机的照片,这样机械结构看得比较清晰。伸出来木片上的 OpenMV 就是专门用来向下识别电线位置的,因为地面按题目要求是灰白色,识别起来没有太多干扰。另一个 OpenMV 装在机腹下侧拍标识杆
    在这里插入图片描述
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[随笔]2019省电赛无人机题(B题)总结 的相关文章

  • 51串口发送数据的格式

    串行口控制寄存器SCON SCON的字节地址是98H xff0c 其格式如下 xff1a SM0 SM1 xff1a 串行口工作方式控制位 xff1a SM0 SM1 工作方式 功能 波特率 00 方式0 同步移位寄存器 fosc 12 0
  • c51单片机学习笔记-矩阵按键实验

    目的 xff1a 通过数码管显示矩阵按键 S1 S16 按下后键值 0 F 编译软件 xff1a keil5 过程 xff1a xff08 1 xff09 定义各端口 include 34 reg52 h 34 typedef unsign
  • CMake 添加第三方库的几种依赖方式

    转载链接 xff1a C 43 43 工程 xff1a 总结 CMake 添加第三方库依赖方式git submodule find library FetchContent CPM等 github地址 cpp cmake example 第
  • vue.js中v-for的使用及索引获取

    vue js中v for的使用及索引获取 1 v for 直接上代码 示例一 xff1a lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt
  • (转贴)Windows CE 5.0下串口驱动硬件FIFO控制Bug分析及修正方法

    转贴自 xff1a 驱动开发网 原贴地址 xff1a http bbs driverdevelop com read php tid 61 109193 amp fpage 61 0 amp toread 61 amp page 61 1
  • 四剑客和正则表达式常见故障及困惑集合(待更新)

    一 find命令 warning警告 maxdepth 这个参数要放在其他参数之前 root 64 oldboyedu59 find type d maxdepth 1 find warning you have specified the
  • sed的使用

    一 xff0c 替换文本 s pattern replacement flags replacement会替换pattern 例如 xff1a root 64 node1 sed cat data2 txt This is a test o
  • KVM虚拟化-创建-桥接-硬盘-快照

    1 创建 使用virt manager进行创建 virt manager进入管理器 点击如图进行创建 将ISO下载到虚拟机里面 点击浏览 下面是虚拟机名字 选择本地浏览 选中CentOS的iso 选择后前进 选择内存和cpu xff0c 前
  • 串口专题(一)——基础知识

    前言 xff1a 为了方便查看博客 xff0c 特意申请了一个公众号 xff0c 附上二维码 xff0c 有兴趣的朋友可以关注 xff0c 和我一起讨论学习 xff0c 一起享受技术 xff0c 一起成长 1 概念介绍 串行口是计算机一种常
  • STM32中晶振的原理与作用

    前言 xff1a 为了方便查看博客 xff0c 特意申请了一个公众号 xff0c 附上二维码 xff0c 有兴趣的朋友可以关注 xff0c 和我一起讨论学习 xff0c 一起享受技术 xff0c 一起成长 转载地址 STM32中晶振的原理与
  • STM32学习笔记一一UCOSII(1)

    前言 xff1a 为了方便查看博客 xff0c 特意申请了一个公众号 xff0c 附上二维码 xff0c 有兴趣的朋友可以关注 xff0c 和我一起讨论学习 xff0c 一起享受技术 xff0c 一起成长 1 简介 UCOSII 是一个可以
  • PADS 原理图库文件绘制

    前言 xff1a 为了方便查看博客 xff0c 特意申请了一个公众号 xff0c 附上二维码 xff0c 有兴趣的朋友可以关注 xff0c 和我一起讨论学习 xff0c 一起享受技术 xff0c 一起成长 1 PADS Logic 参数设置
  • prometheus监管平台(一)(开源)

    prometheus监管平台 xff08 一 xff09 xff08 开源 xff09 一 登录二 首页三 General Management功能四 Host Management功能五 Job Management功能六 Alarm M
  • vncserver连接后窗口显示太小

    VNC server的默认的分辨率是1024x768 如果要改变VNC server的分辨率 1 可以用一下命令启动VNC server root 64 localhost vncserver geometry 1280x1024 这种修改
  • dfs (二进制枚举,暴力,马的管辖)

    在中国象棋中 xff0c 马是走日字的 一个马的管辖范围指的是当前位置以及一步之内能走到的位置 xff0c 下图的绿色旗子表示马能走到的位置 如果一匹马的某个方向被蹩马脚 xff0c 它就不能往这个方向跳了 xff0c 如下图所示 xff0
  • linux进程(四)——进程的几种状态

    usr src linux headers 4 15 0 45 include linux Used in tsk gt state define TASK RUNNING 0x0000 define TASK INTERRUPTIBLE
  • linux网络设备驱动(一)

    一 框架 1 xff09 网络协议接口层 向网络层协议提供统一的数据包收发接口 xff0c 不论上层协议是ARP xff0c 还是IP xff0c 都通过dev queue xmit 函数发送数据 xff0c 并通过netif rx 函数接
  • linux taskset命令

    一 简介 taskset命令用于设置进程 xff08 或线程 xff09 的处理器亲和性 xff08 Processor Affinity xff09 xff0c 可以将进程 xff08 或线程 xff09 绑定到特定的一个 或 多个CPU
  • STM32使用cubemx、HAL库硬件SPI驱动ICM20602

    软件平台 xff1a cubemx mdk 硬件平台 xff1a stm32f103rct6 ICM20602 工程源代码链接 xff1a https download csdn net download wwwlyj123321 1099
  • 【OBS】OBS Studio 的安装、参数设置和录屏、摄像头使用教程

    提示 xff1a 作者简介 xff1a 盐焗小星球 wyb xff0c 一名在读的电子信息工程专业大学生 x1f4d1 个人主页 xff1a 盐焗小星球 wyb的主页 x1f4eb 如果文章知识点有错误的地方 xff0c 请指正 xff01

随机推荐