2012-01-24 4 views
2

OpenNI에서 내 kinect 장치의 일련 번호를 얻으려면 어떻게해야합니까? avin2의 SensorKinect 드라이버 을 사용하고 있습니다.OpenNI를 사용하여 Kinect 일련 번호를 얻으려면 어떻게해야합니까?

나는 다음과 같은 노력하고있어,하지만 난 단지 내 변수 serial에 "0"을 얻을 :

xn::NodeInfoList possibleChains; 
context.EnumerateProductionTrees(XN_NODE_TYPE_DEVICE,NULL,possibleChains,NULL); 
for(xn::NodeInfoList::Iterator i = possibleChains.Begin(); i != 
possibleChains.End(); ++i) 
    { 
     xn::NodeInfo node = *i; 
     nRetVal = context.CreateProductionTree(node); 
     xn::Device device; 
     nRetVal = node.GetInstance(device); 
     XnChar serial[1024]; 
     device.GetIdentificationCap().GetSerialNumber(serial, 1024); 
    } 

답변

3

을 나는 그 아직 OpenNI 불가능하다고 생각 (적어도 넥트를 위해 - 아마 avin2 드라이버입니다 비난).

045e/[email protected]/13 (idVendor/[email protected]/DeviceId) 

:

그러나, 당신은이 (A 장치의 nodeType) 다음과 같은 포함되는 USB 버스/포트가 키 넥트가 리눅스에 xn::NodeInfo::GetCreationInfo (link)

를 사용하여 연결된에 대한 정보를 얻을 수 있습니다 C++ 대신 OpenNI java wrapper를 사용하므로 정확한 코드를 표시 할 수 없지만 Mac/Linux/Win에서 내 응용 프로그램에서 Kinects를 구별하기 위해이 메서드가 작동합니다.

문제는 kinect를 다른 USB에 연결할 때 버스 정보와 포트 정보가 변경된다는 것입니다 (그리고 리눅스에서는 때때로 재시작 사이에도 변경됩니다). 당신이 리눅스에 있다면

, 당신은 (루트로) 사용할 수 있습니다

# lsusb -v -d 045e:02ae | grep -e "Bus\|iSerial" 
# Bus 005 Device 008: ID 045e:02ae Microsoft Corp. Xbox NUI Camera 
# iSerial     3 A00365A00972107A 
# Bus 005 Device 013: ID 045e:02ae Microsoft Corp. Xbox NUI Camera 
# iSerial     3 A00365A00955107A 

는 키 넥트의 실제 일련 번호를 얻을 수 있습니다.

그러므로 OpenNI 애플리케이션이 시작되기 전에 실행될 bash 스크립트를 만들어서 버스/포트를 찾아 애플리케이션에 전달하면 (이 정보를 사용하여 올바른 Kinect와 통신 할 수 있음)). 제공 OpenNI2

1

wantedSerialNumber 문자열로 일련 번호를 원

openni::Device device = new openni::Device(); 
openni::Array<openni::DeviceInfo> deviceList; 
openni::OpenNI::enumerateDevices(&deviceList); 
for (int i = 0; i != deviceList.getSize(); ++i) { 
    const openni::DeviceInfo& info = deviceList[i]; 
    string uri = info.getUri(); 
    device->open(uri.c_str()); 
    char serialNumber[1024]; 
    device->getProperty(ONI_DEVICE_PROPERTY_SERIAL_NUMBER, &serialNumber); 
    if (string(serialNumber) != wantedSerialNumber) { 
     device->close(); 
    } else { 
     break; 
    } 
} 
관련 문제