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

La classe AnalogAccelerometer (Java, C++) permet aux utilisateurs de lire les valeurs à partir d’un accéléromètre à axe unique qui est connecté à l’une des entrées analogiques du roboRIO.

// 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 les utilisateurs disposent d’un accéléromètre analogique à 3 axes, ils peuvent utiliser trois instances de cette classe, une pour chaque axe.

L’interface Accelerometer

Tous les accéléromètres à 3 axes de WPILib implémentent l’interface Accelerometer (Java, C++). Cette interface définit les fonctionnalités et les paramètres communs à tous les accéléromètres à 3 axes pris en charge.

L’interface :code: Accelerometer contient des méthodes d’obtention pour l’accélération le long de chaque direction cardinale (x, y et z), ainsi que des méthodes de réglage pour les plages d’accélérations que l’accéléromètre mesurera.

Avertissement

Tous les accéléromètres ne sont pas capables de mesurer nécessairement toutes les gammes.

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

La classe ADXL345_I2C

La classe ADXL345_I2C (Java, C++) fournit une prise en charge pour l’accéléromètre ADXL345 à travers le bus de communication I2C.

// 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);

La classe ADXL345_SPI

La classe ADXL345_SPI (Java, C++) fournit une prise en charge pour l’accéléromètre ADXL345 à travers le bus communication SPI.

// 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);

La classe ADXL362

La classe ADXL362 (Java, C++) fournit une prise en charge de l’accéléromètre ADXL362 à travers le bus de communication SPI.

// 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);

La classe BuiltInAccelerometer

La classe BuiltInAccelerometer (Java, C++) donne accès à l’accéléromètre intégré du roboRIO :

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

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;
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;
}

La plupart des accéléromètres légaux pour une utilisation en FRC sont assez bruyants, et c’est souvent une bonne idée de les combiner avec la classe LinearFilter (Java, C++) pour réduire le bruit :

Accelerometer accelerometer = new BuiltInAccelerometer();

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

LinearDigitalFilter xAccelFilter = LinearDigitalFilter.movingAverage(10);

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