我使用BCF2000 Behringer fader作为输入来控制使用ROS的机器人。一切都很好,但突然间它停止了工作。突然之后,我的意思是在我休息了一周之后。我需要知道它是硬件还是软件问题(也许有人在我离开时放弃它?我不这么认为,但我找不到错误)。我只运行一个python模块,它从推子读取数据并在ROS中发布它以找到问题,这就是我无法使推子的滑块移动。
基本上,python模块从参数列表中读取两个整数。如果给出第三个,则推子的所有值都应该为0(滑块和按钮)。第一个整数是输入设备ID,第二个是输出设备ID。这是:
if len(sys.argv) > 1:
input_dev = int(sys.argv[1])
else:
input_dev = pygame.midi.get_default_input_id()
print "Using DEFAULT input device %d" % input_dev
if input_dev == -1:
print "No default MIDI input device"
exit(-1)
print "Using input device %d" % input_dev
if len(sys.argv) > 2:
output_dev = int(sys.argv[2])
else:
output_dev = pygame.midi.get_default_output_id()
print "Using DEFAULT output device %d" % input_dev
if output_dev == -1:
print "No default MIDI output device"
exit(-1)
print "Using output device %d" % output_dev
controller = pygame.midi.Input(input_dev)
controller_input = pygame.midi.Output(output_dev)
问题是我不知道如何找到正确的输入设备号。在过去的一个月里,我用'3'和'2'来称呼它,意思是:
me@mycpu:ros$ rosrun bcf2000 bcf2000_driver.py 3 2
如果我对发布的数据进行回声,我会在移动任何滑块或按下按钮时发布所有数据。例如:
me@mycpu:ros$ rostopic echo /bcf2000/joy
header:
seq: 1
stamp:
secs: 1441969279
nsecs: 677656888
frame_id: ''
axes: [21.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 69.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
buttons: [127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
但如果我写入推子,滑块将不会移动。再次,这段代码几天前就开始工作了。根据GIT存储库日志,我100%确定是相同的代码。例如,将所有内容都放到0:
for i in range(1,93):
controller_input.write([[[176, i, 0, 0], 0]])
推子有93个频道。
可能是我使用了错误的输出设备编号。我已经改变了0到10之间的数字而没有。如何找出正确的设备编号?我如何调试实际上是一个软件问题(可能是操作系统问题,我不知道)或硬件问题?最后一个是不太可能的,因为它将是一个非常有选择性的硬件问题。但我可能是错的。
更新:这只发生在我的电脑上,所以这不是硬件问题。
更新2:这是aseqdump -l </ p>的输出
me@mycpu:ros$ aseqdump -l
Port Client name Port name
0:0 System Timer
0:1 System Announce
14:0 Midi Through Midi Through Port-0
24:0 BCF2000 BCF2000 MIDI 1
24:1 BCF2000 BCF2000 MIDI 2
我可以使用aseqdump -p 24:0来听取输入。
使用get_device_info列出所有设备的信息:
('ALSA', 'Midi Through Port-0', 0, 1, 0)
('ALSA', 'Midi Through Port-0', 1, 0, 0)
('ALSA', 'BCF2000 MIDI 1', 0, 1, 0)
('ALSA', 'BCF2000 MIDI 1', 1, 0, 0)
('ALSA', 'BCF2000 MIDI 2', 0, 1, 0)
('ALSA', 'BCF2000 MIDI 2', 1, 0, 0)
('ALSA', 'BCF2000 MIDI 3', 0, 1, 0)
('ALSA', 'aseqdump', 0, 1, 0)
对于设备2,4和6,我无法写入设备。我正在尝试使用以下方法写入每个输出设备:
#!/usr/bin/env python
import pygame
import pygame.midi
import sys
import time
def main():
pygame.midi.init()
devices = pygame.midi.get_count()
if devices < 1:
print "No MIDI devices detected"
exit(-1)
print "Found %d MIDI devices" % devices
print("id -- interface -- name -- input -- ouput -- opened")
for ii in range(devices):
ll = pygame.midi.get_device_info(ii)
bool1 = bool(ll[2])
bool2 = bool(ll[3])
bool3 = bool(ll[4])
print(str(ii) + " -- " + str(ll[0]) + " -- " + str(ll[1]) + " -- " + str(bool1) + " -- " + str(bool2) + " -- " + str(bool3))
if (bool2):
value = 0
if ii%2 == 0:
value = 127
controller = pygame.midi.Output(ii)
controller.write([[[176, 48, 0, 0], value]])
time.sleep(2)
应打印每个设备的设备信息,如果是输出设备,则应移动第一个滑块。它不会移动任何设备。