openNI驱动控制kinect马达

与世无争的帅哥 提交于 2020-01-12 08:06:08

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即可

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!