课程项目设计——HJduino树莓派小车0基础运行开发
前言
这是我们学校2020年秋开设的一门课程,因为这门课很吃自学和一些文件的配置等,除了淘宝店的资料还需要很多博客和论坛的文献,所以特别开个文章帖子记录一下怎样从什么都不会到把小车成功运行和开发一点自己需要的功能。
-
项目内容
这是提供给我们的小车,是用树莓派作为主板,连接到驱动板上对电机做一些简单的控制。
-
我的基础
1.接触过以stm32作为主控的机器车的使用。包括调试烧录等。
2.语言上以python为主,C也较常使用
3.完全未在Linux系统做过开发
从零开始
这是2020秋大四的一门课程,目标是实现用所给的树莓派和一些小车运动部件来编写程序实现对给定轨道的循迹、绕圈等。
涉及了许多传感器,如红外、超声波、摄像头等。老师建议由于树莓派的算力足够,只使用摄像头来进行定位、识别是效果最好的。
小车硬件搭建
这部分拿到小车的时候已经搭建过了,所以就暂时空着。
后续有调整的话会补上。
:后续调整,由于装载的摄像头只能平行,无法面对过近的轨道情况,所以调整小车摄像头的位置偏下,用硬纸板和胶带来做连接。
启动树莓派
这里就对于没有任何前置课程的我们来说学习比较痛苦,字都认识,可是没有完整概念的话是完全没法理解步骤的。1.13回顾:可以先跟着教程直接做,做到后面遇到问题了再返回来,就理解这里到底是在做什么了。
- 这边简单念到一下,可以把树莓派理解为一个小型的主机。
- 之前学校让你接触到的51、stm32都是你在电脑(pc机)上完成编译工作后烧录到主板上的,而树莓派则是你直接在这台小型主机上完成控制、编写软件程序的工作
安装系统
既然作为一个主机,那么便需要自己的操作系统,而这边我们需要准备一张tf卡,京东上花30元买了一张。
- 买到的卡
- 通过读卡器在micro SD卡上安装树莓派系统镜像文件
- SDFormatter 来对SD卡格式化
2. Win32DiskImager 安装系统
格式化结束后插拔读卡器,开始安装我们的系统。
首先解压出系统镜像文件如下图所示 HJduino.img
打开win32diskimager,选中刚刚解压的img镜像文件。这边会自动读取microsd卡的位置,直接write
大约5分钟就能安装完毕。
• 请注意安装完,Windows系统下看到SD卡的剩余容量只剩几十MB 了,这是正常现象,因为linux下的分区Windows下是看不到的!
• 大家可以使用分区软件查看SD卡,就能看到linux下的分区 •,其中Ext3区属于linux的文件系统,就和Windows的文件系统NTFS、 FAT32、FAT16一样
• Swap区为linux的虚拟内存区,主要在物理内存不够用的时候,做 缓存用
- 把卡插到小车里
操作树莓派
那么如何去完成对这个主机的运行和操作呢?
- 远程连接
运用putty,通过有线连接(网线)或者wifi连接的方法,和树莓派进行连接,进行一个初步的设置。
设置完毕后直接用windows自带的远程桌面连接到树莓派桌面即可,账号是pi,密码是raspberry。
第一次启动还需要输入tightvncserver。
- 添加外设
直接连键盘鼠标和电脑屏幕,这个方法即把树莓派小车当作一个电脑来使用,如何为主机添加外设是很清楚的一件事情。
不过这种方法小车不够便携,用了一两次后由于需要安装系统和opencv等,所以没有继续使用。
在PC上控制树莓派
这里我们使用程序提供的HJduino.exe
这个例程所能展示的效果为
通过PC图形化界面控制小车移动,和返回摄像头实时数据。
打开小车摄像头
在打开软件之前,我们需要在小车上开启摄像头,这涉及到Linux命令,这些在操作系统中已经放好了。
与windows的理念不同,Linux更习惯于用命令行来打开某个文件。我们首先使用cd命令来进入摄像头软件的目录。
cd mjpg-streamer/mjpg-streamer-experimental
随后打开摄像头软件,并输入一些命令行参数
./mjpg_streamer -i "./input_raspicam.so" -o "./output_http.so -
w ./www"
打开后可以运行程序,会有如下图的变化,其中图1是第三方视角,图2是摄像头传输的画面。
打开小车远程WIFI控制
到这一步,摄像头正常运行了,另外新开一个终端
输入ls,可以查看工作目录下的全部文件。
随后编译我们的c文件(在windows下有编译器帮你完成这一步骤)
gcc hjduino.c -o hjduino -lwiringPi -lpthread
编译后以后可以直接输入sudo(运行)命令。
Linux下的运行命令为
sudo ./hjduino 2000
命令行参数为端口
此时电脑可以控制了。
例程理解
红外循迹
硬件
软件
基于视觉的改动
根据例程,我们需要改动和自己编写的地方有
1.提供转弯的标准,依据opencv对摄像头赛道进行分割
2.设置小车运动的方向
3.设置小车运动的速度,直线加速、弯道减速。
起步编程
环境的搭建
0.树莓派4
原先安装的镜像树莓派系统有点老旧,在wifi和qt安装上有很多的问题。
这边直接重新安装了一个树莓派4文件系统,前面看过的需要的例程等直接拷贝文件就可以了。
接下来环境的配置均需要联网,最方便的方式就是使用宿舍的路由器,我们把小车接上网线:
然后在路由器设置中找到小车的ip号,进行远程连接。
1.OpenCV
更换源及更新
opencv的安装我参考了这篇博文
CSDN树莓派4opencv.
首先进行换源,将下述地址输入sources.list中。
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi
将下述地址输入raspi.list中
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
在命令行中输入,以更新软件源并测试是否编辑正常
sudo apt-get update
sudo apt-get upgrade
更新过程速度都很快,达到理想。大约半小时后更新安装完毕
扩大SD卡区域
必须使用16G以上的卡,最好是class10以上,实测8G class6卡安装到35%就爆满了,推算安装完成要4.6G左右。
然后扩大文件系统。因为,用SD卡安装完系统后一大部分空间实际是未被分配的
我使用的是32G卡片,但是也跟着扩大一下。
sudo raspi-config
使用该命令,选择advanced option,再选择扩大文件系统,随后输入sudo reboot进行重启
增加交换空间
增加交换空间避免内存不够编译挂起。
sudo nano /etc/dphys-swapfile
将 CONF_SWAPSIZE 值从默认值更改 100 为 1024 ,随后保存。
下载工具和包
前置准备工作做完了,总算开始下载opencv了。
①输入这四命令来安装依赖库和一些需要的工具
sudo apt install build-essential cmake git pkg-config libgtk-3-dev libcanberra-gtk*
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev
sudo apt install libjpeg-dev libpng-dev libtiff-dev gfortran openexr libatlas-base-dev opencl-headers
sudo apt install python3-dev python3-numpy libtbb2 libtbb-dev libdc1394-22-dev
②创建一个新目录并从 Github 克隆 OpenCV 和 OpenCV contrib 存储库:
mkdir ~/opencv_build && cd ~/opencv_build
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
比较慢,估计会中途崩溃。
果然下了好几天都一直失败、重试,最后在PC机上挂了vpn下载了两个build程序,再用U盘拷贝给小车。
我们直接在这个网站上去donwload with zip即可
https://github.com/opencv
后续就一样。
编译
接下来是编译的过程
创建编译空间
mkdir -p ~/opencv_build/opencv/build
cd ~/opencv_build/opencv/build
设置编译参数,注意,一定要一行一行复制输入,否则会有回车,在键入中会直接运行,这样会报错。
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D ENABLE_NEON=ON \
-D ENABLE_VFPV3=ON \
-D BUILD_TESTS=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules \
-D BUILD_EXAMPLES=OFF ..
开始编译
make -j4
编译过程是可见的快,大概两三个小时就好了,好了之后运行安装
sudo make install
安装成功后,通过
pkg-config --modversion opencv4
可以看到我们的C++库是否安装成功。
2.QT
QT的安装我参考了这篇博文
树莓派QT安装.
sudo apt-get update
sudo apt-get install qt5-default
sudo apt-get install qtcreator
第一行命令在最开始更新过了,不需要再次更新。
安装完毕后在树莓派的主界面可以找到他,也可以拖动到桌面快捷方式。
进入后需要进行一些设置,首先对于我们的小车项目来说需要一个合适的kit,你需要新建一个kit,来补充默认kit缺失的【桌面设备】
设置完qt后需要新建QT工程,按下图选择Non-QT项目
测试运行,成功build并debug。
3.摄像头的开启
后来在qt中运行cv时发现一直有报错,打不开摄像头,由于我们是新装的系统,还需要配置一下摄像头。参考博文如下:
摄像头的开启
sudo nano /etc/modules
我们是没有装vim的,所以nano直接打开该文件,在最后一行加入
bcm2835-v4l2
ctrl+o写入回车并ctrl+x保存
重启后就能够正常使用摄像头了
环境的搭建到此结束。
主程序的编写
使用qt新建C++工程之后,我们需要在qt的配置文件中加入opencv的路径:
LIBS +=和INCLUDEPATH最重要,*前者提供类似python中需要import的库
并在主要的工程文件中调用它。
#include <iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include <softPwm.h> //pwm波驱动电机
#include <wiringPi.h>
using namespace std;
using namespace cv; //opencv的命名空间
整体逻辑
这里的流程图是我们一个稳定版本的小车,仅能实现以一个较低速度通过弯道的功能。
初始化过程主要是电机控制及后续图像处理矩阵。
图像处理部分则是由cv中的转灰度和阈值来负责,最后呈现给系统的是一个二值图像。根据对图像中央区域检测,来判断此时的跑道状态。并结合图像底部的区域状态了对之前判断的跑到状态进行修正。
如检测到图像中央有一段黑色像素,记录该黑色像素行数,检测该行下方的跑道情况,若同时检测到则继续直行,若检测到右边跑道则说明需要左拐。同时在发送运动命令前需要收到left_danger,right_danger标志位的纠错,即其的优先级高于直行,以防止冲出跑道摄像头无法检测的情况。
整体在一个while循环中不停,退出条件由waitKey控制。
电机控制
1&#