基于树莓派的智能小车

代码位置:Github地址

文章目录

  • 基于树莓派的智能小车
    • 一、简介
    • 二、实验设备
    • 三、前期准备
    • 四、实验原理
      • 4.1硬件调试
      • 4.2 代码框架
      • 4.3 代码实现
        • 4.3.1 避障代码
        • 4.3.2 单线巡线代码
        • 4.3.3 颜色追踪代码
    • 五、使用方法
    • 六、存在的问题
    • 参考链接
    • note

一、简介

项目是学校项目设计的课程项目,要求使用基于树莓派的小车实现部分功能。

在该实验中实现了 小车的避障、单线巡线、颜色追踪任务,后文会附出已实现功能的实现过程和代码,在参考的资料中有部分有待实现的内容以供参考,如有需要的同学可以参考本博客和参考教程实现树莓派小车各种功能的控制。

  • 避障:使用红外和超声波传感器组合实现避障;
  • 单线巡线:使用摄像头,基于视觉进行单线巡线;
  • 颜色追踪:使用摄像头,基于视觉对蓝色(可以后续更改)物体进行追踪;

学校提供的小车的商家是慧净电子,商家提供了一些使用教程,适合初学,基于C语言,实现了一些简单的红外避障、红外寻迹、超声波避障和摄像头调用。

项目使用Python作为编程语言,本人也建议使用Python实现,尤其是希望实现复杂功能的同学:首先,相较于C++,Python更容易上手,可以更方便实现各种功能;其次,Python有很多集成好的深度学习框架,如Tensorflow、Pytorch,对于一些复杂的功能可以很好地实现。但是同时,Python在运行速度方面存在劣势。

完成该实验需要做好前期准备,在此基础上为代码创建环境,理解代码逻辑,对其中使用的超参数结合实际情况进行修改,运行代码,实现PC端和树莓派端的良好结合。

二、实验设备

树莓派3

SD卡

驱动板(L298N)

CSI摄像头

超声波测距传感器

红外避障传感器

小车 + 4个电机

电脑

三、前期准备

  • 重装系统

树莓派自带的系统比较老旧,其中预装的是Python=3.4,对后续Opencv的使用不太方便。更新成*Raspberry Pi OS (bust 10)*系统,后续的环境搭建、依赖安装和系统有关,太新的系统不保证成功;

树莓派系统直接从树莓派官网下载,使用SD卡安装镜像之前记得格式化。

  • 开启VNC服务

为树莓派开启VNC服务可以有很多种方案,这里做个简单罗列,仅详细介绍实践过的方案。

方案一:树莓派默认热点。树莓派有热点模块,商家预装的树莓派系统默认打开该模块,因此可以通过连接名叫pi3的热点对小车进行控制;

方案二:树莓派设置连接WiFi。重装系统之后小车没有默认开启热点,因此需要对小车进行配置。可以手动在小车的SD卡中写配置文件让其开机之后自动连接WiFi,通过连接相同WiFi之后进行vnc调试;

方案三:显示器手动设置连接WiFi。如果有显示器的同学会更加方便,通过显示器和鼠标、键盘控制调配小车,我们便采用该方案。手动为小车连接WiFi之后,可以使用vnc连接到小车在PC端控制。

无论使用上述的任何一种方案,获取小车的ip地址之后均可以通过下面的教程开启VNC服务。

树莓派开启VNC服务

成功连接VNC之后后续的控制和配置可以很方便进行。当然也可以使用Putty或者远程桌面连接等方式连接到树莓派,这里仅介绍我们使用的方法。

  • 更换系统更新源和pip源

为了后续更新和下包更快捷,建议更改成国内源:

参考的资料是:

  • 更换系统更新源

  • 更换pip源

亲测有效。

  • 为树莓派安装中文输入法:

安装中文输入法为后续搜索解决方案提供便利;

这里提供用到过的两种解决方案

比较健全的方案:该方案需要对中文输入进行一些设置,因此较为复杂;

凑活能用的方案:该方案比较快捷,单纯想打出中文用这个就可以;

  • 文件传输

方案一:使用FileZilla传输文件;

方案二:直接使用U盘传输;

四、实验原理

4.1硬件调试

  • 直流电机

直流电机的原理可以参考学长的介绍,电机控制的代码在move.py中,需要注意GPIO端口号的配置。

  • 红外避障

红外避障相关代码在infrared.py内,InfraredMeasure函数是小车左右的两个红外避障传感器。在本项目中没有使用到底部的传感器。

注意,红外避障传感器传回0表示前方有障碍物,传回1表示前方无障碍物。

  • 超声波测距

超声波测距原理可以参考学长的介绍,ultrasound.py代码中包含了超声波传感器的初始化,超声波测距和对测距进行移动平均。

  • 摄像头

摄像头在首次使用之前需要进行一些配置,可以参考摄像头配置中提到的方法。

python调用摄像头有两种方式:

方式一:使用picamera

方式二:使用opencv

在巡线功能中我们使用picamera模块,后面颜色检测追踪功能使用了opencv模块。

摄像头相关代码在camera.py中,其中实现了:

  • 摄像头初始化;
  • 实时图像传输(发送端),注意HOST为PC在此WiFi网络下的IP地址(通过ifconfig查看),PORT设置一个和接收端相同的端口号就可以。PC端使用pc_receiver.py运行来接收树莓派传回的数据。

另外注意,程序终止是一定要关闭摄像机(camera.close()),否则下次无法正常打开。

4.2 代码框架

代码的整体框架参考了MingruiYU学长的博客。

  • 基础模块

代码的基础模块实现了传感器功能的调用以及电机的控制,包括:

电机控制代码:move.py;

红外线传感器代码:infrared.py;

超声波传感器代码:ultrasound.py;

摄像头调用代码:camera.py;

  • 主程序模块

避障代码:main_obstacle_avoidance.py;

单线巡线代码:main_track.py;

颜色追踪代码:main_tracking_color.py;

主程序模块通过Car类继承了基础模块的各个类,调用基础模块从而编排逻辑实现功能。

  • 环境配置

后续的实现需要安装Opencv环境,Opencv可理论上可以在线安装,但是因为网络和不知名原因,可能会出现wheel下载不出或者一直安装不上的原因。因此采用了一种离线安装,手动安装依赖的方式。

可以参考:python3使用pip安装opencv

注意:如果直接按照教程安装会安装最新版的Opencv,有部分依赖之间可能存在版本冲突的问题,可能会安装失败,可以手动下载低版本的轮子自行安装。

4.3 代码实现

4.3.1 避障代码

避障代码采用左右两个红外传感器和一个超声波测距传感器组合实现避障。程序框图如下:

这里红外传感器传回的变量是布尔值,0表示有障碍,1表示没有障碍。

在左侧和右侧均没有障碍时采用超声波传感器判断是否可以直行。注意这里dist<20cmdist<20cmdist<20cm时表示正前方不远处有障碍,那么就应该避开障碍,由于倒车可能陷入循环,因此左转避开障碍。

这部分的核心代码为:

if (start_time is None) or (time.time() - start_time > 0.5):start_time = Noneif left_measure == 0 and right_measure == 1:print("Going right")car.right(80)elif left_measure == 1 and right_measure == 0:print("Going left")car.left(80)elif left_measure == 0 and right_measure == 0:print("Going back")car.back(50)else:if dist_mov_ave < 20:car.left(80)print("Going left")start_time = time.time()elif dist_mov_ave < 100:car.forward(dist_mov_ave/2 + 40)else:car.forward(90)
else:pass

4.3.2 单线巡线代码

单线巡线过程中尝试过多种方案,在这里依次介绍。

两种方案采用了相同的图像处理逻辑,使用picamera模块获得图像后,对图片进行滤波去噪,使用蓝色二值化图像(因为蓝色分量的红色部分较少,可以很好地区分)。针对得到的二值化图像,仅仅检测靠近小车前方的区域来获取道路信息即可,对道路信息进行平均得到道路的中心点横坐标。下面展示经过二值化并保存检测点的图片:

方案一:根据逻辑判断规定小车的速度;

该方案通过逻辑判断小车的前进方向。当道路中心xmidx_{mid}xmid​在整个屏幕左侧左转,在整个屏幕右侧右转;如果没有检测到道路(意味着小车冲出去了),那么就回退,直到找到道路再重新开始判断。

方案二:线性控制小车的速度;

该方案在方案一的基础上进行了修正,我们有一个基本的假设,如果小车检测的道路越靠右测那么右转的速度差速应该越大。在这样的假设下,我们设计了一个线性的速度控制程序。

左轮的速度为:

vleft=vlow+vhigh−vlowwidth∗xmidv_{left}=v_{low}+\frac{v_{high}-v_{low}}{width}*x_{mid}vleft​=vlow​+widthvhigh​−vlow​​∗xmid​

右轮速度为:

vright=vhign+vlow−vhighwidth∗xmidv_{right}=v_{hign}+\frac{v_{low}-v_{high}}{width}*x_{mid}vright​=vhign​+widthvlow​−vhigh​​∗xmid​

通过线性控制小车可以实现小车更加精细的控制,减少小车出错的的次数。

核心代码:

ForB = 'Forward'
LorR = 'Brake'camera, rawCapture = car.CameraInit()  # Initialize the PiCamera
for raw_frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):frame_origin = raw_frame.array################## lane detection #############################img = cv2.blur(frame_origin, (5, 5))  # denoisingblu_img, _, red_img = cv2.split(img)  # extract the blu channel of the RGB image (since the lane in our experiment is red)_, dst = cv2.threshold(blu_img,  30, 255, cv2.THRESH_BINARY)  # binaryzation, the thresold deponds on the light in the environmentheight, width = dst.shapeprint(height, width)half_width = int(width/2)all_line_pos = np.zeros((num_lane_point, 1))img_out = cv2.cvtColor(dst, cv2.COLOR_GRAY2RGB)for i in range(num_lane_point):   # each detected point on the lanedetect_height = height - 20 * (i+1)detect_area_all = dst[detect_height, 0: width-1] line_all = np.where(detect_area_all == 0)if len(line_all[0]):all_line_pos[i] = int(np.max(line_all) + np.min(line_all)) / 2else:all_line_pos[i] = -1 if all_line_pos[i] >= 0:   # draw the lane points on the binary imageimg_out = cv2.circle(img_out, (all_line_pos[i], detect_height), 4, (0, 0, 255), thickness=10)if VideoReturn:  # detect the tennis & transmit the frames to PCcar.VideoTransmission(img_out)############################ decision making #####################################all_mid = np.median(all_line_pos) # choose the most internal lane point for decision makingif all_mid < 0:ForB = 'Backward'else:  #if line is on the left, turn left and fo straightForB = 'Forward'############################ motion control #####################################  if ForB is 'Forward':vleft = speed_low + (speed_high-speed_low)/width * all_midvright = speed_high + (speed_low-speed_high)/width * all_midcar.forward_turn(vleft, vright)elif ForB is 'Backward':car.back(25)

4.3.3 颜色追踪代码

由于RGB图像空间对光强更加敏感,H(色调)S(饱和度)V(明度):对光强变化不敏感,因此实现颜色追踪使用HSV颜色空间。整体程序框图如下:

该部分实现参考github视觉项目。

图像处理部分和巡线任务相似。

图像处理结果如图所示:

在运动控制方面,使用超声波和颜色追踪结合使用,没有检测到物体则原地不动;检测到物体后,使用超声波测距,如果较远便追踪,较近便后退;追踪速度通过在巡线线性控制的基础上给定了一个速度不变的区域,减少不必要的决策。该运动方案也是在结合其他实验之后得到的比较健全的方案。

核心代码:

def Move(x, y, dis):vleft = speed_low + (speed_high-speed_low)/IMAGE_WIDTH * xvright = speed_high + (speed_low-speed_high)/IMAGE_WIDTH * xif x == 0 and y == 0:car.brake()print("stop")else:if dis < 20:car.back(25)print("back")else:if IMAGE_WIDTH/4 < x < (IMAGE_WIDTH-IMAGE_WIDTH/4):car.forward(30)print("forward")elif x < IMAGE_WIDTH/4:car.forward_turn(vleft, vright)print("left")elif x > (IMAGE_WIDTH-IMAGE_WIDTH/4):car.forward_turn(vleft, vright)print("right")

五、使用方法

  • 调用方法
cd code
python3 main_obstacle_avoidance.py
cd code
python3 main_track.py
cd code
python3 main_tracking_color.py
  • PC端接收图片

使用PC端接收树莓派处理之后的图片,方便观察和调试结果。

在树莓派端的camera.py中设置IP和端口(IP可以通过ipconfig获得,端口相同即可),在PC端pc_receiver.py代码中设置对应的IP和端口。运行代码便可以接收图像。

六、存在的问题

  1. 控制方案:在控制方面还可以有很多更好的方案,比如记录误差,通过PID的思路控制小车;
  2. 图像处理方面未尝试使用HSV空间巡线,还有后续提升的空间;
  3. 不同任务摄像头的要求的位置不同,该矛盾尚未解决。

参考链接

MingruiYU学长的博客

github视觉项目

树莓派开启VNC服务

更换系统更新源

更换pip源

python3使用pip安装opencv

树莓派安装中文输入法

树莓派安装中文输入法

摄像头配置

note

  • 本博客的主要结构和部分功能实现主要参考MingruiYU学长的博客,在此感谢学长为我们铺平了道路。

基于树莓派的智能小车相关推荐

  1. 【毕业设计】基于树莓派的智能小车设计 - 物联网 单片机 嵌入式 stm32

    文章目录 1 简介 2 实现功能 主控开发板:树莓派 电机和控制器 避障功能 3 实现效果 5 部分实现代码 6 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目 ** 基于 ...

  2. 【毕业设计之树莓派系列】基于树莓派的智能小车设计

    基于树莓派的智能小车设计 摘要 随着人们对智能化生活的需求不断增长,智能小车的发展逐渐受到关注.然而,现有的智能小车硬件和软件设计有一定的局限性,需要进一步改进和完善.本文旨在基于树莓派PICO开发板 ...

  3. 【记录】本科毕设:基于树莓派的智能小车设计(使用Tensorflow + Keras 搭建CNN卷积神经网络 使用端到端的学习方法训练CNN)

    0 申明 这是本人2020年的本科毕业设计,内容多为毕设论文和答辩内容中挑选.最初的灵感来自于早前看过的一些项目(抱歉时间久远,只记录了这一个,见下),才让我萌生了做个机电(小车动力与驱动)和控制(树 ...

  4. 基于ros_arduino_bridge的智能小车----下位机篇

    基于ros_arduino_bridge的智能小车----下位机篇 参考文章: 基于ros_arduino_bridge的智能小车----上位机篇 基于ros_arduino_bridge的智能小车- ...

  5. 基于STM32的智能小车方案设计

    基于STM32的智能小车设计 前言 一.什么是STM32智能小车? 二.模块汇总 1.主控板(STM32F103ZE) 2.底板 3.电机 4.避障模块(超声波传感器,红外传感器) 5.寻迹模块(3路 ...

  6. 基于树莓派的智能垃圾桶

    基于树莓派的智能垃圾桶项目 预计所需要实现的功能 通过感应能够实现垃圾桶盖子的自动开关. 垃圾桶上装载OLED屏,屏幕上需要显示,温度,时间. 远程控制通过电脑端实现控制垃圾桶的移动. 功能模块: 1 ...

  7. 智能循迹避障小车C语言程序编写思路,基于单片机的智能小车红外避障循迹系统设计与制作...

    余秀玲 余秀娟 摘 要:随着科技的高速发展,人们对生活质量的要求越来越高,无人驾驶汽车已经被广为研发和试用,由此智能小车的快速发展也是在情理之中.通过对基于单片机的智能小车的硬件及软件设计分析,实现红 ...

  8. 基于树莓派的智能家居控制系统设计论文参考

    完整论文咨询可WX联系:gyf1842965496 智能家居控制系统功能实现详细介绍:基于树莓派的智能家居控制系统设计https://blog.csdn.net/G1842965496/article ...

  9. 基于linux的智能小车_基于ARM10与LINUX智能小车系统设计.doc

    基于ARM10与LINUX智能小车系统设计 基于ARM的智能小车系统的设计 摘 要 基于ARM的嵌入式系统其性能优良,移植性好,已广泛应用在各个行业,因此将ARM微处理器应用于智能小车的控制系统是一种 ...

最新文章

  1. 对话图灵奖得主John Hennessy,他说对美国留学签证变化很忧心
  2. 架构师之路 — 分布式系统 — gRPC 谷歌远程过程调用
  3. [BZOJ1500][NOI2005]维修数列(splay)
  4. 不属于微型计算机特点的是什么,2017计算机应用基础模拟题及答案
  5. ie6 javascript js 缺少标识符总结(转载)
  6. 聊聊近期的感受和10月文章精选!
  7. oracle日期处理函数
  8. 数据探索很麻烦?推荐一款史上最强大的特征分析可视化工具:yellowbrick
  9. 全网首发:使用命令行编译VS工程为Win32/x64
  10. PHP校园食堂系统描述
  11. 扫雷游戏(实现了网页版的扫雷游戏的所有逻辑)
  12. python花瓣_Python 花瓣网动态爬虫
  13. CH340/CH341 Linux驱动编译
  14. Power Switching ----- Controlling power for power shutoff
  15. 程序人生-hit计统大作业
  16. 第九章 SQL Server的简单应用
  17. 系统集成项目管理工程师高频考点(第一章)
  18. Efficient Estimation of Word Representations in Vector Space
  19. html5隐藏%3ctextarea,html text隐藏,html textarea
  20. Eclipse配置黑色酷炫主题

热门文章

  1. dubbo原理和机制
  2. 【限流02】限流算法实战篇 - 手撸一个单机版Http接口通用限流框架
  3. MySQL和pymysql安装 linux ubuntu
  4. 朴素的设计打造牛X的产品
  5. 玩客云刷Armbian5.9
  6. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、jinfo、jconsole使用详解
  7. 微服务修炼之服务发现--nacos naming
  8. 用Java输出等腰三角形
  9. C程序-蓝桥-未名湖边的烦恼
  10. CSS中 设置( 单行、多行 )超出显示省略号