这里所说的远程控制,是指一台PC通过一个界面可以达到控制并监视小车的目的。当然你也可以设计红外遥控,蓝牙等方式。

  • 在设计界面时我选择了python自带的GUI工具————Tkinter。
    选择Tkinter是因为它简单,写完直接运行就行。我们只需要通过VNC或者Windows远程桌面连接到树莓派,运行代码,就可以在PC上控制小车。
    你自己也可以选择HTML来完成。做一个web页面。相关的自己可以去搜索。
  • 控制界面带一个视频传输的接口,在这次我选择了用OpenCV调用树莓派摄像头来实现实时的视频传输。
  • 代码如下:
#coding=utf-8
import RPi.GPIO as GPIO
import time
from Tkinter import *
from PIL import Image,ImageTk
import tkFileDialog as filedialog
import cv2
import threading#控制界面函数
def ConInterface():#播放本地视频的函数def playLocalVideo():moviePath=filedialog.askopenfilename() #文件对话框,用来打开文件夹,选择文件print(moviePath)playBtn.place_forget() #隐藏播放按钮movie=cv2.VideoCapture(moviePath)waitTime= 1000/movie.get(5) #获取每帧需要的时间print(waitTime)movieTime = (movie.get(7) / movie.get(5))/60 #用视频文件的总帧数除以视频文件的帧速率得到视频的总时长,并换算成分钟print(movieTime)playSc.config(to=movieTime)while movie.isOpened():ret,readyFrame=movie.read() #read()返回两个值,ret 表示帧是否为空,readyFrame表示当前帧if ret==True:movieFrame=cv2.cvtColor(readyFrame,cv2.COLOR_BGR2RGBA) #校正颜色newImage=Image.fromarray(movieFrame).resize((675,360)) #调整大小newCover=ImageTk.PhotoImage(image=newImage)video.configure(image=newCover)  #将图像加入到video标签中video.image=newCovervideo.update()cv2.waitKey(int(waitTime)) #播放完每帧等待的时间else:break#使用opencv调用树莓派摄像头def playVideo():playBtn.place_forget()  #点击播放按钮之后开始播放视频,隐藏按钮movie=cv2.VideoCapture(0)  #打开摄像头movie_fps=movie.get(5)  #得到画面的帧速率print(movie_fps)waitTime=int(1000/movie_fps)print(waitTime)while movie.isOpened():#读取帧,返回布尔值和当前帧,ret 表示帧是否为空,readyFrame表示当前帧ret,readyFrame=movie.read()if ret==True:#校正图像颜色movieFrame=cv2.cvtColor(readyFrame,cv2.COLOR_BGR2RGBA)#设置图像大小newImage=Image.fromarray(movieFrame).resize((675,360))#将照片设置成和tkinter兼容的图像newCover=ImageTk.PhotoImage(image=newImage)#将图像放入Label中video.configure(image=newCover)video.image=newCovervideo.update()cv2.waitKey(20)else:breakmovie.release()   #释放资源#设置线程执行播放视频程序def Thread_playVideo():thread_playVideo=threading.Thread(target=playVideo)thread_playVideo.start()root=Tk() #初始化tkroot.title("控制界面")     #设置标题root.geometry("1080x720")  #设置窗口大小root['bg']="#333333"       #设置窗口背景颜色#root.iconbitmap('/home/pi/ZRcode/go.ico')root.resizable(width=False,height=False)    #设置窗口长和宽是否可以变化#分别设置三个Frame 模块用于存放Label,Buttonvideof=Frame(root,height=360,width=675,cursor="cross")videof.place(x=199,y=0)f1=Frame(root,height=270,width=540,cursor="circle",bg="#333333")f1.place(x=269,y=359)f2=Frame(root,height=180,width=540,cursor="plus",bg="#333333")f2.place(x=269,y=629)#视频窗口movieImage=Image.open('/home/pi/ZRcode/raspberry.jpg').resize((675,360))cover=ImageTk.PhotoImage(image=movieImage)video=Label(videof,width=675,height=360,bd=0,bg="pink",image=cover)video.place(x=0,y=0)#播放按钮的布局iconImag=Image.open('/home/pi/ZRcode/play.ico').resize((32,32))icoBtn=ImageTk.PhotoImage(image=iconImag)playBtn=Button(videof,image=icoBtn,cursor="hand2",command=Thread_playVideo,relief="groove")playBtn.place(x=319,y=159)#playSc=Scale(videof,from_=0,to=90,length=675,orient=HORIZONTAL,resolution=0.2,showvalue=0,bd=0,cursor="hand2",troughcolor="white")#playSc.place(x=0,y=310)#控制按钮up=Button(f1,text="前进",command=lambda:turn_up(20,1),activeforeground="green",activebackground="yellow",height=1,width=4)up.place(x=267,y=39)left=Button(f1,text="左转",command=lambda:turn_left(20,1),activeforeground="green",activebackground="yellow",height=1,width=4)left.place(x=132,y=134)right=Button(f1,text="右转",command=lambda:turn_right(20,1),activeforeground="green",activebackground="yellow",height=1,width=4)right.place(x=412,y=134)back=Button(f1,text="后退",command=lambda:turn_back(20,1),activeforeground="green",activebackground="yellow",height=1,width=4)back.place(x=267,y=230)stop=Button(f1,text="停止",command=car_stop,activeforeground="green",activebackground="yellow",height=1,width=4)stop.place(x=267,y=134)xunji=Button(f2,text="循迹",command=Thread_track,activeforeground="green",activebackground="yellow",height=1,width=4)xunji.place(x=68,y=44)bz=Button(f2,text="避障",command=Thread_bizhang,activeforeground="green",activebackground="yellow",height=1,width=4)bz.place(x=461,y=44)over=Button(f2,text="OVER",command=Thread_gpio_clean,activeforeground="green",activebackground="yellow",height=1,width=6)over.place(x=263,y=44)root.mainloop()
  • 为什么要导入threading?
    写完界面运行之后我发现,当你点击一个按钮之后,其他的按钮在程序执行时是不可以点击的。这就存在问题,我们需要在循迹或者避障的同时要摄像头传输视频,所以我们需要将程序设计成多线程的,它们才能并行。当然并行主要是循迹和视频传输,避障和视频传输。循迹和避障当然是不用并行。循迹功能中可以加入避障,但这不属于并发。
  • 导入的PIL和CV2
    这两个都是计算机视觉和图像处理的库。我也只是使用了部分功能,并没有深入了解。
  • 最终运行效果图

树莓派小车————远程控制相关推荐

  1. 树莓派小车(远程控制、PWM变速、超声波自动避障)

    代码地址:github.com/Sanzo00/pi-car 功能展示 远程控制小车 PWM变速 小车在低电压情况下跑的比较慢,因此增加变速的功能. 超声波自动避障 这里使用超声波测距模块(HC-SR ...

  2. DIY树莓派小车(一)树莓派4B+TB6612FNG驱动直流电机

    趁着暑假时间充裕,准备制作一辆简易的树莓派小车,让树莓派不再吃灰,写此文记录折腾的过程. DIY树莓派小车(一)树莓派4B+TB6612FNG驱动直流电机 小车需求简要介绍 采用双轮差速方式移动 双轮 ...

  3. MQTT树莓派小车局域网控制移动

    最近在做MQTT ,一种轻量级的应用层通信协议 然后用MQTT代替socket做消息传送控制我的树莓派小车运动,这样的好处是 很多的云服务器都支持MQTT 所以可以实现远程控制小车做安防 本文首先在上 ...

  4. 以前不懂事现在只想搞钱,从0-1搭建一个树莓派小车

    项目来源背景 自从上了大学,感触很多,身为一个计算机系的小白,见识到了大佬们的学识渊博,就此下定决心,要向他们不断的靠近(身为一个什么也不懂的小白,难免都不太愿意跟我交流).起初真正意义上认识树莓派是 ...

  5. 【opencv-ANNs】简单自动驾驶树莓派小车

    关键词:#树莓派小车 #opencv #神经网络 #自动驾驶 #python3 概要:设计一个可以自动驾驶的小车,能实时分析摄像头采集到的数据,完成左右转向的判断和执行,使其可以保持在车道上. 原理简 ...

  6. 安卓端APP遥控树莓派小车

    一.基本原理 在android端写一个小小的控制器来通过局域网来控制树莓派小车的行驶,基本思路是在树莓派上写一个socket服务器,android端写一个socket客户机,两边约定好命令的指令(例如 ...

  7. 树莓派小车教程(四)之——基本实现网页控制小车速度可调(同步执行)

    项目场景: 之前的小车教程序列里写到了网页控制小车速度的初步实现.当时只是初步实现小车速度的加减,但运行起来还是出现了些问题,如不能实现小车的移动与变速同时进行.手指离开按键后小车仍有延迟等. 问题分 ...

  8. 简单的Web控制树莓派小车

    说在前面:大四第一学期没课,决定做一个智能小车.从最初的一无所有,到小车可实现远程控制,虽然在这期间遇到了不少问题,但同时也让我学到了许多新知识.当然,小车的完成并非是我一个人的力量,各位大佬的教程给 ...

  9. 树莓派小车python操作流程--龙邱科技

    ▌第一部分 环境解决 1.1 软件版本 发货前已经配置好软件环境: Linux raspberrypi 5.4.51 Python 3.7 OpenCV-python 3.4.6.27 1.2 TF卡 ...

最新文章

  1. MVP+WCF+三层结构搭建项目框架(上)
  2. MIME类型不可小视
  3. 在微型计算机系统中,打印机一般是通过( ,2013湖南省计算机等级考试试题 二级C试题最新考试试题库...
  4. 夯实基础,彻底掌握js的核心技术(一)
  5. 【数据库系统设计】SQL语言实验
  6. 牛客 —— 湖南大学第十六届程序设计竞赛(重现赛)
  7. http status code —— http 状态码
  8. 【java笔记】继承与多态
  9. Linux Linux开发 Linux高级编程 Linux文档
  10. vue : 无法加载文件 C:\Users\1111111\AppData\Roaming\npm\vue.ps1,因为在此系统禁止运行脚本
  11. Tecplot360 作图经验
  12. 3 非齐次线性微分方程与无量纲化
  13. 服务器硬盘可以换盘位吗,RAID里的硬盘可以互换槽位吗
  14. 风格迁移 I2I 论文阅读笔记——U-GAT-IT,动漫风格生成
  15. 四相八拍步进c语言程序,四相八拍的步进电机简单的驱动
  16. joycon手柄拆解_爱活电刑室 | 撬开海拉尔的大门! 任天堂Switch全拆解
  17. 计算机sng,腾讯高级执行副总裁汤道生:腾讯SNG正在大力布局人工智能
  18. 插件自动解决谷歌翻译用不了,win、mac、linux通用,附链接
  19. aps软件中的运营管理至关重要
  20. 计算机在油气储运专业的应用,计算机多媒体专业学论文参考文献 计算机多媒体专业论文参考文献数量是多少...

热门文章

  1. python实现excel计算_用python实现简单EXCEL数据统计的实例
  2. FA-PEG-NHS 叶酸PEG活性酯
  3. 级数_2:常数项级数的审敛法
  4. MyBatis官网下载步骤
  5. 一文理解kafka端到端的延迟
  6. 【转】Arp的攻防实战
  7. 第二周学习前端总结与感悟(一)
  8. Arduino使用RFID模块来储存卡信息实现智能门锁(MF RC522)
  9. 一文道尽 Excel 的 Criterion
  10. linux中退格出现乱码,SSH中的SQL命令按退格键出现乱码的有关问题解决