FRC Java Temelleri
Last updated
Last updated
Java'da roboRIO'ya bağlı nesneler oluşturma
Genellikle roboRİO breakout panolarından(Türkiye'de bilinen adıyla roborio üzerindeki pin girişleri) birine bağlanan WPILib'deki tüm nesneler, bağlandığı kanal veya bağlantı noktası numarasını belirttiğiniz yerde oluşturulduğunda oluşturucuda bir argümana sahiptir. Yukarıdaki örnek Java için WPILib kullanılan kuralları göstermektedir.
Analog kanal 1'e bağlı bir AnalogGyro nesnesi oluşturur ve adresini "headingGyro" içine kaydeder.
Geçerli pozisyonu AnalogGyro'dan derece olarak alır ve değişken "heading" içinde saklar.
Genel olarak Driver Station PC'sine USB üzerinden bağlanan nesneler, bağlandıkları USB portunu belirten tek bir argüman alırlar. FRC Driver Station ile çalışan herhangi bir joystick veya gamepad ile arabirim kurmak için gereken işlevselliği sağlayan tek bir Joystick sınıfı sağlanmıştır.
DS'deki USB bağlantı noktasına 1'e bağlı bir Joystick nesnesi oluşturur.
Joystick'in geçerli X ekseni değerini alır ve "speed" değişkeninde saklar.
Eşzamanlılık ve threads hakkında daha fazla bilgi için Oracle tarafından yayınlanan bu makaleye bakın. Aşağıda açıklanamayan hatalara neden olacak WPILib'de yazılan robot programları için önemli bilgiler bulacaksınız.
Aşağıdaki kod asla döngüden çıkamayacaktır! Tüm JVM durduğunda duracaktır. Thread tek başına çıkmadığı sürece thread'ı durdurmak için hiçbir yol yoktur. Bu problemi yaşayan takımlar genelde otonom içerisinde bu hatayı yapmaktadırlar. Bu da maç esnasında otonom bittikten sonra teleop kodlarını asla kullanamayacağınız anlamına gelmektedir.
Kötü Örnek:
Bir flag ayarlayarak bu sorunu çözebiliriz. Java'da her thread için tasarlanmış bir flag vardır. Bu flag'ı kontrol etmek için kodumuzu değiştirmemiz gerek. Bu örneğe bir göz atın:
Base class
Application
SampleRobot
SampleRobot base class'ı kulağa hoş geliyor, küçük örnek programlar yazmak için iyi, özellikle fikirleri denemek için. Bir yarışma programı oluşturmak için kullanılabilir olsa da, ek yetenekler eklendikçe genişletilmesi çok zor olduğu için tavsiye edilmez. Bunun yerine, aşağıda açıklanan diğer şablonlardan birini seçebilirsiniz.
IterativeRobot
IterativeRobot base class, yeni veriler sürücü istasyonundan geldiğinde her zaman periyodik olarak çağrılan yöntemlere sahiptir. Fikir, robotun (özerk, teleop veya test) çalıştığı her mod için, programın az miktarda iş yaptığı uygun periyodik yöntem denir. Döngüler veya gecikmeler gibi periyodik yöntemlerde uzun süre çalışan bir kod bulundurmamak önemlidir. Bunu yapmak, robot performansını olumsuz yönde etkileyebilecek eksik sürücü istasyonu güncellemelerine neden olabilir. Her periyot yaklaşık olarak 20 milisaniye olup, roboRİO, Driver Station bilgisayarı veya ağ trafiği üzerindeki CPU yüküne bağlı olarak değişebilir. Eğer hassas zamanlama gerekiyorsa, örneğin robot kontrol algoritmaları uygulamak için tavsiye edilmez. bunun yerine TimedRobot (aşağıda) kullanabilirsiniz.
TimedRobot
TimedRobot, periyodik yöntemlerin öngörülebilir bir zaman aralığında çağrıldığını garanti etmek için bir timer (Notifier) kullanması dışında IterativeRobot ile aynıdır. Joystick değerleri gibi sürücü istasyonu verilerini alırken, zaman aralığı 20 milisaniye veri dağıtımı ile gecikme yaşamayacağı için en iyi performans sağlanacaktır. Bu, çoğu robot programı için önerilen temel sınıftır. Tıpkı IterativeRobot gibi, periyodik yöntemlerde uzun süre çalışan kod veya döngülere sahip olmak çok önemlidir.
Command based robot
TimedRobot temel sınıfına dayanırken, çoğu takım için Command bassed robot programlama stili önerilir. Program üzerinde bir kolun bir yere yükseltilmesi, bir mesafe sürmesi vb. gibi bazı robot davranışlarını uygulayan komutlara ayırmayı kolaylaştırır. Ayrıca programı kolayca genişletilebilir ve test edilebilir hale getirir. RobotBuilder programı (eclipse eklentileri ile birlikte) programı organize etmek için kolay bir yol sağlar. Dashboard'lar (SmartDashboard ve Shuffleboard) kolayca hata ayıklama ve komut tabanlı programları test etmek için izin verir.
C++
Java
Iterative Robot, en yaygın kod yapısına, robot kodunun yerine taban sınıfında durum geçişlerini ve döngülerini ele alarak destekler.
TimedRobot temel sınıfı, belirtilen zaman aralığını kullanarak periyodik işlevleri çağırması dışında IterativeRobot (yukarıdaki) ile aynıdır. Her bir çağrı için uygun periyodik fonksiyona varsayılan zaman aralığı 0.02 saniyedir (20 milisaniye). Varsayılan süre dahili setPeriod (java) veya SetPeriod (C ++) değeri saniye cinsinden çift değer olarak çağrılarak geçersiz kılınabilir. Dahili olarak bir Notifier, aralığı ayarlamak için kullanılır.
C++
Java
SampleRobot , durum akışının çoğunun doğrudan programınızda göründüğü ve WPILib kodunda gizlenmediği en basit şablondur. Olumsuz yanı, bu durum akışının yanlış uygulanması, programlarınızda karmaşıklığa neden olabilir. Yeni başlayanların Iterative Template veya Command Based robotunu seçmeleri önerilir.
Kesinlikle bir temel sınıf olmasa da, Command-Based robot modeli, daha kolay genişletilebilen daha büyük programları oluşturmak için bir yöntemdir. Robotunuzu tasarlamayı, alt sistemleri oluşturma ve robot ile operatör arayüzü arasındaki etkileşimleri kontrol etmeyi kolaylaştıran bir dizi sınıfla desteklenmiştir. Ayrıca, otonom programlar yazmak için basit bir mekanizma sağlar.