Cinemática
Contexto MeltyBrain
En un robot de combate tipo MeltyBrain, el robot gira sobre su eje vertical (Z) a alta velocidad. El sensor, situado a una distancia \(r\) del centro de rotación, mide la aceleración centrípeta en el plano XY. A partir de esta aceleración se estiman la velocidad angular \(\omega\), las RPM, y el ángulo de rotación acumulado.
El eje Z mide la componente vertical (gravedad ± vibraciones), que no se utiliza en los cálculos cinemáticos.
Parámetros físicos
Definidos en h3lis.h:37-39:
| Parámetro | Símbolo | Valor | Descripción |
|---|---|---|---|
MPU_SENSOR_OFFSET_M |
\(r\) | 0.010 m (10 mm) |
Distancia del sensor al eje de rotación |
MPU_G_MS2 |
\(g\) | 9.80665 m/s² |
Aceleración de la gravedad estándar |
MPU_A_MIN_MS2 |
\(a_{min}\) | 0.5 m/s² |
Umbral mínimo de \(a_c\) para cálculos |
⚠️ Importante:
MPU_SENSOR_OFFSET_Mdebe ajustarse a la distancia real entre el sensor y el centro del robot. El valor por defecto (10 mm) es un placeholder.
Ecuaciones
1. Aceleración centrípeta
La aceleración centrípeta se calcula como la magnitud del vector de aceleración en el plano XY:
Implementación en h3lis.c:115-116:
float a_xy_g = sqrtf(h3lis_data.ax * h3lis_data.ax + h3lis_data.ay * h3lis_data.ay);
float a_xy_ms2 = a_xy_g * MPU_G_MS2;
2. Velocidad angular
De la relación cinemática \(a_c = \omega^2 r\):
donde \(a_c\) está en m/s² y \(r\) en metros.
El cálculo solo se ejecuta si la aceleración centrípeta supera el umbral mínimo, evitando divisiones por ruido en reposo:
if (a_xy_ms2 < MPU_A_MIN_MS2) {
h3lis_data.omega_rad_s = 0.0f;
h3lis_data.rpm = 0.0f;
} else {
h3lis_data.omega_rad_s = sqrtf(a_xy_ms2 / MPU_SENSOR_OFFSET_M);
h3lis_data.rpm = h3lis_data.omega_rad_s * (60.0f / (2.0f * PI));
}
3. RPM
4. Integración de ángulo
El ángulo de rotación se integra numéricamente con el método de Euler, usando un paso fijo igual al período del SysTick:
donde \(\Delta t = 1\,\text{ms}\) (constante H3LIS_DT_S = 0.001f en h3lis.c:7).
h3lis_data.angle_rad += h3lis_data.omega_rad_s * H3LIS_DT_S;
5. Normalización del ángulo
Tras cada integración, el ángulo se normaliza al rango \([0, 2\pi)\):
while (h3lis_data.angle_rad >= 2.0f * PI) {
h3lis_data.angle_rad -= 2.0f * PI;
}
while (h3lis_data.angle_rad < 0.0f) {
h3lis_data.angle_rad += 2.0f * PI;
}
6. Conversión a grados
El ángulo en grados se obtiene directamente desde radianes:
h3lis_data.angle_deg = h3lis_data.angle_rad * (180.0f / PI);
API de consulta
Los getters definidos en h3lis.h:45-50 devuelven los valores calculados en la última llamada a h3lis_update():
| Función | Retorno | Unidad |
|---|---|---|
h3lis_get_ax() |
Aceleración eje X | g |
h3lis_get_ay() |
Aceleración eje Y | g |
h3lis_get_az() |
Aceleración eje Z | g |
h3lis_get_a_centripetal() |
Magnitud \(a_c\) | g |
h3lis_get_rpm() |
Velocidad de rotación | RPM |
h3lis_get_angle_deg() |
Ángulo integrado | ° (0–360) |
Frecuencia de actualización
| Parámetro | Valor |
|---|---|
| Frecuencia de muestreo | 1000 Hz (ODR del sensor) |
| Frecuencia de actualización | 1000 Hz (ISR SysTick) |
| Paso de integración Δt | 1 ms |
| Frecuencia de salida | ~5 Hz (bucle principal) |
Limitaciones
⚠️ Sin giróscopo: el ángulo se estima por integración numérica de \(\omega\) derivada de la aceleración centrípeta. Esta técnica tiene limitaciones: - Deriva: pequeños errores en \(\omega\) se acumulan sin límite. Una sesión de 60 s a 1000 RPM con 1% de error acumula ~600 revoluciones de deriva angular. - Reposo: cuando el robot no gira, \(a_c \approx 0\), \(\omega = 0\), y el ángulo no se actualiza. No hay forma de detectar rotación pasiva sin giróscopo. - Vibraciones: impactos y vibraciones del combate introducen ruido de alta frecuencia en \(a_c\) que se propaga a \(\omega\) y al ángulo.
Para aplicaciones de producción se recomienda complementar con un giróscopo (sensor fusion) o con marcas de referencia externas (IR, hall effect).
Ejemplo numérico
Para un robot MeltyBrain con el sensor a 10 mm del centro girando a 1000 RPM:
| Variable | Cálculo | Valor |
|---|---|---|
| \(\omega\) | \(1000 \cdot 2\pi / 60\) | 104.7 rad/s |
| \(a_c\) (SI) | \(\omega^2 \cdot r\) | 109.7 m/s² |
| \(a_c\) (g) | \(109.7 / 9.80665\) | 11.2 g |
| \(\Delta\theta\) por tick | \(\omega \cdot 0.001\) | 0.1047 rad (6.0°) |
Documento generado el 2026-06-27. Ver también Sensores, Arquitectura Software.