2010年5月4日火曜日

Logitech Qcam Orbit のosx でのtilt/pan サポート

osx がUVC をsupport して無事使えていたのだけど、せっかくのtilt/pan がまったく使えなかった。

uvc のコントロールコマンドをほとんどサポートしてないということで、UVC Camera Control をつくった人がいた。

Qcam Orbit のTilt/Pan はUVC のTilt/Pan をつかってない。

UVCにはTilt/Pan が定義されているのだけど、Orbit ではこれを定義していない。
linux のdriver やlibwebcam を見るとUVC Extension Unit Control でやるらしい。
これでUVC CameraControl をいじらないとダメぽい。


#define UVC_LOGITECH_MOTOR 0x9

#define LXU_MOTOR_PANTILT_RELATIVE_CONTROL 0x01
#define LXU_MOTOR_PANTILT_RESET_CONTROL 0x02
#define LXU_MOTOR_FOCUS_MOTOR_CONTROL 0x03

とか追加して libwebcam のlogitech.xml とかを見ると

 entity:UVC_GUID_LOGITECH_MOTOR_CONTROL
 selector:XU_MOTORCONTROL_PANTILT_RELATIVE
index:0
size:4
Allows the control of pan/tilt motor movements for camera models that support mechanical pan/tilt.
Bits 0 to 15 control pan, bits 16 to 31 control tilt.
The unit of the pan/tilt values is 1/64th of a degree and the resolution is 1 degree.


とかあるので、それにあわせて


.pantiltrel = {
.unit = UVC_LOGITECH_MOTOR,
.selector = LXU_MOTOR_PANTILT_RELATIVE_CONTROL,
.size = 4,
},
.pantilt_reset = {
.unit = UVC_LOGITECH_MOTOR,
.selector = LXU_MOTOR_PANTILT_RESET_CONTROL,
.size = 1,
},


本来はunit はuint id でvender UUID のGUID で指定してそれで該当するコントローラを取得しないといけないぽいけど
とりあえずあと回し。

- (BOOL)setData2:(void *)value withLength:(int)length forSelector:(int)selector at:(int)unitId
{
IOUSBDevRequest controlRequest;
NSLog(@"unitID %d", unitId);
controlRequest.bmRequestType = USBmakebmRequestType( kUSBOut, kUSBClass, kUSBInterface );
controlRequest.bRequest = UVC_SET_CUR;
controlRequest.wValue = ( selector <<>
controlRequest.wIndex = ( unitId <<8>
controlRequest.wLength = length;
controlRequest.wLenDone = 0;
controlRequest.pData = value;
return [self sendControlRequest:controlRequest];
}


USB Control Request を送るのに4バイトまでしか対応してなさげだったので追加

こんな感じで追加した。UVCCameraControl に追加したmethod は

- (BOOL)setPanTilt:(BOOL)reset withPan:(int)pan withTilt:(int)tilt;
- (BOOL)resetTiltPan:(BOOL)enabled;
いちよ変更したものは http://github.com/kazu/UVCCameraControl においておきました。
いちよruby のscript がついてるのでそれから操作できます。

ustream とかでdirect で使うとdevice interface がlock されちゃうのでCamTwist の2.1 とかで
試すとstreaming したまま動かすのができます。

注意: pan/tilt reset がまだちょっとおかしい。reset をかけた際にそっから移動しようとしてバキバキ音がして物理的に壊れそう。

いちよUVCCameraControl についてたユーティリティもちょっとだけいじった。




zenback