我正在构建一个基本的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循环和其他操作...但是操纵杆输入中存在逻辑/时序序列,我没有把它放在正确的位置
答案 0 :(得分:0)
对于伺服部分,基于Servokit documentation,有两种方法来控制伺服器:
kit.servo[servonum].angle = 180
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中所述。
超时将允许角度计算。