Partilhar via


Recuperar exemplos de IMU do Azure Kinect

O dispositivo Kinect do Azure fornece acesso a IMUs (Inertial Motion Units), incluindo os tipos de acelerômetro e giroscópio. Para acessar amostras de IMUs, você deve primeiro abrir e configurar seu dispositivo e, em seguida, capturar dados de IMU. Para obter mais informações, consulte localizar e abrir dispositivo.

As amostras IMU são geradas com uma frequência muito maior do que as imagens. As amostras são relatadas ao anfitrião a uma taxa menor do que as amostradas. Ao aguardar uma amostra de IMU, várias amostras serão frequentemente disponibilizadas ao mesmo tempo.

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

Configurar e iniciar câmaras

Nota

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

Para iniciar as câmeras, use 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;
}

Aceder a amostras IMU

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

Você pode obter as amostras de IMU no mesmo thread que obtém capturas de imagem ou em threads separados.

Para recuperar amostras de IMU assim que estiverem disponíveis, convém usar k4a_device_get_imu_sample() seu próprio thread. A API também tem enfileiramento interno suficiente para permitir que você verifique apenas amostras depois que cada captura de imagem for retornada.

Como há algumas filas internas de amostras de IMU, você pode usar o seguinte padrão sem descartar nenhum dado:

  1. Aguarde uma captura, em qualquer taxa de quadros.
  2. Processe a captura.
  3. Recupere todas as amostras de IMU enfileiradas.
  4. Repita a espera na próxima captura.

Para recuperar todos os exemplos de IMU atualmente enfileirados, você pode chamar k4a_device_get_imu_sample() com um timeout_in_ms de 0 em um loop até que a função retorne K4A_WAIT_RESULT_TIMEOUT. K4A_WAIT_RESULT_TIMEOUT indica que não há amostras enfileiradas e 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);
}

Próximos passos

Agora que já sabe como trabalhar com amostras IMU, também pode