PyUSB, пиши на устройство без отсоединения ядра - PullRequest
0 голосов
/ 28 сентября 2018

У меня очень дешевая китайская стереокамера CHUSEI 3D.Я хотел бы использовать его с ROS для получения стереоизображения для учебного пособия по роботизированной руке, которое я сейчас делаю.

К сожалению, нет реальной документации для веб-камеры.В режиме по умолчанию, если он подключен к моей машине с Ubuntu и я открываю Cheese Webcam Booth, он показывает изображение только с одной камеры.В интернете я нашел решение, использующее pyusb, которое работает для MacOs.Я пробовал это на моем Ubuntu 16.04, но выдает ошибку Ошибка 16. Ресурс занят.

Я добавил dev.detach_kernel_driver(0) строку к коду и ctrl_transfer сработало ... Но этокак я не могу получить доступ к веб-камере впоследствии.Итак, мой вопрос, используя Python и Ubuntu 16.04, есть ли способ отправить эти команды на веб-камеру БЕЗ отсоединения драйвера ядра, чтобы у меня все еще был доступ к веб-камере?

import cv2
import usb.core
import usb.util
import usb.backend.libusb1

cam=cv2.VideoCapture(0) 

backend = usb.backend.libusb1.get_backend(find_library=lambda x: "/usr/lib/libusb-1.0.so")   
dev = usb.core.find(idVendor=0x18e3, idProduct=0x5031,backend=backend)
dev.detach_kernel_driver(0)
# simulate the SET_CUR sequence
dev.ctrl_transfer(0x21,0x01,0x0800,0x0600,[0x50,0xff])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0xf6])
dev.ctrl_transfer(0x21,0x01,0x0800,0x0600,[0x25,0x00])
dev.ctrl_transfer(0x21,0x01,0x0800,0x0600,[0x5f,0xfe])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0x03])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0x02])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0x12])
dev.ctrl_transfer(0x21,0x01,0x0f00,0x0600,[0x00,0x04])
dev.ctrl_transfer(0x21,0x01,0x0800,0x0600,[0x76,0xc3])
k=0
print('ok')
while (k!=ord('q')):
 ret,frame=cam.read()
 frame = cv2.resize(frame,(640,480),interpolation=cv2.INTER_CUBIC)
 cv2.imshow("cam_test",frame)

 k=cv2.waitKey(18)&0xFF
 kv=k-ord('0')
 # print(kv)
 # if press 1,2,3 or 4, change the 3d camera mode
 if kv in [1,2,3,4]:
  dev.ctrl_transfer(0x21,0x01,0x0a00,0x0600,[kv,0x00])

Сообщение об ошибке

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    dev.ctrl_transfer(0x21,0x01,0x0800,0x0600,[0x50,0xff])
  File "/home/ubuntu/.local/lib/python2.7/site-packages/usb/core.py", line 1034, in ctrl_transfer
    self._ctx.managed_claim_interface(self, interface_number)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/usb/core.py", line 102, in wrapper
    return f(self, *args, **kwargs)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/usb/core.py", line 167, in managed_claim_interface
    self.backend.claim_interface(self.handle, i)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/usb/backend/libusb1.py", line 811, in claim_interface
    _check(self.lib.libusb_claim_interface(dev_handle.handle, intf))
  File "/home/ubuntu/.local/lib/python2.7/site-packages/usb/backend/libusb1.py", line 595, in _check
    raise USBError(_strerror(ret), ret, _libusb_errno[ret])
usb.core.USBError: [Errno 16] Resource busy
...