控制 Raspberry Pi 辆汽车
Controlling a Raspberry Pi car
我正在尝试用键盘控制我的 raspi 汽车。我设法做到了,但我偶然发现了一个错误,我不知道如何解决它。
这是我的代码:
- motorControl 包含汽车运动的函数:init() forward() reverse() turn_right() turn_left()
我还在我的车上装了一个超声波传感器:
distance_sensor包含测量传感器与目标物体之间距离的函数。
import pygame
from motorControl import *
from distance_sensor import distance_Ultrasonic
GPIO.setwarnings(False)
init()
screen = pygame.display.set_mode([240, 160])
def check():
dist = distance_Ultrasonic()
while ( dist <= 3):
dist = distance_Ultrasonic()
stop()
while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
check()
turn_right()
elif event.key == pygame.K_LEFT:
check()
turn_left()
elif event.key == pygame.K_UP:
check()
forward()
elif event.key == pygame.K_DOWN:
check()
reverse()
elif event.key == pygame.K_q:
stop()
pygame.quit()
elif event.type == pygame.KEYUP:
print('No key pressed')
stop()
我想在这里做的是当点击其中一个键盘时,首先调用 check() 函数来检查距离是否合适,然后它向前移动,向后移动等等..
但是按住键盘时的问题是:
例如,如果我按住键盘的向上箭头,程序会按预期调用 check() 来检查距离,如果距离合适则向前移动。当我接近一个目标物体时,汽车并没有停下并撞上了目标。所以很明显,当按住向上箭头时,我将被困在 forward() 函数中,而不会每次都调用 check() 。我该如何解决这个问题?
嗯,这里的问题是,即使 check
决定你应该停止,你还是继续做这个动作。 check
需要做一次检查,returnTrue或False告诉调用者是否继续。例如:
def check():
if distance_Ultrasonic() <= 3:
stop()
return False
return True
while True:
check()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
check():
turn_right()
elif event.key == pygame.K_LEFT:
check()
turn_left()
elif event.key == pygame.K_UP:
if check():
forward()
elif event.key == pygame.K_DOWN:
if check():
reverse()
elif event.key == pygame.K_q:
stop()
pygame.quit()
elif event.type == pygame.KEYUP:
print('No key pressed')
stop()
这假设“turn_right”和“turn_left”实际上没有任何向前运动,所以如果你按住“右”,你只是想让它永远旋转。我不知道你想如何处理反向。如果传感器向前看,那么你就无法知道什么时候停止。
我正在尝试用键盘控制我的 raspi 汽车。我设法做到了,但我偶然发现了一个错误,我不知道如何解决它。
这是我的代码:
- motorControl 包含汽车运动的函数:init() forward() reverse() turn_right() turn_left()
我还在我的车上装了一个超声波传感器:
distance_sensor包含测量传感器与目标物体之间距离的函数。
import pygame from motorControl import * from distance_sensor import distance_Ultrasonic GPIO.setwarnings(False) init() screen = pygame.display.set_mode([240, 160]) def check(): dist = distance_Ultrasonic() while ( dist <= 3): dist = distance_Ultrasonic() stop() while True: for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT: check() turn_right() elif event.key == pygame.K_LEFT: check() turn_left() elif event.key == pygame.K_UP: check() forward() elif event.key == pygame.K_DOWN: check() reverse() elif event.key == pygame.K_q: stop() pygame.quit() elif event.type == pygame.KEYUP: print('No key pressed') stop()
我想在这里做的是当点击其中一个键盘时,首先调用 check() 函数来检查距离是否合适,然后它向前移动,向后移动等等..
但是按住键盘时的问题是: 例如,如果我按住键盘的向上箭头,程序会按预期调用 check() 来检查距离,如果距离合适则向前移动。当我接近一个目标物体时,汽车并没有停下并撞上了目标。所以很明显,当按住向上箭头时,我将被困在 forward() 函数中,而不会每次都调用 check() 。我该如何解决这个问题?
嗯,这里的问题是,即使 check
决定你应该停止,你还是继续做这个动作。 check
需要做一次检查,returnTrue或False告诉调用者是否继续。例如:
def check():
if distance_Ultrasonic() <= 3:
stop()
return False
return True
while True:
check()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
check():
turn_right()
elif event.key == pygame.K_LEFT:
check()
turn_left()
elif event.key == pygame.K_UP:
if check():
forward()
elif event.key == pygame.K_DOWN:
if check():
reverse()
elif event.key == pygame.K_q:
stop()
pygame.quit()
elif event.type == pygame.KEYUP:
print('No key pressed')
stop()
这假设“turn_right”和“turn_left”实际上没有任何向前运动,所以如果你按住“右”,你只是想让它永远旋转。我不知道你想如何处理反向。如果传感器向前看,那么你就无法知道什么时候停止。