前言
学校任务,挖坑慢慢填。
硬件支持
1.Raspberry Pi 3 (raspberry pi zero用于数据集群)
2.金士顿16G闪存卡(class10)
3.HDMI数据传输线
4.树莓派官方摄像头
5.其他树莓派常用配件
6.stm32开发板
7.stm32小车配件
8.充电宝用于逻辑电路供电
9.电池用于机械部件供电
实现方案
使用树莓派作为逻辑总控,使用Arduino作为机械总控。
树莓派作为小型计算机,搭载了ARM系列处理器,所以作为图像识别的处理器,同时还搭载了WIFI模块,如果使用树莓派作为处理器无法达到要求,可以通过WIFI将数据传输至服务器进行数据处理,将结果数据传回小车。
硬件配置
视频信号采集硬件
本文项目使用了CMOS材料的摄像头(CSI接口,非USB摄像头),像素都连接着 ADC,不用设计专属通道,也可以转为数字信号使用,像素体积较小,内部可以设置信号处理器,辅助寄存器可以用作缓存,且所需耗电量也少。数字摄像头采集的图像较为准确,可抗干扰,有利于 CMOS 摄像头在智能小车上的实时应用。
- 无 IR 滤波器
- 高清图像
- 高数据容量
- 8 百万像素固定焦点(包括.焦点调整工具)
- 支持 1080p、720p60 和 VGA90
- Sony IMX219PQ CMOS 图像传感器
- 15 引脚带状电缆
架构设计
小车上开启socket server,接收控制端发来的指令,也将图片发送给控制端。
PC上开启httpserver,方便随时随地查看小车摄像头的视频数据,由于motion自带了一个httpserver,可以通过嵌入frame的方式快速实现网页实时监控视频播放。
逻辑控制单元(raspberry pi 3)
树莓派是一系列小型单板计算机由英国树莓派基金会开发,以促进基本的教学计算机科学在学校和发展中国家。原始模型比预期更加流行,在目标市场之外销售机器人等用途。它不包括外设(如键盘,鼠标和外壳)。然而,一些配件已被包括在几个官方和非官方的捆绑。
基本参数
CPU:ARM Cortex-A53 1.2GHz 64-bit quad-core ARMv8 CPU
视频输入:Broadcom VideoCrore IV,OpenGL ES 2.0,1080p 30 h.264/MPEG-4 AVC高清解码器
外接设备:17个GPIO及HAT规格铺设
电源:5V / 通过MicroUSB或GPIO头
本文中所采用树莓派的原因在于树莓派自带h264硬解码,可以针对摄像头的视频进行GPU的处理,同时树莓派支持多种设备连接方式,便于使用和多平台协作。
机械控制单元
Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。由一个欧洲开发团队于2005年冬季开发。其成员包括Massimo Banzi、David Cuartielles、Tom Igoe、Gianluca Martino、David Mellis和Nicholas Zambetti等。
它构建于开放原始码simple I/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境。主要包含两个主要的部分:硬件部分是可以用来做电路连接的Arduino电路板;另外一个则是Arduino IDE,你的计算机中的程序开发环境。你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。
Arduino能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。板子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,烧录进微控制器。对Arduino的编程是通过 Arduino编程语言 (基于 Wiring)和Arduino开发环境(基于 Processing)来实现的。基于Arduino的项目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件,他们之间进行通信 (比如 Flash, Processing, MaxMSP)来实现。
特点
- 跨平台
- 简单清晰
- 开放性
- 发展迅速
逻辑控制单元
本项目在树莓派小车上模拟实现了自动避障的无人驾驶车,通过使用motion摄像头管理工具获取摄像头数据,使用python的tornado框架搭建了webserver进行网页监控,并通过socket与小车进行数据通讯,在server上将小车发送的图像数据利用darknet深度学习框架进行处理,在此结果上设计了小车的避障算法,并将控制指令发送回小车,实现自动避过障碍物达到目标物体的目的。
motion运动检测模块
Motion(http://www.lavrsen.dk/foswiki/bin/view/Motion/)是一款小巧、轻型但又功能强大的应用软件,可以用来在Linux上操控监控摄像头。它能够与任何支持Linux的摄像头协同运行,包括所有的V4L网络摄像头、许多IP摄像头以及安迅士(Axis)摄像头,它还可以控制平移和倾斜功能。Motion可以录制使用JPEG、PPM和MPEG等格式的短片和快照,你可以在Web浏览器中远程查看这些视频,这要归功于Motion的内置HTTP服务器。它将图像文件存储在你所选择的一个目录里,它也不需要数据库,不过它支持MySQL和PostgreSQL,如果你的确想要使用其中一个的话。
tornado框架
Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像 web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。
socket连接
两个进程(程序)如果需要进行通讯最基本的一个前提能够唯一标示一个进程,在本地进程通讯中我们可以使用PID(progress ID)来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
darknet神经网络
Darknet是一个用C和CUDA编写的开源神经网络框架。它安装速度快,易于安装,并支持CPU和GPU计算。你可以在GitHub上找到源代码,并对其进行设计。
你只看一次(YOLO)是一个最先进的实时对象检测系统。在Titan X上,它以40-90 FPS的速度处理图像,COCO test-dev上的VOC 2007上的mAP为78.6%,mAP为48.1%。
事先检测系统将分类器或定位器重新用于执行检测。他们将模型应用于多个位置和尺度的图像。图像的高评分区域被视为检测结果。
我们使用完全不同的方法。我们将一个神经网络应用于整个图像。该网络将图像划分为区域并预测每个区域的边界框和概率。这些边界框由预测的概率加权。
我们的模型比基于分类器的系统有几个优点。它在测试时查看整个图像,以便通过图像中的全局上下文来预测它的预测。与单一图像需要数千个的R-CNN等系统不同,它也使单个网络评估的预测成为可能。这使其速度非常快,比R-CNN快1000倍,比Fast R-CNN快 100倍。有关完整系统的更多详情,请参阅我们的论文。
网络摄像头的同步检测
YOLOv2使用一些技巧来改善培训并提高性能。像Overfeat和SSD一样,我们使用完全卷积模型,但是我们仍然训练整个图像,而不是严格的否定。就像更快的R-CNN一样,我们调整边界盒的先验,而不是直接预测宽度和高度。但是,我们仍然直接预测x
和y
坐标。完整的细节在我们的论文中。
[图片上传失败...(image-9f52f6-1523716485849)]
Darknet会打印出它检测到的物体,信心以及找到它们需要多长时间。我们没有编译Darknet,OpenCV
因此无法直接显示检测结果。相反,它将它们保存在内predictions.png
。您可以打开它来查看检测到的对象。由于我们在CPU上使用Darknet,每个图像需要大约6-12秒。如果我们使用GPU版本,速度会更快。
如果你看不到结果,在测试数据上运行YOLO并不是很有趣。而不是在一堆图像上运行它,让我们在网络摄像机的输入上运行它!
要运行这个演示,你需要用CUDA和OpenCV编译Darknet。然后运行命令:
./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights
</pre> YOLO将显示当前的FPS和预测类以及在其上绘制边界框的图像。 您需要连接到OpenCV可连接到的计算机的网络摄像头,否则它将无法工作。如果您连接了多个网络摄像头并且想要选择使用哪一个摄像头,则可以通过该标记
<span style="font-family: 'Open Sans', 'Clear Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;">-</span>c <num>进行选择(
0默认情况下,OpenCV使用网络摄像头)。 ### 避障代码实现 将图片纵向划分成了三部分,以1/3 、2/3为中间的界,划分了三块,并依次编号为1,2,4。(本来初衷是想利用二进制处理,但是最后赶时间,也没有用二进制实现,实际上,还是用的大量if-ellse) <pre>
st=>start: 接收拍的照片
cond=>condition: 目标物体在视线里?
targ_is_7=>condition: 目标物体没有占满视线?
e=>end
rotate=>operation: 调整角度
judge1_if=>condition: 目标物体单独占了一个block?
judge1=>operation: judge_barriers_1函数
judge2=>operation: judge_barriers_2函数
st->cond->targ_is_7->judge1_if
cond(yes)->targ_is_7
cond(no)->rotate->e
targ_is_7(no)->e
targ_is_7(yes)->judge1_if
judge1_if(yes)->judge1->e
judge1_if(no)->judge2->e