Accéléromètres - Partie logicielle

Note

Cette section couvre le logiciel spécifique aux accéléromètres. Pour un guide qui explique le raccordement électrique des accéléromètres, voir Accéléromètres.

Un accéléromètre est un appareil qui mesure l’accélération.

Les accéléromètres se présentent généralement en deux types: axe unique et 3-axes. Un accéléromètre à axe unique mesure l’accélération le long d’une seule dimension spatiale; un accéléromètre à 3 axes mesure l’accélération le long des trois dimensions spatiales à la fois.

WPILib prend en charge les accéléromètres à axe unique via la classe AnalogAccelerometer.

Les accéléromètres à trois axes nécessitent souvent des protocoles de communication plus complexes (tels que SPI ou I2C) pour envoyer des données multidimensionnelles. WPILib a supporte les accéléromètres 3 axes suivants:

La classe 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();
// Creates an analog accelerometer on analog input 0
frc::AnalogAccelerometer accelerometer{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 les utilisateurs disposent d’un accéléromètre analogique à 3 axes, ils peuvent utiliser trois instances de cette classe, une pour chaque axe.

Il existe des accesseurs en lecture (getters) pour l’accélération le long de chaque direction cardinale (x, y et z), ainsi qu’un accesseur en écriture (setter) pour la plage d’accélérations que l’accéléromètre mesurera.

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

La classe 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
ADXL345_I2C accelerometer = new ADXL345_I2C(I2C.Port.kMXP, ADXL345_I2C.Range.k8G);
// Creates an ADXL345 accelerometer object on the MXP I2C port
// with a measurement range from -8 to 8 G's
frc::ADXL345_I2C accelerometer{I2C::Port::kMXP, frc::ADXL345_I2C::Range::kRange_8G};

La classe 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
ADXL345_SPI accelerometer = new ADXL345_SPI(SPI.Port.kMXP, ADXL345_SPI.Range.k8G);
// Creates an ADXL345 accelerometer object on the MXP SPI port
// with a measurement range from -8 to 8 G's
frc::ADXL345_SPI accelerometer{SPI::Port::kMXP, frc::ADXL345_SPI::Range::kRange_8G};

La classe 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
ADXL362 accelerometer = new ADXL362(SPI.Port.kMXP, ADXL362.Range.k8G);
// Creates an ADXL362 accelerometer object on the MXP SPI port
// with a measurement range from -8 to 8 G's
frc::ADXL362 accelerometer{SPI::Port::kMXP, frc::ADXL362::Range::kRange_8G};

La classe 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
BuiltInAccelerometer accelerometer = new BuiltInAccelerometer();
// Creates an object for the built-in accelerometer
// Range defaults to +- 8 G's
frc::BuiltInAccelerometer accelerometer;

Les accéléromètres provenant de tierce-parties

Alors que WPILib fournit un support intégré pour un certain nombre d’accéléromètres disponibles dans le kit de pièces ou via FIRST Choice, il existe certains dispositifs AHRS (Attitude and Heading Reference System) qui contiennent des accéléromètres. Ceux-ci sont généralement pris en charge à partir des librairies des manufacturiers. Par contre, si ces dispositifs ont une sortie analogique simple, ils peuvent être utilisées avec la classe AnalogAccelerometer.

Utilisation des accéléromètres dans le logiciel

Note

Les accéléromètres, comme leur nom l’indique, mesurent l’accélération. Des accéléromètres précis peuvent être utilisés pour déterminer la position grâce à une double intégration (puisque l’accélération est la deuxième dérivée de la position), de la même manière que les gyroscopes sont utilisés pour déterminer le cap. Cependant, les accéléromètres disponibles pour une utilisation en FRC n’ont pas le degré de performance nécessaire pour être utilisés de cette façon.

Il est recommandé d’utiliser des accéléromètres en FRC® pour toute application qui a besoin d’une mesure approximative de l’accélération actuelle. Cela peut inclure la détection de collisions avec d’autres robots ou éléments de terrain, de sorte que les mécanismes vulnérables puissent être automatiquement rétractés. Ils peuvent également être utilisés pour déterminer quand le robot passe sur un terrain accidenté pour une routine du mode autonome (comme traverser les défenses comme dans FIRST Stronghold).

Pour détecter les collisions, il est préférable de mesurer le paramètre de secousse (Jerk) plutôt que l’accélération. La secousse est la dérivée (ou le taux de changement) de l’accélération, et indique à quelle vitesse les forces sur le robot changent - l’impulsion soudaine d’une collision provoque une forte pointe dans la valeur de la secousse. La secousse peut être calculée en prenant simplement la différence entre deux mesures d’accélération subséquentes et en divisant par le temps entre elles:

double prevXAccel = 0.0;
double prevYAccel = 0.0;

BuiltInAccelerometer 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) / 0.02;
    double yJerk = (yAccel - prevYAccel) / 0.02;

    prevXAccel = xAccel;
    prevYAccel = yAccel;
}
double prevXAccel = 0.0;
double prevYAccel = 0.0;

frc::BuiltInAccelerometer accelerometer;

void Robot::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) / 0.02;
    double yJerk = (yAccel - prevYAccel) / 0.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:

BuiltInAccelerometer 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());
}
frc::BuiltInAccelerometer accelerometer;

// Create a LinearFilter that will calculate a moving average of the measured X acceleration over the past 10 iterations of the main loop
auto xAccelFilter = frc::LinearFilter::MovingAverage(10);

void Robot::RobotPeriodic() {
    // Get the filtered X acceleration
    double filteredXAccel = xAccelFilter.Calculate(accelerometer.GetX());
}