我正在构建一个基本的DVa机械机器人(业余爱好)。这是非两足动物。轮式底盘。所有代码都用python编写。
我如何在按住按钮、按下操纵杆的同时持续执行活动?我甚至可以同时做两个(或更多):向前移动轮子,转动躯干,开枪?
我正在读取操纵杆输入的数据。伺服系统也能工作。我似乎无法理解“当按钮被按下时--做点什么--并继续扫描更多输入”的逻辑循环。
尝试了各种things...they都不起作用,所以它们不在下面的代码中。
运行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')相当于basic...when BTN_TL被按下,伺服5和6应该旋转直到按钮被释放
同样,在按下HAT0X和0Y时,伺服系统应向前/向后/向左/向右移动。
我尝试了while循环和whatnot...but在游戏杆输入中有一个逻辑/时序序列,我没有放在正确的位置
发布于 2019-05-10 06:06:23
对于伺服部分,基于Servokit documentation的伺服控制有两种方式:
kit.servo[servonum].angle = 1801:前进,-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的向下事件。最大值为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()与timeout (select([gamepad], [], [], timeout))配合使用,如readthedoc: python-evdev中所述。
超时将允许角度计算。
https://stackoverflow.com/questions/56067475
复制相似问题