openNI驱动控制kinect马达

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 path
21 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 command
33 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 usb
41 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 state
54 // tiltToAngle(27) : Up
55 // tiltToAngle(-27) : Down

2011/12/15 17:38 重要更新:

刚刚在运行程序时,手持着kinect。发现这个旋转角度与底座是否水平放置无关(当选择旋转0时,它总是能够让摄像头水平向前)。这也证实了kinect内部确实存在一个陀螺仪。

知识共享许可协议 本作品采用知识共享署名-非商业性使用 2.5 中国大陆许可协议进行许可,转载需注明原作者tangyili即可

原文地址:https://www.cnblogs.com/lucantang/p/2288982.html