Saltar a contenido
← Volver a OPRobots.org

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_M debe 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:

\[a_c = \sqrt{a_x^2 + a_y^2} \quad [g]\]

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\):

\[\omega = \sqrt{\frac{a_c}{r}} \quad [\text{rad/s}]\]

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

\[\text{RPM} = \omega \cdot \frac{60}{2\pi}\]

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:

\[\theta_n = \theta_{n-1} + \omega \cdot \Delta t\]

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:

\[\theta_{°} = \theta \cdot \frac{180}{\pi}\]
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.