课程项目设计——HJduino树莓派小车0基础运行开发

本文记录了一个从零基础到成功运行HJduino树莓派小车的开发过程,包括小车硬件搭建、树莓派系统安装与操作、在PC上远程控制树莓派、红外循迹的理解与编程实现。通过该项目,作者掌握了Python、Linux环境下的开发,并体验了树莓派作为微型主机的优势。
摘要由CSDN通过智能技术生成

前言

这是我们学校2020年秋开设的一门课程,因为这门课很吃自学和一些文件的配置等,除了淘宝店的资料还需要很多博客和论坛的文献,所以特别开个文章帖子记录一下怎样从什么都不会到把小车成功运行和开发一点自己需要的功能。

  • 项目内容
    这是提供给我们的小车,是用树莓派作为主板,连接到驱动板上对电机做一些简单的控制。
    提供的项目小车

  • 我的基础
    1.接触过以stm32作为主控的机器车的使用。包括调试烧录等。
    2.语言上以python为主,C也较常使用
    3.完全未在Linux系统做过开发

从零开始

这是2020秋大四的一门课程,目标是实现用所给的树莓派和一些小车运动部件来编写程序实现对给定轨道的循迹、绕圈等。
涉及了许多传感器,如红外、超声波、摄像头等。老师建议由于树莓派的算力足够,只使用摄像头来进行定位、识别是效果最好的。

小车硬件搭建

这部分拿到小车的时候已经搭建过了,所以就暂时空着。
后续有调整的话会补上。
:后续调整,由于装载的摄像头只能平行,无法面对过近的轨道情况,所以调整小车摄像头的位置偏下,用硬纸板和胶带来做连接。
在这里插入图片描述

启动树莓派

这里就对于没有任何前置课程的我们来说学习比较痛苦,字都认识,可是没有完整概念的话是完全没法理解步骤的。1.13回顾:可以先跟着教程直接做,做到后面遇到问题了再返回来,就理解这里到底是在做什么了。

  • 这边简单念到一下,可以把树莓派理解为一个小型的主机。
  • 之前学校让你接触到的51、stm32都是你在电脑(pc机)上完成编译工作后烧录到主板上的,而树莓派则是你直接在这台小型主机上完成控制、编写软件程序的工作

安装系统

既然作为一个主机,那么便需要自己的操作系统,而这边我们需要准备一张tf卡,京东上花30元买了一张。

  • 买到的卡
    在这里插入图片描述
  • 通过读卡器在micro SD卡上安装树莓派系统镜像文件
    1. 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是摄像头传输的画面。
图1在这里插入图片描述

打开小车远程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&#

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值