Information

FRC Java Programming Part 3: Setting up Tank Drive Controls

Basic shortcuts

Ctrl + SSave subtitles
Ctrl + click
Double click
Edit highlighted caption
TabEdit next caption
Shift + TabEdit previous caption
EscLeave edit mode
Ctrl + SpacePlay / pause video
Ctrl + HomePlay selected caption
Ctrl + EnterSplit caption at cursor position
at current time

Advanced shortcuts

Ctrl + InsertAdd new caption
Ctrl + DeleteDelete selected caption
Ctrl + IEdit currently played segment
Shift + EnterNew line when editing
Ctrl + LeftPlay from -1s
Ctrl + RightPlay from +1s
Alt + LeftShift caption start time -0.1s
Alt + RightShift caption start time +0.1s
Alt + DownShift caption end time -0.1s
Alt + UpShift caption end time +0.1s

Annotation shortcuts

Ctrl + 1Hesitation
Ctrl + 2Speaker noise
Ctrl + 3Background noise
Ctrl + 4Unknown word
Ctrl + 5Wrong segment
Ctrl + 6Crosstalk segment
You are in the read-only mode. Close
00:00.0
00:14.7
Evet herkese merhaba. Önceki bölümde drivebase sınıfını yapmıştık motorları ve hız kontrol devrelerini ayarlamıştık
00:14.8
00:19.6
Aynı zamanda numaralandırmalar için RobotMap'i hazırlamıştık.
00:19.7
00:32.1
Ama henüz joysticklerimizden değer almaya aldığımız değerle drivebase'imize komut vermeye başlamamıştık bu bölümde ise nasıl yapacağımızdan bahsedeceğiz.
00:32.2
00:41.2
Burda yapmamız gereken iki temel aşama var. Birincisi joysticklerden giriş almak ve ikincisi ise motorlarımıza güç vermek
00:41.3
01:02.5
İlk yapacağımız şey OI adlı dosyaya gitmek. Bu dosya tüm veri giriş çıkışlarınızın yer alacağı dosyadır
01:02.6
01:31.0
Bir joystick tanımlamak için ise public final Joystick left_Joy = new Joystick(); yazmanız gerekir
01:31.1
01:35.9
Ancak parantezin içindeki bağlı olduğu portu yazarken tekrardan RobotMap e gidip joystickimizin bağlı olduğu portu tanımlayacağız
01:36.0
02:31.2
Joystickin numarasını önceki numaradan sonra virgül koyarak tanımlıyoruz. Tanımlamalarınızın daha iyi gözükmesi için aralarına yorum ekleyebilirsiniz.
02:31.3
02:36.1
Tanımlamalarınızı sınıflandırırken PWM ve CAN olarak da sınıflandırmaya çalışın ikisi birbirinden tamamen farklı sistemler olduğu için karıştırmak sıkıntı çıkarır.
02:36.2
03:10.5
RobotMap'de tanımladıktan sonra OI dosyasına geri dönebiliriz. Ve parantezin içini robotmap den değeri alarak doldurabiliriz. Aynısını kopyalayıp sağ joystick için de yapıyoruz
03:10.6
03:39.2
Eğer joystickleriniz eskiyse joysticklerinizde Deadzone adı verilen bir alan bulunabilir bu alan joystiği tutmasanız bile motorlara güç verilmesine neden olur.
03:39.3
03:55.0
Bu soruna karşı bize yardımcı olması için ise public static final double JOY_DEADZONE adlı bir ölü alan tanımlayacağız
03:55.1
04:17.7
Bu sayede ise eğer joystick değerleri bu değeri geçmiyorsa motorlara güç verilmeyecek. Şimdi 0.05 değerini kullanabiliriz
04:26.5
04:33.7
Bunu sağlayabilmek için ise bazı metodları kullanmamız gerekecek. İlk metodumuz sol joystickin X ekseninde değerini almak için olacak buna göre bir metod adı tanımlayın
04:33.8
05:48.9
Bu metodun içine ise bir değişkene sol joystickten aldığımız değeri tanımlıyoruz. Ve ekranda gördüğüüz şekidle mevcut değerle ölü alanı karşılaştırıp kesin bir sonuç elde edeceğimiz kodu yazıyoruz.
05:49.0
06:17.3
Ve yazdığınızı kopyalayıp diğer joystickler ve eksenler için yapabilirsiniz.
06:17.4
06:22.2
Eğer farklı joysticklerde farklı ölü alanlarınız bulunuyorsa onlara özel bir şekilde yapmanızı öneririm burda yazılan değerler bizim joysticklerimize özel.
06:25.2
06:54.3
Ayrıca sonraki adımlar için bir OI fonksiyonu oluşturmanız sizin adınıza çok yardımcı olacaktır.
06:54.4
07:21.6
Şimdi komutlar paketinin altında yeni bir sınıf oluşturuyoruz ve adını TankDrive koyuyoruz. Ve superclass kısmından command'i seçiyoruz
07:21.7
07:49.1
Bir komut dosyasının doğru bir komut dosyası olması için ilk önce komutunuz için bir fonksiyon oluşturmanız gerekir.
07:49.2
08:18.3
Daha sonra bir tane protected void initialize fonksiyonu oluşturuyoruz. Burada bilmeniz gereken temel şey bu kodun superclass'ından miras aldığıdır.
08:18.4
08:23.2
Komutu çalıştıracak olan protected void execute metodunu ekliyoruz.
08:23.3
08:40.3
Aslında ihtiyacımız olmayacak ama bazı durumlarda işimize yarayabilecek bir metod olan interrupted i de ekliyoruz.
08:40.4
09:00.6
Buradaki initialize metodu komut çalıştırıldığında ilk çalışacak metoddur ve sadece bir kere çalışır. Tank drive metodu asıl robotu sürmemizi sağlayacak metoddur ve komutu çalıştırdığımızda çalışmaya başlar
09:00.7
09:11.3
Execute metodu ise komut çalışırken periyodik olarak çalışır. IsFinished ise komut bitirildiğinde çalışacak koddur.
09:11.4
09:39.0
Interrupted ise eğer başka bir komut aynı alt sisteme ihtiyaç duyuyorsa bu ikilemde ne yapılcağının belirlendiği fonksiyondur
09:39.1
09:43.9
Şimdi ise yapmamız gereken birkaç şey var. Öncelikle bu komuda hangi alt sistemleri kullanacağımızı belirtmemiz gerekiyor.
09:44.0
09:54.8
Daha sonra ise yazdığımız metodlara neler yapmaları gerektiğini belirtmemiz gerekiyor.
09:54.9
10:33.0
Bizim bu komutta drivebase alt sistemini kullanmamız gerekiyor bunun için ise tankdrive fonksiyonunun içine requires yazıp ihtiyacımız olan alt sistemi yazıyoruz.
10:33.1
10:53.9
Komutlar genellikle referanslara ihtiyaç duydukları için robot dosyamızda bir yerde drivebase imizin bir instance olarak belirlenmesi gerekir.
10:54.0
11:17.5
Ve bunu yapmak için de Robot.java dosyanıza girmelisiniz. Ve buraya public static Drivebase drivebase yazarak tanımlamalısınız.
11:17.6
11:30.6
Robot Init kısmında drivebase = new Drivebase olarak tanımlamalısnız.
11:30.7
12:00.6
Basit olarak bu komutun yapmasını istediğimiz joystick girişlerine göre motorlara çıkış vermesini sağlamak
12:00.7
12:06.7
Çoğu fonksiyonu tamamladıktan sonra yapmamız gereken komut dosyasına gelip execute kısmına
12:06.8
12:45.6
Robot.drivebase.setRaw(Robot.oi.getLeftJoyY,Robot.oi.getRightJoyY) yazdıktan sonra bu kod robotumuzu sürebilmemizi sağlayacaktır.
12:45.7
12:50.5
Bu yaptıklarımıza ek olarak bir şey eklemek istiyorum bu işimize yarayacaktır.
12:50.6
13:11.9
Çoğu joystickte bir gaz ayarlama slider'ı bulunacaktır. Her zaman tüm güçte gitmek istemiyorsak bu slider işimize yarayabilir.
13:12.0
13:42.7
Komut dosyamıza geliyoruz ve double throttle = LEFT_JOY.getThorttle(); olmak üzere bir değişken tanımlıyoruz.
13:42.8
14:12.7
Bu satırı ekledikten sonra ise önceden yazmış olduğumuz satırdaki değerleri thorttle değerleri ile çarpıyoruz ve işte bu kadar.
14:12.8
14:35.7
Ancak bu değerler her zaman istediğimiz gibi olmayabilir bu sorunu çözmek için ise thorttle değerini tanımladığımız satıra yazılanları ekliyoruz.
14:35.8
14:56.8
Bu kodun bize sağladığı şey ise örnmeğin tam güçte iken 1 değerini yarımda iken 0.5 değeri gibi kesin ve oransal değerler almamızı sağlıyor
14:56.9
15:12.1
Evet şu an tamamen çalışan bir tank drive robotumuz var ancak şimdi göstereceğim şey farklı alt sistemler ekleyecekseniz ve farklı tanımlamalar yapacaksanız önemli.
15:46.0
15:56.5
Şu an aslında önemli bir şeyi kaçırıyoruz. Bu komut robot tarafından hiçbir şekilde çalıştırılmıyor bu komutun çalıştırılmasını da sağlamamız gerekli
15:56.6
16:01.4
Drivebase dosyamıza gidiyoruz ve en alttaki fonksiyon olan initDefaultCommand'e dikkat ediyoruz.
16:01.5
16:47.8
Bu fonksiyonun içine setDefaultCommand(new TankDrive); yazıp tank drive komutunu importluyoruz. Ve artık sonunda etrafta iki joystick ile sürebileceğiniz robotun kodu hazır.
16:47.9
16:52.7
Sonraki bölümlerde biraz daha karmaşık olan CAN kullanımına ve bazı sensörlerin kullanımına çalışacağız.
16:52.8
17:09.5
Şu anda kullandığımız motor kontrolörleri PWM olduğu için şu anlık CAN kullanmaya ihtiyaç duymuyoruz ancak TalonSRX gibi devreler kullanacağımızda CAN kullanacağız.
17:09.6
17:13.0
İzlediğiniz için çok teşekkür ederiz artık temel olarak bir robotu programlamayı biliyorsunuz.