本项目的GitHub连接html
本项目是学校项目设计课程内的项目,要求是使用一个基于树莓派的小车来实现一些简单的功能。python
本项目适合初次接触树莓派,但愿利用树莓派及小车配件实现一些简单功能的同窗们。git
目前咱们实现的功能有:github
学校提供的小车的商家是慧净电子,商家提供了一些使用教程,适合初学,基于C语言,实现了一些简单的红外避障、红外寻迹、超声波避障和摄像头调用。算法
本项目选用Python做为编程语言,有几点缘由:Python相比较C语言更简明;咱们对Python的掌握状况更好一些(C语言没学好啊);方便以后使用tensorflow作一些深度学习的功能。但同时带来的缺点就是运行速度会差一点。编程
下面咱们会对小车配置、功能实现和使用方法进行详细的介绍。本文结构以下:api
若想成功实现本项目的功能,请:网络
咱们的源代码所有放在PythonCode文件夹内。架构
咱们对每一个传感器定义了一个类,放在相应的py文件里,由此能够很清晰方便地对每一个传感器进行单独的调试。ssh
名称以main开头的文件是实现相应功能的主程序,在主程序里定义了一个Car类,该类继承了全部传感器的类。
商家给树莓派预装了系统,应该是商家本身改过的,也是几年前的了。强烈建议本身将树莓派的系统进行重装(重装后opencv和tensorflow的安装都会简单不少),推荐安装树莓派的官方系统Raspbian。安装方法百度一下,教程不少,也很简单。
关于树莓派教程,推荐树莓派实验室|开箱上手必读,里面的教程基本准确好用。
对树莓派进行操做的方法有不少:
咱们基本上是使用SSH登陆到树莓派进行操做的,也就是使用putty登陆。这须要树莓派和PC在同一个局域网下,咱们选择让树莓派建立一个WiFi热点,而后让PC链接这个WiFi热点。方法:建立WiFi热点并开机自启动,其中使用了github上一个开源的库create_ap。同时,还要设置热点开机自动启动。另外注意要设置开启树莓派的SSH服务,不然putty链接会显示失败。
使用官方的源由于众所周知的缘由会很是慢且不稳定,因此要换成国内的源。
使用最新版树莓派系统,能够直接用pip3安装OpenCV。
首先须要肯定树莓派、驱动板、传感器之间的连线是正确的。
电机相关代码在move.py内。须要注意GPIO端口号的设置,python用的是BCM编码。
在move.py中,定义了前进、后退、左转、右转、停车功能。转弯是经过左右轮差速实现的。
超声波相关代码在ultrasound.py内,实现了超声波测距和对测距进行移动平均来减少偏差。
红外避障相关代码在infrared.py内,InfraredMeasure函数是小车左右的两个红外避障传感器,TrackingMeasure是小车底部两个红外寻线传感器。
注意,红外避障传感器传回0表示前方有障碍物,传回1表示前方无障碍物。
调用摄像头须要先在sudo raspi-config
中启用Camera,而后重启。
python调用摄像头有两种方式:
咱们使用的是picamera方式,由于咱们发现使用OpenCV的方式会有延时,它返回的第一帧图像是在镜头初始化那一刻的图像,而不是主程序请求时的图像。
具体调用方法参考 树莓派(Raspberry Pi)中PiCamera+OpenCV的使用。
摄像头相关代码在camera.py中,其中实现了:
另外注意,程序终止是必定要关闭摄像机(camera.close()),不然下次没法正常打开。
基于超声波和红外,使小车在运行过程当中不会撞上障碍物。
主程序为main_obstacle_avoidance.py,其思想很简单,超声波传感器测出小车距离前方障碍物的距离,两边的红外传感器测出两边是否有障碍物,根据测量结果进行运动决策和电机控制。
将树莓派摄像头拍摄到的视频流传到PC端,并在PC端查看。目的是为了便于摄像头姿态的调整和图像处理算法的调试。另外,若是须要的话可使用传输到PC的图像在PC端进行处理(咱们没有实现此功能)。
可选择的传输协议有两种:
咱们使用UDP传输协议进行图像传输。具体实现主要分为发送端和接收端两部分:
基于视觉,使小车沿车道线行驶。环境要求为白色的地板,黑色(深色)的车道线。
主程序为main_lane_tracking.py,其流程大体以下:
在本实验中,车道线检测部分较容易实现,咱们发现,在这种简单的环境下,固定阈值的二值化效果比大津法好。另外,由于咱们的车道线偏蓝色,咱们选择提取图像的R通道进行二值化。检测效果如图:
运动控制部分相对较为复杂,咱们只采用了一个简单的逻辑,效果还能够。
识别并定位摄像头图像中的各种常见物体。
主程序为main_object_detection.py,其调用了TensorFlow Object Detection API,使用了训练好的的SSDLite目标检测模型,在树莓派端进行目标检测。
TensorFlow安装方法及TensorFlow Object Detection API配置方法能够彻底参考此文档:EdjeElectronics/Tutorial to set up TensorFlow Object Detection API on the Raspberry Pi
或者TensorFlow Object Detection API能够直接clone这位的 xyc2690/Raspberry_ObjectDetection_Camera,能够不用配置TensorFlow Object Detection API,下载即用。
咱们使用的SSDLite模型主要优势是运行速度快、占用内存小,适合在树莓派端进行运算。据咱们测试,帧率大概为0.8帧/s。咱们使用的是树莓派3,若是是更新的型号,速度会更快一点。
基于摄像头,使小车追踪一个移动的网球,并与网球保持必定距离。
主程序在main_tennis_tracking.py中,网球追踪流程大概以下:
实验显示:
在不一样光照条件下,网球的色调(H)基本上保持一致,范围大体在25至50 (OpenCV范围),在可靠明亮的光照条件下,范围大体在30至40。
网球检测的程序在detect_new.py中,具体流程以下:
经测试,帧率大概在15帧/s。
运动控制的程序在main_tennis_tracking.py中,具体流程以下:
目前存在的问题:
在树莓派终端中输入:
cd PythonCode python3 main_obstacle_avoidance.py
树莓派发送图像,在树莓派终端输入:
cd PythonCode python3 camera.py
同时,若是想在PC端接收图像,在PC终端输入:
cd PythonCode python3 pc_receiver.py
NOTICE:camera.py和pc_receiver.py均须要根据具体状况配置HOST和POST:
在树莓派终端输入:
cd PythonCode python3 main_lane_tracking.py
若是想在PC端接收车道检测图像,则在PC终端输入:
cd PythonCode python3 pc_receiver.py
在树莓派终端中输入:
cd PythonCode python3 main_object_detection.py
若是想在PC端接收图像,则在PC终端输入:
cd PythonCode python3 pc_receiver.py
NOTICE:Tensorflow Object Detection API 和 ssdlite模型并未上传至此仓库,须要自行安装。两者的安装和配置方法请参考此文档:EdjeElectronics/Tutorial to set up TensorFlow Object Detection API on the Raspberry Pi
; 或者TensorFlow Object Detection API能够直接clone这位的 xyc2690/Raspberry_ObjectDetection_Camera,能够不用配置TensorFlow Object Detection API,下载即用。
在树莓派终端输入:
cd PythonCode python3 main_tennis_tracking.py
若是想在PC端接收网球检测图像,则在PC终端输入:
cd PythonCode python3 pc_receiver.py