我正试图用一个ps4控制器控制一个机器人,该控制器通过蓝牙连接到raspberry pi,但我需要使它移动的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)函数被调用时,如何使它停止移动
我可能没有直接解决你的问题,因为我没有硬件来测试它,但是你可以考虑写一个^ {CD1>}函数,在那里你显式地把所有的马达设置为0位置(如果你使用一个H桥控制器,这意味着将两个通道设置为关闭)。然后,在调用函数
on_x_release(self)
时,您将像通常那样将self.command标志设置为False,但也可以调用stop()
函数来显式停止电机移动另一方面,我认为这个问题可能是因为你没有一个机器人什么都不做的“默认”条件。通常,我处理此类问题的方法是将机器人的一般行为定义为不做任何事情,并将x键定义为中断。因此,只要按下该键,就会发生一个事件,等价的eventHandler被称为(如果您熟悉微控制器,请考虑ISR)。以这种方式设计它可能会给你更多的控制
相关问题 更多 >
编程相关推荐