Yörünge Üretimi

WPILib’in 2020 sürümü, yörüngeler oluşturmaya yardımcı olan sınıflar içerir. Yörünge, alandaki iki uç noktayı birbirine bağlayan, eğri boyunca her noktada hız ve ivmeler içeren düzgün bir eğridir. Yörüngelerin oluşturulması ve takip edilmesi, otonom görevleri gerçekleştirmek için inanılmaz derecede faydalıdır. İleri gitme, durma, 90 derece sağa dönme ve sonra ilerlemeyi içeren basit bir otonom rutin yerine, yörüngelerin kullanılması düzgün bir eğri boyunca harekete izin verir. Bu, otonom rutinleri hızlandırma ve diğer görevler için daha fazla zaman yaratma avantajına sahiptir; ve iyi uygulandığında, otonom navigasyonu daha doğru ve hassas hale getirir.

Bu makale, bir yörüngenin nasıl oluşturulacağını anlatıyor. Bu dizideki sonraki birkaç makale, oluşturulan yörüngenin gerçekte nasıl izleneceğini ele alacaktır. Yörüngeler dünyasına dalmadan önce robotunuzun sahip olması gereken birkaç şey var:

  • Robotun her iki tarafının konumunu ve hızını ölçmenin bir yolu. Bunu yapmanın en iyi yolu kodlayıcıdır; ancak diğer seçenekler optik akış sensörleri vb. içerebilir.

  • Robot kasasının açısını veya açısal oranını ölçmenin bir yolu. Bunu yapmanın en iyi yolu jiroskoptur. Açısal hız enkoder hızları kullanılarak hesaplanabilmesine rağmen, bu yöntem tekerlek dönme kaybı nedeniyle ÖNERİLMEZ.

Otonom navigasyonu gerçekleştirmenin daha basit bir yolunu arıyorsanız bkz the section on driving to a distance mesafesine sürüşle ilgili bölüm.

Spline’lar - Eğri setleri

Spline, noktalar arasında enterpolasyon yapan bir dizi eğriyi ifade eder. Eğriler dışında, noktaları birleştiren noktalar olarak düşünün. WPILib iki tür spline’ı destekler: hermit kenetli kübik ve hermit beşli.

  • Hermite sıkıştırılmış kübik: Bu, çoğu kullanıcı için önerilen seçenektir. Bu eğri çizgiler kullanılarak yörüngelerin oluşturulması, tüm noktaların (x, y) koordinatlarının ve başlangıç ve bitiş yol noktalarındaki başlıkların belirlenmesini içerir. İç yol noktalarındaki başlıklar, sürekli eğriliği (yön değiştirme hızı) sağlamak için otomatik olarak belirlenir.

  • Hermite quintic: Bu, kullanıcının * tüm * yol noktaları için (x, y) koordinatlarını ve başlıklarını belirtmesini gerektiren daha gelişmiş bir seçenektir. Bu, kenetlenmiş kübik yivlerin oluşturduğu yörüngelerden memnun değilseniz veya iç noktalardaki başlıkların daha iyi kontrolünü istiyorsanız kullanılmalıdır.

Spline’lar yörüngeler oluşturmak için bir araç olarak kullanılır; ancak, spline’ın kendisi hızlar ve ivmeler hakkında herhangi bir bilgiye sahip değildir. Bu nedenle, spline sınıflarını doğrudan kullanmanız önerilmez. Hızları ve ivmeleri olan düzgün bir yol oluşturmak için, bir * yörünge * oluşturulmalıdır.

Yörünge yapılandırmasını oluşturma

Bir yörünge oluşturmak için bir konfigürasyon oluşturulmalıdır. Yapılandırma, başlangıç hızı ve bitiş hızına ek olarak özel kısıtlamalar, maksimum hız, maksimum ivme hakkında bilgi içerir. Yapılandırma ayrıca yörüngenin tersine çevrilmesi gerekip gerekmediği hakkında bilgi içerir (robot yol noktaları boyunca geriye doğru gider). Bir yapılandırma oluşturmak için `` TrajectoryConfig ‘’ sınıfı kullanılmalıdır. Bu sınıfın yapıcısı iki argüman alır: maksimum hız ve maksimum ivme. Diğer alanlar (`` startVelocity ‘’, `` endVelocity ‘’, `` reversed ‘’, `` kısıtlamalar ‘’) varsayılan değerlere (`` 0 ‘’, `` 0 ‘’, `` false` Nesne oluşturulduğunda , {} ``). Bu alanlardan herhangi birinin değerlerini değiştirmek isterseniz, aşağıdaki yöntemleri çağırabilirsiniz:

  • setStartVelocity (double startVelocityMetersPerSecond) '' (Java) / `` SetStartVelocity (units :: meter_per_second_t startVelocity) (C ++)

  • setEndVelocity (double endVelocityMetersPerSecond) '' (Java) / `` SetEndVelocity (units :: meter_per_second_t endVelocity) (C ++)

  • setReversed (boolean tersine çevrildi) `` (Java) / `` SetReversed (bool tersine çevrildi) (C ++)

  • addConstraint (TrajectoryConstraint kısıtlaması) `` (Java) / `` AddConstraint (TrajectoryConstraint kısıtlaması) (C ++)

Not

`` Ters-reversed ‘’ özelliği, basitçe robotun geriye doğru hareket edip etmediğini gösterir. Dört yol noktası, a, b, c ve d belirtirseniz, robot, `` ters-reversed`` bayrağı `` doğru-true`` olarak ayarlandığında, yol noktaları boyunca aynı sırayla seyahat edecektir. Bu aynı zamanda, yol noktalarını sağlarken robotun yönünü hesaba katmanız gerektiği anlamına gelir. Örneğin, robotunuz ittifak istasyonu duvarınıza bakıyorsa ve bazı alan unsurlarına geri giderse, başlangıç yol noktasının 180 derece dönüşü olmalıdır.

Yörünge oluşturmak

Bir yörünge oluşturmak için kullanılan yöntem generateTrajectory (...) şeklindedir. Bu yöntem için dört aşırı yük vardır. Kenetli kübik spline kullanan iki tanesi ve beşli spline kullanan diğer ikisi. Her bir spline türü için bir yörünge oluşturmanın iki yolu vardır. En kolay yöntemler, Pose2d nesnelerini kabul eden aşırı yüklemelerdir.

Kelepçeli kübik eğriler için bu yöntem, biri başlangıç yol noktası ve diğeri bitiş yol noktası için olmak üzere iki Pose2d nesnesini kabul eder. Yöntem, iç yol noktalarını temsil eden `` Translation2d`` nesnelerinin bir vektörünü alır. Bu iç yol noktalarındaki başlıklar, sürekli eğriliği sağlamak için otomatik olarak belirlenir. Beşli spline’lar için, yöntem basitçe `` Pose2d`` nesnelerinin bir listesini alır ve her bir `` Pose2d`` , bir noktayı ve alandaki başlığı temsil eder.

Daha karmaşık aşırı yük, spline’lar için “kontrol vektörlerini-control vectors” kabul eder. Bu yöntem, her noktada teğet vektörün büyüklüğünü kontrol edebileceğiniz Pathweaver ile yörüngeler oluştururken kullanılır. `` ControlVector`` sınıfı iki `` çift`-double`` diziden oluşur. Her dizi bir boyutu (x veya y) temsil eder ve onun elemanları bu noktadaki türevleri temsil eder. Örneğin, `` x`` dizisinin 0 öğesindeki değer x koordinatını (0. türev), 1. öğedeki değer x boyutundaki 1. türevi temsil eder ve bu böyle devam eder.

Sabitlenmiş kübik spline’lar kullanılırken, dizinin uzunluğu 2 (0. ve 1. türevler) olmalıdır, oysa beşli spline’lar kullanılırken, dizinin uzunluğu 3 (0., 1. ve 2. türev) olmalıdır. Tam olarak ne yaptığınızı bilmiyorsanız, yörüngeleri manuel olarak oluşturmak için ilk ve daha basit yöntem ŞİDDETLE önerilir. (yani Pathweaver JSON dosyalarını kullanmadığınızda).

2018 oyunu FIRST Power Up için sabitlenmiş kübik eğriler kullanarak bir yörünge oluşturmanın bir örneği:

class ExampleTrajectory {
  public void generateTrajectory() {

    // 2018 cross scale auto waypoints.
    var sideStart = new Pose2d(Units.feetToMeters(1.54), Units.feetToMeters(23.23),
        Rotation2d.fromDegrees(-180));
    var crossScale = new Pose2d(Units.feetToMeters(23.7), Units.feetToMeters(6.8),
        Rotation2d.fromDegrees(-160));

    var interiorWaypoints = new ArrayList<Translation2d>();
    interiorWaypoints.add(new Translation2d(Units.feetToMeters(14.54), Units.feetToMeters(23.23)));
    interiorWaypoints.add(new Translation2d(Units.feetToMeters(21.04), Units.feetToMeters(18.23)));

    TrajectoryConfig config = new TrajectoryConfig(Units.feetToMeters(12), Units.feetToMeters(12));
    config.setReversed(true);

    var trajectory = TrajectoryGenerator.generateTrajectory(
        sideStart,
        interiorWaypoints,
        crossScale,
        config);
  }
}

Not

Java kodu, kolay birim dönüştürmeleri için 2020’de WPILib’e eklenen Units <https://first.wpi.edu/wpilib/allwpilib/docs/release/java/edu/wpi/first/wpilibj/util/Units.html> _ yardımcı programını kullanır.

Not

Bu yörünge oluşturma, Pathfinder’dan çok daha hızlı siparişler olsa da, oluşturma süresi hala ihmal edilebilir olmadığından tüm yörüngelerin başlangıçta (robotInit) oluşturulması şiddetle tavsiye edilir. Oluşturma süresi genellikle her yörünge için 10 ms ile 25 ms arasında değişir.