请大家先看看我的法拉利~


它身上有前中后三个超声波传感器,轻松调用他们就能使小车避障轻松走出迷宫啦。预期小车走的路线是这样子的:

我的核心思路:
初始小车为前进状态,此时使用前、左、右三个传感器检测小车三边与障碍物的距离,当前方距离小于一个界限值时,判断左右传感器与障碍物的距离,如果左大于右,则向左转,否则,向右。当转向完成后小车的转向角度可能会发生偏差,判断左右传感器与障碍物的距离,设置一个大致的调整时间,使小车停止,然后进行微调整,再返回循环体继续前进。

使小车自己进行微微调整的思路:
转向完成后,判断左右传感器与障碍物的距离,如果小于一个界限值,则令小车进行微调。使小车有一个较好的角度前进,将碰撞的可能性降到最低。

程序流程图:

代码如下:

# -*- 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设计相关推荐

  1. 树莓派小车教程(二)之——基于Tornado框架的网页控制小车(按键+鼠标点击)

    项目场景: 前两天笔者写了一份手把手树莓派小车教程(一)之--小车跑起来的教程.当时只是让小车能动起来,不过项目中的小车肯定是需要一个用户界面能够操控的. 能看到这一部分的读者们可能基本都会简单的控制 ...

  2. 基于Python设计10以内乘法出题器

    1. 项目背景 有正在上小学孩子的父母,就会遇到出乘法口算题的困扰.本文希望使用Python解决出乘法题的困扰. 2.项目函数概览 (1)随机生成乘法题 equation_produce() (2)随 ...

  3. pip安装OpenCV教程(简单步骤)基于python

    准备 安装好python环境的电脑(若未安装python环境,可参照https://blog.csdn.net/qq_36623595/article/details/115599427) pytho ...

  4. 简单实用的基于python的OCR中文字符识别——基于windows平台(附代码)

    1. 基本环境 操作系统:win7 64位系统 python版本:3.6 2.安装配套环境 (1)首先安装OCR字符识别库Tesseract    下载网址:https://digi.bib.uni- ...

  5. 基于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 ...

  6. 基于Python实现的吃豆人游戏设计

    资源下载地址:https://download.csdn.net/download/sheziqiong/86817091 资源下载地址:https://download.csdn.net/downl ...

  7. 基于Python的毕业论文怎么写?

    目前越来越多的科学研究开始运用技术手段,其中应用较多的是模型建立和数据分析,这就离不开计算机语言的使用,Python以其简单易学的特性,配合高度的适用性,在科研领域发挥越来越重要的作用,基于Pytho ...

  8. 基于Python的旅游景点的数据采集与分析的研究

    在旅游景点不断扩张,本基于Python的旅游景点的数据采集与分析系统按照软件开发方法进行研究,对系统先进行需求分析,确定系统必须做什么,进而进行系统设计,设计出满足需求的新系统,最后才是系统功能实现以 ...

  9. 树莓派小车教程(三)之——初步实现网页控制小车速度可调(顺序执行)

    项目场景: 之前写了一篇手把手树莓派小车教程(二)之--基于Tornado框架的网页控制小车(按键+鼠标点击).当时只记录了如何通过Tornado框架能让网页控制小车跑起来(以恒定速度),但是项目中小 ...

  10. python微博评论爬虫_详解用python写网络爬虫-爬取新浪微博评论 基于Python的新浪微博爬虫研究...

    怎样爬取新浪微博的评论信息 针对八爪鱼在微博的应用上,除了用户信息之外还包括话题内容方面的采集,目前绝大多数企业均在微博设有官方微博,八爪鱼可以协助企业快速及时的抓取与企业产品相关联的话题信息,规则市 ...

最新文章

  1. silverlight 类似百度的图片浏览器,视频播放,附件下载功能,全部后台程序。...
  2. jemter安装Transactions per Second和Response Times Over Time插件
  3. mvc 实例 php,来写一个简单的PHP MVC结构
  4. linux systemd 使用
  5. 阿基米德椭圆规原理,你看懂了吗?
  6. 水表读数自动识别,基于DB和CRNN的方法
  7. 嵌入式linux只读保护,如何使用squashfs只读文件系统制作Linux系统文件
  8. MOSS提升权限方法
  9. 洞穴辐射(radiation)
  10. 删除数据清理oracle表空间,oracle删除(释放)数据文件/表空间流程
  11. vecm matlab,VECM是什么?
  12. D - 暴力[百钱百鸡(稍简单)]
  13. LUA脚本(游戏辅助) 点击函数 区域单点多点着色
  14. android开发屏幕投射到电视6,用电视吃鸡!将手机上的内容投射到电视机的屏幕上!...
  15. 关于信息安全认证CISP与CISSP的对比及分析
  16. PS弧形边缘的去黑色背景色
  17. Sea of nodes 中译文
  18. 用MATLAB怎么获取任意像素点的灰度值
  19. 自然语言处理第二讲:单词计数
  20. 使用R语言分析世界幸福指数

热门文章

  1. 【致远FAQ】致远OA启动不起来了(下集)
  2. iOS-性能优化的那些事
  3. 如何解决没有指定在Windows运行或者它包含错误
  4. 【文档+视频】Verdi基础教程
  5. java登录验证_java实现登录验证码
  6. java解析MT940报文,swift MT报文解析处理
  7. opencv 图像伽马校正
  8. Android 加载数据等待时 小人奔跑进度动画
  9. bandicom录屏音画不同步_bandicam录屏工具
  10. 微信表白代码,单身汪们还不快收藏!