首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用操纵杆输入来做事情(驱动伺服系统,打开led)

使用操纵杆输入来做事情(驱动伺服系统,打开led)
EN

Stack Overflow用户
提问于 2019-05-10 04:58:18
回答 1查看 171关注 0票数 0

我正在构建一个基本的DVa机械机器人(业余爱好)。这是非两足动物。轮式底盘。所有代码都用python编写。

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

我正在读取操纵杆输入的数据。伺服系统也能工作。我似乎无法理解“当按钮被按下时--做点什么--并继续扫描更多输入”的逻辑循环。

尝试了各种things...they都不起作用,所以它们不在下面的代码中。

运行6个连续伺服系统(4个用于底盘,2个用于微机枪)罗技F710操纵杆

代码语言:javascript
复制
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')

相当于basic...when BTN_TL被按下,伺服5和6应该旋转直到按钮被释放

同样,在按下HAT0X和0Y时,伺服系统应向前/向后/向左/向右移动。

我尝试了while循环和whatnot...but在游戏杆输入中有一个逻辑/时序序列,我没有放在正确的位置

EN

回答 1

Stack Overflow用户

发布于 2019-05-10 06:06:23

对于伺服部分,基于Servokit documentation的伺服控制有两种方式:

  1. 设置所需的轴角度:

代码语言:javascript
复制
    kit.servo[servonum].angle = 180

  1. 表示旋转方向(1:前进,-1:后退,0:停止),如:

代码语言:javascript
复制
    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的向下事件。最大值为0。

代码语言:javascript
复制
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()timeout (select([gamepad], [], [], timeout))配合使用,如readthedoc: python-evdev中所述。

超时将允许角度计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56067475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档