Obter exemplos de IMU do Azure Kinect

O dispositivo Azure Kinect fornece acesso a Unidades de Movimento Inerciais (IMUs), incluindo os tipos de acelerómetro e giroscópio. Para aceder a exemplos de IMUs, primeiro tem de abrir e configurar o seu dispositivo e, em seguida, capturar dados de IMU. Para obter mais informações, consulte Localizar e abrir o dispositivo.

Os exemplos de IMU são gerados com uma frequência muito maior do que as imagens. Os exemplos são comunicados ao anfitrião a uma taxa mais baixa do que os exemplos. Ao aguardar um exemplo de IMU, vários exemplos ficam frequentemente disponíveis ao mesmo tempo.

Veja a especificação de hardware do Azure Kinect DK para obter detalhes sobre a taxa de relatórios da IMU.

Configurar e iniciar câmaras

Nota

Os sensores de IMU só podem funcionar quando a cor e/ou as câmaras de profundidade estão em execução. Os sensores de IMU não podem funcionar sozinhos.

Para iniciar as câmaras, utilize k4a_device_start_cameras().

k4a_device_configuration_t config = K4A_DEVICE_CONFIG_INIT_DISABLE_ALL;
config.camera_fps = K4A_FRAMES_PER_SECOND_30;
config.color_format = K4A_IMAGE_FORMAT_COLOR_MJPG;
config.color_resolution = K4A_COLOR_RESOLUTION_2160P;

if (K4A_RESULT_SUCCEEDED != k4a_device_start_cameras(device, &config))
{
    printf("Failed to start cameras\n");
    goto Exit;
}

if (K4A_RESULT_SUCCEEDED != k4a_device_start_imu(device))
{
    printf("Failed to start imu\n");
    goto Exit;
}

Exemplos de IMU do Access

Cada k4a_imu_sample_t contém um acelerómetro e uma leitura de giroscópio capturadas quase ao mesmo tempo.

Pode obter os exemplos de IMU no mesmo thread que obtém capturas de imagem ou em threads separados.

Para obter exemplos de IMU assim que estiverem disponíveis, poderá querer chamar k4a_device_get_imu_sample() o seu próprio thread. A API também tem colocação em fila interna suficiente para permitir que verifique apenas a existência de amostras após a devolução de cada captura de imagem.

Uma vez que existem algumas filas internas de amostras de IMU, pode utilizar o seguinte padrão sem remover quaisquer dados:

  1. Aguarde numa captura, a qualquer taxa de fotogramas.
  2. Processe a captura.
  3. Obtenha todos os exemplos de IMU em fila.
  4. Repita a espera na captura seguinte.

Para obter todos os exemplos de IMU atualmente em fila, pode chamar k4a_device_get_imu_sample() com um timeout_in_ms de 0 num ciclo até que a função devolva K4A_WAIT_RESULT_TIMEOUT. K4A_WAIT_RESULT_TIMEOUT indica que não existem amostras em fila e que nenhuma chegou no tempo limite especificado.

Exemplo de utilização

k4a_imu_sample_t imu_sample;

// Capture a imu sample
switch (k4a_device_get_imu_sample(device, &imu_sample, TIMEOUT_IN_MS))
{
case K4A_WAIT_RESULT_SUCCEEDED:
    break;
case K4A_WAIT_RESULT_TIMEOUT:
    printf("Timed out waiting for a imu sample\n");
    continue;
    break;
case K4A_WAIT_RESULT_FAILED:
    printf("Failed to read a imu sample\n");
    goto Exit;
}

// Access the accelerometer readings
if (imu_sample != NULL)
{
    printf(" | Accelerometer temperature:%.2f x:%.4f y:%.4f z: %.4f\n",
            imu_sample.temperature,
            imu_sample.acc_sample.xyz.x,
            imu_sample.acc_sample.xyz.y,
            imu_sample.acc_sample.xyz.z);
}

Passos seguintes

Agora que sabe como trabalhar com exemplos de IMU, também pode