自己搭建的无人机跟踪实验,主要讲软件,硬件的需要等等
整个系统需要两部分,识别程序和控制无人机运动的程序,都是Python脚本,但运行需要在Ubuntu下用ROS进行通讯,所以需要学习ROS的一些基础用法
首先安装Ubuntu双系统,不要用虚拟机,后面没法操作了,双系统不麻烦而且很香,看整个教程,讲的很详细:Ubuntu双系统安装教程
安装好Ubuntu之后需要安装ROS,这里推荐用小鱼的一键安装,上链接:小鱼的ROS一键安装
ROS教程看赵虚左的课程,简单看个3章就可以了,点这个链接:ROS机器人入门,后面还有他做的文档:ROS文档
ROS基本会用了以后,可以跑一些别人的代码例程,推荐一下肖坤的无人机仿真系列,继续上链接:肖坤教程,主要看以下几章:仿真平台基础配置、目标检测与跟踪、darknet环境安装。其实跟我之后要介绍的方法不太一样,但你可以玩玩这个仿真环境,有个感受,他用的是YOLO算法
除了他这个比较复杂的仿真,我自己搭建的很简单的仿真环境是看这个教程学习的,你也可以学习一下,看看Gazebo里面很多东西是怎么设置的,上链接:PX4实现移动无人机跟踪物体仿真
然后建议自己跑一下YOLO算法,感受一下目标识别程序的大概,我自己当时就是这么学习的,放一下当时老师给我们的链接:YOLOv5的安装与使用,这个直接在Windows环境下跑就可以了,按照帖子里面的步骤即可,写的非常详细。把猫狗数据集放在了网盘里,最开始学习用猫狗是很容易上手的,上链接:[猫狗数据集](链接:https://pan.baidu.com/s/1LXnXUBP1HeC75UqqTdMbZA?pwd=tq1k 提取码:tq1k)
原理在网上都是百度到,这是我自己画的图,是找到KCF的MATLAB代码一步一步运行程序跑出来的,可以看清楚每一步操作对图片做了什么工作,你也可以这么做,有利于对原理的理解

在这部分,学习KCF原理的时候,会有一个图像的HOG特征,也就是颜色梯度直方图,当时在做实验的时候发现,人物处于草地这种复杂背景中时会比水泥地这种简单背景跟踪效果更好,因为HOG提取的是一个图像的轮廓信息,而草地本身就很复杂了,相对水泥地来说就特别不友好,针对这种问题可以用颜色来区分等等方法。我觉得如果单纯做图像的可以去考虑这些,,

这部分介绍几个KCF的Python程序以及其改进版本
1.opencv-KCF,这个是直接用python第三方库直接封装好的代码直接运行的,可能需要安装一些第三方库,pip install opencv-python opencv-python-contrib,如果还有别的错误直接百度解决就好了。下面具体讲一下这个代码怎么运行的:






2.第二个主要是说明CSRT ,在上述图3那里能够添加一个新的算法:CSRT,没有其他的改动,这个算法的特点是能够适应尺度变化,而且对于非矩形目标的跟踪效果更好,不再具体讲代码,这个没有具体文件,自己改一下调用算法就行了。
3.第三个说一下DSST算法 ,这个对于目标的尺度大小变化最鲁棒,而且是在无人机上使用效果最好的,有了上述代码经验,我们在自此基础上,看DSST算法的代码:

这里调用的tracker.py是网上大佬手撸出来的,每一个小段都有详细的注释,可以参考学习一下,整个流程到底是啥意思。然后tracker.py中还调用了一个fhog.py的文件,这个是跟踪使用的图像特征HOG,fhog是其升级版,而且他的代码用了C++加速,所以最后运行速度还是很客观的,关于hog的性质理解可以参考这两个链接:HOG特征笔记,HOG特征-简书。
所以这个代码共有三个文件:run.py tracker.py fhog.py 需要运行的是run.py
4.第四个代码说一下动态框选 ,由于上述手撸的DSST程序,有个小小的缺点,就是他会在相机打开的那一瞬间的一帧中让你选择需要跟踪的目标进行框选,所以在无人机上的应用就会很麻烦,最好是画面一直在动, **等目标何时出现了,我再进行框选。** 这个想法我目前认为可以跟YOLO算法结合一下,让YOLO也有可选择性,也挺好的。下面讲一下这个代码我怎么改的,也是跟网上的大佬写的代码拼接...需要运行的是run2.py
调用tracker函数就和DSST那个代码一样了,所以这个脚本主要功能是能 **动态框选**

5.第五个代码说一下如何初始化多个跟踪器,进行性能对比 ,这部分代码仍然是在上一个代码的基础上加以修改得到的,我们的目标即,通过一个同矩形进行初始化,保证每个算法得到的初始信息是相同的,进而对比各种算法性能优劣,需要运行的是run3.py,简略介绍如下:

效果图如下:

至此,识别跟踪算法的python程序就讲解完毕了,我还上传了KCF的MATLAB代码版本,是原著作者的代码,写的比较清晰,可以自己一步一步进行运行看其数学远离,因为KCF是最典型的相关滤波跟踪算法,相比深度学习算法,它很多数学操作是仍然能看到的,对理解图像识别算法有很大的意义。
接下来,讲解一下如何将识别算法的信息可以用起来控制四旋翼无人机进行运动,即控制程序。
写KCF那个大神的源代码在他的主页上,代码我也在这个帖子里的文件夹上传了,但视频序列的文件夹有点大,我弄个百度网盘放进来,其他的DSST代码和SAMF代码也是,可以直接百度网盘下载,大神的网页还有别的研究,可以自己去学习一下,这部分MATLAB的代码可以自己一步一步运行来看数学逻辑,比python要好懂,原理都一样,但由于我们后面用到的都是python文件,就不详细介绍了这块了,如果不懂可以和我联系
由于跑代码需要用到的视频集有点多放不太下,这里放上百度网盘链接: https://pan.baidu.com/s/1lTdPkDHkJppBgDq2-WD5Bw?pwd=gmao提取码:gmao
直接下载百度网盘的代码吧,可以直接运行,这个帖子里的少视频集,直接运行run.m文件
先上原理框图,这里需要稍微懂一点ROS(因为我也只是懂一点点),我理解到的ROS在这个任务中的工作主要就是收发信息,节点管理,统一接口方式这样。

这部分会有gazebo仿真和实物两部分,一般都先在Gazebo上先把代码跑通,然后开始调试无人机实物,这样效率比较高,前面也放了肖坤的大环境,可以跑跑里面的键盘控制无人机室内飞行,跟控制小海龟是一样的,这里也是放一个我学习Gazebo仿真时的一个网上的教程:PX4实现移动无人机跟踪物体仿真
然后对上面这个例程进行一些小的修改:给四旋翼安装一个下置摄像头,在无人机升起到固定高度之后,运用摄像头捕获到的图像使用KCF系列算法对小车进行识别,然后根据小车识别框在整个视频画面中距离中心的距离来控制无人机飞行,这里的目标就是始终保持小车在无人机画面的中心。


在这一块还有一个毕设中的小思考,因为在实物验证中,师兄帮忙飞四旋翼,每次飞行的高度肯定是不一样的,那么伴随着跟踪框在争个画面中的移动速度是不一样的,它反应速度也会不同,离得太近的时候过于灵敏,离得太远的时候反应很慢,跟不上,所以师兄的建议就是把高度信息引入控制回路中,这个高度信息是PX4就可以获取的,这个我也在仿真中跑通并在实物上运行成果了。
首先讲Gazebo仿真的
Gazebo建模在文章开头给过链接了,按照那个文章进行建模然后修改核心代码;将控制C代码制作成工作空间的格式,然后运行,Python不需要这个,可以一个一个Python文件运行来打开节点;
在仿真中控制无人机垂直飞到一定高度,然后打开摄像头,跟踪下方小车,然后用键盘控制小车移动,无人机就会跟踪小车进行移动了。
在用这个程序将无人机飞起来之后,打开摄像头,运行KCF系列程序

运行KCF,会手动框选目标小车,此时需要速度快一点,不然无人机会飘走;KCF程序会将目标框的坐标输出出来通过ROS程序发送给控制程序
然后运行控制程序,根据目标框中心的坐标与整个摄像头屏幕中心的偏离程度来进行控制,PID控制,输出无人机的速度信息,封装成MAVROS信息,发送给飞控板

在上面仿真跑通之后,就需要将程序移植到实物四旋翼上,对真实目标进行跟踪啦,当时我们测试了两套硬件设备。
第一套:使用NVIDIA jetson xavier nx作为板载计算机,其GPU搭载48个Tensor核心的384核NVIDIA Volta™ GPU,视觉加速器采用7通道VLIW视觉处理器,此计算机适用于无人机、智能摄像头、高分辨率传感器和其他IoT嵌入式系统等高性能AI系统。目标识别使用USB单目摄像头,其下方的Inter T265是追踪摄像头用于室内吊挂飞行时的室内定位使用,其包含两个语言镜头传感器、一个IMU和一个VPU,这样其可以利用环境中的视觉特征进行定位追踪;GPS用于室外实验定位;使用Pixhawk飞控模块,其是一款无人机控制系统

第二套:使用Inter迷你电脑NUC11TNKi5 薄款作为板载计算机,其使用了i5-1135G7处理器,8G内存,整机功率可以达到120瓦,与NVIDIA jetson xavier nx相比,此板载计算机的优势在于其优异的CPU性能,对于相关滤波跟踪算法此类只需要元素点乘运算而不需要像基于深度学习的目标跟踪算法那样海量的矩阵运算,在此计算机上测试跟踪算法的帧率能够比nx计算机快3-4倍,这样更有利于目标的稳定跟踪。
如果用深度学习比如YOLO算法的话,还是NX更快的,而且那个T265i是专门用来室内定位的,室外直接用GPS,因为PX4的程序是只有在知道位置信息的情况下才能进入off broad模式的,即板外模式,这里的板是说pixhawk,pixhawk外就是无人机上携带的那个计算机NX或者NUC。还有一个inter的T435i摄像头,海智同学是用这个摄像头和NX板来做YOLO的跟踪,435i的特点是有红外测距,所以他需要将摄像头读到物体的距离信息引入到跟踪程序当中,但当时发现一个BUG就是,红外对阳光下和阴影下测距会产生极大的漂移,使无人机不知道该怎么飞,具体现象就是,无人机跟踪我好好的,我从阳光下进入阴影处的一刹那,无人机就傻眼了。而我用这种普通的USB摄像头,单目的是不能直接得到距离信息的,需要有一个相机倾斜安装角度和引入飞机高度以及视频像素来计算物体的距离,距离的测算写到代码中,应该不会出现这个温度影响的漂移,但这个代码我懒惰了,不想写了。。。
还发现了一个问题就是,DSST算法已经能够很好的跟随物体的前后移动,大小的变化来改变框的大小了,我根据这个框的大小来控制无人机的前后运动,使得跟踪框的大小基本保持一个固定的大小,但帧数提高后,会使得跟踪框大小变化速度快,传到控制无人机那块之后就使得无人机前后晃动很快,白杨师兄建议加一个均值滤波,这个我可没懒惰,给写出来了
这里有两种均值滤波,一种是每10帧取平均当作一帧数据用,但这样会降低帧率,使得控制还是阶跃,而当我们把前10帧取平均当作第1帧数据,第2帧到第11帧取平均当作第2帧数据,这样下来,帧率并没有变化,但目标框的大小变化会变得很平滑。
从3帧平均,5帧平均到10帧平均都试一下,最后会发现10帧平均的时候已经比较平滑啦。
在用实物飞行时,摄像头连接到NUC上时,会出现找不到那个是摄像头的USB的现象,就会使程序启动失败,而且好像是先在ROS中开启MAVROS,再开启摄像头进行识别,具体记不清了,时间有点久了....然后写了一个寻找Usb的小程序,当然更好的方法是绑定接口,我懒了也没学...
还有一个细节是,需要在地面站电脑上装远程桌面nomachine和录屏软件Kazam

实物飞行运行的代码是DSST算法,这个算法有更好的尺度适应能力,更好的跟踪目标的移动,这里的DSST代码也进行了加入ROS节点的修改,与上面介绍的KCF大同小异,代码已经上传,大家可以自己进行学习。
十次滤波控制程序,上面有提到,就是将十次速度输出进行均值滤波,但仍然是十次输出,不改变频率,这样无人机的运动就会变得光滑

最后,现场图如下,帅气智哥担当目标~无人机可以跟随目标前后上下左右移动,而且移动比较光滑
至此,整个教程就结束啦,可能还有一些小细节没有写进去,时间太久了,记不太清了,很多硬件的东西没有详细介绍,比如飞控板和机载电脑以及摄像头的连接等等,这些大家可以自己去搜索一下。
代码可以到我的gitee上下载:an_KCF系列算法无人机跟踪: (gitee.com),顺便帮忙点个小心心呀
感谢毕业设计中老师、师兄和同学们的鼓励与帮助
3.【Autolabor初级教程】ROS机器人入门_哔哩哔哩_bilibili
4.Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程
6. (17条消息) PX4无人机-Gazebo仿真实现移动物体的跟踪_解矣。的博客-CSDN博客_gazebo 无人机
7.YOLO V5的安装与使用_?-ldl的博客-CSDN博客_yolov5下载
8.『ML笔记』HOG特征提取原理详解+代码_布衣小张的博客-CSDN博客_hog代码
我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da
我试图在Ubuntu14.04中使用Curl安装RVM。我运行了以下命令:\curl-sSLhttps://get.rvm.io|bash-sstable出现如下错误:curl:(7)Failedtoconnecttoget.rvm.ioport80:Networkisunreachable非常感谢解决此问题的任何帮助。谢谢 最佳答案 在执行curl之前尝试这个:echoipv4>>~/.curlrc 关于ruby-在Ubuntu14.04中使用Curl安装RVM时出错,我们在Stack
我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat
安装Rails时,一切都很好,但后来,我写道:rails-v和输出:/home/toshiba/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in`require':cannotloadsuchfile--rails/cli(LoadError)from/home/toshiba/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in`r
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva