2020 Komut Tabanlı Yeniden Yazmak - Rewrite: Ne Değişti?

This article provides a summary of changes from the original command-based framework to the 2020 rewrite. This summary is not necessarily comprehensive - for rigorous documentation, as always, refer to the API docs (Java, C++).

Paket Yerleri

The new command-based framework is located in the wpilibj2 package for Java, and in the frc2 namespace for C++. The new framework must be installed using the instructions: WPILib Komut Kütüphaneleri.

Başlıca Mimari Değişiklikler

Komut temelli çerçevenin genel yapısı büyük ölçüde aynı kalmıştır. Bununla birlikte, kullanıcıların bilmesi gereken bazı önemli mimari değişiklikler vardır:

Arayüz Olarak Commands-Komutlar ve Subsystems-Alt Sistemler

Command (Java, C++) and Subsystem (Java, C++) are both now interfaces as opposed to abstract classes, allowing advanced users more potential flexibility. CommandBase and SubsystemBase abstract base classes are still provided for convenience, but are not required. For more information, see Komutlar and Subsystems - Alt sistemler.

Çoklu Komut Grubu Sınıfları - Multiple Command Group Classes

The CommandGroup class no longer exists, and has been replaced by a number of narrower classes that can be recursively composed to create more-complicated group structures. For more information see Command Compositions.

Satır İçi-Inline Komut Tanımları

Previously, users were required to write a subclass of Command in almost all cases where a command was needed. Many of the new commands are designed to allow inline definition of command functionality, and so can be used without the need for an explicit subclass. For more information, see Included Command Types.

Komut Bağımlılıklarının Enjeksiyonu - Command Dependencies

Kitaplığın kodlamasında gerçek bir değişiklik olmasa da, yeni komut tabanlı çerçeve için önerilen kullanım modeli, alt sistem bağımlılıklarının komutlara enjeksiyonunu kullanır, böylece alt sistemler global olarak bildirilmez. Bu, daha önce tanıtılan global alt sistem modelinden daha temiz, daha sürdürülebilir ve daha yeniden kullanılabilir bir modeldir. Daha fazla bilgi için, bakınız Komut Tabanlı Bir Robot Projesi Yapılandırma.

Komut Sahipliği (Yalnızca C++)

Önceki komut çerçevesi, kullanıcıların tüm komutlar için ham işaretçiler kullanmasını gerektiriyordu, bu da tüm C++ komut tabanlı projelerde neredeyse kaçınılmaz bellek sızıntılarına yol açmanın yanı sıra komut grupları içinde çift ayırma komutları gibi yaygın hatalara yer bırakıyordu.

Yeni komut çerçevesi, tüm komutlar için sahiplik yönetimi sunar. Düğmelere bağlı komutlar ve varsayılan komutlar tipik olarak schedulera aittir ve bileşen komutları, bileşeni içeren komut gruplarına aittir. Sonuç olarak, kullanıcılar, çok iyi bir neden olmadıkça, genellikle bir komutu new ile yığın olarak ayırmamalıdır.

Sahiplik aktarımı, perfect forwarding kullanılarak yapılır, yani rvalues taşınacak ve lvalues kopyalanacaktır (`rvalue/lvalue açıklaması<http://thbecker.net/articles/rvalue_references/section_01.html>`__).

Planlayıcıdaki-Scheduler Değişiklikler

  • Scheduler has been renamed to CommandScheduler (Java, C++).

  • Komutların kesilebilirliği artık komutların değil programlayıcının sorumluluğundadır ve schedule çağrısı sırasında belirtilebilir.

  • Kullanıcılar artık, bir komut programlandığında, kesintiye uğradığında veya normal şekilde sona erdiğinde gerçekleştirilen eylemleri planlayıcıya aktarabilir. Bu, olay günlüğü gibi durumlarda oldukça kullanışlıdır.

Alt Sistemdeki Değişiklikler

Not

Alt sistemler hakkında daha fazla bilgi için, bakınız Subsystems - Alt sistemler

  • As noted earlier, Subsystem is now an interface (Java, C++); the closest equivalent of the old Subsystem is the new SubsystemBase class. Many of the Sendable-related constructor overloads have been removed to reduce clutter; users can call the setters directly from their own constructor, if needed.

  • initDefaultCommand kaldırıldı; alt sistemlerin artık varsayılan komutlarını “bilmelerine” gerek yoktur, bunun yerine doğrudan CommandScheduler ile kaydedilir. Yeni setDefaultCommand yöntemi, CommandScheduler çağrısını basitçe kapsar.

  • Alt sistemler artık şu anda onları gerektiren komutları “bilmiyor”; bu yalnızca CommandScheduler tarafından ele alınır. Bununla birlikte, CommandScheduler yöntemiyle ilgili bir kullanışlı paket sağlanmıştır.

Command Değişiklikleri

Not

Komutlar hakkında daha fazla bilgi için, bakınız Komutlar.

  • As noted earlier, Command is now an interface (Java, C++); the closest equivalent of the old Command is the new CommandBase class. Many of the Sendable-related constructor overloads have been removed to reduce clutter; users can call the setters directly from their own constructor, if needed.

  • Komutlar artık kendi zamanlama durumlarını işlemez; bu artık planlayıcının-scheduler sorumluluğundadır.

  • İnterrupted() yöntemi, artık komutun kesintiye uğrayıp uğramadığını belirten bir parametre alan end() yöntemine aktarıldı (normal şekilde sona erdiyse false).

  • Requires() yöntemi, addRequirement() olarak yeniden adlandırıldı.

  • void setRunsWhenDisabled(boolean disabled) has been replaced by an overridable runsWhenDisabled method.

  • void setInterruptible(boolean interruptible) has been replaced by an overridable getInterruptionBehavior method.

  • Several “decorator” methods have been added to allow easy inline modification of commands (e.g. adding a timeout).

  • (C++ only) In order to allow the decorators to work with the command ownership model, a CRTP is used via the CommandHelper class. Any user-defined Command subclass Foo must extend CommandHelper<Foo, Base> where Base is the desired base class.

PIDSubsystem/PIDCommand değişiklikleri

  • PIDController’deki değişikliklerin ardından, bu sınıflar artık ana robot döngüsünden eşzamanlı olarak çalışır.

  • PIDController artık constructor aracılığıyla yerleştirilerek birçok yönlendirme methodu kaldırılır. Oluşturulduktan sonra getController() ile değiştirilebilir.

  • GyroDriveCommands örneğinde (Java <https://github.com/wpilibsuite/allwpilib/tree/main/wpilibjExamples/src/main/java/edu/wpi/first/wpilibj/examples/gyrodrivecommands> `__, C ++ <https://github.com/wpilibsuite/allwpilib/tree/main/wpilibcExamples/src/main/cpp/examples/GyroDriveCommands>`__) gösterildiği gibi, PIDCommand büyük ölçüde satır içi kullanım için tasarlanmıştır.

  • Kullanıcılar PIDCommand’i daha “geleneksel” olarak kullanmak isterse, korumalı returnPIDInput() ve usePIDOutput (double output) yöntemlerini geçersiz kılarak, korumalı m_measurement ve m_useOutput düzenlenerek değiştirilmiştir. alanlar. Benzer şekilde, kullanıcılar setSetpoint i çağırmak yerine korumalı m_setpoint alanını değiştirebilirler.