0

我正在构建一个基本的 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循环等等......但是在操纵杆输入中有一个逻辑/时序序列我没有放在正确的位置

4

1 回答 1

0

对于舵机部分,根据Servokit 文档,有两种控制舵机的方法:

  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 事件。和 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()with timeout ( select([gamepad], [], [], timeout)),如readthedoc: python-evdev中所述。

超时将允许角度计算。

于 2019-05-09T22:06:22.603 回答