Gyroscopes - Yazılım

Not

Bu bölüm yazılımdaki jiroskopları kapsar. Jiroskoplarla ilgili bir donanım kılavuzu için bkz . Gyroscopes - Donanım.

Bir jiroskop veya “gyro”, genellikle robotikte robot yönlerini ölçmek ve/veya stabilize etmek için kullanılan bir açısal oran sensörüdür. WPILib, parça kitinde bulunan ADXRS450 jiroskopu için doğal olarak özel destek ve AnalogGyro sınıfı aracılığıyla daha geniş çeşitlilikteki analog jiroskoplar için daha genel destek sağlar.

The Gyro interface-Arayüzü

WPILib’de yerel olarak desteklenen tüm gyro nesneleri Gyro interface (Java, C++) uygular. Bu arayüz, mevcut açısal hızı ve istikameti elde etmek, mevcut istikameti sıfırlamak ve jiroskopu kalibre etmek için yöntemler sağlar.

Not

Bir jiroskopu kalibre ederken robotun sabit kalması çok önemlidir.

ADXRS450_Gyro

ADXRS450_Gyro class (Java, C++) SPI veriyolu üzerinden bağlanan parça setinde bulunan Analog Devices ADXRS450 gyro için destek sağlar.

Not

ADXRS450 Gyro birikimi, FPGA’daki özel devre sistemi aracılığıyla gerçekleştirilir; buna göre ADXRS450_Gyro nun yalnızca tek bir örneği kullanılabilir.

// Creates an ADXRS450_Gyro object on the MXP SPI port
Gyro gyro = new ADXRS450_Gyro(SPI.Port.kMXP);

AnalogGyro

AnalogGyro class (Java, C++), analog çıkışlı herhangi bir tek eksenli gyro için destek sağlar.

Not

Gyro birikimi, FPGA’daki özel devreler aracılığıyla gerçekleştirilir; buna göre, AnalogGyro`lar yalnızca 0 ve 1 analog bağlantı noktalarında kullanılabilir.

// Creates an AnalogGyro object on port 0
Gyro gyro = new AnalogGyro(0);

Üçüncü-parti gyros

WPILib, parça kitinde ve herhangi bir analog gyro için mevcut bir ADXRS450 gyro için yerel destek sağlarken, FRC ® ‘da yaygın olarak kullanılan birkaç popüler AHRS (Attitude and Heading Reference System-Tutum ve Yön Referans Sistemi) cihazı vardır. ivmeölçerler içeren ve daha karmaşık iletişim gerektiren. Bunlar genellikle satıcı kitaplıkları aracılığıyla kontrol edilir.

Using gyros in code

Not

Jiroskoplar konumdan ziyade hızı ölçtüğü için konum, açıdaki toplam değişikliği elde etmek için hız sinyalini entegre ederek (toplayarak) hesaplar. Bu nedenle, jiroskop açısı ölçümleri her zaman bazı gelişigüzel sıfır açılar ile ilişkilidir (robot açıldığında veya bir sıfırlama yöntemi çağrıldığında jiroskopun açısıyla belirlenir) ve aynı zamanda birikmiş hatalara (“kayma-drift” denir) tabidir. Cayro ne kadar uzun kullanılırsa büyüklükte artış olur. Sürüklenme miktarı jiroskopun türüne göre değişir.

Jiroskoplar, FRC’de robot yönünü hem ölçmek hem de kontrol etmek için son derece kullanışlıdır. FRC maçları genellikle kısa olduğundan, bir FRC maçı boyunca toplam jiroskop kayması idare edilebilir derecede küçük olma eğilimindedir (kaliteli bir jiroskop için birkaç derece düzeyinde). Dahası, tüm yararlı jiroskop uygulamaları, mutlak baş yönü ölçümünün tüm maç boyunca doğru kalmasını gerektirmez.

Kontrol panelinde robot yönünün görüntülenmesi

Shuffleboard, a Gyro dan yön verilerini pusula biçiminde görüntülemek için bir widget içerir . Bu, robota yönelik görüş çizgileri gizlendiğinde robotun yönünü görüntülemek için yararlı olabilir:

Gyro gyro = new ADXRS450_Gyro(SPI.Port.kMXP);

public void robotInit() {
    // Places a compass indicator for the gyro heading on the dashboard
    // Explicit down-cast required because Gyro does not extend Sendable
    Shuffleboard.getTab("Example tab").add((Sendable) gyro);
}

Sürerken yönü sabitlemek - kararlı hale getirmek

Bir jiroskop için çok yaygın bir kullanım, robotun düz hareket etmesi için sürüş sırasında robotun yönünü stabilize etmektir. Bu, özellikle mecanum ve swerve gibi holonomik sürücüler için önemlidir, ancak tank sürücüleri için de son derece kullanışlıdır.

Bu, tipik olarak, dönüş hızı veya yön üzerindeki bir PID kontrol cihazının kapatılması ve döngünün çıkışının bir kişinin dönüş kontrolüne aktarılmasıyla elde edilir (bir tank sürücüsü için, sürücünün iki tarafı arasında bir hız farkı olacaktır).

Uyarı

Tüm kontrol döngülerinde olduğu gibi, kullanıcılar sensör yönünün ve dönüş yönünün tutarlı olmasını sağlamak için dikkatli olmalıdır. Aksi takdirde, döngü dengesiz olacak ve robot çılgınca dönecektir.

Örnek: Dönüş oranı kullanarak tank sürüşü stabilizasyonu

Aşağıdaki örnek, dönüş hızında kapatılan basit bir P döngüsü kullanılarak istikametin nasıl dengeleneceğini gösterir. Dönmeyen bir robotun dönüş oranının sıfır olması gerektiğinden, döngü için ayar noktası örtük olarak sıfırdır, bu da bu yöntemi çok basit hale getirir.

Gyro gyro = new ADXRS450_Gyro(SPI.Port.kMXP);

// The gain for a simple P loop
double kP = 1;

// Initialize motor controllers and drive
Spark left1 = new Spark(0);
Spark left2 = new Spark(1);

Spark right1 = new Spark(2);
Spark right2 = new Spark(3);

SpeedControllerGroup leftMotors = new SpeedControllerGroup(left1, left2);
SpeedControllerGroup rightMotors = new SpeedControllerGroup(right1, right2);

DifferentialDrive drive = new DifferentialDrive(leftMotors, rightMotors);

@Override
public void autonomousPeriodic() {
    // Setpoint is implicitly 0, since we don't want the heading to change
    double error = -gyro.getRate();

    // Drives forward continuously at half speed, using the gyro to stabilize the heading
    drive.tankDrive(.5 + kP * error, .5 - kP * error);
}

Daha gelişmiş uygulamalar, daha karmaşık bir kontrol döngüsü kullanabilir. Yön sabitlemesi için dönüş hızında döngüyü kapatırken, PI döngüleri özellikle etkilidir.

Örnek: Yön kullanarak tank sürüşü stabilizasyonu

Aşağıdaki örnek, pruva yönü kapalı basit bir P döngüsü kullanılarak istikameti nasıl stabilize edeceğinizi gösterir. Dönüş oranı örneğinden farklı olarak, harekete başlamadan önce ayar noktasını mevcut rotaya ayarlamamız gerekecek ve bu da bu yöntemi biraz daha karmaşık hale getirecektir.

Gyro gyro = new ADXRS450_Gyro(SPI.Port.kMXP);

// The gain for a simple P loop
double kP = 1;

// The heading of the robot when starting the motion
double heading;

// Initialize motor controllers and drive
Spark left1 = new Spark(0);
Spark left2 = new Spark(1);

Spark right1 = new Spark(2);
Spark right2 = new Spark(3);

SpeedControllerGroup leftMotors = new SpeedControllerGroup(left1, left2);
SpeedControllerGroup rightMotors = new SpeedControllerGroup(right1, right2);

DifferentialDrive drive = new DifferentialDrive(leftMotors, rightMotors);

@Override
public void autonomousInit() {
    // Set setpoint to current heading at start of auto
    heading = gyro.getAngle();
}

@Override
public void autonomousPeriodic() {
    double error = heading - gyro.getAngle();

    // Drives forward continuously at half speed, using the gyro to stabilize the heading
    drive.tankDrive(.5 + kP * error, .5 - kP * error);
}

Daha gelişmiş uygulamalar, daha karmaşık bir kontrol döngüsü kullanabilir. Yön stabilizasyonu başlığındaki döngüyü kapatırken, PD döngüleri özellikle etkilidir.

Belirli bir yöne dönmek

Bir jiroskop için diğer yaygın ve oldukça kullanışlı bir uygulama, bir robotu belirli bir yöne bakacak şekilde döndürmektir. Bu, otonom bir sürüş rutininin bir bileşeni olabilir veya bir robotu saha öğeleriyle hizalamaya yardımcı olmak için uzaktan kumanda sırasında kullanılabilir.

Yön stabilizasyonunda olduğu gibi, bu genellikle bir PID döngüsü ile gerçekleştirilir - ancak stabilizasyonun aksine, döngü yalnızca yön üzerinde dönebilir. Aşağıdaki örnek kod, robotu basit bir P döngüsü ile 90 dereceye bakacak şekilde döndürecektir:

Gyro gyro = new ADXRS450_Gyro(SPI.Port.kMXP);

// The gain for a simple P loop
double kP = 1;

// Initialize motor controllers and drive
Spark left1 = new Spark(0);
Spark left2 = new Spark(1);

Spark right1 = new Spark(2);
Spark right2 = new Spark(3);

SpeedControllerGroup leftMotors = new SpeedControllerGroup(left1, left2);
SpeedControllerGroup rightMotors = new SpeedControllerGroup(right1, right2);

DifferentialDrive drive = new DifferentialDrive(leftMotors, rightMotors);

@Override
public void autonomousPeriodic() {
    // Find the heading error; setpoint is 90
    double error = 90 - gyro.getAngle();

    // Turns the robot to face the desired direction
    drive.tankDrive(kP * error, kP * error);
}

Daha önce olduğu gibi, daha gelişmiş uygulamalar daha karmaşık kontrol döngüleri kullanabilir.

Not

Özellikle basit bir P döngüsü kullanılıyorsa, güç aktarma sistemindeki statik sürtünme nedeniyle açıya dönüş döngülerinin doğru şekilde ayarlanması zor olabilir. Bunu açıklamanın birkaç yolu vardır; en yaygın/etkili olanlardan biri, kontrol döngüsünün çıkışına bir “minimum çıktı” eklemektir. Diğer bir etkili strateji, sürücünün her iki tarafında iyi ayarlanmış hız kontrolörlerine kademeli olarak yerleştirmektir.