使用操纵杆输入来执行操作(驱动伺服器,打开LED)

时间:2019-05-09 20:58:18

标签: python robotics joystick evdev

我正在构建一个基本的DVa Mech机器人(爱好)。这是非两足动物。轮式底盘。 python中的所有代码。

我如何在按住按钮并按住操纵杆的同时连续执行活动?而且我还能一次做两个(或多个):向前移动车轮,转动躯干,射击枪吗?

我正在阅读操纵杆输入正常。伺服也工作。 我似乎无法弄清楚“按下按钮时-做一些事情-并继续扫描以获取更多输入”的逻辑循环

尝试了各种方法...它们无法正常工作,因此超出了下面的代码。

运行6个连续伺服器(4个用于底盘,两个用于小型喷枪) 罗技F710操纵杆

from evdev import InputDevice, categorize, ecodes, KeyEvent
from adafruit_servokit import ServoKit
import time
kit = ServoKit(channels = 16)
gamepad = InputDevice('/dev/input/event7')
print (gamepad)
for event in gamepad.read_loop():
    if event.type == ecodes.EV_KEY:
            keyevent = categorize(event)
            if keyevent.keystate == KeyEvent.key_down:
                    print(keyevent)
                    ....
                    elif keyevent.keycode == 'BTN_TL':
                            print ("Guns")
    elif event.type == ecodes.EV_ABS:
            absevent = categorize(event)
            print(absevent.event.code)
            if ecodes.bytype[absevent.event.type][absevent.event.code] == 'ABS_HAT0X':
                    if absevent.event.value == -1:
                            print('left')
                    elif absevent.event.value == 1:
                            print('right')
            if ecodes.bytype[absevent.event.type][absevent.event.code] == 'ABS_HAT0Y':
                    if absevent.event.value == -1:
                            print('forward')
                    elif absevent.event.value == 1:
                            print('back')

完全基本...按下BTN_TL时,伺服5和6应当旋转直到释放按钮

与HAT0X和0Y类似,在按下时伺服器应向前/向后/向左/向右移动。

我尝试了while循环和其他操作...但是操纵杆输入中存在逻辑/时序序列,我没有把它放在正确的位置

1 个答案:

答案 0 :(得分:0)

对于伺服部分,基于Servokit documentation,有两种方法来控制伺服器:

  1. 设置所需的轴角度:
    kit.servo[servonum].angle = 180
  1. 指示旋转方向(1:向前,-1:向后,0:停止),例如:
    kit.continuous_servo[servonum].throttle = 1 
    kit.continuous_servo[servonum].throttle = -1
    kit.continuous_servo[servonum].throttle = 0

我宁愿使用角度,即使我必须在循环中增加/减少其值(根据时间)。它将帮助您掌握速度(或速度曲线)和位置。

对于操纵杆部分来说,Eric Goebelbecker的“教程”值得一读。

编辑:使用continuous_servo的解决方案(以供将来阅读)

ABS_HAT0{X,Y}在活动轴上以-1或+1通知DOWN事件。 UP为0。

axis_servo = {
    'ABS_HAT0X': 5,
    'ABS_HAT0Y': 6,
}

[...]
        axis = ecodes.bytype[absevent.event.type][absevent.event.code]
        if axis == 'ABS_HAT0X':
            servonum = axis_servo[axis]
            kit.continuous_servo[servonum].throttle = absevent.event.value
        if axis == 'ABS_HAT0Y':
            servonum = axis_servo[axis]
            # Reverse Y axis (1 -> up direction)
            kit.continuous_servo[servonum].throttle = -absevent.event.value

在没有continuous_servo的情况下,应考虑将select()超时select([gamepad], [], [], timeout))结合使用,如readthedoc: python-evdev中所述。

超时将允许角度计算。