【发布时间】:2021-06-30 23:23:54
【问题描述】:
我正在尝试使用通过蓝牙连接到树莓派的 ps4 控制器来控制机器人,但是我需要让它移动的 while 循环出现问题。机器人以使其行走的模式循环腿部位置。我制作了一个成功的程序,它使用键盘按住 w、a、s 或 d 将沿通常的方向移动机器人并在释放后停止机器人。但是,ps4 控制器使用函数进行输入的方式让我感到困惑。
这是键盘代码:
from move import move, steady, steady_X
import sys, tty, termios, time
import Adafruit_PCA9685
def getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
pwm = Adafruit_PCA9685.PCA9685()
if __name__ == '__main__':
step = 1
move_stu = 1
try:
while 1:
char = getch()
if char == 'x':
pwm.set_all_pwm(0,300)
time.sleep(1)
break
if char == 'w':
move(step, 35, 'forward')
step += 1
if step > 4:
step = 1
time.sleep(0.08)
if char == 's':
move(step, 35, 'backward')
step += 1
if step > 4:
step = 1
time.sleep(0.08)
if char == 'a':
move(step, 35, 'left')
step += 1
if step > 4:
step = 1
time.sleep(0.08)
if char == 'd':
move(step, 35, 'right')
step += 1
if step > 4:
step = 1
time.sleep(0.08)
if char == 'e':
pwm.set_all_pwm(0,300)
time.sleep(0.1)
steady_X()
if char == ' ':
steady()
except KeyboardInterrupt:
pwm.set_all_pwm(0,300)
time.sleep(1)
其中 35 是机器人的速度。
控制器代码为:
from pyPS4Controller.controller import Controller
from move import move, steady, steady_X
import sys, tty, termios, time
import Adafruit_PCA9685
class MyController(Controller):
def __init__(self, **kwargs):
Controller.__init__(self, **kwargs)
self.step = 1
self.pwm = Adafruit_PCA9685.PCA9685()
self.command = False
def on_x_press(self):
self.command = True
while self.command == True:
move(self.step, 35, 'forward')
self.step +=1
if self.step > 4:
self.step = 1
time.sleep(0.08)
def on_x_release(self):
self.command = False
controller = MyController(interface="/dev/input/js0", connecting_using_ds4drv = False, event_definition = None)
controller.listen()
一旦 controller.listen() 被调用,它就会开始从控制器获取输入。 现在,一旦按下 x,机器人将向前移动,并且在释放时不会停止。所以我的问题是,当 x 被释放并调用 on_x_release(self) 函数时,如何让它停止移动?
【问题讨论】:
标签: python loops object robotics robot