Sensores
Nesta secção, vamos aprender como ler os dados dos sensores do drone em tempo real. Esses dados são fundamentais para tarefas como estabilização, controle, navegação e autonomia.
Vamos criar um programa que lê e imprime no console os seguintes sensores:
- Acelerômetro (\(a_x\), \(a_y\) e \(a_z\))
- Giroscópio (\(g_x\), \(g_y\) e \(g_z\))
- Proximidade (\(d\))
- Fluxo óptico (\(p_x\) e \(p_y\))
Visão geral
Antes de começar, é importante entender alguns conceitos:
- Os sensores no Crazyflie são processados por um sistema de estimação que envia os dados via uma fila interna. Usamos a função
estimatorDequeue(&m), para preencher a estruturameasurement_t m, que contém diferentes tipos de leitura, identificados porm.type. - O sistema coleta dados continuamente em alta frequência, que vêm da IMU (acelerômetro e giroscópio), do lidar (proximidade) e da câmera (fluxo óptico).
- Usamos
DEBUG_PRINT()para exibir os valores no console serial.
Código
Crie um arquivo chamado sensors.c dentro da pasta src/examples com o seguinte código:
#include "FreeRTOS.h" // FreeRTOS core definitions (needed for task handling and timing)
#include "task.h" // FreeRTOS task functions (e.g., vTaskDelay)
#include "supervisor.h" // Functions to check flight status (e.g., supervisorIsArmed)
#include "debug.h" // Debug printing functions (e.g., DEBUG_PRINT)
#include "estimator.h" // Estimator functions (e.g., estimatorDequeue)
// Sensors data
float ax, ay, az; // Accelerometer [m/s^2]
float gx, gy, gz; // Gyroscope [rad/s]
float d; // Range [m]
float px, py; // Optical flow [pixels]
// Main application loop
void appMain(void *param)
{
// Infinite loop (runs continuously while the drone is powered on)
while (true)
{
// Get sensor data from queue
measurement_t m;
while (estimatorDequeue(&m))
{
switch (m.type)
{
case MeasurementTypeGyroscope:
gx = m.data.gyroscope.gyro.x;
gy = m.data.gyroscope.gyro.y;
gz = m.data.gyroscope.gyro.z;
break;
case MeasurementTypeAcceleration:
ax = m.data.acceleration.acc.x;
ay = m.data.acceleration.acc.y;
az = m.data.acceleration.acc.z;
break;
case MeasurementTypeTOF:
d = m.data.tof.distance;
break;
case MeasurementTypeFlow:
px = m.data.flow.dpixelx;
py = m.data.flow.dpixely;
break;
default:
break;
}
}
// Print sensor data to console
DEBUG_PRINT("Acc: %4.2f %4.2f %4.2f | Gyr: %6.2f %6.2f %6.2f | Dis: %4.2f | Flow: %2.0f %2.0f\n",(double)ax,(double)ay,(double)az,(double)gx,(double)gy,(double)gz,(double)d,(double)px,(double)py);
// Wait for 100 milliseconds before checking again (10 Hz loop)
vTaskDelay(pdMS_TO_TICKS(100));
}
}
Você pode simplesmente copiar e colar o código acima. Mas é importante que você leia e entenda o que cada linha está fazendo (o código está bem comentado).
Compilando
Para que o firmware compile seu novo programa, modifique o arquivo Kbuild:
obj-y += src/examples/sensors.o
Em seguida, compile e programe o quadricoptero.
Testando
Para testar o funcionamento, siga as etapas abaixo:
- Abra o Crazyflie Client e conecte-se ao drone.
- Clique em
View>Toolboxes>Console - Verifique se os dados dos sensores estão sendo impressos
Atenção
Movimente o drone com a mão e observe a variação dos sensores em tempo real.
Agora você sabe como acessar dados brutos dos sensores do drone. Esses dados são a base para algoritmos de controle, filtros e navegação. A partir daqui, você terá todo o poder necessário para construir sistemas embarcados inteligentes — do jeito que quiser!