Acelerómetros-Software

Nota

Esta sección cubre los acelerómetros en el software. Para obtener una guía de hardware para acelerómetros, consulte Acelerómetros - Hardware.

Un acelerómetro es un dispositivo que mide la aceleración.

Los acelerómetros generalmente vienen en dos tipos: eje único y eje 3. Un acelerómetro de un solo eje mide la aceleración a lo largo de una dimensión espacial; un acelerómetro de 3 ejes mide aceleración a lo largo de las tres dimensiones espaciales a la vez.

WPILib admite acelerómetros de eje único a través de la clase AnalogAccelerometer.

Los acelerómetros de tres ejes a menudo requieren protocolos de comunicación más complicados (como SPI o I2C) para enviar datos multidimensionales. WPILib tiene soporte nativo para los siguientes acelerómetros de 3 ejes:

AnalogAccelerometer

The AnalogAccelerometer class (Java, C++) allows users to read values from a single-axis accelerometer that is connected to one of the roboRIO’s analog inputs.

// Creates an analog accelerometer on analog input 0
AnalogAccelerometer accelerometer = new AnalogAccelerometer(0);

// Sets the sensitivity of the accelerometer to 1 volt per G
accelerometer.setSensitivity(1);

// Sets the zero voltage of the accelerometer to 3 volts
accelerometer.setZero(3);

// Gets the current acceleration
double accel = accelerometer.getAcceleration();

Si los usuarios cuentan cuentan con un acelerómetro de 3 ejes, se pueden usar tres instancias de esta clase, una para cada eje.

Interfaz del acelerómetro

All 3-axis accelerometers in WPILib implement the Accelerometer interface (Java, C++). This interface defines functionality and settings common to all supported 3-axis accelerometers.

La interfaz Accelerometer contiene captadores para la aceleración a lo largo de cada dirección cardinal (x, y, y z), así como un setter para el rango de aceleraciones que medirá el acelerómetro.

Advertencia

No todos los acelerómetros son capaces de medir todos los rangos.

// Sets the accelerometer to measure between -8 and 8 G's
accelerometer.setRange(Accelerometer.Range.k8G);

ADXL345_I2C

The ADXL345_I2C class (Java, C++) provides support for the ADXL345 accelerometer over the I2C communications bus.

// Creates an ADXL345 accelerometer object on the MXP I2C port
// with a measurement range from -8 to 8 G's
Accelerometer accelerometer = new ADXL345_I2C(I2C.Port.kMXP, Accelerometer.Range.k8G);

ADXL345_SPI

The ADXL345_SPI class (Java, C++) provides support for the ADXL345 accelerometer over the SPI communications bus.

// Creates an ADXL345 accelerometer object on the MXP SPI port
// with a measurement range from -8 to 8 G's
Accelerometer accelerometer = new ADXL345_SPI(SPI.Port.kMXP, Accelerometer.Range.k8G);

ADXL362

The ADXL362 class (Java, C++) provides support for the ADXL362 accelerometer over the SPI communications bus.

// Creates an ADXL362 accelerometer object on the MXP SPI port
// with a measurement range from -8 to 8 G's
Accelerometer accelerometer = new ADXL362(SPI.Port.kMXP, Accelerometer.Range.k8G);

BuiltInAccelerometer

The BuiltInAccelerometer class (Java, C++) provides access to the roboRIO’s own built-in accelerometer:

// Creates an object for the built-in accelerometer
// Range defaults to +- 8 G's
Accelerometer accelerometer = new BuiltInAccelerometer();

Acelerómetros de terceros

Así como WPILib provee soporte nativo para un numero de acelerómetros disponibles en el kit of parts o por medio de FIRST Choice, hay también dispositivos menos populares AHRS (Attitude and Heading Reference System) los cuales son comúnmente usados en FRC e incluyen acelerómetros. Estos son controlados generalmente mediante un vendor de libraries, aunque si tienen una entrada análoga sencilla, se pueden usar con la clase AnalogAccelerometer.

Usar acelerómetros en código

Nota

Los acelerómetros, como su nombre lo dice, miden la aceleración. Acelerómetros precisos pueden ser útiles para determinar posiciones a través de la doble integración (desde que la aceleración es la segunda derivada de la posición), de manera similar que los giroscopios son usados para determinar la dirección. Sin embargo, los acelerómetros disponibles para usar en FRC no son de la calidad suficiente para usarse de este modo.

Se recomienda utilizar acelerómetros en FRC® para cualquier aplicación que necesite una medición aproximada de la aceleración actual. Esto puede incluir la detección de colisiones con otros robots o elementos de campo, de modo que los mecanismos vulnerables se puedan retraer automáticamente. También se pueden usar para determinar cuándo el robot pasa por un terreno accidentado para una rutina autónoma (como atravesar las defensas en FIRST Stronghold).

Para detectar colisiones, a menudo es más robusto medir la sobreaceleración que la aceleración. La sobreaceleración es la derivada (o la tasa de cambio) de la aceleración e indica la rapidez con la que cambian las fuerzas sobre el robot: el impulso repentino de una colisión provoca un pico agudo en la sacudida. La sobreaceleración se puede determinar simplemente tomando la diferencia de las mediciones de aceleración posteriores y dividiéndolas por el tiempo entre ellas:

double prevXAccel = 0;
double prevYAccel = 0;

Accelerometer accelerometer = new BuiltInAccelerometer();

@Override
public void robotPeriodic() {
    // Gets the current accelerations in the X and Y directions
    double xAccel = accelerometer.getX();
    double yAccel = accelerometer.getY();

    // Calculates the jerk in the X and Y directions
    // Divides by .02 because default loop timing is 20ms
    double xJerk = (xAccel - prevXAccel)/.02;
    double yJerk = (yAccel - prevYAccel)/.02;

    prevXAccel = xAccel;
    prevYAccel = yAccel;
}

Most accelerometers legal for FRC use are quite noisy, and it is often a good idea to combine them with the LinearFilter class (Java, C++) to reduce the noise:

Accelerometer accelerometer = new BuiltInAccelerometer();

// Create a LinearFilter that will calculate a moving average of the measured X acceleration over the past 10 iterations of the main loop

LinearFilter xAccelFilter = LinearFilter.movingAverage(10);

@Override
public void robotPeriodic() {
    // Get the filtered X acceleration
    double filteredXAccel = xAccelFilter.calculate(accelerometer.getX());
}