树莓派小车简单的迷宫算法-基于Python设计
请大家先看看我的法拉利~
它身上有前中后三个超声波传感器,轻松调用他们就能使小车避障轻松走出迷宫啦。预期小车走的路线是这样子的:
我的核心思路:
初始小车为前进状态,此时使用前、左、右三个传感器检测小车三边与障碍物的距离,当前方距离小于一个界限值时,判断左右传感器与障碍物的距离,如果左大于右,则向左转,否则,向右。当转向完成后小车的转向角度可能会发生偏差,判断左右传感器与障碍物的距离,设置一个大致的调整时间,使小车停止,然后进行微调整,再返回循环体继续前进。
使小车自己进行微微调整的思路:
转向完成后,判断左右传感器与障碍物的距离,如果小于一个界限值,则令小车进行微调。使小车有一个较好的角度前进,将碰撞的可能性降到最低。
程序流程图:
代码如下:
# -*- coding: utf-8 -*-import RPi.GPIO as gpio # 第一行引用后,可以设置中文注释 树莓派上才有的
import time
import sys
import randomgpio.setwarnings(False) # 去掉一些不必要的警告def init():gpio.setmode(gpio.BOARD) # GPIO调用BOARD编号方式gpio.setup(38, gpio.OUT)gpio.setup(40, gpio.IN)gpio.setup(35, gpio.OUT)gpio.setup(37, gpio.IN)gpio.setup(29, gpio.OUT)gpio.setup(31, gpio.IN)def gp():gpio.setmode(gpio.BOARD)gpio.setup(12, gpio.OUT) # 引脚设置为输出gpio.setup(16, gpio.OUT)gpio.setup(18, gpio.OUT)gpio.setup(22, gpio.OUT)# 前传感器
def forward_distance():init()gpio.output(38, True) # 发出触发信号保持10us以上(15us)time.sleep(0.000015)gpio.output(38, False)while not gpio.input(40):passt1 = time.time() # 发现高电平时开时计时while gpio.input(40):passt2 = time.time() # 高电平结束停止计时return (t2 - t1) * 34000 / 2 # 返回距离,单位为厘米gpio.cleanup()return forward_distance# 左传感器
def left_distance():init()gpio.setup(35, gpio.OUT)gpio.output(35, True) # 发出触发信号保持10us以上(15us)time.sleep(0.000015)gpio.output(35, False)while not gpio.input(37):passt1 = time.time() # 发现高电平时开时计时while gpio.input(37):passt2 = time.time() # 高电平结束停止计时return (t2 - t1) * 34000 / 2 # 返回距离,单位为厘米gpio.cleanup()return left_distance# 右传感器
def right_distance():init()gpio.output(29, True) # 发出触发信号保持10us以上(15us)time.sleep(0.000015)gpio.output(29, False)while not gpio.input(31):passt1 = time.time() # 发现高电平时开时计时while gpio.input(31):passt2 = time.time() # 高电平结束停止计时return (t2 - t1) * 34000 / 2 # 返回距离,单位为厘米gpio.cleanup()return right_distancedef forward():init()gp()# 全速前进状态gpio.output(12, True) # 左前进gpio.output(16, False) # 左后退gpio.output(22, False) # 右后退gpio.output(18, True) # 右前进# q = gpio.PWM(12, 50) # !error 两个PWM信号程序会出错# p = gpio.PWM(18, 50) # 信道,频率# q.start(50)# p.start(50) # 占空比time.sleep(0)# 左转
def left(runtime):gp()gpio.output(12, False)gpio.output(16, False)gpio.output(22, False)gpio.output(18, True)p = gpio.PWM(18, 80) # 信道,频率p.start(50) # 占空比time.sleep(runtime)gpio.cleanup()# 右转
def right(runtime):gp()gpio.output(12, True)gpio.output(16, False)gpio.output(22, False)gpio.output(18, False)p = gpio.PWM(12, 80) # 信道,频率p.start(50) # 占空比time.sleep(runtime)gpio.cleanup()# 左边微调
def adjust_left(runtime):init()gp()gpio.output(12, False) # 左前进gpio.output(16, True) # 左后退gpio.output(22, False) # 右后退gpio.output(18, True) # 右前进# q = gpio.PWM(16,50)# p = gpio.PWM(18,50)# q.start(50)# p.start(50)time.sleep(runtime)# 右边微调
def adjust_right(runtime):init()gp()gpio.output(12, True) # 左前进gpio.output(16, False) # 左后退gpio.output(22, True) # 右后退gpio.output(18, False) # 右前进# q = gpio.PWM(12, 50)# p = gpio.PWM(22, 50)# q.start(50)# p.start(50)time.sleep(runtime)def stop(runtime):init()gp()gpio.output(12, False)gpio.output(16, False)gpio.output(22, False)gpio.output(18, False)gpio.cleanup()time.sleep(runtime)def run():while True:init()gp()forward()fd = forward_distance()ld = left_distance()rd = right_distance()print('前距离是:%0.2f cm' % fd)print("----------------------")if ld < 7:stop(0.3)adjust_left(0.5)print("向左微转")continueif rd < 7:stop(0.3)adjust_right(0.5)print("向右微转")continueif fd > 200:stop(0.3)adjust_left(0.5)continueif fd < 30 and ld > rd:print("左转")print("----------------------")print('左距离是:%0.2f cm' % ld)left(2)continueelif fd < 30 and rd > ld:print("右转")print("----------------------")print('右距离是:%0.2f cm' % rd)right(1.25)continueelse:continuerun()
总体是非常简单的,代码也有注释,希望对你们有帮助!
树莓派小车简单的迷宫算法-基于Python设计相关推荐
- 树莓派小车教程(二)之——基于Tornado框架的网页控制小车(按键+鼠标点击)
项目场景: 前两天笔者写了一份手把手树莓派小车教程(一)之--小车跑起来的教程.当时只是让小车能动起来,不过项目中的小车肯定是需要一个用户界面能够操控的. 能看到这一部分的读者们可能基本都会简单的控制 ...
- 基于Python设计10以内乘法出题器
1. 项目背景 有正在上小学孩子的父母,就会遇到出乘法口算题的困扰.本文希望使用Python解决出乘法题的困扰. 2.项目函数概览 (1)随机生成乘法题 equation_produce() (2)随 ...
- pip安装OpenCV教程(简单步骤)基于python
准备 安装好python环境的电脑(若未安装python环境,可参照https://blog.csdn.net/qq_36623595/article/details/115599427) pytho ...
- 简单实用的基于python的OCR中文字符识别——基于windows平台(附代码)
1. 基本环境 操作系统:win7 64位系统 python版本:3.6 2.安装配套环境 (1)首先安装OCR字符识别库Tesseract 下载网址:https://digi.bib.uni- ...
- 基于python设计的宾馆管理系统 课程论文
目录 一.概述 2 二.需求分析 3 三.设计 4 3.1总体框架 4 3.2初始化模块 4 3.3开房模块 5 3.4查找模块 6 3.5删除模块 7 3.6修改模块 7 3.7排序模块 8 3.8 ...
- 基于Python实现的吃豆人游戏设计
资源下载地址:https://download.csdn.net/download/sheziqiong/86817091 资源下载地址:https://download.csdn.net/downl ...
- 基于Python的毕业论文怎么写?
目前越来越多的科学研究开始运用技术手段,其中应用较多的是模型建立和数据分析,这就离不开计算机语言的使用,Python以其简单易学的特性,配合高度的适用性,在科研领域发挥越来越重要的作用,基于Pytho ...
- 基于Python的旅游景点的数据采集与分析的研究
在旅游景点不断扩张,本基于Python的旅游景点的数据采集与分析系统按照软件开发方法进行研究,对系统先进行需求分析,确定系统必须做什么,进而进行系统设计,设计出满足需求的新系统,最后才是系统功能实现以 ...
- 树莓派小车教程(三)之——初步实现网页控制小车速度可调(顺序执行)
项目场景: 之前写了一篇手把手树莓派小车教程(二)之--基于Tornado框架的网页控制小车(按键+鼠标点击).当时只记录了如何通过Tornado框架能让网页控制小车跑起来(以恒定速度),但是项目中小 ...
- python微博评论爬虫_详解用python写网络爬虫-爬取新浪微博评论 基于Python的新浪微博爬虫研究...
怎样爬取新浪微博的评论信息 针对八爪鱼在微博的应用上,除了用户信息之外还包括话题内容方面的采集,目前绝大多数企业均在微博设有官方微博,八爪鱼可以协助企业快速及时的抓取与企业产品相关联的话题信息,规则市 ...
最新文章
- silverlight 类似百度的图片浏览器,视频播放,附件下载功能,全部后台程序。...
- jemter安装Transactions per Second和Response Times Over Time插件
- mvc 实例 php,来写一个简单的PHP MVC结构
- linux systemd 使用
- 阿基米德椭圆规原理,你看懂了吗?
- 水表读数自动识别,基于DB和CRNN的方法
- 嵌入式linux只读保护,如何使用squashfs只读文件系统制作Linux系统文件
- MOSS提升权限方法
- 洞穴辐射(radiation)
- 删除数据清理oracle表空间,oracle删除(释放)数据文件/表空间流程
- vecm matlab,VECM是什么?
- D - 暴力[百钱百鸡(稍简单)]
- LUA脚本(游戏辅助) 点击函数 区域单点多点着色
- android开发屏幕投射到电视6,用电视吃鸡!将手机上的内容投射到电视机的屏幕上!...
- 关于信息安全认证CISP与CISSP的对比及分析
- PS弧形边缘的去黑色背景色
- Sea of nodes 中译文
- 用MATLAB怎么获取任意像素点的灰度值
- 自然语言处理第二讲:单词计数
- 使用R语言分析世界幸福指数