如何用PS4 DualShock控制器(Python)控制这个机器人?

2024-05-18 21:23:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图用一个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)函数被调用时,如何使它停止移动


Tags: importselfmoveiftimestepsys机器人
1条回答
网友
1楼 · 发布于 2024-05-18 21:23:24

我可能没有直接解决你的问题,因为我没有硬件来测试它,但是你可以考虑写一个^ {CD1>}函数,在那里你显式地把所有的马达设置为0位置(如果你使用一个H桥控制器,这意味着将两个通道设置为关闭)。然后,在调用函数on_x_release(self)时,您将像通常那样将self.command标志设置为False,但也可以调用stop()函数来显式停止电机移动

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
        stop() # (or modify the move function to accept a 'stop' string)


controller = MyController(interface="/dev/input/js0", connecting_using_ds4drv = False, 
event_definition = None)
controller.listen()

另一方面,我认为这个问题可能是因为你没有一个机器人什么都不做的“默认”条件。通常,我处理此类问题的方法是将机器人的一般行为定义为不做任何事情,并将x键定义为中断。因此,只要按下该键,就会发生一个事件,等价的eventHandler被称为(如果您熟悉微控制器,请考虑ISR)。以这种方式设计它可能会给你更多的控制

相关问题 更多 >

    热门问题