【问题标题】:Doing things (driving servos, turning on led) using joystick input使用操纵杆输入做事(驱动伺服系统,打开 LED)
【发布时间】:2019-05-09 20:58:18
【问题描述】:

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

如何在按住按钮、推动操纵杆的同时连续执行活动?我什至可以同时做两个(或更多):向前移动轮子、转动躯干、开枪?

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

尝试了各种方法......它们没有工作,所以它们不在下面的代码中。

运行 6 个连续伺服系统(4 个用于底盘,2 个用于迷你枪) 罗技 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 循环和诸如此类的...但是在操纵杆输入中有一个逻辑/时序序列我没有放在正确的位置

【问题讨论】:

    标签: python robotics joystick evdev


    【解决方案1】:

    servo部分,基于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 中所述。

    超时将允许角度计算。

    【讨论】:

    • 谢谢!我在 Eric 的教程中遇到的问题是他使用 EV_SYN 事件来启动活动。据我了解,EV_SYN 在您释放按钮时发生。然后他的代码计算按钮被按住的时间,然后执行移动。我正在寻找立即按下按钮移动伺服并继续移动它直到我放手....但我可能误解了他的代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    相关资源
    最近更新 更多