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
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 oldSubsystem
is the newSubsystemBase
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ğrudanCommandScheduler
ile kaydedilir. YenisetDefaultCommand
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 oldCommand
is the newCommandBase
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 alanend()
yöntemine aktarıldı (normal şekilde sona erdiysefalse
).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 subclassFoo
must extendCommandHelper<Foo, Base>
whereBase
is the desired base class.
PIDSubsystem/PIDCommand değişiklikleri
Not
Daha fazla bilgi için bkz PIDSubsystems ve PIDCommands üzerinden PID Kontrol, and WPILib’de PID Kontrolü
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 sonragetController()
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()
veusePIDOutput (double output)
yöntemlerini geçersiz kılarak, korumalım_measurement
vem_useOutput
düzenlenerek değiştirilmiştir. alanlar. Benzer şekilde, kullanıcılarsetSetpoint
i çağırmak yerine korumalım_setpoint
alanını değiştirebilirler.