İvmeölçerler-Accelerometers - Yazılım

Not

Bu bölüm yazılımdaki ivmeölçerleri kapsar. İvmeölçerlerle ilgili bir donanım kılavuzu için bkz İvmeölçerler - Donanım.

İvme ölçer, ivmeyi ölçen bir cihazdır.

İvmeölçerler genellikle iki tiptedir: tek eksenli ve 3 eksenli. Tek eksenli ivmeölçer, tek bir uzaysal boyut boyunca ivmeyi ölçer; 3 eksenli ivmeölçer, aynı anda üç uzamsal boyut boyunca ivmeyi ölçer.

WPILib, AnalogAccelerometer sınıfı aracılığıyla tek eksenli ivmeölçerleri destekler.

Üç eksenli ivmeölçerler, çok boyutlu verileri göndermek için genellikle daha karmaşık iletişim protokolleri (SPI veya I2C gibi) gerektirir. WPILib, aşağıdaki 3 eksenli ivmeölçerler için yerel desteğe sahiptir:

AnalogAccelerometer

AnalogAccelerometer class (Java, C++), kullanıcıların roboRIO’nun analog girişlerinden birine bağlı tek eksenli bir ivmeölçerden değerleri okumasına olanak tanır.

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

Kullanıcıların 3 eksenli bir analog ivmeölçeri varsa, her eksen için bir tane olmak üzere bu sınıfın üç örneğini kullanabilirler.

Accelerometer Arayüzü

Tüm 3-axis ivmeölçerler WPILib implement the Accelerometer interface (Java, C++). uygular. Bu arayüz, desteklenen tüm 3-axis ivmeölçerler için ortak olan işlevselliği ve ayarları tanımlar.

Accelerometer arayüzü, her bir ana yön (x, y ve z) boyunca hızlanma için alıcılar ve ivmeölçerin ölçeceği hızlanma aralığı için bir ayarlayıcı içerir.

Uyarı

Tüm ivmeölçerler tüm aralıkları ölçemez.

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

ADXL345_I2C

ADXL345_I2C class (Java, C++), I2C iletişim veri yolu üzerinden ADXL345 ivmeölçer için destek sağlar.

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

ADXL345_SPI class (Java, C++), SPI iletişim veri yolu üzerinden ADXL345 ivmeölçer için destek sağlar.

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

ADXL362 class (Java, C++), SPI iletişim veri yolu üzerinden ADXL362 ivmeölçer için destek sağlar.

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

BuiltInAccelerometer class (Java, C++) roboRIO’nun kendi dahili ivmeölçerine erişim sağlar:

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

Üçüncü-parti accelerometers

WPILib, parça setinde veya FIRST Choice aracılığıyla bulunan bir dizi ivmeölçer için yerel destek sağlarken, FRC’de yaygın olarak kullanılan ve ivmeölçerler içeren birkaç popüler AHRS (Davranış-Attitude ve Heading-Yön Referans Sistemi) cihazı vardır. Bunlar genellikle üretici kitaplıkları aracılığıyla kontrol edilir, ancak basit bir analog çıkışa sahiplerse AnalogAccelerometer sınıfıyla kullanılabilirler.

İvmeölçeri kodda kullanma

Not

İvmeölçerler, adından da anlaşılacağı gibi ivmeyi ölçer. Hassas ivmeölçerler, yönü belirlemek için jiroskopların kullanıldığı gibi, çift entegrasyon yoluyla (ivme konumun ikinci türevi olduğundan) konumu belirlemek için kullanılabilir. Ancak, FRC’de kullanım için mevcut olan ivmeölçerler, bu şekilde kullanılmak için neredeyse yeterince yüksek kalitede değildir.

FRC ® içinde ivmeölçer kullanılması önerilir. Akım ivmesinin kabaca ölçülmesini gerektiren herhangi bir uygulama için. Bu, diğer robotlar veya alan unsurları ile çarpışmaların tespit edilmesini içerebilir, böylece savunmasız mekanizmalar otomatik olarak geri çekilebilir. Ayrıca, robotun otonom bir rutin için engebeli araziden ne zaman geçtiğini belirlemek için de kullanılabilir (FIRST Stronghold’deki savunmaları geçmek gibi).

Çarpışmaları tespit etmek için, sarsıntıyı ölçmek genellikle hızlanmadan daha sağlamdır. Sarsıntı, hızlanmanın türevidir (veya değişim oranıdır) ve robot üzerindeki kuvvetlerin ne kadar hızlı değiştiğini gösterir - çarpışmadan kaynaklanan ani itme, sarsıntıda keskin bir artışa neden olur. Sarsıntı, sadece sonraki ivme ölçümlerinin farkını alarak ve bunlar arasındaki zamana bölerek belirlenebilir:

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

FRC kullanımı için yasal olan çoğu ivmeölçer oldukça gürültülüdür ve gürültüyü azaltmak için bunları aşağıdaki kodla birleştirmek genellikle iyi bir fikirdir LinearFilter class (Java, C++):

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