Kinect驱动中,笔者最喜欢使用的就是OpenNI驱动,主要原因就是开源,提供更多的数据(有空写一个两个驱动的对比,当然网上也早有类似的对比,但还是不够全面,也过期了http://www.cnblogs.com/TravelingLight/archive/2011/06/20/2085149.html,比如:Nite的最新版本中,不需要“投降姿势”就可以立刻获得skeleton的数据)。但相比于MS kinect SDK,它还有一个重要的缺点:没有提供控制kinect马达旋转的接口。于是,笔者在控制kinect俯仰旋转时,只能不停在两家版本的sdk中切来切去,或者有时懒得切驱动,直接手动暴力旋转,甚是麻烦。
今日偶见google group的openni-dev上Nicolas Tisserand的一枚神帖:Hit me “Easy way to control Kinect motor through OpenNI”。文中他成功的使用XnUSB.h(OpenNI头文件之一)完成马达的控制,他把kinect motor封装成一个类再操作,有冗余的发送控制信息的代码,只能在kinect没有初始化打开的情况下工作,无法在摄像头已打开的情况下工作,故修改见如下函数:
1 #include <XnUSB.h> 2 bool _isOpen = false; 3 4 bool tiltToAngle(int angle) // angle: -27 to 27 5 { 6 XN_USB_DEV_HANDLE m_dev; 7 const XnUSBConnectionString *paths; 8 XnUInt32 count; 9 XnStatus res; 10 11 // _isOpen is the global camera open status of kinect. If kinect camera is open, we should not call xnUSBInit() again.12 if (_isOpen == false)13 {14 res = xnUSBInit(); 15 if (res != XN_STATUS_OK) { 16 xnPrintError(res, "xnUSBInit failed"); 17 return false; 18 }19 }20 // Get device path21 res = xnUSBEnumerateDevices(0x045E /* VendorID */, 0x02B0 /*ProductID*/, &paths, &count); 22 if (res != XN_STATUS_OK) { 23 xnPrintError(res, "xnUSBEnumerateDevices failed"); 24 return false; 25 } 26 // Open first found device 27 res = xnUSBOpenDeviceByPath(paths[0], &m_dev); 28 if (res != XN_STATUS_OK) { 29 xnPrintError(res, "xnUSBOpenDeviceByPath failed"); 30 return false; 31 } 32 // Send control command33 res = xnUSBSendControl(m_dev, XN_USB_CONTROL_TYPE_VENDOR , 0x31, angle, 0x00, NULL, 0, 0); 34 if (res != XN_STATUS_OK) { 35 xnPrintError(res, "xnUSBSendControl failed"); 36 return false; 37 } 38 xnUSBCloseDevice(m_dev); 39 40 // Shutdown usb41 if (_isOpen == false)42 {43 res = xnUSBShutdown(); 44 if (res != XN_STATUS_OK) { 45 xnPrintError(res, "xnUSBShutdown failed"); 46 return false; 47 }48 }49 50 return true; 51 }52 53 // tiltToAngle(0) : Normal state54 // tiltToAngle(27) : Up 55 // tiltToAngle(-27) : Down
2011/12/15 17:38 重要更新:
刚刚在运行程序时,手持着kinect。发现这个旋转角度与底座是否水平放置无关(当选择旋转0时,它总是能够让摄像头水平向前)。这也证实了kinect内部确实存在一个陀螺仪。
本作品采用知识共享署名-非商业性使用 2.5 中国大陆许可协议进行许可,转载需注明原作者tangyili即可。
来源:https://www.cnblogs.com/lucantang/archive/2011/12/15/2288982.html