В этой записи я расскажу немного об опыте работы с Optitrack SDK и подключении устройства TrackIR.

Особенности TrackIR с Optitrack SDK

Данным девайсом можно управлять из Optitrack SDK, однако есть некоторые особенности:

— вектор возвращает определяемое положение 6DOF для устройства или используемого TrackClip. Причем возможно получение только одного вектора за кадр.

— каждый кадр при работе с TrackIR не имеет индектификатора, точнее id всегда равен 0, в отличие от Optitrack камер.

— TrackIR имеет фиксированный фпс и при его смене вовсе возвращается значение -1 без ошибки выполнения функции. Так что лучше так даже и не делать.

Лаг передачи данных

При работе с Optitrack SDK в передаче данных присутствовал лаг, отставание данных от производимых действий. Причиной этого стало использование сглаживания вектора, хотя подобная операция и была добавлена по документации к Optitrack SDK. Но все же информацию всегда можно профильтровать, а иногда нужно получить их с как можно большей точностью.

Само же сглаживание выполняется через интерфейс INPSmoothing

CComPtr<INPSmoothing> m_spSmoothingDot;

CComPtr<INPSmoothing> m_spSmoothingYaw;

CComPtr<INPSmoothing> m_spSmoothingPitch;

CComPtr<INPSmoothing> m_spSmoothingRoll;

CComPtr<INPSmoothing> m_spSmoothingX;

CComPtr<INPSmoothing> m_spSmoothingY;

CComPtr<INPSmoothing> m_spSmoothingZ;

и сам код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// now smooth the values
m_spSmoothingYaw->Update(varYaw, varEmpty);
m_spSmoothingPitch->Update(varPitch, varEmpty);
m_spSmoothingRoll->Update(varRoll, varEmpty);
m_spSmoothingX->Update(varX, varEmpty);
m_spSmoothingY->Update(varY, varEmpty);
m_spSmoothingZ->Update(varZ, varEmpty);
// get the smoothed data
m_spSmoothingYaw->get_X(&varYaw);
m_spSmoothingPitch->get_X(&varPitch);
m_spSmoothingRoll->get_X(&varRoll);
m_spSmoothingX->get_X(&varX);
m_spSmoothingY->get_X(&varY);
m_spSmoothingZ->get_X(&varZ);
// now smooth the values        m_spSmoothingYaw->Update(varYaw, varEmpty);     m_spSmoothingPitch->Update(varPitch, varEmpty);     m_spSmoothingRoll->Update(varRoll, varEmpty);       m_spSmoothingX->Update(varX, varEmpty);     m_spSmoothingY->Update(varY, varEmpty);     m_spSmoothingZ->Update(varZ, varEmpty);
// get the smoothed data        m_spSmoothingYaw->get_X(&varYaw);       m_spSmoothingPitch->get_X(&varPitch);       m_spSmoothingRoll->get_X(&varRoll);     m_spSmoothingX->get_X(&varX);       m_spSmoothingY->get_X(&varY);       m_spSmoothingZ->get_X(&varZ);

Постоянная передача данных

По умолчанию так настроено, что при отсутствии данных в области видимости камеры, кадр не обрабатывается. Это не всегда может быть удобно, на это нужно рассчитывать скажем так. Переключение данного режима в постоянную работу даже при отсутсвии данных выполняется следующим методом:

1
2
3
4
5
CComVariant var = (bool) true;

// don't skip empty frames

m_spCamera->SetOption( NP_OPTION_SEND_EMPTY_FRAMES, var );
Немного об Optitrack SDK и TrackIR
Метки:                

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *