zoukankan      html  css  js  c++  java
  • 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即可

  • 相关阅读:
    编程ING:人人都能学会程序设计
    以拯救之因
    使用交互环境
    使用交互环境 连载3
    深入理解Oracle Exadata
    字符编码
    多语境的操作
    挖掘用户需求
    神一样的产品经理——基于移动与互联网产品实践
    产品各类型之间的关系
  • 原文地址:https://www.cnblogs.com/lucantang/p/2288982.html
Copyright © 2011-2022 走看看