Only this pageAll pages
Powered by GitBook
1 of 62

FRCTURKEY

Loading...

Loading...

Takım Kurma Rehberi

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

FRC - Yazılım

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

FRC Elektronik

Loading...

Loading...

FRC Mekanik

Loading...

Loading...

Loading...

Loading...

İŞ/ÖDÜL/KURALLAR

Loading...

Loading...

Loading...

Takımlardan Gelenler

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Yarışmaya Hazırlanmak

Loading...

Liste Dışı

Loading...

FIRST nedir?

FIRST® ismi, "Bilim ve Teknolojinin Tanınması ve Yayılması İçin" ("For Inspiration and Recognition of Science and Technology") anlamına gelen bir kısaltmadır.

Daha fazla bilgi için FIRST adresini ziyaret edin

FIRST 1989’da gençlerin bilime ve teknolojiye yönelik ilgisini canlandırmak için kuruldu. Manchester NH’de kurulan FIRST, gençleri bilim, mühendislik, teknoloji ve matematik alanlarında bir eğitim ve kariyer hedeflemeye motive eden ve aynı zamanda özgüven ve hayat becerilerini geliştiren ulaşılabilir ve inovatif programlar tasarlar.

FIRST'un misyonu gençleri heyecanlı, mentor tabanlı bilim ve teknoloji alanlarında yetenekleri geliştirmelerini sağlayan, inovatif olmaya yönlendiren ve liderlik, iletişim gibi hayat becerilerini geliştirmelerini sağlayan programların bir parçası yaparak teknoloji ve bilim alanında liderler olmaları için ilham vermektir.

Robot'dan daha fazlası ! (More than robots)

Fikret Yüksel Foundation

Fikret Yüksel Vakfı 1998’de Fikret Yüksel tarafından kurulmuştur.Darüşşafaka (Maddi olanakları sınırlı olan ve ebeveynlerinden en az birini kaybetmiş olan çocukları eğitmeyi amaçlayan bir kurum) mezunu olan Fikret Yüksel eğitim hayatına önce İTÜ, sonrasında MIT ve Harvard’da devam etti. İnşaat mühendisliği, yapı mühendisliği ve maden mühendisliği alanlarında okudu ve çalıştı.

Türkiye’de ve Amerika’da bir çok mühendislik projesinde yer aldı ve Alaska Boru Hattı’nın tasarımında önemli görevlerde bulundu. Hayatının ilerleyen yıllarında mühendislikten emekli oldu ve kızı Susan Burchard’la konut renovasyonu ve ticareti işine girdi. Beraber Seattle’da ve çevresinde konut sahibi olan ve işleten Yüksel Inc’i kurdular ve büyüttüler. Yüksel ölümünün ardından şirketin, Darüşşafaka öğrencileri öncelikli olmak üzere Türk öğrencilere destek veren bir vakfın kurulmasını istediğini vasiyet etti.

Takım Kurma Rehberi

Bir FRC takımı kurmaya karar verdiniz ancak nereden başlayacağınızı bilemiyorsanız aşağıdaki maddeleri inceleyerek yardım alabilirsiniz.

Aynı zamanda ülkemizde çalışmalarına devam FRC takımlarımız ile iletişim kurup onlardan yardım isteyebilirsiniz(Takımların harita üzerinde yerleşimi).

Programın en önemli kazanımlarından biri olan “Duyarlı Profesyonellik” (Gracious Professionalism) sahibi FRC takımlarımız sizlere yardımcı olacaktır.

Takım kaydına geçmeden önce bir FRC takımını başlatmadan önce aşağıdaki konulara hakim olduğunuzdan emin olunuz.

  • FRC takım üyeleri

Buraya kadar yapılan tüm açıklamaları okuyup kavradıktan sonra takım oluşturma adımlarına devam edebilirsiniz.

    • Tüm takım kayıtları sitesi üzerinden yapılmaktadır. Takım kaydı ile ilgili örnek kılavuza ulaşabilirsiniz.

    • Her takımın kurucu mentoru (Lead Mentor) ve ikincil mentoru (Lead 2 Mentor) olur.

FRC Öğrenci kaydı.
  • Takım kaydınızı yaptınız ise tabiki öğrencilerin kaydı ile devam edebilirsiniz. Öğrenci kayıtlarının tamamlanmış olması

  • FRC takımı Regional (Bölgesel Turnuva seçimi)

    • Takımların bölge seçiminde tercih ağırlıklı sistem kullanılmaktadır. Bu sistem ile ilgili tüm detaylara buradan ulaşabilirsiniz.

    • Bölge seçimi ile ilgili sık sorulan sorular kılavuzuna buradan erişebilirsiniz.

  • FRC Mentorları
    Takım İsmi
    Robot Odası ve Demirbaş
    Malzeme Kullanımı ve İş Güvenliği
    Maddi İhtiyaçlar
    Sosyal medya yönetimi
    FRC takım kaydı.
    FIRST internet
    buradan

    Takım İsmi

    FIRST Robotics Competition’da her takım bir takım numarası ile temsil edilir. Kesin kayıt yapılıncaya kadar (kayıt ücretinin tamamlanması) geçici bir numara atanır. Kesin kayıt işleminden sonra takım aktif olduğu sürece atanan döt haneli numaraya sahip olur.

    Ancak bunun yanında takımı tanımlayan yada üyelerin ortak kararı sonucu ortaya çıkacak bir takım ismi de kullanılır. Tercih edeceğiniz takım isminin akılda kalıcı olması takımınızın bilinirliğini arttıracaktır. Bunun yanında takım isminize uygun logo tasarımları v.b. de üretmeniz faydalı olacaktır.

    Takımınıza seçmiş olduğunuz ismin sizleri, okulunuzu v.b. yansıtması tanınmanız açısından faydalı olacaktır. İsterseniz daha sonra takım isminizi değiştirebilirsiniz. Tüm bu işlemler resmi FIRST sitesi üzerinden gerçekleştirilmektedir. www.firstinspires.org.

    VISION PROCESSING - GÖRÜNTÜ İŞLEME

    Faydalı Web Sayfaları

    FRC ile ilgili faydalı linkler !Genel Faydalı Linkler

    FRC Java Temelleri

    https://wpilib.screenstepslive.com/s/currentCS/m/java/l/145309-java-conventions-for-objects-methods-and-variables

    https://wpilib.screenstepslive.com/s/currentCS/m/java/l/681690-multithreading-in-java

    Geçmiş yıllara ait iş planları

    buradan takımların geçmiş yıllara ait iş planlarını bulabilirsiniz.

    Veteran yıllarına ait iş planları

    5MB
    Techtolia Business Plan.pdf
    PDF
    Open
    7748 Techtolia 2020 Business Plan

    Rookie yıllarına ait iş planları

    8MB
    8208 Business Plan 2020.pdf
    PDF
    Open
    8208 Sycamore 2020 Business Plan
    2MB
    8159 Business Plan 2020 Infinite Recharge.pdf
    PDF
    Open
    8159 Golden Horn 2020 Business Plan

    Geçmiş Yıllara ait robot dökümanları

    Bu içeriğin oluşumuna öncülük yaptığı için Sneaky Sneakes 7285 takımına teşekkür ederiz.

    Sneaky Sneakes 7285 takımının teknik robot dökümanlarına aşağıdan ulaşabilirsiniz.

    3MB
    7285 TECHNICAL BINDER.pdf
    PDF
    Open
    Sneaky Sneakes - 2020 Infinite Recharge Robot Teknik Dökümanı

    Sneaky Sneakes 7285 2020 Infinite Recharge robot yazılımına Geçmiş yıllara ait robot yazılımları kısmından ulaşabilirsiniz.

    1MB
    8159 Juri Kitapcığı.pdf
    PDF
    Open
    Golden Horn - 2020 Jüri Kitapçığı

    Labview

    Faydalı Siteler ve Dokumanlar

    FRC ile ilgili faydalı linkler !

    FRC Takım Üyeleri

    FRC turnuvalarında görevleri öğrencilerin yapması esas alınmıştır. Takımın kurulmasından, robotun yapımına kadar takım üyelerinin bir arada çalışması gereklidir.

    Bir takım için önerilen minimum öğrenci sayısı 10’dur. Maksimum takım üyesi sınırı yoktur. Takım üyelerinin istekli ve gönüllü olması takımın başarısını arttıracaktır.

    Turnuva düzeni robot tasarım, robot oyunu, iş güvenliği, girişimcilik, güvenlik animasyonu gibi birçok alana ayrılabilmektedir. Buradaki amaç bu alanlarda varlık göstermeye çalışırken aynı zamanda FIRST ® değerlerini benimseyen, STEM ile ilgili çalışmalar içerisinde bulunan ve bunları etkileşim içerisinde olduğu topluluğa yayan, kendi kaynaklarını yaratan, takım ruhuna sahip sürdürülebilir bir ekip oluşturmaktır.

    Takımın bel kemiği olan üyelerinin yarışmaya hazırlanırken ve yarışma içerisinde bu değerleri kavrayarak ve göstererek iş yapması beklenmektedir. Farklı alanlarda verilen görevleri yapmak, yaratıcı bir şeyler ortaya koymak ve problemleri çözebilmek için takım üyeleri arasında bir organizasyon yapısına ihtiyaç duyulmaktadır. Bu organizasyon yapısının takımın işleyişini en optimum şekilde yönlendirecek ve aynı zamanda bireysel yetenek ve zenginlikleri de göz önünde bulunduracak şekilde olması takımın faydasınadır.

    Üyelerin ve yeni üye olacakların bilgilendirilmesi ve duyurular yapmanız için gerekli materyallere www.firstinspires.org adresinden ulaşabilirsiniz.

    Java ve C/C++

    Pnomatik

    Diğer Yazılım İçerikleri

    Görüntü İşleme Workshop

    Andymark Şase Dokumantasyonu

    Aşağıdaki şase KOP (kit of parts) ile gelen şasedir. FIRST Robotics Competition takımlarının hızlı bir şekilde yürür aksama kavuşması için pratik, güçlü bir şase tasarımıdır. Ayrıca yükseltme kitleri (şişme tekerlek, mecanum v.b.) ile farklı modellere dönüştürülebilir.

    Kullanılması ZORUNLU DEĞİLDİR. 🆓 Ücetsiz bir çok şase tasarımını da internet üzerinde bulabilir, yada kendi tasarımlarınızı yapabilirsiniz.

    Visual Studio Kod Temelleri ve WPILib Uzantısı

    Microsoft'un Visual Studio Code'u, C ++ ve Java gelişimi için FRC'deki yeni desteklenen IDE, 2015-2018'den beri kullanılan Eclipse IDE'nin yerine geçiyor. Bu makalede, Visual Studio Code ve WPILib uzantısını kullanmanın bazı temel özellikleri tanıtılmaktadır.

    Welcome Sayfası

    Visual Studio Code ilk açıldığında, size bir Hoş Geldiniz sayfası sunulur. Bu sayfada, Visual Studio Kodunu kişiselleştirmenize izin veren bazı hızlı linklerin yanı sıra, IDE'nin temelleri ve bazı ipuçlarını ve püf noktalarını öğrenmenize yardımcı olacak belgeler ve videolar için birkaç link bulacaksınız.

    Ayrıca sağ üst köşede küçük bir WPILib logosu olduğunu görebilirsiniz. Bu, WPILib eklentisi tarafından sağlanan özelliklere erişmenin bir yoludur (aşağıda daha ayrıntılı olarak tartışılmıştır).

    Video Editleme

    Bu içeriğin gelişmesine katkı sağladığı için 6064 Istanbulls takımına teşekkür ederiz.

    Malzeme Kullanımı ve İş Güvenliği

    Öğrencilerin robot yapımı sırasında kullanılacak malzemeleri güvenle kullanabilmeleri için sezon öncesinde ufak çalışmalar yapılmasını öneriyoruz. İş güvenliği en önem verdiğimiz kısımdır.

    Eğer bölgenizde size bu malzemelerin güvenli kullanımına yardımcı olacak gönüllüler yoksa size yardımcı olmak için hazır bekleyen FIRST Robotics Competition mezunları ve takımları olduğunu unutmayın.

    Unutmayın ki kullandığınız takımla sadece doğru kullanıldığında faydalı ve güvenli olacaktır. Takımların kullanımı konusunda mutlaka deneyimli ve profesyonel kimselerden yardım isteyiniz. Ve unutmayın “hiç bir şey can güvenliğinden daha önemli değildir”.

    Talepleriniz doğrultusunda mezunlar ve diğer takımlar çeşitli eğitim atölyeleri düzenlemek için okulunuza gelebilirler. Bu tür paylaşımlar FIRST Robotics Competition takımları arasında sık görülür. Öğrenirken çok güzek dostluklar kuracağınıza eminiz.

    Bütün bu çalışmalar içerisinde iş güvenliği öncelikli geliyor. FIRST Vakfı ‘Safety FIRST’ sloganıyla buna verdiği önemi açıklamakta. Kesici ve delici aletlerin, iş makinelerinin ve elektronik cihazların kullanımı sırasında gözlük, eldiven gibi güvenlik araçlarının kullanılması, yetişkin gözetimi, çalışma alanlarında yangın söndürücü ve ilk yardım kiti ekipmanlarının hazır bulunması bu tedbirlerden bazıları.

    Gönüllü Pozisyonları

    Judge / Judge Advisor /Judge Assistant

    Pit Administration Support / Pit Announcer

    Solidworks Özel Tasarım Dişli Kutusu Yapımı

    Bu içeriğe destek sağladığı için 6025 Adroit Androids takımına teşekkür ederiz.

    Pnömatik Hava Kaçakları ve Basit Çözümleri

    Bu içeriğin oluşumuna katkı sağladığı için Istanbulls 6064 takımına teşekkür ederiz.

    Hazırlık süreci boyunca bir İş Güvenliği Planı oluşturmanız ve uygulamanız hem yaralanmalara ve kazalara karşı tedbir sağlar hem de kendinizin ve çevrenizde bu konuda bilincin artmasını sağlar. Türkiye’de birden fazla takım ücretsiz İş Güvenliği ve İlk Yardım Eğitimi almakta ve hatta diğer takımların alabilmesi için çalışmalar yapmaktadır.

    Turnuva sırasında da Pit Alanı içerisinde güvenlik gözlüğü kullanımı, kapalı ayakkabı giyilmesi, toplu saç gibi birçok iş güvenliği kuralı da bulunmaktadır. Kurallar ve ayrıntılı bilgi için FIRST Vakfının sitesini https://www.firstinspires.org ve https://safety.frcturkey.org adresini ziyaret edebilirsiniz.

    Maddi İhtiyaçlar

    Bu projeyi gerçekleştirmek için sponsor bulmanız ya da birikim yapabilmek için çalışmalar düzenlemeniz gerekebilir. Bu birikimleri kontrol altında tutabilmeniz için güvenli bir okul hesabı kullanmanızı öneririz. Okul aile birlikleri bu tarz projelerde yardımcı olmaktadır.

    Takımlar maddi yadi ayni (malzeme) sponsorları bulabilirler. Bir sponsor takımın sponsorluk stratejisine göre vida, t-shirt, baskı, konaklama, ulaşım v.b. olabileceği için ihtiyaçlar için maddi destekte verebilir.

    Her takımın ihtiyaç duyduğu maddi miktarlar doğal olarak değişiklik göstermektedir. Ancak her takım için kesin olan kayıt ücretleri sabittir. FRC turnuvasına ilk kez kayıt olan bir takım Rookie (Çaylak) takım olarak anılmaktadır. İlk yılını tamamlamış takımlar Veteran olarak tanımlanırlar.

    Rookie bir takımın herhangi bir (yurt içi / yurtdışı) bölgesel tunuvaya kayıt ücreti 6000$ ‘dır. Veteran’lar için kayıt ücreti ise 5000$ ‘dır.

    Takımlar bu ödemelerini yaptıkları zaman seçmiş oldukları bir bölgesel turnuva kayıtlarını kesinleştirmiş olurlar. Bu işlem sonucunda takıma ait 4 haneli takım numarası verilir. Kayıt ücretlerini tamamlamış takımlar Kick-off’da (oyun açıklanma etkinliği) içerisinde motor, bilgisayar, şase, pnomatik malzemeler, kontroller ünitesi v.b. malzemeleri teslim alır. https://www.firstinspires.org/robotics/frc/kit-of-parts

    Kayıt ücretleri konusunda maddi imkan yaratmakta sıkıntı yaşayan takımlar FIRST Rookie Grant (Çaylak hibesi), Fikret Yüksel Vakfı Grant hibe desteği programlarını takip edip başvurabilir. Her sene açıklanan başvuru kılavuzları takip edilmelidir.

    Takımlar mutlaka sponsorluk çalışmalarını yıla yayıp maddi yönden sürdürülebilir olmaya gayret göstermelidir. İş planlarının bu şekilde hazırlanması faydalı olacaktır.

    Yukarıda belirtildiği gibi amaçlanan ‘kendi kaynaklarını yaratabilen sürdürülebilir’ bir takım kurabilmektir. Maddi ihtiyaçlarınızı karşılamak için bir finansal plan oluşturup belgelendirmeniz gerekmektedir. Harcamalar, gelir-gider dengesi ve bütçe planlarıyla maddi yönetiminizi halletmeniz beklenir. Güzel ve güvenilir bir “İş Planı” hazırlamak ve ona uymak kaynak oluşturmak konusunda takımınıza çok faydalı olacaktır.

    Yaratıcı fikirlerinizi girişimcilik ruhunuzla birleştirerek çok farklı yöntemler bulabilirsiniz. Bu uygulamalar sizlere hem ekstradan kaynak yaratmakta hem de bazı ödül kriterlerinde ekstra puan sağlamakta olduğu için önerilmektedir. (Kermesler düzenleyip okul kantinlerinde çalışarak satış yapıp ‘Girişimcilik Ödülü’ kazanan yurt dışı takımlar da mevcut).

    Sorun yaşamamak için size yardım edeceğini söyleyen insanlara para vermeyiniz. Önce işin tamamlanmasını bekleyiniz. Mutlaka fiş ya da fatura karşılığı ödeme yapınız bu size yaptığınız ödemeleri belgelendirme imkanı sağlayacaktır.

    Sizin için malzeme alacağını ya da kayıt ücreti yatıracağını söyleyen insanlara paranızı vermeyiniz. Maddi konularda mutlaka mentorlerinize bilgi veriniz.

    Sponsorluk v.b. destek sözlerini mümkün ise “Sponsorluk antlaşmaları” şeklinde tamamlayınız. Bu takımınızın maddi açıdan ileriyi görebilmesini sağlayacaktır.

    Unutmayın yolu FRC’den geçmiş herkes size yardım etmek için bekliyor ve bu insanlar para talebinde bulunmaz. Bulunanlara itibar etmeyiniz !

    Kullanıcı arayüzü

    Bu konu ile ilgili en önemli bağlantı muhtemelen User Interface document. belgesidir Bu belge, kullanıcı arayüzünü kullanmanın temellerini açıklar ve FRC için Visual Studio Code kullanmaya başlamanız için gereken bilgilerin çoğunu sağlar.

    Command Palette

    Command Palette , Visual Studio Kodundaki (WPILib uzantısından olanlar dahil) hemen hemen her fonksiyon veya özelliğe erişmek veya bunları çalıştırmak için kullanılabilir. Command Palette View menüsünden veya Ctrl + Shift + P (Mac'te Cmd + Shift + P) tuşlarına basarak erişilebilir. Pencereye metin yazmak, aramayı ilgili komutlara göre dinamik olarak daraltır ve açılır menüde gösterir.

    Aşağıdaki örnekte "wpilib" Komut Paleti'ni etkinleştirdikten sonra arama kutusuna yazılmıştır ve WPILib içeren fonksiyonlara göre listeyi daraltır.

    WPILib Eklentileri

    WPILib uzantısı, proje ve proje bileşenleri oluşturma, roboRIO'ya kod oluşturma ve indirme ile ilgili FRC'ye özgü işlevler sağlar. WPILib komutlarına iki yoldan biriyle erişebilirsiniz:

    • Command Palete "WPILib" yazarak

    • Çoğu pencerenin sağ üstündeki WPILib simgesine tıklayarak.Bu, önceden girilmiş olan "WPILib" ile Command Palete açacaktır.

    Belirli WPILib eklenti komutları hakkında daha fazla bilgi için bu bölümdeki diğer makalelere bakın.

    Lead Team Queuer / Team Queuer

    Control System Advisor

    Safety Glasses Atendant / Safety Advisor

    Referee / Scorekeeper / FTA / FTAA

    VIP Coordinator / Ambassador / Alumni Table Attendant

    Inspector

    Field Supervisor / Field Repair/reset / Field Assembly/disassembly

    Crowd Control / Assign as Needed / practise Field Attendant / Spare parts Attendant

    Istanbulls Logo
    Istanbulls Logo

    Robot Programı Oluşturma VSCODE

    Bu makalede, Visual Studio Kodunda yeni bir WPILib projesi oluşturacağız. Bu örnekte bir TimedRobot yapacağız, ancak aynı yöntemler mevcut şablonlardan veya örneklerden herhangi birinden proje oluşturmak için de geçerlidir.

    Command Palete Erişim

    Ctrl + ÜstKrkt + P'ye tıklamak komut paletini açacaktır. Komut paleti, projeler oluşturmak ve etkileşimde bulunmak için WPILib komutlarını içerir.

    WPILib Komutlarına Erişim

    Tüm WPILib komutları "WPILib:" ile başlar, bu nedenle WPILib komutlarına erişmek için Command Palete arama çubuğuna "WPILib:" yazın.

    Yeni Bir WPILib Projesi Oluşturmak

    Yeni bir proje oluşturmak için "Yeni bir proje oluştur" komutunu seçin. Bu, yeni projenizi oluşturmak için gereken bilgileri girdiğiniz çeşitli alanların bulunduğu bir form gösterecektir.

    Yeni proje yaratma penceresi

    Yeni proje oluşturma adımları burada ana hatlarıyla belirtilmiştir:

    1. Oluşturmak istediğiniz projenin türünü seçin. Örnek bir proje veya WPILib tarafından sağlanan şablon projelerden biri olabilir.

    2. Projeniz için kullandığınız dili seçin.

    3. Bir şablonda - şablon tipini seçin (Zamanlı robot, İteratif robot, Komut robotu, vb.)

    4. Projenin yerleştirileceği klasörü seçin.

    son olarak, "Generate Projectr" i tıklayın ve VS Kodu projeyi belirtilen yerde oluşturacaktır.

    Yeni Projenin Açılması

    Projenizi başarıyla oluşturduktan sonra, Visual Studio Code size aşağıda gösterildiği gibi projeyi açma seçeneği sunacaktır. Bunu şimdi veya daha sonra Ctrl-O (mac'ta Command + O) yazıp projenizi kaydettiğiniz klasörü seçerek yapabilirsiniz.

    Açıldıktan sonra solda proje hiyerarşisini göreceksiniz. Dosyaya çift tıklamak bu dosyayı editörde açacaktır.

    C ++ Konfigürasyonları (Sadece C ++)

    C ++ projeleri için IntelliSense'i kurmak için bir adım daha var. Bir projeyi her açtığınızda, C ++ yapılandırmalarını yenilemek isteyen sağ alt köşede bir açılır pencere açmalısınız, IntelliSense'i ayarlamak için Evet'i tıklatın.

    Robot Kodu Oluşturma ve Deploy etme

    Robot projesini oluşturmak için şunlardan birini yapın:

    1. Komut Paletini açın ve "Robot Kodu Oluştur" u seçin.

    2. VS Kodu penceresinin sağ üst köşesindeki üç noktalarla gösterilen kısayol menüsünü açın ve "Robot Kodu Oluştur" u seçin.

    3. Proje hiyerarşisindeki build.gradle dosyasına sağ tıklayın ve "Robot Kodu Oluştur" u seçin.

    Önceki talimatlardaki üç konumdan herhangi birinde "Deploy Robot Code" u seçerek robot kodunu deploy edin. Bu kodu deploy edecek ve robot programını roboRIO'ya yerleştirecektir. Başarılı olursa, başarılı bir "Oluşturma" mesajı (2) göreceksiniz ve RioLog çalışırken robot programından konsol çıkacaktır.

    FRC ile ilgili faydalı linkler !

    https://learn.frcturkey.org/[TR] Fikret Yüksel Vakfı tarafından içeriği oluşturulan Türkçe bilgiler içeren web sitesi. İçeriğine takımlarda katkı sağlayabilirler.

    http://www.team358.org/files/programming/ControlSystem2015-2019/labview/index.php [ENG] FRC elektroniği ve programlaması hakkında güzel içerik bulunduran bir sitedir. Labview kod resimlerini Labview uygulamasına taşıdığınızda programı da uygulamaya geçirmiş oluyorsunuz:

    https://www.robowranglers148.com/resources.html [ENG] FRC Robot tasarımları, mühendislik defterleri ve juri kitapçıkları bulunduran bir sitedir.

    http://frc971.org/content/resources [ENG] FRC Yazılım ve Robot çizmek hakkında içerikler bulunduran bir sitedir.

    [ENG] FRC Robot yazılımları, mühendislik defterleri ve jui kitapçıkları bulunduran bir sitedir.

    [ENG] FRC Robot tasarımları, mühendislik defterleri ve juri kitapçıkları bulunduran bir sitedir.

    [ENG] FRC Robot yazılımları, mühendislik defterleri ve juri kitapçıkları bulunduran bir sitedir.

    [ENG] FRC Robot yazılımı, yazılım için yapılmış bir çok Shuffleboard’u bulunduran bir sitedir.

    [ENG] FRC Business Plan ve Ödül dosyaları bulunduran bir sitedir.

    [ENG] FRC Robot yazılımları, mühendislik defterleri, juri kitapçıkları ve robot tasarımları bulunduran bir sitedir.

    [ENG] FRC Robot yazılımları, mühendislik defterleri, juri kitapçıkları ve robot tasarımları bulunduran bir sitedir.

    [ENG] FRC Yarışma stratejileri, robot tasarımları ve mühendislik defterleri bulunduran bir sitedir.

    [ENG] FRC Robot yazılımları, mühendislik defterleri, juri kitapçıkları ve robot tasarımları bulunduran bir sitedir.

    [ENG] FRC Robot yazılımları, mühendislik defterleri ve juri kitapçıkları bulunduran bir sitedir.

    Geçmiş yıllara ait robot yazılımları

    buradan takımların geçmiş yıllara ait yazılımlarını bulabilirsiniz.

    JAVA

    C++

    Labview

    Python

    Robot Odası ve Demirbaşlar

    Sezon boyunca kullanacağınız bir takım odanızın olması işleri kolaylaştıracaktır. Elektrikli el aletleri ve makine kullanıma uygun, sezon sonunda robotu çıkarabilmeniz için büyük kapısı olan ve robotu taşımanızın kolay olması için merdiven olmayan bir oda size uygun olacaktır. Burada yazılanlar tavsiye niteliğindedir. Elinizdeki imkanları değerlendirmeniz gerekebilir.

    Robot odası üretim aşamalarının ve takım çalışmalarının daha verimli olmasını sağlamaktadır. Bazı okullarda takıma verilecek oda bulunamayabilir. Bu takımlar bölgelerindeki sanayi işletmeler ya da üniversiteler ile anlaşmalar yaparak onların alanlarını kullanabilir. Bunun ile ilgili bir kısıtlama bulunmamaktadır.

    Odanın yanında robotunuzu yaparken kullanmanız gerekebilecek belli başlı aletlerin listesini aşağıda bulabilirsiniz. Bu aletler tamamen tavsiye niteliğindedir. Aletleri satın alabileceğiniz gibi sponsor bularak da temin edebilirsiniz.

    Bazı takımlar bu malzemeleri tedarik edemediği için için okul dışında robot üretim çalışmaları yapabiliyor. Sürecin iyi değerlendirilmesi ve öğrenci faydası için bu malzemelerin mümkün olan kadarını temin etmenizi öneriyoruz. Elinizde takımların olması üretim ve deneme süreçlerinizin verimini arttıracaktır. Kullandığınız takımların bakımlarını yapmayı unutmayınız.

    Aşağıdaki liste sadece örnek olarak verilmiştir. Yapılacak tasarıma bağlı olarak farklı malzemelere de ihtiyaç duyabilirsiniz.

    Genel Faydalı Linkler

    [ENG] Solidworks for Kids çocukların 3 boyutlu tasarım becerilerini geliştirmek için tasarlanmış web tabanlı bir uygulamadır.

    [ENG] [TR] Autodesk firması tarafından çocukların 3 boyutlu tasarım becerilerini geliştirmek için tasarlanmış web tabanlı uygulamasıdır.

    Başlangıç için örnek kodlar

    Robotunuz için örnek değişkenlerinizin tanımlanması.

    Robotunuz için örnek otonom kodu

    Geçmiş yıllara ait ödül yazıları

    buradan takımların geçmiş yıllara ait ödül yazılarını bulabilirsiniz.

    Chairman Ödülü

    Daha önce Chairman ödülü kazanmış Türk takımları ve ödül yazıları.

    Takımlara ait chairman videolarını youtube'de bulabilirsiniz.

    Metal, Plastik çekiç

  • Portatif / Sabit Mengene

  • Matkap

  • Matkap uç seti (metal ve tahta için uygun uçlar)

  • Hobi matkabı

  • Sütun Matkap

  • Dekopaj testere ve uçları (metal/ahşap)

  • Çeşitli ebatlarda vida, somun, çivi

  • Çalışma eldiveni

  • Güvenlik Gözlüğü

  • Panç (Çeşitli çaplarda)

  • Tornavida seti

  • Eğe (metal ve plastik için uygun)

  • Hassas Cetvel

  • Havya- Lehim

  • Yan keski

  • Pense

  • İngiliz anahtarı seti

  • Alyan takımı

  • Cırcır seti

  • Perçin Seti

  • El testeresi

  • Sıcak Hava Tabancası

  • Bu malzemelere ek olarak polikarbon, pleksi, ahşap, alüminyum profil ve levhalarda robot üretim aşamalarında ihtiyaç duyulan malzemeler arasındadır.

    Tabiki tasarım, programlama v.b. çalışmalarda kullanılmak üzere robot odasnızda internet ve kullanıma açık bir yada bir kaç bilgisayar bulundurmanız faydalı olacaktır.

    https://frcteam2910.org/resources/
    https://team2471.org/resources/
    http://spectrum3847.org/recommendedreading/
    http://www.team624.org/?controller=page&action=programmingResources
    http://team3128.org/resources/
    http://team1323.com/wiki/
    https://www.citruscircuits.org/resources.html
    https://www.simbotics.org/resources/
    http://www.killerbees33.com/resources/
    https://www.teamrush27.net/resources
    https://www.swappsforkids.com/
    https://www.tinkercad.com/

    Ödüller

    Chairman's Award

    En prestijli FIRST® ödülü. Diğer takımlara örnek olan ve FIRST ruhunu en iyi yansıtan takıma verilir.

    Rookie All-Star Award

    Bu ödül sadece rookie takımlardan birine verilebilir. Öğrencileri bilim ve teknoloji

    alanında en çok ilhamlandıran takıma verilir.

    Winning Alliance (3 takım)

    Robot Performansında kazanan ittifak.

    Rookie Inspiration Award

    Bir rookie takımın okullarında ve çevrelerinde mühendislik alanında yarattıkları başarı ve ilham için verilir.

    Engineering Inspiration Award

    Takımın okulunda ve çevresinde mühendislik alanında yarattığı başarı ve ilham için verilir.

    Gracious Professionalism® Award

    Diğer takımlarla ve çevreleriyle ilişkileri FIRST’in çekirdek değerlerini en iyi temsil eden takıma verilir.

    Entrepeneurship Award

    Takım hedeflerini gerçekleştirebilmek için girişimcilik ruhunu gösteren ve en iyi iş çerçevesini hazırlayan takıma verilir.

    Creativity Award

    tasarım, bileşen kullanımı veya oyun stratejisi yaratıcılığını en iyi yansıtan takıma verilir.

    Judges Award

    Yarışma süresince, takımın benzersiz çabaları, performansı ve dinamiğini en iyi yansıtan takıma verilir.

    Excellence in Engineering Award

    Olağandışı tasarıma ve kullanılabilirliğe sahip robota verilir.

    Quality Award

    Konsept ve makine sağlamlığını en iyi sağlayan takıma verilir.

    Finalist Alliance (3 takım)

    Finalist İttifak

    Highest Rookie Seed

    Karşılaşmalar sonucunda en yüksek puana sahip rookie takıma verilir.

    Industrial Design Award

    Bu ödül verimli bir şekilde tasarlanmış robot ve oyun görevlerini etkili bir şekilde yerine getiren takıma verilir.

    Industrial Safety Award

    İnovatif yöntemler kullanarak sıradan güvenlik önlemlerini aşan ve tehlikelere karşı önlem alan takımlara verilir.

    Innovation in Control Award

    Elektronik, mekanik ya da yazılımsal açıdan yenilikçi bir control sistemi ya da parçaları yapan ve kullanan takımlara verilir.

    Team Spirit Award

    Sıradışı ve coşkulu takım dinaminiğine ve takım çalışmasına sahip takıma verilir.

    Imagery Award

    Bu ödül, mühendislik ve olağanüstü çekiciliği sağlayan takıma verilir. Makine ve takım görünümünün görsel estetik entegrasyonu.

    Woodie Flowers Award

    İyi iletişim teknikleri kullanarak takımına liderlik eden, geliştiren, öğreten ve ilham veren en iyi mentora verilir.

    Safety Animation Award

    Takımın güvenlik odağını göstermek için çekilen kısa animasyonlardan en iyisine verilir.

    Gracious Professionalism Animation Award

    Gracious professionalism ile ilgili en iyi kısa animasyonu yapan takıma verilir.

    Volunteer of the Year Award

    Harcadığı eforla ve ürettiği sonuçlarla öne çıkan gönüllüye verilir.

    Woodie Flowers

    Dean's List

    116KB
    2905 2017.pdf
    PDF
    Open
    2905 Exectuive and Chairman Essay 2017
    102KB
    6429ExecutiveandChairmanEssay.pdf
    PDF
    Open
    6429 Executive and Chairman Essay 2018
    101KB
    6025.pdf
    PDF
    Open
    6025 Executive and Chairman Essay 2018
    130KB
    2905.pdf
    PDF
    Open
    2905 Executive and Chairman Essay 2018
    103KB
    4191.pdf
    PDF
    Open
    4191 Executive and Chairman Essay 2019
    102KB
    3646.pdf
    PDF
    Open
    3646 Executive and Chairman Essay 2019
    80KB
    6025 (1).pdf
    PDF
    Open
    6025 Executive and Chairman Essay 2020
    27KB
    Woodie Flowers 8208.pdf
    PDF
    Open
    8208 - Woodie Flowers 2020
    3KB
    Techtolia Woodie Flower.docx
    Open
    7748 - Woodie Flowers 2020
    359KB
    2016-Nomination-Mrs.-Drummer.docx
    Open
    245 - Woodie Flowers 2016
    16KB
    8208 Sude Dagarslan.docx
    Open
    8208 - Deans List 2020
    88KB
    2010-Deans_Nomination_Dean_Keithly.pdf
    PDF
    Open
    245 - Dean's List 2010
    Teleoperation için kolay robot sürme kodu

    Test Modu

    //Programın ihtiyac duydugu diger dosyalari ice aktarir
    import edu.wpi.first.wpilibj.IterativeRobot;
    import edu.wpi.first.wpilibj.Joystick;
    import edu.wpi.first.wpilibj.RobotDrive;
    import edu.wpi.first.wpilibj.livewindow.LiveWindow;
    
    public class Robot extends IterativeRobot {
    
    //Robot classimiz icin degiskenler tanimlar
         RobotDrive myRobot;
         Joystick stick;
         Timer timer;
    
    //Robot init yönetimindeki degiskenleri cagirir robot basladiginda ilk bu komutlar calisir
         public void robotInit() {
              myRobot = new RobotDrive(0,1); //myRobot adinda robotumuzu haraket ettirecek kutuphaneyi cagirdik 0,1 robotumuzun tekerleklerinin bagli oldugu pwm numaralaridir 4 teker kullanıyorsanız 0,1,2,3 seklinde degistirebilirsiniz
              stick = new Joystick(1); //stick adinda joystick veya xbox kullanmamiza olanak saglayacak kutuphaneyi cagiriyoruz 1 kullandiginiz kolun takili oldugu usb portudur driver station uzerinden gorebilir ve ayarlayabilirsiniz
              timer = new Timer(); // timer adinda bir zamanlayici kullanmamiza olanak saglayacak kutuphaneyi cagiriyoruz
         }
    }
    public void autonomousInit() { //Bu metod her zaman robot otonom moda girdiginde baslar
         timer.reset(); // zamanlayiciyi resetle
         timer.start(); // saymaya başla
    }
    
    public void autonomousPeriodic() { //Bu metod robot otonom modun enable olduguna dair bir paket aldiginda calismaya baslar
         // 2 saniye boyunca robotu sur
         if (timer.get() < 2.0) {
              myRobot.drive(-0.5, 0.0); // robotu yarim hizda ileri sur
         } else {
              myRobot.drive(0.0, 0.0); // Robotu durdur
         }
    }
    public void teleopInit() {// teleopInit metodu her zaman teleop moduna girdiginizde cagrilir
    }
    
    public void teleopPeriodic() { // teleperiodic metodu robotun enable olduguna dair bir paket aldiginda calismaya baslar
         myRobot.arcadeDrive(stick); //Bu kod robota tanimladiginiz joystick ile motorlari surmenizi saglar
    }
    
    public void testPeriodic() {
         LiveWindow.run();
    }
    //Test Modu, robot işlevselliğini test etmek için kullanılır.Programımızın test modu LiveWindow'u çalıştırır. LiveWindow, Robot Test Modundayken, robot üzerindeki kontrol panelindeki girişleri ve kontrol çıkışlarını görmenizi sağlayan SmartDashboard'un bir parçasıdır.SmartDashboard bölümünde LiveWindow hakkında daha fazla bilgi edinebilirsiniz.

    "Yeni klasör oluştur" onay kutusu işaretlenirse, verilen klasörde proje adı ile yeni bir klasör oluşturulur. Onay kutusu işaretli değilse, sağlanan klasörün boş olduğu varsayılır (değilse bir hata verir) ve proje dosyaları bu dizine yerleştirilir.

  • Proje adı projede ve ayrıca isteğe bağlı olarak önceki adımdaki onay kutusu işaretliyse yerleştirilecek klasörü oluşturmak için kullanılır.

  • Projenin takım numarası. Bu, paket adları için ve kodu dağıtırken robotunuzu bulmak için kullanılacaktır.

  • Bu Sayfaya Nasıl İçerik Eklerim?

    Herhangi bir içeriği düzenlemek

    Girdiğiniz içeriğin sağ üst kısmında bulunan Edit on Github butonuna tıklayarak ilgili github sayfasına gidebilirsiniz. Ardından edit butonuna basarak içeriğe eklemeler yapıp geliştirebilir veya hataları düzenleyebilirsiniz.

    Not: İçerikler yetkili kişiler tarafından incelendikten sonra yayına alınacaktır.

    Edit on Github butonunun bulunduğu yer
    Edit butonunun bulunduğu aldığı yer
    Kaydedin

    Nasıl Kendi İçeriğimizi Ekleriz?

    adresine giderek uygun başlığa tıklayıp sağ üst köşede bulunan "create new file" butonuna basın. Ardından içeriğinizi ekleyip uygun bir isim verip kaydedin.

    Not: İçerikler yetkili kişiler tarafından incelendikten sonra yayına alınacaktır.

    İçeriğim hiç bir başlığa uymuyor

    Frcturkey Repositoriesine gelip "create new file" butonuna basın. Ardından oluşturmak istediğiniz başlığı yazıp sonuna / ekleyip dosya adınızı ekleyin. Yani mekanik/cnc kullanımı.md gibi

    . Not: İçerikler yetkili kişiler tarafından incelendikten sonra yayına alınacaktır.

    Bizim Size Sağladığımız Katkılar

    Düzenlediğiniz, eklediğiniz içerikler için learn.frcturkey.com adresinde içeriğinizin altına size veya takımınıza özel teşekkür ediyoruz. Aynı zamanda eğer yazılım ile ilgileniyorsanız github adresimize yaptığınız destek size ileride iş mülakatlarınız için github üzerinde iyi bir referans olacaktır.

    Co-Processor - Hatalar ve Çözümleri

    Yaşadıkları problemleri ve çözümleri bizlere aktaran #6038 ITOBOT takımına ve #6025 Adroit Anroids takımına teşekkürler!

    Hatalar ve Çözümleri

    Hatalar ve Çözümleri

    AttributeError: 'NoneType' object has no attribute 'shape' hatası

    Bu hatayı alma sebebiniz yazılımımızın sizin kameranızı tanımamasından kaynaklanmaktadır. Kameranızı Raspberry Pi'ye taktıktan sonra konsola

    sudo apt-get update && sudo apt-get upgrade

    komutunu girmeniz gerekmektedir. Bu komut kameranız Raspberry Pi 'ye bağlıyken Raspi'nizi update edip gereklid driverleri indirmesini ve upgrade komutuyla kurmasını sağlayacaktır. Eğer kameranızı yine algılamazsa kodunuzda bulunan

    satırındaki 0 numarasını 1 ile değiştirebilirsiniz. Raspberry Pi'de 4 port olduğu için 4'e kadar değiştirerek deneyebilirsiniz.

    No module named 'networktables'

    Eğer böyle bir hata ile karşılaşıyorsanız pynetworktables kütüphanesini kurarken sıkıntı yaşamışsınız demektir.

    pip install pynetworktables

    Komutunu girip tekrar çalıştırmayı deneyin. Eğer aynı hatayı almaya devam ediyorsanız, muhtemelen kodu sudo komutuyla çalıştırmaya çalışıyorsunuzdur. Sudo ve normal işlem esnasında kullandığınız pi farklı kullanıcılardır. Sudo bütün yetkilere sahip olan kullanıcı anlamına gelmektedir. Sudo olarak çalıştırmak istiyorsanız , kütüphaneleri Sudo kullanıcısına tekrardan kurmanız gerekmektedir. Bunun için konsola şu komutları girmelisiniz.

    Sudo su

    Bu komut pi kullanıcısından sudo kullanıcısına geçmenizi sağladı. Şimdi bütün kütüphaneleri tekrardan pip komutu ile kurabilirsiniz.

    IndentationError: unindent does not match any outer indentation level

    Bu hata komutun başında bulunan boşlukları sildiğinizi veya fazladan boşluk koyduğunuz anlamına gelir. Python syntax'ı boşluklarla olduğu için yazdığınız komutu algılamaz. Boşlukları kontrol edip tekrar çalıştırmayı deneyin. Eğer boşluklarla ilgli bir problem göremezseniz herhangi bir Python editörü indirip editör ile kodlarınızı kontrol edebilirsiniz. Editörler bu tarz problemleri kendiliğinden fark edip düzeltirler.

    Reflektörün beyaz yansıması

    Bu problem bir çok farklı sebepten kaynaklanıyor olabilir.

    Başlıca sebepleri:

    • Kullandığınız ledlerin parlaklığı

    • Kullandığınız ledlerin sayısı

    • Kamera ve ledlerin konumu

    • Kullandığınız reflector

    Bunun için Wpilib'in yazdığı bir makale bulunmakta. Bu makaleyi okuyarak problemi çözebilirsiniz.

    Yaşadıkları problemleri ve çözümleri bizlere aktaran #6038 ITOBOT takımına ve #6025 Adroit Anroids takımına teşekkürler!

    Takım Fonlama

    Çeviriler için Artistanbul 'a teşekkür ederiz...

    Bölüm 1 : Bütçe yaratmak

    Bölüm 2 : Kaynak Haritası

    Bölüm 3 : Talep Etme

    Bölüm 4 : Teşekkür Etme

    Bölüm 5 : Küçük projeler için Donorschoose.org

    Bölüm 6 : Büyük projeler için Donorschoose.org

    Altyazı çevirisi için 'a teşekkür ederiz.

    FRC için C ++ ve Java Geliştirme Araçları Kurulumu (vscode)

    Windows kurulumunuz için uygun yükleyiciyi (32 bit veya 64 bit) indirin.

    Çalıştırmak için yükleyiciye çift tıklayın. Herhangi bir Güvenlik uyarısı görürseniz, Çalıştır veya Daha Fazla Bilgi-> Yine de Çalıştır'ı tıklayın.

    Kurulum Tipi

    Makinede Tüm Kullanıcılar için mi yoksa Geçerli Kullanıcı için mi yükleneceğini seçin. "All Users" seçeneği Yönetici ayrıcalıkları gerektirir, ancak tüm kullanıcı hesaplarının erişebileceği bir şekilde kurulur, Geçerli Kullanıcı yüklemesine yalnızca kurulduğu hesaptan erişilebilir.

    Yapacağınız iş için doğru sensörü seçmek

    Bunu takip eden makaleler WPILib ile çeşitli sensörlerin kullanımı ve kullanımı hakkında ayrıntılı bilgi vermektedir, ancak belirli bir görev için hangi sensörün kullanılacağını nasıl öğrenebilirsiniz? Bu makale, çeşitli ortak FRC görevleri için olası sensör seçeneklerini açıklamaya çalışır.

    Bir mekanizmanın bir veya iki konumunu tespit etme

    Motorlu bir mekanizma için bir veya iki konumun tespit edilmesi çok yaygın bir FRC görevidir. En sık rastlanan olay, bir mekanizmanın her iki uçta da bir limite ulaştığında tespit edilmesidir, ancak istenen pozisyonu veya ev konumunu saptamak da temelde aynı görevdir.

    Limit Anahtarları Mekanik limit anahtarları bu senaryo için en yaygın çözümlerden biridir. Anahtarlar gerçekten mekanizmanın sınırlarını belirliyorsa, anahtarların mekanizma tarafından gözden kaçamayacakları ve mekanizma tarafından hasar görmeyecekleri bir konumda ayarlandığından emin olunuz. Limit şalterler kullanışlıdır çünkü çok basittirler, oldukça ucuzdurlar ve çok çeşitli durumlarda kullanılabilirler.

    Bir mekanizmanın konumunu birçok farklı noktada veya limit olmayan noktalarda tespit etmek

    Bazen asansörün ne kadar yüksek olduğunu bilmeniz gerekir, bu yükseklik asansörünüzün en yüksek noktası olmaksızın veya bir kolun başlangıç konumundan ne kadar yüksek olduğu veya atıcı kafanızın hangi açı ile işaret edildiğini bilmeniz gerekir. Bu problemler, bazı zorlu limit switch yerleşimleri ve onlar için yakalanan akıllı bir ekip tarafından çözülebilirdi, ancak bu iş için tasarlanan başka sensörler de var.

    Ultrasonik Sensörler

    Ultrasonik sensörler gibi mesafe sensörleri, görüş alanındaki en yakın nesnenin sensörden ne kadar uzakta olduğunun oldukça doğru bir ölçümünü verebilir, yani eğer doğru şekilde ayarladıysanız, kolunuzu veya asansörünüzü ne zaman durdurabilirsiniz? arzu ettiğiniz noktalara gelir. Genellikle bu ölçümler 2-3 inç'e kadar doğru olacaktır, yani çok daha fazla doğruluğa ihtiyacınız varsa, bu bölümde farklı bir sensöre bakmak isteyebilirsiniz, ancak bu çoğu vaka için yeterince iyi bir yöntemdir.

    Kızılötesi Mesafe Sensörleri Kızılötesi mesafe sensörleri ultrasonik sensörlere çok benziyor, sadece farklı bir ölçüm yöntemi kullanıyorlar. Bu sensörler öğreticilerimizde açık bir şekilde ele alınmamıştır, ancak bu sensörlerin çoğunun bir analog çıkışı vardır, yani çoğu durumda belirli bir mesafeye dönüşen sensörden bir voltaj elde etmek için analog giriş sınıfını kullanabilirsiniz. Ultrasonik sensörlerle karşılaştırıldığında kızılötesi sensörlerin avantajı, gürültülü bir stadyumdan etkilenmemeleridir, bazı durumlarda bir ultrasonik sensör, bir rekabette ne kadar gürültü olduğu için daha az doğru bir değer elde edebilir.

    Counters ve Enkoderler

    Kolunuz veya asansörünüz bir motor tarafından sürülürse, kolun veya yükselticinin ne kadar yüksek olduğunu bulmak için motorun döndüğü dönüş sayısını ölçebilirsiniz. Bu yöntem bilinen bir yükseklik ölçümü kontrolünden daha fazla bir tahmin ve kontrol yöntemidir, ancak birkaç test ve bazı baskı satırı deyimleriyle, belirli yüksekliklere ulaşmak için gereken dönüş sayısını kolayca bulabilirsiniz, sadece ölçümünüzü unutmayın. her zaman bir şeye dayanır ve eğer sabit kodlanmış rotasyon sayınız zemine dayanırsa ve hava biraz bir maçla başlarsa, tepeye çıktığı zaman yanlış ayar noktasında olacaktır. Başlangıçta nasıl ayarlanacağını bilmek önemlidir.

    Potansiyometre

    Kolun açısını bilmeniz gerekiyorsa, potansiyometre sizin için bir iş olacaktır, hareket açısını okunabilir analog değere dönüştürür. Bu, nişancınızın nereye vurulduğunu veya kolunuzun ne kadar yüksek olduğunu bilmek için çok iyi çalışır ve bazı sensörler ile de doğrusal olarak kat edilen mesafeyi ölçebilirsiniz, böylece bir asansörle çalışabilir.

    Akselerometre

    Bir yüzeyin eğimini ölçmek, bir ivme ölçer ile mümkün olabilir; bu, açıyı belirlemek için iyi bir fikir verecek bir kol için, eğer ölçmek istediğiniz buysa. Bunlar, robotun bundan daha fazla gitmemesi ya da muhtemelen kendisini kırması gibi nedenlerle tuttuğunuz sınırlar için gerçekten yararlıdır ve bazen kesin hedefleme için yeterince doğru değildir.

    Düz Sürüş

    Bazen robotunuz, robot yönündeki küçük sapmaları kolayca düzeltebilen bir insan tarafından kontrol edilmemektedir. Kendinize doğru sürmek için robotunuza ihtiyacınız olduğunda, işi yapmak için çalışacak bir çift sensörünüz var.

    Jiroskop(Gyro)

    Jiroskop, bir yöne işaret eden bir sensördür ve bu yönden saptığında ve ne kadar uzak olduğunuzda size söyleyecektir. Bu, tahrik motorlarından birinin diğerinden biraz daha yavaş olmasını veya otonom olduğumuzda ne kadar uzandığımızı doğru bir şekilde ölçmemize yardımcı olabilir. Ayrıca bir başlangıç noktasından da ölçüm yaparlar, bu yüzden robot yanlış yere konursa, bunu bilmeyecektir.

    Enkoder

    Tahrik motorlarında enkoderler varsa, tekerleklerin ne kadar dönmüş olduğunu ölçebilir ve bunlardan biri diğerinden daha fazla ölçüm yaparsa, bunu düzeltebilirsiniz. Bu, özellikle dönerken tekerleklerin kayması nedeniyle etkili değildir ve enkoderler bu ölçümler için jiroskoplar kadar doğru değildir.

    Ne kadar uzağa gittim? Enkoder

    Enkoderler, bir motoru en son sıfırladığınızdan bu yana geçen dönüşlerin sayısını ölçer. Bu, farklı dişli ve kasnak oranları için matematik yaparak, robotunuz için mesafe hesaplamasına dönüşleri hesaplayabileceğiniz anlamına gelir. Bu, enkoderinizi koyduğunuz tekerleklerinizden biraz daha az hassaslaşır, çünkü kasnaklardaki gevşeklik mesafesini, kasnaklarda mandalları atlayan kayışları ve yüzeyde kaymasını engelleyen tekerlekler, böylece daha uzun bir mesafe verir. Gerçekten gittiğinden daha çok. Bu, ölçtükleri rotasyonların ortalaması alınarak birden fazla enkodere sahip olduğunuzda, bundan kaçınılır, böylece herhangi bir kayma daha iyi verilere sahip olacak şekilde azaltılır.

    Mesafe sensörleri Robotu sahada kurmanın pratik kaygılarından dolayı çok yaygın olmamasına rağmen, mesafe sensörleri, ölçülecek bir noktanız varsa ne kadar ileri gittiğinizi söylemek için kullanılabilir. Bir alan elemanından veya duvardan ölçtüğünüz için, bir dönüşten sonra ne kadar ilerlediğinizi veya eğer statik bir nesneden çok uzaktaysa ne kadar ilerlediğinizi söylemek genellikle mümkün değildir.

    Kamera ve Vision

    Çoğu zaman, bir problemin nasıl çözüleceğini düşündüğünüzde, kulak tıkaçları ile büyük yastıklı eldivenlerle gözü kapalı bir şekilde yapmaya çalışmayın. Bu, robotun hiçbir sensör olmadan dünyayı nasıl deneyimlediğidir. oyun parçasını göremiyorum, bu tüpü ne kadar sıkı tuttuğunu hissedemezsin, sensörler bu şeyleri algılayamazsa, robot işini doğru yapıp yapmadığını bilemez. İnsanların dünyamızdan bilgi almak için yaptıkları en önemli şeylerden biri, ona bakmak, konum ve mesafe gibi şeyleri yargılamak ve etrafımızdaki önemli şeylerin yerlerini belirlemek.

    Neden Vision Kullanmalı?

    Vision çok güçlü bir araçtır, bir şeyden ne kadar uzak olduğunuzu, önünüzde kaç öğenin bulunduğunuzu, nereye işaret ettiğinizi ve ne kadar hızlı hareket ettiğinizi, hepsi bir sensörden almanızı sağlar. Bir şeyin ne kadar uzakta olduğu gibi şeyler, kameranın görüş açısını, çözünürlüğü ve görünümde bilinen bir nesnenin boyutunu öğrenerek ölçülebilir. Maddelerin sayısının sayılması, nesne algılama ve tanıma meselesidir ve hareket, işlerin size ne kadar hızlı gittiğini ölçmektedir. Bunlar aynı zamanda kameraların görüntülemesini sürücüye aktarabilme yeteneğiyle de birleştirilebilir, böylece sürücü ve operatör camın arkasındaki alanın tamamı boyunca robotların perspektifinden görülebilir.

    Neden vision kullanmıyorsunuz?

    Vision kullanmak için birkaç şeye sahip olmanız gerekir: Kaliteli bir kamera, görsel bilgiyi anlamlı veriye dönüştürmenin bir yolu ve çok gelişmiş görsel tanımlamanın dışarıdaki kütüphaneler tarafından nasıl yapıldığını bilen veya istekli olan biri. Roborio ile kamera videosunu anlamlı veriye dönüştürmek için gerekli olan hesaplamaların bir kısmını ya da tamamını yapabilmemiz mümkündür ve kameralar parçaların setinde mevcuttur, ancak daha gelişmiş görsel işlemler için ek işlemlere ihtiyacınız olabilir. güç ve yüksek kaliteli kameralar. Çünkü bu takımların çoğu temel şeyler için vision kullanıyor ya da sadece sürücünün kullanabileceği daha fazla bilgi olarak kullanıyor.

    Diğer Sensörler ve Sorunlar

    Sonuç olarak, robotlarındaki sensörler söz konusu olduğunda bireysel sorunlarına çözüm bulmak ekiplere kalmıştır. Bazen takımların kullanabileceği sensörler yeterince iyi değildir, enkoderler ihtiyacınız olan hızlarda okuyamaz, ultrasonik sensörler belli bir mesafeden sonra da yanlış olurlar, bunlar çözülmesi gereken zorluklardır ve gerçekten burada olmanızın sebebi de budur. Bu zorluklar, öğrencilere ve akıl hocalarına, takımların meydan okuma ve son teslim tarihlerinin önüne koyulduğunda ne kadar yaratıcı olabileceğini öğreten şeydir. Bu, sorunlara en iyi ve en yaratıcı çözümlerin bazılarının yaratıldığı zamandır.

    Sosyal Medya Yönetimi

    Günümüzde sosyal medyanın gücü tartışılamaz. Takımınızın güçlü bir sosyal medya yönetimi yapıyor olması faaliyetlerinizi duyurmak, topluluğunuzu güzel örnekler ile etkilemek ve sponsorluk taleplerinizin daha kolay yanıtlanmasını sağlayacaktır.

    Yapmış olduğunuz etkinlik ve çalışmalarınızı düzenli olarak uygun etiketler ile oluşturacağınız sosyal medya hesaplarınız üzerinden paylaşınız. Bu şekilde tüm FRC topluluğu sizlerden haberdar olacaktır.

    Takım içerisinde görevi sosyal medya yönetimi olan bir ekibin olması faydalı olacaktır.

    Tüm Kullanıcılar'ı seçerseniz, görünen güvenlik istemini kabul etmeniz gerekir.

    VSCode İndirin

    Lisanslama nedeniyle, yükleyici paketlenmiş VSCode yükleyicisini içeremez. VSCode yükleyicisini indir veya önceden indirilmiş bir kopya seçmek için VSCode Seç / İndir'i tıklatın. İnternet bağlantısı olmayan diğer makinelere kurmak istiyorsanız, indirme tamamlandıktan sonra, Çevrimdışı Yükleyici ile birlikte kopyalamak üzere dosya sistemindeki zip dosyasına götürmek için İndirilen Dosyayı Aç seçeneğine tıklayabilirsiniz.

    Kurulumu çalıştırın

    Tüm onay kutularının işaretli olduğundan emin olun (bu makineye 2019 WPILib yazılımı önceden yüklediyseniz ve yazılım otomatik olarak işaretini kaldırmadıysa), sonra Install seçeneğine tıklayın.

    Ne Yüklendi?

    Çevrimdışı Yükleyici aşağıdaki bileşenleri yükler:

    • Visual Studio Code - 2019 robot kodu geliştirme için desteklenen IDE. Çevrimdışı yükleyici, makinenizde VSCode olsa bile, WPILib geliştirme için ayrı bir VSCode kopyası hazırlar. Bu, WPILib kurulumunu çalıştıran ayarların bazılarının VSCode'u diğer projeler için kullanıyorsanız mevcut iş akışlarını bozabileceği için yapılır.

    • C ++ Compiler - roboRIO için C ++ kodu oluşturma araçları

    • Gradle - C ++ veya Java robot kodu oluşturmak / dağıtmak için kullanılan Gradle sürümü

    • Java JDK / JRE - Java robot kodunu oluşturmak ve Java tabanlı Araçlardan herhangi birini Çalıştırmak için kullanılan, Java JDK / JRE'nin belirli bir sürümü. Bu, mevcut herhangi bir JDK kurulumuyla yan yana var ve JAVA_HOME değişkeninin üzerine yazmıyor.

    • WPILib Araçları - SmartDashboard, Shuffleboard, Robot Oluşturucu, Anahat Görüntüleyici, Pathweaver

    • WPILib Bağımlılıkları - OpenCV, vs.

    • VSCode Uzantıları - VSCode'da robot kodu gelişimi için WPILib uzantıları

    Yüklenenler - Devam

    Çevrimdışı Yükleyici, VSCode’un WPILib kopyasına bir Masaüstü Kısayolu da kurar ve bir komut kısayolu kurar, böylece VSCode’nin bu kopyası "frccode2019" komutunu kullanarak komut satırından açılabilir.

    Bunların her ikisi de WPIlib C ++ Java araçları olarak belirli yıla referans veriyor, şimdi farklı mevsimlerden birden fazla ortamın yan yana kurulmasını destekliyor.

    Bitirelim

    Yükleyici tamamlandığında, şimdi VSCode'un WPILib sürümünü açabilecek ve kullanabileceksiniz. Herhangi bir 3. parti kütüphaneyi kullanıyorsanız, bunları robot kodunda kullanmadan önce bunları ayrı ayrı kurmanız gerekecektir.

    GitHub'dan
    https://github.com/Fikretyukselfoundation/FRCturkey
    Yeni içerik oluşturmak
    İçeriğinize isim vermek ve yazmak
    Kaydedin
    Artistanbul

    FRC için Farklı bir IDE kullanmak

    İçerik için Imperium #6874 takımına teşekkür ederiz.

    FRC için Farklı bir IDE kullanmak

    FRC için farklı IDE kullanmak

    IDE (Integrated Developement Environment): Bilgisayar programcılarının yazılım geliştirmesi için uygun şartlar sağlayan, içindeki araçlar ile yazılımınızın hızlıca gelişmesine yardımcı olan programlardır.

    Şu anda FIRST'ün FRC için desteklediği IDE Visual Studio Code. Peki neden başka IDE kullanmak isteyelim? Bunun birden fazla nedeni olabilir.

    • Performans sıkıntıları yaşıyor olabilirsiniz.

    • Diğer IDE'lerin bulundurduğu araç Visual Studio Code'da bulunmayabilir.

    • Başka bir IDE kullanmaya alışmış olabilirsiniz.

    Peki biz IDE'mizi değiştirmek için ne yapmalıyız?

    Eğer var olan bir projeniz yoksa

    Projeniz yoksa ilk işiniz proje temel dosyalarını indirmek olacaktır. adresine giderek buradan en üstteki sürümden java.zip'i indiriyoruz.

    Ardından indirdiğimiz sıkıştırılmış klasördeki tüm dosyaları yeni açtığımız proje klasörüne çıkartıyoruz. Çıkarttıktan sonra proje dosyalarından build.gradle'da ufak ayarlar yapmamız gerekiyor. plugins {} bloğunda bulunan id "edu.wpi.first.GradleRIO" version "xxxx.xx.xx" bölümündeki xxxx.xx.xx ile belirtilen versiyonu sitesinden bakarak en son sürüm ile güncelleyebilirsiniz.

    En sonunda böyle bir satır elde etmeniz gerekiyor.

    Eğer kodunuzda sınıfınızın paket ismini değiştirecekseniz def ROBOT_MAIN_CLASS = "frc.team0000.robot.Main" satındaki sınıfı kendinize göre düzenleyebilirsiniz. Daha sonra proje klasöründen .wpilib/wpilib_prefences.json dosyasını düzenliyoruz.

    En sonunda ise projenin ana klasöründe komut istemcisi açıp gradlew komutunu çalıştırabiliriz.

    Eğer var olan bir Visual Studio Code projeniz varsa

    O zaman sizin için proje dosyaları Visual Studio Code tarafından oluşturulmuştur.

    Peki projemizi başka IDE'lere nasıl taşıyacağız?

    Projemizi Eclipse ya da IntelliJ IDEA'da kullanmak için proje klasörümüzün içindeki build.gradle dosyasını açarak plugins {} bloğunu istediğiniz IDE'yi ekleyerek güncellemelisiniz.

    Daha sonra proje klasörümüzde komut istemcisini açıp eğer IntelliJ IDEA kullanacaksak gradlew idea, eğer Eclipse kullanacaksak gradlew eclipse yazarak klasörünüzün içinde IDE Proje dosyalarınızın oluştuğunu göreceksiniz. Eğer IntelliJ IDEA ya da Eclipse'den başka IDE kullanmak istiyorsanız ne yazık ki onların Gradle için plugin desteği bulunmamakta, fakat bahsedeceğim komutlar ile kendi IDE'nizi de kullanabilirsiniz!

    GradleRIO Komutları

    Bu komutları proje ana klasörünüzde komut istemcisi ile çalıştırırsanız aşağıdaki sonuçları elde edersiniz.

    Genel Komutlar

    • gradlew build komutu robotunuzun kodunu derler.

    • gradlew deploy komutu robotunuzun kodunu derleyip o kodu robota yükler.

    • gradlew riolog komutu RoboRIO konsolunuzun komut ekranında gösterilmesini sağlar.

    Yarışmada mısınız? İnternete bağlı değil misiniz? Komutu --offline parametresi ile çalıştırın. örn. gradlew deploy --offline

    3. Parti kütüphaneleri kurmak

    Proje ana klasörümüz içinde vendordeps adlı bir klasör açıyoruz. İçine kurmak istediğimiz 3. Parti kütüphanenin .json dosyasını kaydediyoruz.

    Örnek olarak CTR-E Phoenix: C:\Users\Public\frc2019\vendordeps içinde Phoenix.json olarak bulunur.

    WPILib kütüphanesini güncellemek

    Güncelleme yapmak için en başta Gradle sürümünü güncellemeniz gerekiyor. build.gradle dosyasının aşağısındaki gradleVersion değerini Gradle sürümüne göre değiştirebilirsiniz. Değiştirdikten sonra proje ana klasöründe gradlew wrapper komutunu çalıştırın.

    Daha sonrasında plugins {} bloğunda bulunan id "edu.wpi.first.GradleRIO" version "xxxx.xx.xx" bölümündeki xxxx.xx.xx ile belirtilen versiyonu sitesinden bakarak en son sürüm ile güncellemeniz gerekiyor.

    En sonunda güncellediğiniz sürüme göre bu şekilde bir satır elde etmeniz gerekiyor.

    Daha sonrasında rahatça yazılımınızı güncel bir şekilde kullanabilirsiniz.

    Co-Processor - Bilgisayar

    Bilgisayarı Co-processor olarak kullanmak

    Renk İşlemek

    Eğer Raspberry Pi kullanmadan doğrudan bilgisayar aracılığı ile görüntü işlemek için bilgisayarınıza Python ve belirli kütüphaneleri kurmanız gerekmektedir. Gerekli kütüphaneleri şu şekilde kurabilirsiniz:

    Görüntü İşleme Workshop | Fikret Yüksel Foundation #FRCTurkeyYouTube
    GitHub - KelRot/KelRot-5655-Deep-Space-Code: FRC 2019 Deep Space Robot code of KelRot #5655GitHub
    5655 - 2019 Deep Space
    https://github.com/IMC4191FRC/Season-2018github.com
    4191 - 2018 Power Up
    camera = cv2.VideoCapture(0) #  webcamin bagli oldugu port varsayilan 0

    FRC Mentorları

    Mentor, güvenilir bir danışman veya rehberdir. Mentor destek, danışmanlık, motivasyon sağlayan model olan bireydir. Mentorlar öğrencilerin potansiyellerine ulaşmalarında yardımcı olan kişilerdir. Mentor tavsiye verir, bilgi ve deneyimleri paylaşır, az baskı yapan ve öğrencinin kendisini keşfetmesini sağlayacak bir yaklaşımla öğretir.

    Hazırlık ve turnuva kapsamında deneyimi kazanabilmek adına işleyişin öğrenciler tarafından yürütülmesi esastır ancak gereken noktalarda öğrencilerin yetişkin yardımı alması gerekecektir.

    Takımınızda öğrencilerin olası sorunları ile ilgilenecek, gerekli izinleri alacak, teknik yada yönetimsel konularda sizlere destek verecek en az bir mentor bulunması takımınız için faydalı olacaktır. İhtiyaç duyduğunuz desteğe göre takımınızda birden fazla mentor bulunabilir.

    Bu mentorların asıl görevi yol göstermek ve danışmanlık yapmaktır. Karşılaşılan problemlere nasıl yaklaşılması gerektiği, öğrenme metodu, yol haritası belirleme gibi konularda deneyim ve düşüncelerini takıma aktarabilir.

    Mentor dediğimiz kişi robot yapımına yardım eden bir mühendis, eski bir mezun, bir veli, okul yöneticisi, öğretmen ya da bir eğitimci olabilir. Mentorların takım içerisinde bulundukları pozisyon aslında o takımın organizasyon yapısına dahildir bu nedenle takımınızı oluştururken ihtiyaç duyduğunuz alanlarda ihtiyaç duyduğunuz sayıda mentora sahip olmanızı tavsiye ederiz.

    pip install pillow

    pip install opencv-python

    pip install pynetworktables

    pip install imutils

    Kodunuzu yazıp kaydettikten sonra çalıştırmak için konsoldan şu komutu girmeniz gerekmektedir:

    python yazilimadi.py

    Javadan Değerleri Çekin!

    Kütüphaneleri import edin

    Class'ınızın altına networktables'i tanımlayın

    Değerleri okumak için 2 tane void oluşturalım.

    Değerleri SmartDashboard'a yazdıralım.

    Motorlarımız Değerlere göre haraket ettirelim!

    Kodların tamamına buradan ulaşabilirsiniz :

    Artık robotunuzu enable ettiğinizde , yazılımımızı çalıştırdığımızda değerler otomatik olarak SmartDashboard'a düşmeye başlayacaktır.

    import edu.wpi.first.wpilibj.networktables.NetworkTable; // Networktables kütüphanesi
    import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; // smartdashboardan verileri görmek için
    import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
    GradleRIO
    Gradle - GradleRIO Plugin
    Gradle - GradleRIO Plugin
    gradlerio
    Gradle - GradleRIO Plugin
    Gradle - GradleRIO Plugin
    İçerik için Imperium #6874 takımına teşekkür ederiz.

    CAN cihazlarının kullanımı

    CAN alt sistemini RoboRIO ile kullanma

    RoboRIO ile CAN kullanılması, robot kontrol cihazı ve çevre cihazları arasında önceki bağlantı yöntemlerine göre birçok avantaj sunar.

    CAN bağlantıları, tüm cihazlar arasında papatya şeklinde zincirlenmiş tek bir telden geçmektedir, bu nedenle ev kablolaması gerekli değildir. Bu protokol tabanlı sinyalizasyon olduğundan cihazlar akıllı olabilir ve başlatma, durdurma ve hızı ayarlama dışında daha yüksek seviyeli komutları kabul edebilir. Cihazlar durumu robot kontrol cihazına rapor edebilir ve CAN kullanan cihazları kullanarak çok daha iyi kontrol algoritmalarına sahip olabilir. FRC kontrol sisteminde desteklenen çeşitli CAN cihazları vardır:

    1. Jaguar hız kontrolörleri

    2. CAN-Talon hız kontrolörleri

    3. Güç Dağıtım Panosu (PDP)

    4. Pnömatik Kontrol Modülü (PCM)

    Cihazlar tipik olarak, bükülmüş çift kablo kullanarak (modüler telefon tarzı konektörler kullanan Jaguar hariç) RoboRIO CAN veriyoluna bağlanır.

    Jaguar nesnesi oluşturma

    Her fiziksel Jaguar, C ++ veya Java'da karşılık gelen bir Jaguar nesnesine sahiptir. Jaguar nesneleri, aşağıdaki gibi her iki dilde yeni operatör kullanılarak oluşturulur:

    CANJaguarIDValue değeri, gerçeklenmekte olan cihaz için RoboRIO'nun web arayüzünde programlanmış CAN ID'dir. En son ürün yazılımı sürümünün Jaguar'da yüklü olduğundan emin olun. Jaguar örneğini oluşturduktan sonra çalışma modu ayarlanmalı ve çalışma modunu gösterildiği gibi ayarlamak için enableControl () yöntemi çağrılmalıdır:

    Kontrol modu, programa çalışma moduna özgü diğer parametreleri ayarlama şansı vermek için EnableControl () çağrılana kadar ayarlanmaz. Bu örnekte Jaguar referans sensörü olarak bir kuadratür kodlayıcı ile Yüzde Moduna ayarlanmıştır. SetPercentMode () yöntemindeki enkoderin belirlenmesi, programın gösterilen enkoderler ile ilgili konum hakkında geri bildirim almasına izin verecektir:

    Sınırları kullanma Jaguar ile kullanılabilecek iki tür sınır vardır:

    1. Yumuşak limitler - referans cihaz değerleri Jaguar'ın minimum veya maksimum sayıda enkoder dönüşü gibi her iki yönde de geçmeyeceği değerlerdir.

    2. Limit anahtarları - bir mekanizmanın maksimum hareketini kontrol eden anahtarlar

    Yumuşak sınırlar etkinleştirilip devre dışı bırakılabilir, limit anahtarı kontrolü daima tüm Jaguar modlarında (PWM dahil) çalışır. Limit anahtarları kullanılmazsa, Jaguar'ın düzgün bir şekilde çalışmasını sağlamak için jumperların takılması gerekir. Jumperların kullanımı hakkında ayrıntılı bilgi için Jaguar belgelerine bakın.

    Jaguar'da kapalı döngü kontrolünü kullanma

    Kapalı çevrim kontrolü, Jaguar'ın sensör girişlerine bakması, bir hata değeri (sensör değeri ve ayar noktası arasındaki fark) hesaplaması, bazı aktüatörleri (motorları) ve döngüleri çalıştırması anlamına gelir. Jaguarlar, hız, Pozisyon ve Akım çalışma modları için cihaz içinde bu algoritmayı gerçekleştirebilir. Kapalı döngü geri bildirimini kullanmak için aşağıdakileri yapmanız gerekir:

    1. SetMode () yöntemini kullanarak istenen modu ayarlayın

    2. Doğru ayar modu yönteminde P, I ve D sabitlerini sağlayın

    3. Operasyon için uygun bir sensör sağlayın

    4. ve denetleyicinin çalışmasını başlatmak için EnableControl () öğesini çağırın.

    İlk üç işlem tipik olarak SetMode () yöntemi ile yapılır - sensör ve P, I ve D sabitleriyle birlikte verilir.

    Voltaj kontrolü kullanma

    Çıkış voltajı, sistem bara voltajının yüzdesi veya yukarıda açıklandığı gibi mutlak bir voltaj olabilir. Jaguar'ı Gerilim modunda ayarlamak için aşağıdaki yöntemi kullanın:

    ve Yüzde Voltaj moduna ayarlamak için bu yöntemi kullanın:

    Her iki durumda da burada gösterildiği gibi bir referans cihaz belirtilebilir:

    Bu durumda, bir CPI (counts per revolution)(devir başına sayım) değeri ile referans cihaz olarak bir kuadratür enkoder seçilir. Enkoderin değerini okuyabilir, fakat cihazı kontrol etmek için kullanılmaz - sadece bağlı bir sensör olarak ele alınır.

    Pozisyon kontrolünü kullanma

    Pozisyon kontrolü, motoru hassas konumlara getirmek için PID sabitleri ile birlikte bir potansiyometre veya kareleme enkoder kullanabilir. Konum modunu ayarlarken, sensörü (bu durumda bir kuadratür enkoder), devir başına sayım sayısını ve dahili PID geri besleme döngüsü için P, I ve D sabitlerini belirtmeniz gerekir.

    Bu program Jaguar'ı konum moduna getirir ve motoru enkoder 10'a yönlendirir. Unutmayın ki, bu kodlayıcı bir transmisyonun bir ara dişli üzerine monte edilebildiğinden, motor mili rotasyonları zorunlu değildir.

    Hız kontrolünü kullanma

    Jaguar'ı gösterildiği gibi SetMode yöntemini çağırarak hız moduna geçirin:

    EncoderTag şunlardan biridir: kEncoder, kQuadEncoder veya kPotentiometer. CodesPerRev argümanı, kodlayıcının kullandığı devir başına sayım sayısıdır.

    Jaguar dan durumunu alma

    Burada gösterildiği gibi çeşitli durum değerleri Jaguarlardan okunabilir:

    Bu yöntemler Jaguar'dan çeşitli çalışma değerlerini döndürür. Son yöntem, GetFaults (), çeşitli türlerde hatalar olup olmadığını açıklayan bireysel bitlerle bir bit alanı döndürür. Hataların ve diğer durum yöntemlerinin tam açıklaması için, üstbilgi dosyasına veya seçtiğiniz dile ait JavaDocs'a başvurunuz.

    Jaguar çalışırken, bu servisi talep etmek zorunda kalmadan, her 20 ms'de bir durum değerlerini RoboRIO'ya geri göndermeye ayarlanır. Bu, bu yöntemlerden okuduğunuz durumun, son iletiler kümesinin ne zaman alındığına bağlı olarak 20 ms veya daha eski olabileceği anlamına gelir.

    Pnömatik Kontrol Modülü

    Kompresörü Kontrol Etmek

    Basınç şalteri ve kompresör doğru şekilde bağlandığında, PCM kompresörün kapalı döngü kontrolünü dahili olarak idare eder. Bu kontrolü etkinleştirmek için, gereken tek şey bir solenoid nesnesi ve robotun Etkinleştirilmesidir. Daha fazla bilgi için,

    Solenoidlerin Kullanımı

    RoboRIO için WPILib Solenoid sınıfı artık PCM kullanılarak selenoidleri uygulayan biri ile değiştirilmiştir. Aynı yöntemler şimdi PCM'deki Solenoid portlarına takılan pnömatikleri kontrol edecektir, böylece kodunuz çoğunlukla değişmeden çalışmalıdır. Daha fazla bilgi için,

    Power Distribution Panel

    2015 için Güç Dağıtım Panosu (PDP), devre korumalı 12V çıkışlardan herhangi birine bağlı olan her bir cihaza akımı ölçebilmeyi sağlar. Bu kabiliyete sahip olmak, ek donanım gerektirmeden motorlar tarafından geliştirilen torkun algılanmasını gerektiren bir dizi algoritma kullanma imkanı sunar. PDP, CAN veriyolu üzerinden RoboRIO'ya bağlanır ve kütüphaneler iletişimi yönetmeye özen gösterir.

    Kullanmak için PowerDistributionPanel nesnesinin bir örneğini oluşturun:

    PowerDistributionPanel pdp = yeni PowerDistributionPanel ();

    Not: Değerleri okumanız gerekmedikçe bir PowerDistributionPanel nesnesi oluşturmak gerekli değildir. Nesne hiç oluşturulmasa bile kart tüm kanallarda çalışır ve güç sağlar.

    PDP CAN ID

    C ++ ve Java WPILib'in mevcut sürümleriyle çalışmak için PDP için CAN ID 0 olmalıdır.

    PDP voltajını ve sıcaklığını okumak

    PDP'ye gelen voltajı ve PDP'deki bileşenlerin sıcaklığını okuyabilirsiniz. Motorların yüksek bir tork ayarında çalışıp, sistem akü voltajının düşmesine neden olduğunda, voltajın ölçülmesi önemli olabilir.

    PDP'deki kanal başına akımı okumak

    PowerDistributionPanel nesnesini kullanarak PDP'nin bireysel kanallarındaki akımı okuyabilirsiniz. Kanal 1'deki akımı okumak için getCurrent yöntemini kullanın:

    double current = pdp.getCurrent(1);

    Bu, amper cinsinden geçerli değeri döndürür.

    Not: Kanal numaraları 0 tabanlıdır.

    GitHub - SPaRC-Robotics/Steampowered2017: Team 5665 SPARC's robot code for FRC 2017 Steamworks.GitHub
    5665 - 2017 Steamworks
    GitHub - besiktasrsports/robot-2020GitHub
    7285 - 2020 Infinite Recharge
    GitHub - team-7108/robot2019GitHub
    7108 - 2019 Deep Space
    GitHub - Adroit-Androids/6025-2017-Steamworks-code: 6025 2017 SteamworksGitHub
    6025 - 2017 Steamworks
    GitHub - Adroit-Androids/Turkishoffseason2016-Robot-Code: Turkishoffseason2016 Robot CodeGitHub
    6025 - 2016 Off Season
    GitHub - INTEGRA-3646/FRC-2019-Public: Robot code of the FRC team INTEGRA 3646, for 2019 season.GitHub
    3646 - 2019 Deep Space
    GitHub - istanbulls/2016_StrongHold_6064: Team 6064 IstanBulls FIRST FRC StrongHold game robot code LabviewGitHub
    6064 - 2016 StrongHold

    FRC Java Temelleri

    Java Metodları , Nesneler ve Değişkenler

    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.

    Videolu Java Anlatım

    FRC Java ile temel robot sürüşü

    FRC Java ile motorları çalıştırmak

    AM14U4 - 6 Wheel Drop Center Robot Drive Base - FIRST Kit of Parts ChassisAndyMark
    import numpy as np
    from PIL import ImageGrab
    from collections import deque
    from networktables import NetworkTables
    import cv2
    import time
    import imutils
    import argparse
    import cv2 as CV
    
    x = 0 #programın ileride hata vermemesi için x 0 olarak tanımlıyorum
    y = 0 # programın ileride hata vermemesi için y 0 olarak tanımlıyorum
    
    NetworkTables.initialize(server='roborio-6025-frc.local') # Roborio ile iletişim kuruyoruz
    
    table = NetworkTables.getTable("Vision") # table oluşturuyoruz
    
    #sari rengin algilanmasi
    colorLower = (24, 100, 100)
    colorUpper = (44, 255, 255)
    #converter.py ile convert ettiğiniz rengi buraya giriniz
    
    def screen_record():
        x = 0
        y = 0
        r = 0
        last_time = time.time()
        while(True):
            # 800x600 windowed mode
            printscreen =  np.array(ImageGrab.grab(bbox=(0,40,1024,768)))
            print('Tekrarlanma süresi : {} saniye'.format(time.time()-last_time))
            last_time = time.time()
    
            frame = printscreen
            frame = imutils.resize(frame, width=600)
            frame = imutils.rotate(frame, angle=0)
            hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
            mask = cv2.inRange(hsv, colorLower, colorUpper)
            mask = cv2.erode(mask, None, iterations=2)
            mask = cv2.dilate(mask, None, iterations=2)
            cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
            cv2.CHAIN_APPROX_SIMPLE)[-2]
            center = None
            if len(cnts) > 0:
                c = max(cnts, key=cv2.contourArea)
                ((x, y), radius) = cv2.minEnclosingCircle(c)
                M = cv2.moments(c)
                center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
                if radius > 10:
                    cv2.circle(frame, (int(x), int(y)), int(radius),
                    (0, 255, 255), 2)
                    cv2.circle(frame, center, 5, (0, 0, 255), -1)
            else:
                x = 0
                y = 0
    
            print("x : ")
            print(x)
            print("y : ")
            print(y)
            table.putNumber("X", x) # roborioya değeri göndermek
            table.putNumber("Y", y) # roborioya değeri göndermek
    
            cv2.imshow('frame', frame)
            cv2.waitKey(1)
    screen_record()
    	public static NetworkTable table1 = NetworkTable.getTable("Vision"); // vision adında table çekiliyor
    public static double konumX()
    	{
    		return table1.getNumber("X", 0.0); //raspberry pi den gelen x kordinatları
    	}
    	public static double konumY() 
    	{
    		return table1.getNumber("Y", 0.0); //raspberry pi den gelen y kordinatları
    	}
    	public void teleopPeriodic() {
    		SmartDashboard.putNumber("Nesnenin X konumu: ", konumX()); // smartdashboarda x konumu yazdır
    		SmartDashboard.putNumber("Nesnenin Y konumu: ", konumY()); // smartdashboarda y konumunu yazdır
    
    	}
    public void autonomousPeriodic() {
    	    if(konumX() == 0)
    	{
    	sagmotor1.set(0);
    	sagmotor2.set(0);
    	solmotor1.set(0);
    	solmotor2.set(0);
    	}
    		else if(konumX() < 285) // degerler 285'ten kucukse saga don
    		{
    		sagmotor1.set(0.5); // sag motorları calistir
    		sagmotor2.set(0.5);
    		}
    		else if (konumX() > 295) // degerler 295'ten buyukse sola don
    		{
    		solmotor1.set(0.5); //sol motorlari calistir
    		solmotor2.set(0.5);
    		}
    
    	}
    id "edu.wpi.first.GradleRIO" version "2019.1.1"
    {
      "enableCppIntellisense": false,
      "currentLanguage": "java",
      "projectYear": "2019", //yarışma senesi
      "teamNumber": 6874 //takım numarası
    }
    plugins {
        //...
        id 'idea' //Eğer IntelliJ IDEA kullanacaksanız
        id 'eclipse' //Eğer Eclipse kullanacaksanız
    }
    task wrapper(type: Wrapper) {
        gradleVersion = '5.0'
    }
    id "edu.wpi.first.GradleRIO" version "2019.1.1"
    bkz. Pnömatik için kompresör çalıştırma.
    bkz. Çalışma pnömatik silindirleri - Solenoidler
    m_jaguar = new CANJaguar(CANJaguarIDValue);
    m_jaguar->SetPercentMode(CANJaguar::QuadEncoder, 360);
    	m_jaguar->EnableControl();
    	m_jaguar->Set(0.0f);
    	double initialPosition = m_jaguar->GetPosition();
    		m_jaguar->SetVoltageMode();
    m_jaguar->SetPercentMode();
    	m_jaguar->SetPercentMode(CANJaguar::QuadEncoder, 360);
    m_jaguar->SetPositionMode(CANJaguar::QuadEncoder, 360, 10.0f, 0.4f, 0.2f);
    	m_jaguar->EnableControl();
    	double setpoint = m_jaguar->GetPosition() + 10.0f;
    	m_jaguar->Set(setpoint);
    setSpeedMode(EncoderTag tag, int codesPerRev, double p, double i, double d)
    m_jaguar->GetBusVoltage();
    	m_jaguar->GetOutputVoltage();
    	m_jaguar->GetOutputCurrent();
    	m_jaguar->GetTemperature();
    	
    	m_jaguar->GetFaults();

    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.

  • Java'da operatör arayüzü nesneleri oluşturma

    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.

    1. DS'deki USB bağlantı noktasına 1'e bağlı bir Joystick nesnesi oluşturur.

    2. Joystick'in geçerli X ekseni değerini alır ve "speed" değişkeninde saklar.

    Sınıf, yöntem ve değişken adlandırma

    MXP IO Numarlandırılması

    Java'da multithreading

    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.

    Thread

    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 Seçmek

    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.

    IterativeRobot

    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

    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.

    SampleRobot

    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.

    Command-Based Robot

    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.

    FRC Java ile dijital sensörlerin kullanımı

    FRC Java ile oyun sahasında FMS'ten veri çekmek

    FRC Java ile NAVX sensör ile 90 derecelik dönüşler yapmak

    FRC Java ile Roborio'ya gömülü olan Accelerometre sensöründen veri almak

    FRC Java ile Sensörsüz otonom yazmak

    Co-Processor - Cmucam5 Pixy

    Raspberry Pi İle Pixy Kullanımı içeriğinde sağladığı kaynaklar için #6025 Adroit Anroids takımına teşekkürler!

    Pixy Nedir?

    Pixy, nesneleri en hızlı şekilde tanıtarak onları bulmak için tasarlanmış bütünleşik bir kamera modülü diyebiliriz. Üzerinde NXP Firmasının LPC4330 Çift çekirdekli mikrodenetleyici, 204Mhz de çalışan 32bit ARM Cortex-M4 ün yanında ayrıca 204Mhz de çalışan 32bit ARM Cortex-M0 işlemcisi bulunmakta.Nesneleri tanıtmak için yapmanız gereken tek şey, nesneyi kameraya gösterip üzerinde bulunan butona basmak. Modül, turuncu, sarı, kırmızı, mavi, açık mavi, yeşil ve mor olmak üzere 7 rengi tanıyabiliyor. (kaynak : https://www.robimek.com/nesnelerin-rengini-ve-konumunu-algilayan-pixy-kamera-modul/)

    Pixy Teknik Özellikleri

    İşlemci: NXP LPC4330, 204 MHz, dual core Görüntü Sensörü: Omnivision OV9715, 1/4″, 1280×800 Lens Görüş Alanı: 75 degrees horizontal, 47 degrees vertical Lens Tipi: standard M12 (several different types available) Güç Tüketimi: 140 mA typical Güç Girişi: USB input (5V) or unregulated input (6V to 10V) RAM: 264K bytes Flaş: 1M bytes Kullanılabilir Veri Çıktıları: UART serial, SPI, I2C, USB, digital, analog Boyutlar: 2.1″ x 1.75″ x 1.4″

    Bir megapixel çözünürlüğe sahip sensör, 60FPS’de 640×400(WXGA), 30FPS de ise 1280×800(WXGA) çözünürlükte resim alabiliyor.

    FRC Pixy

    Pixy Modülün Kullanımı ve Ayarları

    Pixy wiki sayfasını açın >>

    Wiki sayfasında PixyMon adlı programı işletim sisteminize uyumlu linkten indirin.

    Pixy Modüle Nesne Tanıtma

    Pixy ‘ye nesne tanıtma işlemini iki şekilde yapabilirsiniz. Birincisi PixyMon programı ile ekrandan fare ile nesneyi seçerek, ikincisi ise modül üzerinde bulunan butona basarak nesneyi tanıtabilirsiniz.

    1.Adım: Şimdi öğretmek istediğiniz nesneyi Pixy’nin önünde tutun ve açılan menüden Action-> Set signature 1‘i seçin.

    2.Adım: Fareyi kullanarak, Pixy’nin nesneyi öğrenmek için kullanmasını istediğiniz bölgeyi seçmek için tıklatın ve sürükleyin.

    3.Adım: Bölgeyi seçtikten sonra, Pixy, nesnenizi öğrenir ve otomatik olarak video moduna girer, böylece renk imzanızın ne kadar iyi çalıştığını doğrulayabilirsiniz.

    Renk İmzası Ayarı

    Pixy, nesneyi daha net hatlarıyla tanıması için birkaç ayar yapılmalıdır. Dişli çark simgesini tıklayın ve Pixy Parameters altındaki Signature Tuning bölmesini seçin.

    Signature 1 kısmından uygun görünümü yakalayana kadar değerleri değiştirin.

    Tüm imza için algılama doğruluğunu en üst düzeye çıkarmak için yedi renk imzasını bu şekilde ayarlayabilirsiniz. Kaydırıcı aralıklarını kaydetmek için Uygula’ya veya Tamam’a basmayı unutmayın! Ayarlamış olduğunuz değerler, İptal düğmesine basarsanız veya iletişim kutusunu kapattığınızda kaydedilmeyecektir.

    Buton İle Nesne Tanıtma

    Pixy ‘nin en avantajlı yönlerinden biri üzerinde bulunan butona basarak nesneyi tanıtabiliyoruz. Modüle enerji verin. Önünde bulunan rgb led beyaz yandıktan sonra sönecektir. Söndükten sonra tanıtmak istediğimiz nesneyi kameraya gösterin ve butonu yaklaşık 1.5 saniye basılı tutun. Önünde bulunan ledin beyaz yandığını göreceksiniz. Bu durum modülün öğrenme modunu aktif ettiği anlamına gelir. Basılı tuttuğunuz sürece ledin rengi kırmızı, turuncu, sarı, açık mavi, mavi, mor şeklinde yanmaya devam eder ve tekrar beyaz renge dönerek tekrarlar. Bu renkler pxymoon programındaki Set Signature 1, Set Signature 2, Set Signature 3, Set Signature 4, Set Signature 5, Set Signature 6, Set Signature 7 adet öğrenme hafızasını temsil eder. Şimdi led renk değiştirirken butonu bıraktığınız anda hangi renk yanıyorsa o rengin karşılığı olan öğrenme hafızasına kaydeder. Örnek verecek olursak, turuncu renk yandığında butonu bırakırsanız ledin rengi kamera önüne koyduğunuz cismin rengine döner ve butona tekrar basıp bıraktığınızda led parlak bir şekilde turuncu flaş yaparak 2. hafıza bölgesine kayıt olur. Bu şekilde diğer hafıza bölgelerine de cisim kaydedebilirsiniz.

    Genel Bilgi

    Pixy doğrudan Roborio'ya bağlanamaz. Çünkü Pixy kütüphaneleri Roborio'yu desteklememektedir. FRC'de Pixy kullanabilmek için 2 yol vardır.

    • Pixy Raspberry pi ile çalıştırıp verileri networktables ile Roborio 'ya aktarmak..

    • Pixy Arduino ile çalıştırıp verileri I2c portu veya SPI portu ile Roborio 'ya aktarmak.

    Yani Pixy donanımını tek başına kullanamazsınız. Eğer Pixy kullanmak istiyorsanız 1 adet Raspberry Pi veya Arduino 'ya ihtiyacınız vardır.

    Raspberry Pi ile Pixy Kullanımı

    Kurulum

    Python SWIG modülü oluşturmak için bağımlılıkları kurun

    Bir uçbirim penceresine şunu yazın: sudo apt-get install swig

    Libusb-1.0-0-dev'i kurun.

    sudo apt-get install libusb-1.0-0-dev

    G ++ (derleyici) yükleyin.

    sudo apt-get install g++

    Libboost'u yükleyin.

    sudo apt-get install libboost-all-dev

    Pixy kaynak kodunu indirin.

    git clone https://github.com/charmedlabs/pixy.git

    Python modülünü oluşturun.

    cd pixy/scripts ./build_libpixyusb_swig.sh

    Kodun olduğu dizine gidin.

    cd ../build/libpixyusb_swig

    Ardından wget komutu ile Pixy kodlarımızı indirelim.

    Artık kodlarınız hazır. Kodlarınızı python pixy.py komutuyla çalıştırabilirsiniz.

    Javadan Değerleri Çekin!

    Kütüphaneleri import edin

    Class'ınızın altına networktables'i tanımlayın

    Değerleri okumak için 2 tane void oluşturalım.

    Değerleri SmartDashboard'a yazdıralım.

    Motorlarımız Değerlere göre haraket ettirelim!

    Kodların tamamına buradan ulaşabilirsiniz :

    Artık Pixy yazılımınızı Raspberry Pi 'den çalıştırdığınızda robotunuz otomatik olarak roborio ile haberleşmeye başlayacaktır.

    FRC 2018 için Labview Kurulumu (sadece LabVIEW)

    Uninstall Old Versions (Recommended)

    Uninstall Old Versions (Recommended)

    NOTE: If you wish to keep programming cRIOs you will need to maintain an install of LabVIEW for FRC 2014. The LabVIEW for FRC 2014 license has been extended. While these versions should be able to co-exist on a single computer, this is not a configuration that has been extensively tested.

    Before installing the new version of LabVIEW it is recommended to remove any old versions. The new version will likely co-exist with the old version, but all testing has been done with FRC 2017 only. Make sure to back up any team code located in the "User\LabVIEW Data" directory before un-installing. Then click Start >> Control Panel >> Uninstall a Program. Locate the entry labeled "National Instruments Software", right-click on it and select Uninstall/Change.

    Select Components to Uninstall

    In the left pane of the dialog box that appears, select all entries. The easiest way to do this is to click the top entry to highlight it, then scroll down to the bottom entry, press and hold shift and click on the last entry then release shift. Click Remove. Wait for the uninstaller to complete and reboot if prompted.

    Getting LabVIEW Installer

    Either locate and insert the LabVIEW DVD or download the LabVIEW 2018 installer from

    If downloaded, right click on the downloaded file (NI_FRC2018.zip) and select Extract All.

    Note: This is a large download (~4GB). It is recommended to use a fast internet connection and to use the NI Downloader to allow the download to resume if interrupted.

    Installing LabVIEW

    National Instruments LabVIEW requires a license. Each season’s license is active until January 31st of the following year (e.g. the license for the 2018 season expires on January 31, 2019)

    Teams are permitted to install the software on as many team computers as needed, subject to the restrictions and license terms that accompany the applicable software, and provided that only team members or mentors use the software, and solely for FRC. Rights to use LabVIEW are governed solely by the terms of the license agreements that are shown during the installation of the applicable software.

    Welcome

    Double click on autorun.exe to launch the installer. If prompted to allow changes click Yes. To install LabVIEW to program your FRC robot, click the top option Install Everything for LabVIEW Development. To install only NI Vision Assistant for use with C++ or Java, click Install Only NI Vision Development Module.

    Warnings

    Click "Next"

    Product List

    Click "Next"

    Product Information

    Un-check the box, then click "Next"

    User Information

    Enter name, organization, and the serial number from the LabVIEW packet in your KOP. Click "Next". If you cannot find your serial number, please reach out to National Instruments at.

    Destination Directory

    Click "Next"

    License Agreements (1)

    Check "I accept..." then Click "Next"

    License Agreements (2)

    Check "I accept..." then Click "Next"

    Driver Software Installation

    If you see this screen, Click "Next"

    Disable Windows Fast Startup

    If you see this screen, click "Next"

    Start Installation

    Click "Next"

    Overall Progress

    Overall installation progress will be tracked in this window

    Individual Product Progress

    Each product installed will also create an individual progress window like the one shown above.

    Product Information

    Click "Next"

    Installation Summary

    If internet access is available and you are ready to activate, click "Next"; otherwise uncheck the "Run License Manager..." and click "Next".

    NI Activation Wizard

    Log into your ni.com account. If you don't have an account, select 'Create account' to create a free account.

    NI Activation Wizard (2)

    The serial number you entered at the "User Information" screen should appear in all of the text boxes, if it doesn't, enter it now. Click "Activate".

    NI Activation Wizard (3)

    If your products activate successfully, an “Activation Successful” message will appear. If the serial number was incorrect, it will give you a text box and you can re-enter the number and select “Try Again”. If everything activated successfully, click “Next”.

    NI Activation Wizard (4)

    Click "Close".

    Restart Message

    Select "Yes"

    NI Update Service

    On occasion you may see alerts from the NI Update Service about patches to LabVIEW. It is not recommended to install these updates unless directed by FRC through our usual communication channels (Frank's Blog, Team Updates or E-mail Blasts).

    GitHub - INTEGRA-3646/FRC-2018-Public: Control software of ScramJet, our robot for the Power Up (2018) season.GitHub
    3646 - 2018 Power Up

    Co-Processor - Limelight

    Limelight

    Limelight Nedir?

    Limelight, FIRST Robotik Yarışması için özel olarak tasarlanmış bir tak-çalıştır akıllı kameradır . Vision Processing tecrübesi gerektirmez. Vision deneyimi olmayan veya yeterli seviyede mentör hocaları olmayan takımlar için Limelight yeterince kolaydır. Vision processing'e ihtiyaç duyan takımlar için bir alternatiftir.

    Sürücü İstasyonu(Driver Station) Girişleri ve Geri Bildirim

    Sürücü İstasyonuna Genel Bakış

    FRC Driver Station yazılımı, insan operatörler ve robot arasında bir arayüz görevi görür. Yazılım, bir dizi kaynaktan girdi alır ve robot kodunun kontrol mekanizmaları için hareket edebileceği robotu yönlendirir.

    Giriş tipleri

    Yukarıdaki grafik DS yazılımı tarafından iletilebilecek farklı giriş türlerini göstermektedir. En yaygın giriş, 2009'dan beri Parça Kitinde sağlanan Logitech Attack 3 veya Logitech Extreme 3D Pro joystick gibi bir HID uyumlu joystick veya gamepad'tir. Özel IO'nun kullanılmasına izin veren bir dizi aygıtın mevcut olduğunu unutmayın. TI Launchpad ve Parçalar Kitinizde bulunan 16 Hertz Leonardo ++ gibi standart bir USB HID cihazı olarak ortaya çıkar.

    Target Info and Retroreflection | Vision Processing | 2014 FRC Control Systemwpilib.screenstepslive.com
    Gyro headingGyro = new AnalogGyro(1);
    double heading = headingGyro.getAngle();
    public class Robot extends IterativeRobot {
        public void robotInit() {
            Thread t = new Thread(() -> {
                while (true) {
    					// Burada takıldık!
                }
            });
            t.start();
        }
    }
    public class Robot extends IterativeRobot {
        public void robotInit() {
            Thread t = new Thread(() -> {
                while (!Thread.interrupted()) {
    					// Bu sefer takılmadık!
                }
            });
            t.start();
        }
    }
    RobotTemplate::RobotTemplate()
    {
    }
    
    void RobotTemplate::RobotInit()
    {
    }
    
    void RobotTemplate::AutonomousInit()
    {
    }
    
    void RobotTemplate::AutonomousPeriodic()
    {
    }
    
    public class RobotTemplate extends IterativeRobot {
    
         public void robotInit() {
    
         }
    
         public void autonomousInit() {
    
         }
    
         public void autonomousPeriodic() {
    
         }
    }
    RobotTemplate::RobotTemplate()
    {
    }
    
    //This function is called once each time the robot enters autonomous mode.
    void RobotTemplate::Autonomous()
    {
         while (IsAutonomous() && IsEnable()) 
         {
              // Put code here
              Wait(0.05);
         }
    }
    
    // This function is called once each time the robot enters teleop mode.
    void RobotTemplate::OperatorControl() {
         while (isOperatorControl() && isEnabled())
         {
              // Put code here
              Wait(0.05);
         }
    }
    
    public class RobotTemplate extends SampleRobot {
    
         //This function is called once each time the robot enters autonomous mode.
         public void autonomous() {
              // Put code here
              Timer.delay(0.05);
         }
    
         // This function is called once each time the robot enters teleop mode.
         public void operatorControl() {
             while(isOperatorControl() && isEnabled()) {
                   //Put code here
                   //Timer.delay(0.05);
             }
         }
    }
    
    Limelight Kamera

    Montaj

    Limelight'ınızı monte etmek için nylock somunlarıyla birlikte dört adet 1/4 ”10-32 vida kullanın.

    Kablolama

    Not : Limelight bir 12V giriş alır, ancak 6V'a kadar çalışacak şekilde üretilmiştir. LED'leri 7V'a kadar sabit bir parlaklığa sahiptir.

    • Voltaj Regülatörü Modülü ile kullanmayın!

    • Limelight iki kablonnuzu PDP'nizdeki herhangi bir yuvaya geçirin.

    • herhangi bir sigortayı (5A, 10A, 20A, vb.) PDP'deki Aynı yuvaya ekleyin.

    • Limelight'ınızdan bir ethernet kablosunu robot radyonuza bağlayın.

    Image etmek

    • Windows7 kullanmayın.

    • Güç kaynağınızdan çıkarın.

    • En güncel flash aracını ve image İndirme Sayfası'ndan indirin.

    • Flash aracını kurun.

    • Dizüstü bilgisayarınızdan bir USB-MicroUSB kablosuyla ışığınızı ayarlayın.

    • Limelight'e güç verin.

    • Windows arama çubuğundan “Limelight Flash Tool” uygulamasını çalıştırın. Ayrıca, başlangıç menüsü uygulamaları klasörünün altındaki “Limelight” klasörünün altında görünecektir.

    • Windows'un kamerayı tanıması 20 saniye kadar sürebilir. Sonraki tüm Windows diyaloglarında “iptal” tuşuna basın.

    • İndirilenler klasörünüzdeki en son .zip dosyasını seçin

    • “Limelights” menüsünde bir “RPI” cihazı seçin

    • “Flash” a tıklayın

    • Bir kez yanıp sönme tamamlandığında, güç kaynağınızdaki gücü kaldırın

    Ağ Kurulumu

    Güvenilirlik için statik bir IP adresi almamıza rağmen, bazı ekipler dinamik olarak atanan IP adreslerini tercih eder.

    Statik IP Adresi (önerilir)

    • Bonjour'u https://support.apple.com/kb/dl999?locale=en_US adresinden yükleyin

    • Robotunuza güç verin ve dizüstü bilgisayarınızı robotunuzun ağına bağlayın.

    • Limelight'ınızın LED dizisini yaktıktan sonra, http: //limelight.local:5801'e gidin. Burası Limelight yönetim Paneli

    • "Networking" sekmesine gidin.

    • Takım numaranızı girin.

    • “IP Assignment” ınızı “Static” olarak değiştirin.

    • Limelight'ın IP adresini “10.TE.AM.11” olarak ayarlayın.

    • Ağ Maskesini “255.255.255.0” olarak ayarlayın.

    • Ağ Geçidini “10.TE.AM.1” olarak ayarlayın.

    • Update butonuna basın.

    • Robotunuza güç verin.

    • Artık http://10.TE.AM.11:5801 adresindeki yönetim panelinize ve kamera akışınıza http://10.TE.AM.11:5800 adresinden erişebileceksiniz.

    Temel Programlama

    Şimdilik, sadece kameradan robotunuza veri almamız gerekiyor. 100hz'de Ağ Tablolarına veri hedefleyen Limelight yayınları. NetworkTable'lar için varsayılan güncelleme hızı 10hz'dir, ancak Limelight daha sık veri aktarımına izin vermek için otomatik olarak üzerine yazar.

    Başlamak için, “limelight” Ağ Tablosundan en az 100hz'de dört değer okumayı öneririz. Kod örneklerimiz bunu nasıl yapacağınızı tam olarak gösterir. Hedefinize olan uzaklıklar (derece olarak) “tx” ve “ty” olarak gönderilir. Bunlar robotunuzu döndürmek, tareti çevirmek vb. İçin kullanılabilir. Hedef alan, “ta” olarak gönderilir, hedefinize uzak bir mesafe göstergesi olarak kullanılabilir. Alan, 0 ile 100 arasında bir değerdir, burada 0, hedefinizin gövde alanı, toplam görüntü alanının% 0'ı anlamına gelir ve 100, hedefinizin gövdesinin tüm görüntünün dolduğu anlamına gelir. Hedefinizin dönüşü veya “eğilmesi” “ts” olarak döndürülür. Tüm değerler sıfıra eşitse, hedef yoktur.

    Ek olarak, NetworkTables'taki değerleri ayarlayarak belirli özellikleri kontrol edebilirsiniz.

    “Limelight” tablosundan aşağıdakileri okuyabilirsiniz:

    tv

    Limelight'ın geçerli herhangi bir hedefi olup olmadığı (0 veya 1)

    tx

    Crosshair'den Hedefe Yatay Ofset (-27 derece ila 27 derece)

    ty

    Crosshair'den Hedefe Dikey Ofset (-20.5 derece ila 20.5 derece)

    ta

    Hedef Alan (görüntünün% 0'ı görüntünün% 100'ü)

    ts

    yamukluk veya açı (-90 derece 0 derece)

    tl

    Gecikme süresi (ms) Görüntü yakalama gecikmesi için en az 11ms ekleyin.

    Aşağıdakileri “limelight” tablosuna yazabilirsiniz :

    ledMode

    Led Durumunu Ayarlama

    0

    Aç

    1

    Kapat

    2

    Aç Kapa(Blink)

    camMode

    Limelight Çalışma Modunu Ayarlama

    0

    Görüntü işlemeyi etkinleştir

    1

    Sürücü kamerası ( Görüntü işlemeyi durdurur)

    pipeline

    Limelight'in pipeline hattını ayarlar

    0 .. 9

    0 ile 9 arasında bir seçim yapabilirsiniz.

    Java

    Bunları import etmeyi unutmayın :

    Labview:

    C++

    Python

    Java Hedef Hizalama

    Driver Station Sınıfı

    C++ DriverStation& ds = DriverStation::GetInstance(); ds.SomeMethod(); DriverStation::GetInstance().SomeMethod(); Java DriverStation ds = DriverStation.getInstance(); ds.someMethod(); DriverStation.getInstance.someMethod();

    Driver Station sınıfı, robot modu, akü voltajı, ittifak rengi ve takım numarası gibi bilgilere erişmek için yöntemlere sahiptir. Driver Station sınıfının joystick verilerine erişme yöntemleri olduğu halde, bu verilere çok daha kullanıcı dostu bir arayüz sağlayan başka bir "Joystick" sınıfı olduğunu unutmayın. DriverStation sınıfı, temel sınıf tarafından bir singleton olarak yapılandırılmıştır. Temel sınıf tarafından oluşturulan DriverStation nesnesinin yöntemlerine erişmek için, DriverStation.getInstance () yöntemini çağırın ve ya sonucu bir DriverStation nesnesinde saklayın.

    Robot Modu

    C++ bool exampleBool; exampleBool = IsDisabled(); exampleBool = IsEnabled(); exampleBool = IsAutonomous(); exampleBool = IsOperatorControl(); exampleBool = IsTest(); while(IsOperatorControl() && IsEnabled()) { } exampleBool = DriverStation::GetInstance()->IsDisabled(); Java boolean exampleBool; exampleBool = isDisabled(); exampleBool = isEnabled(); exampleBool = isAutonomous(); exampleBool = isOperatorControl(); exampleBool = isTest(); while(isOperatorControl() && isEnabled()) { } exampleBool = DriverStation.getInstance().isDisabled();

    Driver Station sınıfı, robotun mevcut modunu kontrol etmek için bir dizi yöntem sunar, bu yöntemler en çok SampleRobot temel sınıfını kullanırken program akışını kontrol etmek için kullanılır. Geçerli modu, etkin durumu (etkin / devre dışı) ve kontrol durumunu (otonom, operatör kontrolü, test) tanımlayan iki ayrı bilgi parçası vardır. Bu, ilk gruptan tam olarak bir yöntem ve ikinci gruptan bir yöntemin her zaman doğru olması gerektiği anlamına gelir. Örneğin, Sürücü İstasyonu şu anda Test moduna ayarlanmışsa ve robot devre dışı bırakılmışsa, yöntemler isDisabled () ve isTest () her ikisi de doğru olacaktır. Bu yöntemlerin uygulanması, DriverStation sınıfındayken, (bu şablonlar genişleyen) RobotBase sınıfı, bu yöntemlere proxy'ler sağlar, böylece sınıf belirtimi olmadan kullanılabilirler (yukarıdaki ilk 3 örnek grubunda gösterildiği gibi). Bu yöntemleri başka bir sınıftan çağırmak için, son örnekte gösterildiği gibi DriverStation örneğini kullanın.

    DS bağlantısı, FMS bağlantısı ve Sistem durumu

    C++ bool exampleBool; exampleBool = DriverStation::GetInstance().IsDSAttached(); exampleBool = DriverStation::GetInstance().IsFMSAttached(); exampleBool = DriverStation::GetInstance().IsSysActive(); exampleBool = DriverStation::GetInstance().IsSysBrownedOut(); Java boolean exampleBool; exampleBool = DriverStation.getInstance().isDSAttached(); exampleBool = DriverStation.getInstance().isFMSAttached(); exampleBool = DriverStation.getInstance().isSysActive(); exampleBool = DriverStation.getInstance().isSysBrownedOut();

    DriverStation sınıfı ayrıca DS'nin robota bağlı olup olmadığını, eğer DS FP çıkışları etkinleştirilmişse (IsSysActive) DS'ye FMS sorgulama ile bağlanırsa ve roboRIO'nun yavaşlama korumasında olup olmadığını sorgulamak için yöntemlere sahiptir. FPGA çıkışları aşağıdakiler dahil olmak üzere çeşitli nedenlerden dolayı devre dışı bırakılabilir: DS, Disabled (Devre Dışı) veya E-Stop (Devre Dışı Bırakılıyor) komutu veriyor, sistem watchdog'u zaman aşımına uğradı (genellikle DS'nin roboRIO ile iletişim kurmaması nedeniyle) veya roboRIO'nun blackout koruması var.

    Batarya voltajı

    C++ double voltage = DriverStation::GetInstance().GetBatteryVoltage(); Java double voltage = DriverStation.getInstance().getBatteryVoltage();

    Uyumluluk amacıyla, akü voltajı, DriverStation sınıfı kullanılarak alınabilir (şimdi, ControllerPower sınıfından roboRIO giriş voltajı olarak da mevcuttur). Bu bilgi, voltaj kompanzasyonu yapmak veya akü voltaj düşüşlerini tespit ederek ve kritik olmayan mekanizmaları kapatmak veya sınırlandırmak suretiyle robot güç çekişini aktif olarak yönetmek için DriverStation sınıfından sorgulanabilir.

    İttifak(Alliance)

    C++ DriverStation::Alliance color; color = DriverStation::GetInstance().GetAlliance(); if(color == DriverStation::Alliance::kBlue){ } Java DriverStation.Alliance color; color = DriverStation.getInstance().getAlliance(); if(color == DriverStation.Alliance.kBlue){ }

    DriverStation sınıfı, robotun hangi ittifak rengi olduğuna dair bilgi sağlayabilir. FMS'ye bağlandığında bu alan tarafından DS'ye iletilen ittifak rengi. Bağlı olmadığında, ittifak rengi DS yazılımının İşletim sekmesindeki Ekip İstasyonu açılır kutusu tarafından belirlenir.

    Konum

    C++ int station; station = DriverStation::GetInstance.GetLocation(); Java int station; station = DriverStation.getInstance().getLocation();

    Sürücü İstasyonunun getLocation () yöntemi, Sürücü İstasyonunun hangi istasyon numarasını (1-3) içerdiğini belirten bir tam sayı döndürür. DS ve kontrollerin yerleştirildiği istasyonun tipik olarak robotun başlangıç pozisyonu ile ilgili olmadığını unutmayın, bu nedenle bu bilgiler sınırlı kullanım olabilir. FMS yazılımına bağlanmadığında, bu durum DS Çalışması sekmesindeki Ekip İstasyonundaki açılır menü tarafından belirlenir.

    Maç Süresi

    C++ double time; time = DriverStation::GetInstance.GetMatchTime(); Java double time; time = DriverStation.getInstance().getMatchTime();

    Bu yöntem, geçerli periyotta (auto, teleop, vb.) Kalan süreyi saniye cinsinden döndürür. Bu zamanın FMS'den kaynaklandığını unutmayın, ancak çeşitli gecikmeler nedeniyle resmi bir zamanlayıcı değildir. Sürücü İstasyonunun Uygulama Eşleştirme işlevselliği, FMS'ye bağlandığında bu yöntemin davranışına yaklaşacaktır. DS'yi doğrudan Otonom veya Teleop modunda çalıştırmak, bu yönteme göre farklı davranacaktır.

    Joystickler

    USB Bağlantısı

    Kumanda Kolu, sürücü istasyonundaki mevcut USB bağlantı noktalarından birine bağlı olmalıdır. Başlatma rutini, joysticklerin pozisyonu ne olursa olsun orta pozisyonda olacak, bu yüzden istasyon açıldığında joysticklerin orta pozisyonlarında olması gerekir. Genel olarak, Sürücü İstasyonu yazılımı, cihazlar arasındaki sıralamayı korumayı deneyecektir, ancak cihazlarınızın hangi sırada olması gerektiğini not etmek iyi bir fikirdir ve Sürücü İstasyonu yazılımını her doğru başlattıklarında kontrol edin. Bu, USB Aygıtları sekmesini seçerek ve sol taraftaki USB Kurulum kutusunda siparişi görüntüleyerek yapılabilir. Bir joystick üzerindeki bir düğmeye basmak, tablodaki girdinin mavi yanmasına ve adından sonra yıldız işaretlerinin görünmesine neden olur. Joystickleri yeniden sıralamak için tıklayıp sürükleyin.

    Joystick Yenilemek

    Sürücü İstasyonu devre dışı modundayken, kumanda kolu cihazlarındaki durum değişikliklerini rutin olarak arar, takılı olmayan aygıtlar listeden çıkarılır ve yeni aygıtlar açılır ve eklenir. FMS'ye bağlanmadığında, bir joystiğin çıkarılması Sürücü Station'ı devre dışı moduna zorlayacaktır. Joystick'i kullanmaya başlamak için joystick'i tekrar yerine takın, doğru noktada görünüp görünmediğini kontrol edin, ardından robotu tekrar etkinleştirin. Sürücü İstasyonu etkin moddayken, yeni bir cihaz taramayacaktır çünkü bu zaman alıcı bir işlemdir ve bağlı cihazlardan gelen sinyallerin zamanında güncellenmesi önceliğe sahiptir.

    Robot yarışmada Saha Yönetim Sistemine bağlandığında Sürücü İstasyonu modu FMS tarafından belirlenir. Bu, robotunuzu devre dışı bırakamayacağınız anlamına gelir ve DS, joystick değişikliklerini algılamak için kendini devre dışı bırakamaz. Joysticklerin manuel olarak tamamen yenilenmesi, klavyedeki F1 tuşuna basılarak başlatılabilir. Bunun tüm cihazları kapatıp tekrar açacağını ve tüm cihazların yukarıda belirtildiği gibi orta konumlarında olması gerektiğini unutmayın.

    Bir Joystick Nesnesi Oluşturmak

    Joystick sınıfı için birincil oluşturucu, Joystick'in port numarasını temsil eden tek bir parametre alır. Bu, Driver Station yazılımının Joystick Setup kutusundaki joystick'in yanındaki (1-6) rakamıdır (ilk resimde gösterilir). Ayrıca, eksenlerin ve düğmelerin sayısının ek parametrelerini alan bir oluşturucu vardır ve belirli aygıtlarla kullanılacak Joystick alt sınıflarını oluşturmak için get ve set axis kanalı yöntemleri ile kullanılabilir.

    Joystick Değerlerine Erişme - Seçenek 1

    Bir joystick nesnesinin geçerli değerlerine erişmenin iki yolu vardır. İlk yol, adlandırılmış erişim yöntemleri veya getAxis yöntemini kullanmaktır. Joystick sınıfı, bu yöntemlerin KOP joystick için joystickin uygun eksenlerine varsayılan haritalamasını içerir. Başka bir cihaz kullanıyorsanız, bu yöntemleri kullanmak için uygun eşlemeleri ayarlamak için Joystick alt sınıfını kullanabilir ve setAxisChannel yöntemini kullanabilirsiniz. Diğer eksenlere veya düğmelere erişmeniz gerekiyorsa, 6 olası eksenden 5'i ve olası on iki düğmeden yalnızca biri için yalnızca adlandırılmış erişimci yöntemleri olduğunu unutmayın,

    Joystick eksenleri 1, -1 aralığında bir ölçeklenmiş değer döndürür ve düğmeler tetiklenen durumlarını gösteren bir boole değeri döndürür. Joystick ve "joystick" ler için tipik kuralın, "Joystick" in "ileri", "Joystick" ve "Joystick" 'in sağa doğru itildiğinden dolayı X'in pozitif olması nedeniyle negatif olması gerektiğine dikkat edin. Belirli bir cihaz için bunu kontrol etmek için, "Joystick Mapping'i Belirleme" konusundaki aşağıdaki bölüme bakın.

    Joystick Değerlerine Erişme - Seçenek 2

    Joystick değerlerine erişmenin ikinci yolu getRawAxis () ve getRawButton () yöntemlerini kullanmaktır. Bu yöntemler, bir parametre olarak ekseni veya düğme numarasını temsil eden bir tam sayı alır ve karşılık gelen değeri döndürür. Cihazınızın fiziksel eksenleri ve düğmeleri ile uygun kanal numarası arasındaki eşleşmeyi belirlemeye yarayan bir yöntem için aşağıdaki "Joystick Eşleştirmesini Belirleme" bölümüne bakın.

    Polar Yöntemler

    Joystick sınıfı ayrıca joystick girişini bir polar koordinat sistemine dönüştürmek için yardımcı yöntemler içerir. Bu yöntemlerin düzgün çalışması için getX ve getY'nin doğru ekseni döndürmesi gerekir (gerekirse setChannel () ile yeniden eşleştirin).

    Joystick Eşleştirmesini Belirleme

    2015 FRC Sürücü İstasyonunda, eksen düğmeleri ve fiziksel joystick özellikleri ile eksen veya düğme numaraları arasındaki eşleşmeyi belirlemek için kullanılabilecek POV değerlerinin göstergeleri bulunur. Seçmek için listede joystick'i tıklamanız yeterlidir ve göstergeler joystick girişine cevap vermeye başlayacaktır.

    DS'de Gösterge - Gösterge Tablosuna Genel Bakış

    Çoğu zaman robottan geri sürücülere geri bildirim almak istenir. Robot ve sürücü istasyonu arasındaki iletişim protokolü, programa özel veri göndermek için gerekli hükümleri içerir. Verileri alan sürücü istasyonundaki programa dashboard denir.

    Network Tables - Nedir?

    Ağ Tabloları, FRC'deki yazılımlar arasında değişkenleri paylaşmak için kullanılan istemci-sunucu protokolünün adıdır. Robot, Network Tables sunucusu olarak hareket eder ve iletişim kurmak isteyen yazılım istemciler olarak bağlanır. En yaygın Ağ Tabloları istemcisi dashboarddır.

    Smart Dashboard

    Smart Dashboard, ilk olarak 2011'de piyasaya sürülen Java kontrol paneli istemcisine atıfta bulunuldu. Bu istemci, göstergelerin otomatik olarak robot tarafında Ağ Tablolarına girilen verilerle eşleşmesi için Ağ Tabloları protokolünü kullandı. O zamandan bu yana, LabVIEW panosu Ağ Tabloları'nı kullanmaya da dönüştürdüğü için terim biraz bulanıklaştı. SmartDashboard hakkında ek bilgi SmartDashboard Kılavuzunda bulunabilir.

    LabVIEW Dashboard hakkında, C ++ veya Java kodlu LabVIEW Dashboard'u kullanma hakkında bir makale de dahil olmak üzere, FRC Driver Station kılavuzunda bulunabilir.

    http://cmucam.org/projects/cmucam5/wiki/Latest_release
    Raspberry Pi İle Pixy Kullanımı içeriğinde sağladığı kaynaklar için #6025 Adroit Anroids takımına teşekkürler!
    http://www.ni.com/download/labview-for-frc-17.0/7185/en/
    www.ni.com/frc/needhelp
    Zoom: NI Activation Wizard (2)
    Zoom: NI Activation Wizard (3)
    Zoom: NI Activation Wizard (4)
    Select Components to Uninstall
    Welcome
    Warnings
    Product List
    Product Information
    User Information
    Destination Directory
    License Agreements (1)
    License Agreements (2)
    Driver Software Installation
    Disable Windows Fast Startup
    Start Installation
    Overall Progress
    Individual Product Progress
    Product Information
    Installation Summary
    NI Activation Wizard
    Restart Message
    NI Update Service

    Görüntü İşleme Kaynakları

    Vision Processing Stratejileri

    Vision Processing kullanmak, robotunuzun alandaki öğelere duyarlı olmasını ve daha fazla özerk olmasını sağlamanın harika bir yoludur. Genellikle FRC oyunlarında, topların veya diğer oyun parçalarının otonom olarak hedeflenmesi veya sahadaki yerlere gitmesi için bonus puanlar vardır. Vision Processing, bu sorunların çoğunu çözmenin harika bir yoludur.Eğer meydan okuyan özerk bir kodunuz varsa, o zaman insan sürücülerine yardım etmek için teleop döneminde de kullanılabilir.

    Görme işlemi için ve vizyon programının çalışması gereken bileşenleri seçmek için birçok seçenek vardır. WPILib ve ilgili araçlar bir dizi seçeneği destekler ve ekiplere ne yapacağına karar vermek için çok fazla esneklik sağlar. Bu makalede, mevcut olan birçok seçenek ile ilgili bazı bilgiler verilecektir.

    OpenCV Görüntü İşleme Kütüphanesi

    OpenCV, akademi ve endüstri genelinde yaygın olarak kullanılan açık kaynaklı bir görüntü işleme kütüphanesidir. GPU hızlandırılmış işlem sağlayan bir desteğe sahip, C ++, Java ve Python da dahil olmak üzere birçok dil için uygun kütüphanelere sahiptir. Ayrıca birçok web sitesi, kitap, video ve eğitim kursları ile belgelenmiştir, böylece nasıl kullanılacağını öğrenmenize yardımcı olacak birçok kaynak bulunmaktadır. Bu nedenlerle ve daha fazlası için WPILib'in C ++ ve Java sürümleriyle kullanım için OpenCV'yi kabul ettik. 2017'den başlayarak WPILib ile birlikte gelen OpenCV kütüphaneleri, video yakalama, işleme ve vision için kütüphanede destek ve vision algoritmalarınızı oluşturmanıza yardımcı olacak araçlar hazırladık. OpenCV hakkında daha fazla bilgi için bkz.

    RoboRIO üzerinde vision kodu

    Vision programı, genel robot programının sadece bir parçası olduğu için programlama oldukça basittir. Program elle veya GRIP tarafından C ++ veya Java ile yazılabilir. Dezavantajı, robot programı ile aynı işlemci üzerinde çalışan vision kodunun performans sorunları yaşayabilmesidir. Bu, robot ve vision programınızın gereksinimlerine bağlı olarak değerlendirmeniz gereken bir şeydir.

    Vision kodu, robot kodunun kullandığı sonuçları üretir. Bir görüş dizisinden değer alan robot kodu yazarken senkronizasyon sorunlarına dikkat edin. GRIP tarafından üretilen kod ve WPILib'deki VisionRunner sınıfı bunu daha kolay hale getirecektir.

    Video akışı kamera operatörü arayüzünü kullanarak SmartDashboard'a gönderilebilir, böylece operatörler kameranın gördüklerini görebilir. Buna ek olarak, OpenCV komutlarını kullanarak görüntülere ek açıklamalar ekleyebilirsiniz, böylece kontrol panelinde hedefler veya diğer ilginç nesneler tanımlanabilir.

    DS bilgisayarında vision kodu

    Görüntü, işlem yapmak için Driver Station dizüstü bilgisayarına geri akışa alınmıştır. Classmate dizüstü bilgisayarlar vision işlemede roboRIO'dan daha hızlıdır fakat üzerinde çalışan gerçek zamanlı programlara sahip değildir. GRIP, dizüstü bilgisayarında doğrudan NetworkTables kullanarak robota gönderilen sonuçlarla birlikte çalıştırılabilir. Alternatif olarak, kendi vision programınızı seçtiğiniz bir dili kullanarak yazabilirsiniz. Yerel bir NetworkTables uygulaması ve OpenCV bağlantısı çok iyi olduğundan Python iyi bir seçimdir.

    Görüntüler işlendikten sonra, hedef konum, mesafe veya ihtiyacınız olan herhangi bir şey gibi anahtar değerler, NetworkTables ile robota geri gönderilebilir. Gecikme sizler için bir sorun olabilir çünkü dizüstü bilgisayardaki görüntülerde gecikmeler ve sonuçların geri gelmesi biraz zaman alabilir.

    Görüntü akışı SmartDashboard veya GRIP'de görüntülenebilir.

    Bir işlemci üzerinde vision kodu

    Raspberry PI veya Kangaroo gibi iş süreçleri, görüntü kodunun desteklenmesi için idealdir. Avantajı, tam hız çalıştırabilmeleri ve robot programına müdahale etmemeleridir. Bu durumda, kamera büyük olasılıkla işlemciye(Raspberry pi vb.) veya (ethernet kamera kullanıyorsanız) robotun üzerindeki bir ethernet girişine bağlanır. Program, herhangi bir dilde yazılabilir, ancak OpenCV ve NetworkTable'lar için basit bağlantılardan dolayı Python iyi bir seçimdir. Bazı takımlar ve deneyimsiz programcılar için çok karmaşık olabilse de, Nvidia Jetson gibi işlemciler en yüksek hız ve en yüksek çözünürlük için yüksek performans sağlayabilmesi için kullanılabilir.

    Veri, ağ işlemcisi üzerindeki vision programından, NetworkTables veya seri bağlantı üzerinden özel bir protokol kullanılarak robota gönderilebilir.

    Kamera seçenekleri

    WPILib tarafından desteklenen bir dizi kamera seçeneği vardır. Kameralar, nasıl çalıştığını belirleyebilecek bir dizi parametreye sahiptir. Örneğin, kare hızı ve görüntü çözünürlüğü, alınan görüntülerin kalitesini etkiler, ancak çok yüksek etkili işlem süresi , robot programınızda ciddi etkiye sahip olabilecek bant genişliğinin oluşmasını sağlar.

    2017'de yeni olan, C ++ ve Java'da mevcut olan ve robota bağlı kameralarla arayüz sağlayan bir CameraServer sınıfı var. Bir Kaynak nesnesi aracılığıyla yerel işlem için görüntüler alır ve orada görüntülemek veya işlem yapmak için akışınızı sürücü istasyonunuza gönderir. Video akışı CameraServer tarafından işlenir.

    WPILib ile kameraların kullanımı ile ilgili detaylar bir sonraki bölümde detaylandırılmıştır.

    Görüntü alın ve işleyin: CameraServer sınıfı

    Kavramlar

    Genellikle FRC'de kullanılan kameralar (Axis kamera gibi USB ve Ethernet kameraları) nispeten sınırlı çalışma modları sunar. Genel olarak, tek bir çözünürlük ve kare hızında yalnızca tek bir görüntü çıktısı (tipik olarak JPG gibi sıkıştırılmış biçimde bir RGB görüntüsü ) sağlarlar. USB kameralar, sadece birden fazla uygulama kameranıza aynı anda erişemeyeceği için sınırlıdır.

    2017 CameraServer çoklu kameraları destekler. Bir kamera bağlantısı kesildiğinde otomatik olarak yeniden bağlanma gibi ayrıntıları ele alır ve aynı zamanda kameranın sunduğu görüntüleri çoklu "istemciler" haline getirir (örn. Hem robot kodunuz hem de gösterge panosu kameranıza aynı anda bağlanabilir).

    Kamera isimleri

    CameraServer'daki her kamera benzersiz bir şekilde adlandırılmalıdır. Bu ayrıca, Panodaki kamera için görünen addır. CameraServer startAutomaticCapture () ve addAxisCamera () işlevlerinin bazı türevleri otomatik olarak kamerayı (ör. "USB Camera 0" veya "Axis Camera") adlandırır veya kameraya daha açıklayıcı bir ad verebilirsiniz (örn. "Intake Cam"). Tek gereksinim, her kameranın kendine özgü bir adı olmasıdır.

    USB kamera ile ilgili notlar

    CPU kullanımı

    CameraServer ile CPU Kullanımı, gerektiğinde sadece sıkıştırma ve açma işlemlerini gerçekleştirerek , herhangi bir istemci bağlı olmadığında akışı otomatik olarak devre dışı bırakarak CPU kullanımını en aza indirecek şekilde tasarlanmıştır.

    CPU kullanımını en aza indirmek için, gösterge paneli çözünürlüğü kamerayla aynı çözünürlüğe ayarlanmalıdır; Bu, CameraServer'ın görüntüyü sıkıştırmasını ve yeniden sıkıştırmasını sağlamaz, bunun yerine resim gösterge panelinden alınan JPEG görüntüsünü doğrudan panoya iletebilir. Kontrol panelindeki çözünürlüğü değiştirmenin * kamera çözünürlüğünü değiştirmediğini unutmayın. kamera çözünürlüğünü değiştirmek, NetworkTables üzerinden veya robot kodunuzda (kamera nesnesinde setResolution öğesini çağırarak) yapılabilir.

    USB Bant Genişliği

    Roborio, USB arabirimleri üzerinden tek seferde çok fazla veri iletebilir ve alabilir. Kamera görüntüleri çok fazla veri gerektirebilir ve bu yüzden bant genişliği limitini aşmak nispeten kolaydır. Bir USB bant genişliği hatasının en yaygın nedeni, özellikle birden çok kamera bağlı olduğunda, JPEG olmayan bir video modunun seçilmesi veya çok yüksek çözünürlükte çalışmasıdır.

    Mimari

    2017 için CameraServer iki katmandan, yüksek seviyeli WPILib CameraServer sınıfından ve düşük seviyeli cscore kitaplığından oluşmaktadır.

    CameraServer sınıfı

    CameraServer sınıfı (WPILib'in bir parçası) robot kodunuza kamera eklemek için yüksek düzeyde bir arabirim sağlar. Ayrıca kameralar ve kamera sunucuları hakkındaki bilgileri NetworkTable'lara yayınlamaktan sorumludur, böylece LabView Dashboard ve SmartDashboard gibi Sürücü İstasyonu kontrol panelleri kameraları listeleyebilir ve akışlarının nerede bulunduğunu belirleyebilir. Oluşturulan tüm kameraların ve sunucuların bir veritabanını korumak için tek bir desen kullanır.

    CameraServer'daki bazı temel işlevler şunlardır:

    • startAutomaticCapture (): Bir USB kamera (ör. Microsoft LifeCam) ekleyin ve bunun için bir sunucu başlatır, böylece panodan görüntülenebilir.

    • addAxisCamera (): Bir axis kamerası eklemek için kullanılır. Robot kodunuzda Axis kameranın görüntülerini işlemiyor olsanız bile, bu işlevi Axis kamerasının Pano'nun açılır menü listesinde görünmesi için kullanabilirsiniz. Aynı zamanda bir sunucu başlatır, böylece sürücü istasyonunuz USB üzerinden roboRio'ya bağlandığında axis akışı hala görüntülenebilir (hem Axis kameranız hem de iki robot radyo Ethernet portuna bağlı roboRio varsa yarışmada kullanışlıdır).

    • getVideo (): Bir kameraya OpenCV erişimi edinin. Bu, roboRio'da (robot kodunuzda) görüntü işleme için kameradan görüntüler almanızı sağlar.

    Cscore Kütüphanesi

    Cscore kütüphanesi alt seviye uygulamasına aşağıdakileri sağlar:

    • USB ve HTTP (örneğin, axis kamera) kameralarından görüntüler alın

    • Kamera ayarlarını değiştir (ör. Kontrast ve parlaklık)

    • Kamera video modlarını değiştir (piksel formatı, çözünürlük ve kare hızı)

    • Bir web sunucusu olarak hareket edin ve görüntüleri standart bir M-JPEG akışı olarak sunun

    Kaynaklar ve Havuz

    Cscore kütüphanesinin temel mimarisi, kaynaklarla havuzlar arasında bölünmüş işlevselliğe sahip MJPGStreamer'inkine benzer. Aynı anda oluşturulmuş ve çalışan birden çok kaynak ve çoklu havuz olabilir.

    Görüntü üreten bir nesne bir kaynaktır ve görüntüleri kabul eden / tüketen bir nesne bir havuzdur. Üretmek / tüketmek kütüphanenin perspektifinden. Böylece kameralar kaynaklardır (görüntü üretirler). MJPEG web sunucusu bir havuzdur çünkü program içindeki görüntüleri kabul eder (bu görüntüleri bir web tarayıcısına veya kontrol paneline yönlendiriyor olabilir). Kaynaklar birden fazla havuza bağlanabilir, ancak havuzlar tek bir kaynağa bağlanabilir. Bir kaynağa bağlandığında, cscore kütüphanesi her bir görüntüyü kaynağından havuza geçirmekten sorumludur.

    • Kaynaklar çerçeveler elde eder (örneğin USB kamerasından görüntü alır) ve yeni bir çerçeve mevcut olduğunda herhangi bir olayı tetikler. Hiçbir havuz belirli bir kaynağı dinlemiyorsa, işlemciyi ve G / Ç kaynaklarını kaydetmek için bir işlemi duraklatabilir veya bağlantısını kesebilir. Kütüphane, olayların tetiklenmesini ve durdurulmasını sağlayarak kamera bağlantılarını / yeniden bağlanmalarını özerk olarak yönetir.

    • Havuzlar belirli bir kaynağın olayını dinler, en son görüntüyü yakalar ve hedefine uygun biçimde iletir. Kaynaklara benzer şekilde, belirli bir havuz devre dışı ise (ör. İstemci HTTP sunucusu üzerinden yapılandırılmış bir M-JPEG'e bağlı değildir), kütüphane, işlemci kaynaklarını kaydetmek için işlemin bazı bölümlerini devre dışı bırakabilir.

    Kullanıcı kodu (bir FRC robot programında kullanılanlar gibi), OpenCV kaynağı ve dağıtma nesneleri aracılığıyla bir kaynak (bir fotoğraf makinesiymiş gibi işlenmiş çerçeveler sağlar) veya bir havuz (işleme için bir çerçeve alır) olarak işlev görebilir. Böylece, bir kameradan görüntü alan ve işlenen görüntüleri dışarıdan görüntüleyen bir görüntü işleme hattı aşağıdaki gibi görünür:

    UsbCamera (VideoSource) --> (cscore internal) --> CvSink (VideoSink)

    --> (your OpenCV processing code) --> CvSource (VideoSource)

    --> (cscore internal) --> MjpegServer (VideoSink)

    Kaynaklar bağlı birden fazla havuza sahip olduğundan, bu hat daha fazla alt işleme ayrılabilir. Örneğin, orijinal kamera görüntüsü, UsbCamera kaynağının CvSink'e ek olarak ikinci bir MjpegServer havuzuna bağlanmasıyla da sunulabilir, sonuçta aşağıdaki grafik elde edilir:

    UsbCamera --> CvSink --> (your code) --> CvSource --> MjpegServer [2]

    \-> MjpegServer [1]

    Kamera tarafından yeni bir görüntü yakalandığında, hem CvSink hem de MjpegServer [1] bunu alır.

    Yukarıdaki grafik, aşağıdaki CameraServer snippet'inin yarattığı grafiktir:

    // UsbCamera ve MjpegServer [1] oluşturur ve bunları bağlar

    CameraServer.getInstance().startAutomaticCapture()

    // CvSink'i oluşturur ve UsbCamera CvSink'e bağlar. CvSink =CameraServer.getInstance().getVideo()

    // CvSource ve MjpegServer [2] 'yi oluşturur ve bunları CvSource outputStream = ile bağlar. CameraServer.getInstance().putVideo("Blur", 640, 480);

    CameraServer uygulaması, cscore seviyesinde aşağıdakileri etkin bir şekilde yapar (açıklama amacıyla). CameraServer, tüm cscore nesnelerine benzersiz isimler oluşturma ve otomatik olarak port numaralarını seçme gibi birçok ayrıntıya dikkat çeker. Ayrıca CameraServer oluşturulmuş nesnelerin tekil kayıtlarını tutar, böylece kapsam dışına çıkarlarsa yok olmazlar.

    UsbCamera usbCamera = new UsbCamera("USB Camera 0", 0);

    MjpegServer mjpegServer1 = new MjpegServer("serve_USB Camera 0", 1181);

    mjpegServer1.setSource(usbCamera); CvSink cvSink = new CvSink("opencv_USB Camera 0");

    cvSink.setSource(usbCamera);

    CvSource outputStream = new CvSource("Blur", PixelFormat.kMJPEG, 640, 480, 30);

    MjpegServer mjpegServer2 = new MjpegServer("serve_Blur", 1182);

    mjpegServer2.setSource(outputStream);

    Referans sayımı

    Tüm cscore nesneleri dahili olarak referans sayılır. Bir havuzun kaynağa bağlanması kaynağın referans sayısını artırır, bu nedenle havuzu kapsam dahilinde tutmak kesinlikle gereklidir. CameraServer sınıfı, CameraServer işlevleriyle oluşturulmuş tüm nesnelerin bir kaydını tutar, bu şekilde oluşturulan kaynaklar ve havuzlar etkin bir şekilde kapsam dışında kalmaz (açıkça kaldırılmadıkça).

    2017 Vision Örnekleri

    LabVIEW

    2017 LabVIEW Vizyon Örneği, diğer LabVIEW örnekleriyle birlikte sunulmuştur. Açılış ekranından, Destek -> FRC Örneklerini Bul'u veya başka herhangi bir LabVIEW penceresini tıklayın, Help->Find Examples tıklayın ve 2017 Vision Örneğini bulmak için Vision klasörünü bulun. Örnek görüntüler örnekle birlikte paketlenmiştir.

    C++/Java

    Daha eksiksiz bir örnek yakında geliyor.

    Şimdilik, bir GRIP projesini ve aşağıdaki açıklamayı ve

    GRIP tarafından oluşturulan kodun robot programınıza entegre edilmesiyle ilgili ayrıntılar burada:

    GRIP projesi tarafından oluşturulan kod, bu ZIP'in Görsel Görüntüler klasöründe bulunanlar gibi resimlerdeki yeşil parçacıklar için OpenCV konturlarını bulacaktır. Burada, hedef olup olmadığını değerlendirmek için bu konturları daha fazla işlemek isteyebilirsiniz. Bunu yapmak için:

    1. Sınırların etrafında sınırlayıcı dikdörtgenler çizmek için boundingRect yöntemini kullanın

    2. LabVIEW örnek kodu, hedef için 5 ayrı oran hesaplar. Bu oranların her biri, nominal olarak 1.0'a eşit olmalıdır. Bunu yapmak için, konturları boyutlarına göre sıralar, sonra en büyük ile başlayarak, bu değerler, hedef olabilecek her bir çift kontür için hesaplar ve bir hedef bulduğunda veya bulduğu en iyi çifti döndürürse durur.

    Aşağıdaki formüllerde, bir harfin ardından bir harf, birinci konturun sınırlayıcı rektininin koordinatını ifade eder, ki bu, ikiden daha büyük olan (örneğin, 1L = 1. kontur sol kenar) ve bir harfle 2, 2 konturdur. (H = Yükseklik, L = Sol, T = Üst, B = Alt, W = Genişlik)

    • Grup Yüksekliği = 1H / ((2B - 1T) * .4) Üst yükseklik toplam yüksekliğin% 40'ı (4 inç / 10 inç) olmalıdır.

    • dTop = (2T - 1T) / ((2B - 1T) * .6) Üstteki şeridin tepesine kadar toplam yüksekliğinin% 60'ı (6 inç / 10 inç) olmalıdır.

    • LEdge = ((1L - 2L) / 1W) + 1 Kontürün (1) sol kenarı ile konturun (2) sol kenarı arasındaki mesafe, 1. konturun genişliğine göre küçük olmalıdır.o zaman, oranın ortalanmasını sağlamak için 1 ekliyoruz.

    Bu oranların her biri daha sonra hesaplanarak 0-100 arasında bir değere dönüştürülür: 100 - (100 * abs (1 - Val))

    Mesafeyi belirlemek için, üst sınırlayıcı kutunun üstünden pikselleri alt sınırlayıcı kutunun altına ölçün

    distance = Hedef yükseklik ft. (10/12) YRes / (2 PixelHeight * tan (kamera görünümü))

    LabVIEW örneği, yuvarlak hedefin kenarlarının algılamadaki gürültüye en fazla maruz kalması nedeniyle yüksekliği kullanır (kameradan daha fazla olan açı noktaları daha az yeşil gözüktüğü için). Bunun dezavantajı, görüntüdeki hedefin piksel yüksekliğinin kamera açısının perspektif bozulmasından etkilenmesidir. Olası düzeltmeler şunları içerir:

    1. Bunun yerine instead kullanmayı deneyin

    2. Çeşitli mesafelerde ölçüm yapın ve bir lookup tablosu veya regresyon fonksiyonu oluşturun

    3. Kamerayı bir servoya monte edin, görüntüde dikey olarak hedefi ortalayın ve mesafe hesaplaması için servo açısını kullanın (kendinize uygun bir şekilde çalışmanız veya bir matematik öğretmeni bulmanız gerekir!)

    4. OpenCV kullanarak perspektif bozulmasını düzeltin. Bunu yapmak için kameranızı OpenCV ile burada açıklandığı şekilde kalibre etmeniz gerekecektir:

    Logo
    Logo
    NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight");
    NetworkTableEntry tx = table.getEntry("tx");
    NetworkTableEntry ty = table.getEntry("ty");
    NetworkTableEntry ta = table.getEntry("ta");
    double x = tx.getDouble(0);
    double y = ty.getDouble(0);
    double area = ta.getDouble(0);
    import edu.wpi.first.networktables.NetworkTableEntry;
    import edu.wpi.first.networktables.NetworkTableInstance;
    std::shared_ptr<NetworkTable> table =   NetworkTable::GetTable("limelight");
    float targetOffsetAngle_Horizontal = table->GetNumber("tx");
    float targetOffsetAngle_Vertical = table->GetNumber("ty");
    float targetArea = table->GetNumber("ta");
    float targetSkew = table->GetNumber("ts");
    from networktables import NetworkTables
    
    table = NetworkTables.getTable("limelight")
    tx = table.getNumber('tx',None)
    ty = table.getNumber('ty',None)
    ta = table.getNumber('ta',None)
    ts = table.getNumber('ts',None
    if (limelight.angleOffset > 10) { // eğer hedef solda kalıyorsa
        RightMotorMaster.setPower(0.30); // 30% throttle
        LeftMotorMaster.setPower(-0.30); // -30% throttle
    } else if (limelight.angleOffset < -10) { // Eğer Hedef Sağda Kaalıyorsa
        RightMotorMaster.setPower(-0.30); // -30% throttle
        LeftMotorMaster.setPower(0.30); // 30% throttle
    } else {
        // Robot hizalanmış yavaşça ileri gidin
        RightMotorMaster.setPower(0.30); // 30% throttle
        LeftMotorMaster.setPower(0.30); // 30% throttle
    }
    C++
    
    Joystick *exampleStick
    
    public:
         Robot(){
         }
         void RobotInit() {
              exampleStick = new Joystick(1);
         }
    
    Java
    
    exampleStick = new Joystick(1);
    C++
    
    double value;
    value = exampleStick->GetX();
    value = exampleStick->GetY();
    value = exampleStick->GetZ();
    value = exampleStick->GetThrottle();
    value = exampleStick->GetTwist();
    
    boolean buttonValue;
    buttonValue = exampleStick->GetTop();
    buttonValue = exampleStick->GetTrigger();
    
    Java
    
    double value;
    value = exampleStick.getX();
    value = exampleStick.getY();
    value = exampleStick.getZ();
    value = exampleStick.getThrottle();
    value = exampleStick.getTwist();
    
    boolean buttonValue;
    buttonValue = exampleStick.getTop();
    buttonValue = exampleStick.getTrigger();
    C++
    
    double value;
    value = exampleStick->GetRawAxis(2);
    
    boolean buttonValue;
    buttonValue = exampleStick->GetRawButton(1);
    
    Java
    
    double value;
    value = exampleStick.getRawAxis(1);
    
    boolean buttonValue;
    buttonValue = exampleStick.getRawButton(2);
    C++
    
    double value;
    value = exampleStick->GetDirectionDegrees();
    value = exampleStick->GetDirectionRadians();
    value = exampleStick->GetMagnitude();
    
    Java
    
    double value;
    value = exampleStick.getDirectionDegrees();
    value = exampleStick.getDirectionRadians();
    value = exampleStick.getMagnitude();
    wget https://raw.githubusercontent.com/enisgetmez/FRC-Vision-Processing/master/Pixy/pixy.py
    import edu.wpi.first.wpilibj.networktables.NetworkTable; // Networktables kütüphanesi
    import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; // smartdashboardan verileri görmek için
    import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
    	public static NetworkTable table1 = NetworkTable.getTable("Vision"); // vision adında table çekiliyor
    public static double konumX()
    	{
    		return table1.getNumber("X", 0.0); //raspberry pi den gelen x kordinatları
    	}
    	public static double konumY() 
    	{
    		return table1.getNumber("Y", 0.0); //raspberry pi den gelen y kordinatları
    	}
    	public void teleopPeriodic() {
    		SmartDashboard.putNumber("Nesnenin X konumu: ", konumX()); // smartdashboarda x konumu yazdır
    		SmartDashboard.putNumber("Nesnenin Y konumu: ", konumY()); // smartdashboarda y konumunu yazdır
    
    	}
    public void autonomousPeriodic() {
    	    if(konumX() == 0)
    	{
    	sagmotor1.set(0);
    	sagmotor2.set(0);
    	solmotor1.set(0);
    	solmotor2.set(0);
    	}
    		else if(konumX() < 285) // degerler 285'ten kucukse saga don
    		{
    		sagmotor1.set(0.5); // sag motorları calistir
    		sagmotor2.set(0.5);
    		}
    		else if (konumX() > 295) // degerler 295'ten buyukse sola don
    		{
    		solmotor1.set(0.5); //sol motorlari calistir
    		solmotor2.set(0.5);
    		}
    
    	}
    Logo

    putVideo (): OpenCV görüntülerini besleyebileceğiniz bir sunucu başlatın. Bu, özel işlenmiş ve / veya açıklamalı görüntüleri panoya aktarmanıza olanak tanır.

    Görüntü işleme için görüntüleri OpenCV "Mat" nesnelerine dönüştürün

    Genişlik oranı = 1W / 2W Her iki konturun genişliği de aynı olmalıdır.
  • Yükseklik oranı = 1H / (2H * 2) Daha büyük şerit, daha küçük olandan iki kat daha uzun olmalıdır.

  • Bu, distorsiyon matrisine ve kamera matrisine neden olacaktır. Bu iki matrisi alıp, mesafe hesaplaması için ölçmek istediğiniz noktaları "doğru" koordinatlarla eşleştirmek için undistortPoints fonksiyonu kullanmalısınız (bu, tüm görüntüyü bozmadan çok daha az CPU kullanımınıa sahip).
    Http://opencv.org.
    TeamForge'da bulunabilecek bir ZIP'e eklenmiş örnek görüntüleri sağladık.
    Using Generated Code in a Robot Program
    http://docs.opencv.org/2.4/doc/tutorials/calib3d/camera_calibration/camera_calibration.html
    Logo
    Logo
    Logo
    Logo
    Logo
    FRC-Vision-Processing/Java/robot.java at master · enisgetmez/FRC-Vision-ProcessingGitHub
    FRC-Vision-Processing/Java/robot.java at master · enisgetmez/FRC-Vision-ProcessingGitHub
    Logo
    Logo
    Logo
    Logo
    Logo

    FRC Kontrol Sisteminin Kablolanması

    Malzemeleri Topla

    Aşağıdaki kontrol sistemi bileşenlerini ve araçlarını bulun

    • Power Distribution Panel (PDP)

    • roboRIO

    • Pneumatics Control Module (PCM)

    • Voltage Regulator Module (VRM)

    • OpenMesh radio (Güç kablosu ve ethernet kablosuyla)

    • Robot Signal Light (RSL)

    • 4x Sparks ya da başka motor sürücüler

    • 2x PWM y-cables

    • 120A Circuit breaker

    • 4x 40A Circuit breaker

    • 6 AWG Kırmızı Kablo

    • 10 AWG Kırmızı/Siyah kablo

    • 18 AWG Kırmızı/Siyah kablo

    • 22AWG sarı/yeşil CAN kablosu

    • 16x 10-12 AWG (sarı) halka terminalleri (entegre kablolu kontrol cihazlarının 8x hızlı bağlantı çiftleri)

    • 2x Andersen SB50 Batarya konnektörleri

    • 6AWG Terminal kulpları

    • 12V Batarya

    • Siyah/Beyaz elektrik bandı

    • Dual Lock malzemesi veya bağlantı elemanları

    • Zip ties(Amerikan Kelepçe)

    • 1/4" ya da 1/2" Pleksi

    Gerekli Araçlar

    • Wago aracı veya küçük düz tornavida

    • Çok küçük düz tornavida gözlük tamirlerinde kullanılan boyutunda

    • Philips Tornavida

    • 5mm Hex anahtarı (Metrik anahtarınız yoksa 3/16" iş görebilir)

    Çekirdek Kontrol Sistemi Bileşenlerini Düzenleme

    Bileşenleri tahtaya yerleştirin. Çalışması gereken bir düzen, yukarıdaki görüntülerde gösterilmektedir.

    Bileşenleri sabitleyin

    Çift taraflı bant veya veya amerikan kelepçe kullanarak, tüm bileşenleri panele sabitleyin. Birçok FRC oyununda robot bağlantısının önemli olabileceğini ve çift taraflı bantın tek başına birçok elektronik bileşeni tutma olasılığının az olduğunu unutmayın.Takımlar, bileşenlerini sabitlemek için somun ve civata tutturucular veya (yukarıdaki resimde gösterildiği gibi) amerikan kelepçe kullanmak isteyebilir.

    Batarya Konektörünü PDP'ye Takın

    Dikkat: Batarya Konektörüne bağlı olan kablolar 6AWG olmalıdır.

    1. Terminal pabuçları batarya konnektörüne takın.

    2. 1/16 "Alyan anahtarı kullanarak, PDP terminal kapağını sabitleyen iki vidayı sökün.

    3. 5 mm'lik bir Alyan anahtar kullanarak (metrik anahtarınız yoksa 3/16 "), negatif (-) cıvatayı ve pulu PDP'den çıkarın ve akü konektörünün negatif terminalini sabitleyin.

    4. 7/16 "kutu uçlu anahtar kullanarak, ana kesicinin" Batt "tarafındaki somunu sökün ve akü kondansatörünün artı ucunu sabitleyin.

    PDP ile şalteri kablolamak

    Dikkat olması gereklidir: 6AWG kırmızı tel, 2x 6AWG terminal pabuçları, 5mm Alyan, 7/16 "

    Bir terminal pabucunu 6AWG kırmızı telin ucuna sabitleyin. 7/16 "kutu ucunu kullanarak, 120A ana kesicinin" AUX "tarafındaki somunu sökün ve terminali saplamanın üzerine yerleştirin. Somunu gevşek bir şekilde sabitleyin (kısaca kesmek, bantlamak ve sıkıştırmak için çıkarmak isteyebilirsiniz) telin diğer ucu) PDP'nin pozitif terminaline ulaşmak için gereken tel uzunluğunu ölçün.

    1. Terminali kırmızı 6AWG kablosunun 2. ucuna kesin, bantlayın ve kıvırın.

    2. 7/16 "kutu ucunu kullanarak, kabloyu 120A ana şalterin " AUX "tarafına sabitleyin.

    3. 5 mm'yi kullanarak diğer ucunu PDP pozitif terminaline sabitleyin.

    PDP bağlantılarını yalıtın

    Gerektirir : 1/16" Alyan, Elektrik bandı

    Elektrik bandı kullanarak, 120A şaltere iki bağlantıyı yalıtın. Ayrıca kapak değiştirildiği zaman ortaya çıkacak olan PDP terminallerinin herhangi bir parçasını yalıtın.

    Wago konektörleri

    Bir sonraki adım PDP'deki Wago konektörlerini kullanmayı içerecektir. Wago konnektörlerini kullanmak için, küçük bir düz tornavidayı dik açıda dikdörtgensel deliğe sokun, ardından kolu açarak terminali açarken bastırmaya devam edin ve tornavidayı yukarıya doğru çevirin.

    PDP'de iki boyutta Wago konektörü bulunur:

    Küçük Wago konektörü: 10AWG-24AWG kablo kabul eder.

    Büyük Wago konektörü: 6AWG-12AWG kablo kabul eder.

    Çekme kuvvetini en üst düzeye çıkarmak ve bağlantı direncini en aza indirmek için Wago konektörüne takmadan önce kalaylı (ve ideal olarak bükülmemiş) kablolar kullanılmamalıdır.

    Motor Sürücü Gücü

    Gerektirir: bant, Küçük Düz Tornavida, 10 veya 12 AWG tel, 10 veya 12 AWG çatal / halka terminalleri, tel sıkıştırıcı

    Spark Sürücüler için :

    1. Kırmızı ve siyah kabloyu 40A (daha büyük) Wago terminal çiftlerinden birinden hız kontrol cihazının giriş tarafına (her uçtaki terminallere takılacak uzunluk için biraz daha fazla) ulaşmak için uygun uzunlukta kesin.

    2. Her bir telin bir ucunu soyun, sonra Wago terminallerine yerleştirin.

    3. Her kablonun diğer ucunu soyun ve bir halka veya çatal terminaline sıkıştırın.

    Pwm kablosu entegreli motor sürücüler için(2. resim) :

    1. Kırmızı ve siyah güç giriş tellerini kesin ve bantlayın, ardından 40A Wago terminal çiftlerinden birine takın.

    Weidmuller Konnektörleri

    Sistemdeki CAN ve güç konektörlerinin bir numarası, bir Weidmuller LSF serisi tel-to-board konnektörü kullanır. En iyi sonuçlar için bu konektörü kullanırken aklınızda bulundurmanız gereken birkaç nokta vardır:

    • Kablo, 24AWG'ye 16AWG olmalıdır (güç kablolaması için gereken göstergeyi doğrulamak için kurallara bakın)

    • Kablo uçları yaklaşık 5/16 " olmalıdır.

    • Kabloyu takmak veya çıkarmak için terminali açmak için ilgili "düğmesine" basın.

    Bağlantıyı temizledikten sonra temiz ve güvenli olduğundan emin olun:

    • Konektörün dışında kısa devreye neden olabilecek çıkıntı teller olmadığından emin olun.

    • Tamamen oturduğunu doğrulamak için kabloyu bağlayın. Tel dışarı çıkarsa ve doğru ölçüm aleti varsa, daha fazla takılmalı ve / veya daha fazla soyulmalıdır.

    roboRIO Gücü

    Gerektirir: 10A / 20A mini sigortalar, Kablo soyucu, çok küçük düz tornavida, 18AWG Kırmızı ve Siyah

    1. PDP'deki 10A ve 20A mini sigortaları, yukarıdaki resimde gösterilen yerlerde takın.

    2. Hem kırmızı hem de siyah 18AWG kablosuna ~ 5/16 "takın ve PDB üzerindeki" Vbat Controller PWR "terminallerine bağlayın.

    3. RoboRIO üzerindeki güç girişine ulaşmak için gereken uzunluğu ölçün. Kabloları batarya gibi diğer bileşenlerin etrafına yönlendirmek ve herhangi bir gerilim azaltma veya kablo yönetimine izin vermek için yeterli uzunlukta bırakmaya dikkat edin.

    Voltaj Regülatörü Modülü

    Requires: Kablo soyucu, küçük düz uçlu tornavida(isteğe bağlı), 18AWG kırmızı ve siyah kablo

    1. Kırmızı ve siyah 18 AWG kablosunun ucunu soyun.

    2. Kabloyu, PDP üzerindeki "Vbat VRM PCM PWR" etiketli iki terminal çiftinden birine bağlayın.

    3. VRM'deki "12Vin" terminallerine ulaşmak için gereken uzunluğu ölçün. Kabloları batarya gibi diğer bileşenlerin etrafına yönlendirmek ve herhangi bir gerilim azaltma veya kablo yönetimine izin vermek için yeterli uzunlukta bırakmaya dikkat edin.

    Pneumatics Control Module (İsteğe Bağlı)

    Gerektirir: Kablo soyucu, küçük düz tornavida (isteğe bağlı), 18AWG kırmızı ve siyah kablo

    1. Kırmızı ve siyah 18 AWG kablosunun ucunu soyun.

    2. Kabloyu, PDP üzerindeki "Vbat VRM PCM PWR" etiketli iki terminal çiftinden birine bağlayın.

    3. VRM'deki "Vin" terminallerine ulaşmak için gereken uzunluğu ölçün. Kabloları batarya gibi diğer bileşenlerin etrafına yönlendirmek ve herhangi bir gerilim azaltma veya kablo yönetimine izin vermek için yeterli uzunlukta bırakmaya dikkat edin.

    Radyo Gücü ve Ethernet

    Gerekenler: Küçük düz tornavida (isteğe bağlı), Rev kablosuz PoE kablosu

    1. PoE kablosunun yüksüklerini VRM'nin 12V / 2A bölümündeki ilgili renkli terminallere takın.

    2. Kablonun ethernet ucunu, güç konektörüne en yakın Ethernet portuna (18-24v POE etiketli) bağlayın.

    Roborio'yu radyo ethernetine bağlamak

    Gerektirir : Ethernet Kablosu

    Rev Passive POE kablosunun dişi RJ45 (Ethernet) portundan bir Ethernet kablosunu, roboRIO üzerindeki RJ45 (Ethernet) portuna bağlayın.

    RoboRIO - PCM CAN

    Not: PCM, robot üzerindeki pnömatik kontrol için kullanılan isteğe bağlı bir bileşendir. PCM'yi kullanmıyorsanız, CAN bağlantısını doğrudan roboRIO'dan (bu adımda gösterilmiştir) PDP'ye bağlayın

    PDP CAN için PCM

    PWM Kabloları

    Seçenek 1 (Doğrudan bağlantı):

    1. Her bir Spark’ten gelen PWM kablolarını doğrudan roboRIO’ya bağlayın. Siyah kablo, roboRIO ve Spark'in dışına doğru olmalıdır. En basit programlama deneyimi için sol tarafı PWM 0 ve 1'e ve sağ tarafa PWM 2 ve 3'e bağlamanız önerilir, ancak hangi kanalın hangi kanala gittiğini ve kodu buna göre ayarladığınızı bildiğiniz sürece herhangi bir kanal kullanabilirsiniz.

    Seçenek 2 (Y kablosu):

    1. 1 PWM Y kablosunu, robotun bir tarafını kontrol eden spark için PWM kablolarına bağlayın. Y kablosundaki kahverengi kablo, PWM kablosundaki siyah kabloyla eşleşmelidir.

    2. PWM Y kablolarını roboRIO üzerindeki PWM bağlantı noktalarına bağlayın. Kahverengi tel, roboRIO'nun dışına doğru olmalıdır. En basit programlama deneyimi için sol tarafı PWM 0'a ve sağ tarafa PWM 1'e bağlamanız önerilir, ancak hangi kanalın hangi kanala gittiğini ve kodu buna göre ayarladığınızı bildiğiniz sürece herhangi bir kanal kullanabilirsiniz.

    Robot Sinyal Işığı

    Gerektirir: Kablo soyucu, 2 pin kablo, Robot Sinyal Işığı, 18AWG kırmızı kablo, çok küçük düz tornavida

    1. Siyah kabloyu merkeze, "N" terminaline takın ve terminali sıkın.

    2. 18AWG kırmızı kabloyu soyun ve "La" terminaline takın ve terminali sıkın.

    3. "Lb" terminaline takmak için 18AWG kablosunun diğer ucunu kesin ve soyun

    4. Kırmızı kabloyu iki pin kablosundan 18AWG kırmızı kablo ile "Lb" terminaline takın ve terminali sıkın.

    RSL'yi robot inşa edildiğinde daha görünür bir yere taşımanız önerilir

    Devre kesiciler

    40 amperlik Devre Kesicileri, Talonların bağlı olduğu Wago konnektörlerine karşılık gelen PDP üzerindeki konumlara takın. Tüm kesiciler için kesicinin en yakın pozitif (kırmızı) terminale denk geldiğine dikkat edin (yukarıdaki grafiğe bakınız). Kart üzerindeki tüm negatif terminaller doğrudan dahili olarak bağlanır.

    Motor gücü

    Her bir CIM motoru için:

    1. CIM'den gelen kırmızı ve siyah bantların uçlarını bantlayın

    spark veya diğer motor sürücüler için:

    1. Motor kablolarının her birinde bir halka / çatal terminali sıkın. Kabloları motor kontrol cihazının çıkış tarafına takın (kırmızı +, siyah -)

    Entegre tel denetleyiciler(kendi üzerinde kendiliğinden pwm kablosu olan sürücüler) için:

    1. Victor SP'den gelen beyaz ve yeşil kabloları bantlayın

    2. Motor kablolarını Victor SP çıkış kablolarına bağlayın (kırmızı kabloyu beyaz M + çıkışına bağlamanız önerilir).

    Batarya bağlayın

    Aküyü Andersen konektörünün robot tarafına bağlayın. Kolu, 120A ana şalterin üstündeki butonu gövdenin üstündeki sırtın içine hareket ettirerek açın.

    Co-Processor - Raspberry Pi

    Raspberry Pi

    Merhabalar, bu içerikte sizlerle daha önceden geliştirdiğimiz görüntü işleme komutlarını paylaşacağım. Öncelikle kodların tamamına ulaşmak isterseniz : buradan ulaşabilirsiniz.

    Bu kısmı buradan daha detaylı bir şekilde izleyebilirsiniz:

    Co-Processor olarak Raspberry PI kullanacağız.

    1/16" Hex anahtarı

  • Tel kesiciler, sıyırıcılar ve kıvırıcılar

  • 7/16” kutu uç anahtarı

  • Terminali motor sürücü giriş terminallerine takın (kırmızı ila +, siyah - -)
    Kabloyu kesin ve soyun.
  • Çok küçük bir düz tornavida kullanarak, kabloları roboRIO'nun güç giriş konektörüne bağlayın (kırmızı V, siyah C). Ayrıca güç konektörünün roboRIO'ya güvenli bir şekilde vidalandığından emin olun.

  • Telin ucundan ~ 5/16 "kesin ve soyun.
  • Kabloyu VRM 12Vin terminallerine bağlayın.

  • Telin ucundan ~ 5/16 "kesin ve soyun.
  • Kabloyu VRM 12Vin terminallerine bağlayın.

  • İki pinli konnektörü, roboRIO üzerindeki RSL bağlantı noktasına bağlayın. Siyah kablo, roboRIO'nun dışına en yakın tarafta olmalıdır.

    Gerekli Kütüphanelerin Kurulması

    Öncelikle görüntü işleme yapacağımız için OpenCV kütüphanelerinden faydalanacağız. OpenCV kütüphanelerinin çalışması için aynı zamanda Numpy kütüphanesini de kurmamız gerekmektedir.

    Konsola girmemiz gereken komutlar şu şekildedir: sudo apt install python-numpy python-opencv libopencv-dev

    y/n seçeneğine y yanıtını verelim. Bu işlem yaklaşık 5 dakika sürebilir.

    Python için pip yani paket yöneticimizi indirmemiz gerekmektedir.

    sudo apt install python python-pip

    y/n seçeneğine y yanıtını verelim. Ardından

    pip install opencv-python

    pip install pynetworktables

    pip install imutils

    komutlarını girelim. Eğer Python 3 kullanıyorsanız, pip komutlarınız şu şekilde olmalı:

    pip3 install opencv-python

    pip3 install pynetworktables

    pip3 install imutils

    Her şey tamamlandıktan sonra bu adımda bitmiş demektir. Bir sonraki adıma geçebiliriz.

    Renk işleme için renk değerlerinin oluşturulması

    En başta renk işlememiz için bize tanımlayacağımız rengin alt ve üst sınırları dediğimiz renk kodu gerekmektedir. Bunun için bir converter yazılımı mevcut. Kodlar bu şekildedir:

    Dilerseniz Github hesabımdan bu kodlara ulaşabilirsiniz. Github üzerinden kolayca wget komutu ile indirebilirsiniz.

    wget https://raw.githubusercontent.com/enisgetmez/BAUROV-Autonomous/master/converter.py

    Kullanımı ise şu şekildedir :

    Algılatmak istediğiniz rengin kırmızı, yeşil, mavi renk değerlerini almalısınız. Ardından şu komutu kullanmalısınız:

    convert.py red green blue

    Lower bound ve upper bound dediğimiz renkleri kopyalayın. İleride kullanacağız.

    Renk İşleme

    Raspberry PI için python yazılımımız şu şekildedir :

    Komutların açıklamaları kod içerisinde bulunmaktadır. Eğer Raspberry PI için komutu otomatik olarak indirmek isterseniz wget komutunu kullanabilirsiniz.

    Artık Java kodlarınızıda yazdıktan sonra robotunuzu enable ettiğinizde , Raspberry PI üzerinden yazılımımızı çalıştırdığımızda değerler otomatik olarak SmartDashboarda düşmeye başlayacaktır.

    Kodunuzu Raspberry PI üzerinden çalıştırmak için:

    python yazilimadi.py

    Şeklinde kullanmanız gerekmektedir. Eğer wget komutunu kullandıysanız yazılım otomatik olarak vision.py olarak gelecektir. Yani çalıştırmak için:

    python vision.py

    komutunu kullanmanız yeterli olacaktır.

    Raspberry Pi kod düzenleme(opsiyonel)

    Raspberry Pi ile gelen kodu düzenlemek isterseniz nano komutunu kullanarak düzenleyebilirsiniz.

    nano vision.py

    Komutunu girip düzenleyeceğiniz satırı düzenledikten sonra ctrl-x tuşlarıyla çıkış yapabilirsiniz.

    Şekil İşleme

    Komutların açıklamaları kod içerisinde bulunmaktadır. Eğer Raspberry PI için komutu otomatik olarak indirmek isterseniz wget komutunu kullanabilirsiniz.

    Artık robotunuzu enable ettiğinizde , Raspberry PI üzerinden yazılımımızı çalıştırdığımızda değerler otomatik olarak smart dashboarda düşmeye başlayacaktır.

    Kodunuzu Raspberry PI üzerinden çalıştırmak için:

    python yazilimadi.py

    Şeklinde kullanmanız gerekmektedir. Eğer wget komutunu kullandıysanız yazılım otomatik olarak vision.py olarak gelecektir. Yani çalıştırmak için:

    python circle.py

    komutunu kullanmanız yeterli olacaktır.

    Javadan Değerleri Çekin!

    Kütüphaneleri import edin

    Class'ınızın altına networktables'i tanımlayın

    Değerleri okumak için 2 tane void oluşturalım.

    Değerleri SmartDashboard'a yazdıralım.

    Motorlarımız Değerlere göre haraket ettirelim!

    Kodların tamamına buradan ulaşabilirsiniz :

    Artık robotunuzu enable ettiğinizde , yazılımımızı çalıştırdığımızda değerler otomatik olarak SmartDashboard düşmeye başlayacaktır.

    https://github.com/enisgetmez/FRC-Vision-Processing
    FRC-Vision-Processing/Java/robot.java at master · enisgetmez/FRC-Vision-ProcessingGitHub
    import sys
    import numpy as np
    import cv2
     
    blue = sys.argv[1]
    green = sys.argv[2]
    red = sys.argv[3]  
     
    color = np.uint8([[[blue, green, red]]])
    hsv_color = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)
     
    hue = hsv_color[0][0][0]
     
    print("Lower bound is :"),
    print("[" + str(hue-10) + ", 100, 100]\n")
     
    print("Upper bound is :"),
    print("[" + str(hue + 10) + ", 255, 255]")
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    from collections import deque
    from networktables import NetworkTables
    import numpy as np
    import argparse
    import cv2
    import time
    import imutils
    x = 0 #programın ileride hata vermemesi için x 0 olarak tanımlıyorum
    y = 0 # programın ileride hata vermemesi için y 0 olarak tanımlıyorum
    NetworkTables.initialize(server='roborio-6025-frc.local') # Roborio ile iletişim kuruyoruz
    table = NetworkTables.getTable("Vision") # table oluşturuyoruz
    
    #sari rengin algilanmasi
    colorLower = (24, 100, 100)
    colorUpper = (44, 255, 255)
    #converter.py ile convert ettiğiniz rengi buraya giriniz
    camera = cv2.VideoCapture(0) #  webcamin bagli oldugu port varsayilan 0
    while True: #yazılımımız çalıştığı sürece aşağıdaki işlemleri tekrarla
    
    
         (grabbed, frame) = camera.read() # grabbed ve frame değişkenini camera.read olarak tanımlıyoruz.
    
         frame = imutils.resize(frame, width=600) # görüntü genişliğini 600p yapıyoruz
         frame = imutils.rotate(frame, angle=0) # görüntüyü sabitliyoruz
    
         hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # görüntüyü hsv formatına çeviriyoruz
    
         mask = cv2.inRange(hsv, colorLower, colorUpper) # hsv formatına dönen görüntünün bizim belirttiğimiz renk sınırları içerisinde olanları belirliyor
         mask = cv2.erode(mask, None, iterations=2) # bizim renklerimizi işaretliyor
         mask = cv2.dilate(mask, None, iterations=2) # bizim renklerimizin genişliğini alıyor
    
    
         cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
    	 cv2.CHAIN_APPROX_SIMPLE)[-2]
         center = None
    
    
         if len(cnts) > 0:
    
    		     c = max(cnts, key=cv2.contourArea)
    		     ((x, y), radius) = cv2.minEnclosingCircle(c)
    		     M = cv2.moments(c)
    		     center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
    
    
    		     if radius > 10: #algılanacak hedefin minumum boyutu
    			     cv2.circle(frame, (int(x), int(y)), int(radius),
    				 (0, 255, 255), 2)
    			     cv2.circle(frame, center, 5, (0, 0, 255), -1)
         else:
            x = 0 ##değerlerin sıfırlanması
            y = 0
    
         print("x : ")
         print(x) # kameradan gelen görüntüde bizim rengimiz varsa x kordinatı
         print("y : ")
         print(y) # kameradan gelen görüntüde bizim rengimiz varsa y kordinatı
    
         table.putNumber("X", x) # roborioya değeri göndermek
         table.putNumber("Y", y)
    wget https://raw.githubusercontent.com/enisgetmez/FRC-Vision-Processing/master/Color%20Detect/vision.py
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import numpy as np
    import argparse
    import cv2
    import cv2 as CV 
    from networktables import NetworkTables
    
    
    NetworkTables.initialize(server='roborio-6025-frc.local') # Roborio ile iletişim kuruyoruz
    table = NetworkTables.getTable("Vision") # table oluşturuyoruz
    
    cap = cv2.VideoCapture(0) # webcamin bagli oldugu port
    
    
    while(True):
    	# goruntu yakalama
    	ret, frame = cap.read()
    
    	# goruntuyu grilestir
    			
    	output = frame.copy()
    	gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    	
    	# goruntuyu blurlastir
    	gray = cv2.GaussianBlur(gray,(5,5),0);
    	gray = cv2.medianBlur(gray,5)
    
    	gray = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
                cv2.THRESH_BINARY,11,3.5)
    	
    	kernel = np.ones((5,5),np.uint8)
    	gray = cv2.erode(gray,kernel,iterations = 1)
    
    	gray = cv2.dilate(gray,kernel,iterations = 1)
    	circles = cv2.HoughCircles(gray, cv2.cv.CV_HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0) #python2 icin
    #	circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param1=40, param2=45, minRadius=0, maxRadius=0) # python3 icin 
        # (x−xcenter)2+(y−ycenter)2=r2   (xcenter,ycenter) 
    	# kalibre
    	# daireyi isle
    	
    	if circles is not None:
    
    		circles = np.round(circles[0, :]).astype("int")
    		
    		
    		for (x, y, r) in circles:
    	
    			cv2.circle(output, (x, y), r, (0, 255, 0), 4)
    			cv2.rectangle(output, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)
    
    			
    			print ("X kordinat: ")
    			print (x) # x kordinatı
    			print ("Y Kordinat: ")
    			print (y) # y kordinatı
    			print ("Radius: ")
    			print (r) # cisimin büyüklüğü
    			table.putNumber("X", x) # roborioya değeri göndermek
    			table.putNumber("Y", y)
    			#cv2.imshow('frame',output) # ekranda göster
    			if cv2.waitKey(1) & 0xFF == ord('q'):
    				break
    cap.release()
    cv2.destroyAllWindows()
    wget https://raw.githubusercontent.com/enisgetmez/FRC-Vision-Processing/master/Figure%20Detect/circle.py
    import edu.wpi.first.wpilibj.networktables.NetworkTable; // Networktables kütüphanesi
    import edu.wpi.first.wpilibj.smartdashboard.SendableChooser; // smartdashboardan verileri görmek için
    import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
    	public static NetworkTable table1 = NetworkTable.getTable("Vision"); // vision adında table çekiliyor
    public static double konumX()
    	{
    		return table1.getNumber("X", 0.0); //raspberry pi den gelen x kordinatları
    	}
    	public static double konumY() 
    	{
    		return table1.getNumber("Y", 0.0); //raspberry pi den gelen y kordinatları
    	}
    	public void teleopPeriodic() {
    		SmartDashboard.putNumber("Nesnenin X konumu: ", konumX()); // smartdashboarda x konumu yazdır
    		SmartDashboard.putNumber("Nesnenin Y konumu: ", konumY()); // smartdashboarda y konumunu yazdır
    
    	}
    	public void autonomousPeriodic() {
    	    if(konumX() == 0)
    	{
    	sagmotor1.set(0);
    	sagmotor2.set(0);
    	solmotor1.set(0);
    	solmotor2.set(0);
    	}
    		else if(konumX() < 285) // degerler 285'ten kucukse saga don
    		{
    		sagmotor1.set(0.5); // sag motorları calistir
    		sagmotor2.set(0.5);
    		}
    		else if (konumX() > 295) // degerler 295'ten buyukse sola don
    		{
    		solmotor1.set(0.5); //sol motorlari calistir
    		solmotor2.set(0.5);
    		}
    
    	}

    Aktüatörler kullanma (motorlar, servolar ve röleler)

    Aktüatöre Genel Bakış

    Bu bölümde speed controller, röleler veWPILib yöntemleri ile motorların ve pnömatiklerin kontrolü ele alınmaktadır.

    Aktüatör tipleri

    Yukarıda gösterilen grafik, WPILib aracılığıyla kontrol edilebilen aktüatör tiplerini göstermektedir. Bu bölümdeki makaleler, bu tip aktüatörlerin her birini ve bunları kontrol eden WPILib yöntemleri ve sınıflarını kapsayacaktır.

    Hız kontrolörlü nesnelere sahip motorlar (Victors, Talons ve Jaguars)

    PWM kontrolörleri, kısa çalışma teorisi

    Kısaltma PWM ( Pulse Width Modulation ) Sinyal Genişlik Modülasyonu anlamına gelir. Victor , Talon ve Jaguar speed controllerleri için PWM girişlerine başvurabilirsiniz bu yöntem motor hızını kontrol etmek için kullanılır. Motorun hızını kontrol etmek için kontrolör motorun algılanan giriş voltajını değiştirmelidir. Bunu yapmak için kontrolör, kontrol sinyaline dayanarak üzerinde olduğu süreyi değiştirerek, giriş voltajını çok hızlı bir şekilde açıp kapatır. FRC'DE kullanılan motor tiplerinin Mekanik Ve Elektronik zaman sabitleri nedeniyle bu hızlı anahtarlama, sabit bir düşük voltajın uygulanmasıyla eşdeğer bir etki üretir (%50 anahtarlama, ~6V ile aynı etkiyi üretir).

    Denetleyicilerin giriş için kullandığı PWM sinyali biraz farklıdır. Sinyal aralığının sınırlarında bile (maksimum ileri veya maksimum geri) sinyal asla %0 veya %100'lik bir görev döngüsüne yaklaşmaz. Bunun yerine Denetleyiciler, 5 ms veya 10 ms'lik bir süre ve 1.5 ms'lik bir orta nokta darbe genişliği olan bir sinyal kullanır. Talon ve Victor kontrolörleri, 1 ms'den 2 ms'ye kadar tipik hobi RC kontrol zamanlamasını kullanır ve Jaguar, 7ms ila ~ 2.3 ms genişletilmiş bir zamanlama kullanır.

    Ham ve İşlenmiş Veri

    Genel olarak, WPILib'deki tüm motor kontrol sınıfları, bir aktüatöre çıkış olarak işlenmiş hali -1.0 ila 1.0 değeri almak üzere ayarlanır. FPGA'DAKİ PWM modülü, 5, 10 veya 20ms dönemleri ile PWM sinyalleri üretme yeteneğine sahiptir ve darbe genişliğini 2000 basamak aralığında değiştirebilir.Her biri orta noktanın etrafında 001ms(orta noktanın etrafındaki her yönde 1000 adım). Bu modüle gönderilen ham değerler, düşük sinyal (devre dışı) tutan özel bir durum olan 0-2000 aralığındadır. Her motor denetleyicisi için sınıf tipik bağlı değerleri (min, max ve deadband her iki tarafında) yanı sıra tipik orta noktası hakkında bilgi içerir. WPILib, işlenmiş değeri motor denetleyicisi için uygun aralığa eşlemek için bu değerleri kullanabilir. Bu kod denetleyicileri farklı türleri arasında sorunsuz geçiş ve belirli sinyal ayrıntıları özetlemelerini sağlar.

    PWM ve Safe PWM Classları

    PWM

    PWM classı, PWM sinyalleri ile çalışan cihazlar için temel sınıftır ve roborio'daki PWM sinyal oluşturma donanımına bağlantılıdır. Doğrudan bir speed controller cihazı veya servo üzerinde kullanılmak üzere tasarlanmamıştır. PWM classı Victor, Jaguar, Talon ve Servo alt sınıfları güncelleme oranını ayarlamak için, deadband eliminasyonunu ve çıktısının profil şekillenmesini belirleyen kod çıktıları verir.

    Safe PWM

    PWM classının bir alt classıdır. Her nesneye detaylı bir izleme ve speed controller nesnesi ekler.

    Bir Speed Controller nesnesinin oluşturulması

    C++

    Java

    Parametreleri Ayarlama

    C++

    Java

    • Deadband Elimination-Ölçekleme algoritmaları denetleyicisi deadband ortadan kaldırmak için true olarak ayarlayın. Denetleyici varsayılan ayarlamak için false olarak ayarlayın.

    Hız Ayarı

    C++

    Java

    Daha önce belirtildiği gibi, Speed Controller nesneleri -1.0 (tam ters) ila +1.0 (tam ileri) arasında değişen tek bir hız parametresi alır.

    WPILib sürücü sınıfları: Drivetrain türleri

    WPILib Sürücü sınıfları, her bir aktarma organı tipi için ayrı sınıflar içerir. WPILib sınıfları tarafından desteklenen üç tip drivetrain vardır. Bu makalede üç tür açıklanmaktadır.

    Differential Drive

    Bu drive base genellikle iki veya daha fazla çekiş gücüne sahiptir. Aynı zamanda "skid-steer", "tank drive" veya "West Coast Drive"olarak da bilinir. Omni tekerlekler kullanarak yatay eksende hareket yapabilirsiniz. Görseldeki robot drivetrain kiti içerisinden çıkan parçalarla yapılmış differential drive örneğidir. Bu drivetrains ileri/geri sürüş yeteneğine sahiptir ve iki tarafı ters yönde sürerek tekerleklerin yanlara doğru kaymasına neden olabilir. Bu drivetrain yan öteleme hareketi yeteneğine sahip değildir.

    Mecanum Drive

    Mecanum drive robotun şasesi ile dönüş yapmadan tekerlekeri kullanarak herhangi bir yönde sürüş yapmanızı sağlayan yöntemdir. Bu yönteme holonomic drive da denir. Tekerlekler 45 derecelik açıda silindirlere sahiptir.

    Üstten bakıldığında bir mecanum robotunun tekerlekleri X desenini oluşturmalıdır. Tekerlekleri farklı yönlerde döndürerek, kuvvet vektörlerinin çeşitli bileşenleri iptal edilir ve istenen robot hareketi ile sonuçlanır. Aşağıda, bu hareketlerin her biri için kuvvet vektörlerinin çizilmesi, bu drivetrainlerin nasıl çalıştığını anlamanızda yardımcı olabilir.

    Killough Drive

    Killough drive (aynı zamanda kiwi drive olarak da bilinir) birbirinden 120 derece açılı üç omni tekerlek kullanan bir holonomik drivetraindir. Mecanum sürücüye benzer şekilde, tekerlekler istenen hareketi gerçekleştirmek için farklı hızlarda çalıştırılır. Sağlanan kontrol yöntemleri Mecanum sürücüsü ile aynıdır.

    Differential Drive kullanarak robotu sürmek

    Differential Drive Nesnesi Oluşturmak

    C++

    Java

    Multi-Motor Sürüşü

    Birçok FRC drivetrain, her tarafta 1'den fazla motora sahiptir. Bunları DifferentialDrive ile kullanmak için, her iki taraftaki motorlar SpeedControllerGroup sınıfı kullanılarak tek bir SpeedController'a toplanmalıdır. Aşağıdaki örneklerde 4 motor (her bir tarafta 2) aktarma organı gösterilmiştir. Daha fazla motora kadar genişletmek için, sadece ek kontrolörleri yaratın ve hepsini SpeedController grubu kontrolörüne aktarın (bu, keyfi bir giriş sayısı alır, kullandığınız motor sayısına göre ekleme yapabilirsiniz).

    C++

    Java

    Sürüş Modları

    DifferentialDrive sınıfı 3 sürücü modu içerir:

    • Tank Drive - Bu mod, aktarma organlarının her iki tarafını kontrol etmek için birer değer kullanır.

    • Arcade Drive - Bu mod, aktarma organının gaz kelebeğini (X ekseni boyunca hız) ve bir rotasyon oranını kontrol etmek için bir değer kullanır.

    • Curvature Drive - "Cheesy Drive" olarak da bilinir; Rotasyon argümanı, rotanın değişim oranından ziyade robotun yolunun eğriliğini kontrol eder. Bu, robotu yüksek hızlarda daha kontrol edilebilir hale getirir. Ayrıca, robotun hızlı dönüş fonksiyonunu ele alır - "hızlı dönüş", yerinde manevralar için sabit eğrilik dönüşünü geçersiz kılar.

    Tank Drive

    Tank Drive modu, aktarma organlarının her iki tarafını bağımsız olarak kontrol etmek için kullanılır (genellikle her 2 taraf için 2 farklı joystick ile kullanılır.). Bu örnek, aktarma organını Tank modunda çalıştırmak için iki ayrı kumanda kolunun Y ekseninin nasıl kullanılacağını gösterir.

    C++

    Java

    Arcade Drive

    Arcade Drive modu, aktarma organını hız / gaz(throttle) ve dönüş oranını kullanarak kontrol etmek için kullanılır. Bu genellikle tek bir kumanda kolundan iki eksenle ya da bir çubuktan gelen gaz kelebeği ve diğerinden dönüş ile birlikte (genellikle tek bir joystick üzerinde) joystick'lere bölünür. Bu örnek, Arcade modu ile tek bir joystick'in nasıl kullanılacağını gösterir.

    C++

    Java

    Curvature Drive

    Arcade Drive gibi, Curvature Drive modu hız / gaz ve dönüş oranını kullanarak aktarma organlarını kontrol etmek için kullanılır. Fark, rotasyon kontrolünün, başlık değişiminin hızı yerine eğrilik yarıçapını kontrol etmeye çalışmasıdır. Bu mod ayrıca, yerinde dönmeyi sağlayan bir alt modu devreye sokmak için kullanılan hızlı dönüş parametresine de sahiptir. Bu örnek Curvature moduyla tek bir joystick'in nasıl kullanılacağını gösterir.

    C++

    Java

    Mecanum Drive kullanarak robotu sürmek

    Bu robotta gösterilen tekerlekler, sürücülerin, klasik bir sürüş durumunda olduğu gibi, düz ileriye doğru 45 derecelik bir açıda uygulanmasına neden olan silindirlere sahiptir. Tekerleklerin hızını değiştirmenin herhangi bir yönde hareket etmesini sağladığını tahmin edebilirsiniz. Mecanum jantların internetteki çeşitli web sitelerinde nasıl çalıştığını araştırabilirsiniz.

    Mecanum Kontrolü : Cartesian vs Polar

    MecanumDrive sınıfı aktarma organlarını kontrol etmek için iki yol içerir:

    • Kartezyen: Bu yöntem X, Y , Döndürme parametrelerini alır ve joystickleri mecanum sürüş hareketine eşleştirirken yaygın olarak kullanılır. Elde edilen robot dönüşü istenen X ve Y hareketinin birleşimidir.

    • Polar: Bu yöntem Büyüklük, Açı ,Döndürme parametrelerini alır ve robotu bağımsız olarak kontrol ederken yaygın olarak kullanılır. Açı, Z ekseni etrafında derece olarak belirtilmelidir (-180 ve 180 arasında).

    Mecanum tekerlekler için teleop sürüş kodu

    Tek bir joystick ile mecanum tekerlekleri kullanarak sürmek için minimum kodu gösteren örnek bir program. Joystick XY konumu, robotun takip etmesi gereken bir robot yön vektörünü temsil eder. Joystick üzerindeki twist (Z) ekseni, sürüş sırasında robot için dönme hızını temsil eder.

    C++

    Java

    Alan odaklı sürüş için programın güncellenmesi

    bir Gyro sensöründen döndürülen açı olan MecanumDrive_Cartesian() yönteminde isteğe bağlı 4. parametre vardır. Joystick'ten verilen X/Y değerleri robotu alana göre ayarlayacaktır. Bu yöntem mecanum sürücüsü için çok yararlıdır. çünkü sürüş için robotun gerçekten ön, arka veya yanları yoktur. Her yöne gidebilir. Bir Gyro sensöründen derece açısını ekleyerek robotun yönlerini daha doğru bir şekilde kullanabilirsiniz.

    Alan odaklı sürüş kullanımı genellikle robot sürücüleri karşı karşıya olduğunda kontrolleri tersine çevrilir.

    MecanumDrive_Cartesian () her çağrıldığında gyro açısını almayı unutmayın.

    C++

    Java

    WPILib ile Servo Kontrolü

    Bir Servo nesnesi oluşturmak

    Servo Değerlerini Ayarlamak

    WPILib'de servo değerlerini ayarlamak için iki yöntem vardır:

    • Scaled Değer - 0 ile 1,0 arasında bir ölçek değeri kullanarak servo konumunu ayarlar. 0, servonun bir ucuna karşılık gelir ve 1.0, diğerine karşılık gelir.

    • Angle - Açıyı, derece cinsinden belirterek servo konumunu ayarlayın. Bu yöntem, Hitec HS-322HD servo (0 ila 170 derece) ile aynı aralıktaki servolar için çalışacaktır.

    On/Off kontrol mekanizmaları , motorlar, diğer mekanizmalar

    Motorlar, solenoidler, ışıklar veya diğer özel devreler gibi diğer mekanizmaların On / Off kontrolü için, WPILib, VEX Robotics'ten Spike H-Bridge Relay'e arabirim oluşturmak için tasarlanmış röle çıkışları için destek oluşturmuştur. Bu cihazlar, bir H-Köprü konfigürasyonunda bağlanan iki rölenin durumunu bağımsız olarak kontrol etmek için 3 pinli bir çıkış (GND, Forward, Reverse) kullanır. Bu, rölenin her iki kutuptaki çıkışlara güç sağlamasına veya her iki çıkışı aynı anda açmasına izin verir.

    Röle yönlerini ayarlamak WPILib röleleri içinde kBothDirections (geri dönüşlü motor veya iki yönlü solenoid), kForwardOnly (sadece ileri pimi kullanır) veya kReverseOnly (yalnızca geri pini kullanır) olarak ayarlanabilir. Yön için bir değer girilmezse, varsayılan olarak kBothDirections olarak ayarlanır. Bu, Relay sınıfındaki hangi yöntemlerin belirli bir örnekle kullanılabileceğini belirler.

    Röle durumu set() yöntemi kullanılarak ayarlanır. Yöntem, aşağıdaki değerlerle bir numaralandırma parametre olarak alır:

    • kOff - Her iki röle çıkışını da kapatır

    • kForward - Röleyi ileriye doğru ayarlar (M + @ 12V, M- @ GND)

    • kReverse - Röleyi tersine çevirir (M + @ GND, M- @ 12V)

    • KOn - Her iki röle çıkışını da ayarlar (M + @ 12V, M- @ 12V).

    Röle yönü, yalnızca ileri veya geri pimler etkinleştirilecek şekilde ayarlanmışsa, bu yöntemin kForward veya kReverse'ye eşdeğer olacağını unutmayın. kOn kullanılması önerilmez.

    Pnömatik için kompresör kullanmak

    Kompresörün Uygulanması, Başlatılması ve Durdurulması

    C++

    Java

    Kompresör durumu

    C++

    Java

    kompresör nesnesi oluşturmanın diğer nedeni, kompresörün durumunu sorgulamaktır. Halihazırda olan veya olmayan durum, pressure switch durumu ve compressorcurrent , compressor nesnesinden sorgulanabilir.

    Pnömatik silindirleri - Solenoidler'i kullanmak

    Solenoid'e genel bakış

    FRC'de kullanılan pnömatik solenoid valfler dahili pilotlu vanalardır. Dahili pilotlu solenoid valflerin çalışması hakkında daha fazla bilgi için, . Valfın harekete geçmesi için gereken minimum bir giriş basıncı olmalıdır. FRC takımları tarafından yaygın olarak kullanılan vanaların çoğu için bu 20 ila 30 psi arasındadır.

    PCM'nin kendisindeki LED'lere bakmak, elektrik veya hava basıncı giriş sorunlarını ortadan kaldırmak için kodun beklediğiniz gibi davrandığını doğrulamanın en iyi yoludur.

    Single solenoidler, tek bir çıkış portundan basınç uygular veya havalandırır. Tipik olarak, ya harici bir kuvvet, silindirin (yay, yerçekimi, ayrı mekanizma) geri dönüş hareketini sağlayacağı ya da double solenoid olarak hareket edecek çiftler halinde kullanılır. double solenoid, iki çıkış portu arasındaki hava akışını değiştirir (aynı zamanda çıkışların ne şekilde havalandırıldığı veya girişe bağlı olmadığı bir orta konuma da sahiptir). Çift silindirli valfler, hava basıncını kullanarak bir silindirin hem uzatılması hem de geri çekilme hareketlerini kontrol etmek istediğinizde yaygın olarak kullanılır. Double solenoid valfler, solenoid koparmada iki ayrı kanala bağlanan iki elektrik girişine sahiptir.

    Single Solenoid kullanımı

    C++

    Java

    WPILib'deki single solenoidler Solenoid sınıfı kullanılarak kontrol edilir. Bir Solenoid nesnesi oluşturmak için, istenen port numarasını ( veya Node ID) ve port numarasını yazmanız yeterlidir. Solenoid çıkışını etkinleştirmek için set(true) değerini ayarlamak veya pasifleştirmek için set(false) ayarlamak gerekir.

    Double Solenoid kullanımı

    C++

    Java

    Double solenoidler WPILib'deki DoubleSolenoid sınıfı tarafından kontrol edilir. Bunlar, single solenoide benzer şekilde yapılandırılmıştır, ancak iki port numarası bulunmaktadır. Valfin durumu daha sonra kOff (çıkış etkin değildir), kForward (ileri kanal etkin) veya kReverse (ters kanal etkin) olarak ayarlanabilir.

    NI Activation Wizard (3)

    Sağ Yatay

    İleri

    Geri

    Geri

    İleri

    Sol Yatay

    Geri

    İleri

    İleri

    Geri

    Saat Yönünde Dönüş

    İleri

    Geri

    İleri

    Geri

    Saat Yönünün Tersinde

    Geri

    İleri

    Geri

    İleri

    Hareket Yönü

    Sol Ön

    Sağ Ön

    Sol Arka

    Sağ Arka

    İleri

    İleri

    İleri

    İleri

    İleri

    Geri

    Geri

    Geri

    Geri

    bu Wikipedia makalesine bakın

    Geri

    NI Activation Wizard (2)
    frc::Jaguar exampleJaguar{0};
    frc::Talon exampleTalon{1};
    frc::TalonSRX exampleTalonSRX{2};
    frc::Victor exampleVictor{11};
    frc::VictorSP exampleVictorSP{12};
    Jaguar exampleJaguar = new Jaguar(0);
    Talon exampleTalon = new Talon(1);
    TalonSRX exampleTalonSRX = new TalonSRX(2);
    Victor exampleVictor = new Victor(11);
    VictorSP exampleVictorSP = new VictorSP(12);
    frc::Jaguar exampleJaguar{0};
    exampleJaguar.EnableDeadbandElimination(true);
    Jaguar exampleJaguar = new Jaguar(0);
    exampleJaguar.enableDeadbandElimination(true);
    frc::Jaguar exampleJaguar{0};
    exampleJaguar.Set(0.7);
    Jaguar exampleJaguar = new Jaguar(0);
    exampleJaguar.set(0.7);
    class Robot 
    {
    	public:   
    		frc::Spark m_left{1};
    		frc::Spark m_right{2}; 
    		frc::DifferentialDrive m_drive{m_left, m_right};
    public class Robot 
    {
    	Spark m_left = new Spark(1);
    	Spark m_right = new Spark(2);
    	DifferentialDrive m_drive = new DifferentialDrive(m_left, m_right);
    class Robot 
    {
    	public:   
    		frc::Spark m_frontLeft{1};
    		frc::Spark m_rearLeft{2}; 
    		frc::SpeedControllerGroup m_left{m_frontLeft, m_rearLeft};
    
    		frc::Spark m_frontRight{3};
    		frc::Spark m_rearRight{4}; 
    		frc::SpeedControllerGroup m_right{m_frontRight, m_rearRight};
    
    		frc::DifferentialDrive m_drive{m_left, m_right};
    public class Robot 
    {
    	Spark m_frontLeft = new Spark(1);
    	Spark m_rearLeft = new Spark(2);
    	SpeedControllerGroup m_left = new SpeedControllerGroup(m_frontLeft, m_rearLeft);
    
    	Spark m_frontRight = new Spark(3);
    	Spark m_rearRight = new Spark(4);
    	SpeedControllerGroup m_Right = new SpeedControllerGroup(m_frontRight, m_rearRight);
    	DifferentialDrive m_drive = new DifferentialDrive(m_left, m_right);
    class Robot: public frc::TimedRobot
    {
    	//Object construction
    
    	void TeleopPeriodic() override {		
    		myDrive.TankDrive(leftStick.GetY(), rightStick.GetY());
    	}	
    }
    public class RobotTemplate extends TimedRobot 
    {
    	//Object construction
    
    	public void teleopPeriodic() {    			
    		myDrive.tankDrive(leftStick.getY(),  rightStick.getY());   
    	}
    }
    class Robot: public frc::TimedRobot
    {
    	//Object construction
    
    	void TeleopPeriodic() override {		
    		myDrive.ArcadeDrive(driveStick.GetY(), driveStick.GetX());
    	}	
    }
    public class RobotTemplate extends TimedRobot 
    {
    	//Object construction
    
    	public void teleopPeriodic() {    			
    		myDrive.arcadeDrive(driveStick.getY(),  driveStick.getX());   
    	}
    }
    class Robot: public frc::TimedRobot
    {
    	//Object construction
    
    	void TeleopPeriodic() override {		
    		myDrive.CurvatureDrive(driveStick.GetY(), driveStick.GetX(), driveStick.GetButton(1));
    	}	
    }
    public class RobotTemplate extends TimedRobot 
    {
    	//Object construction
    
    	public void teleopPeriodic() {    			
    		myDrive.curvatureDrive(driveStick.getY(),  driveStick.getX(), driveStick.GetButton(1));   
    	}
    }
    #include "WPILib.h"
    /**
     * Simplest program to drive a robot with mecanum drive using a single Logitech
     * Extreme 3D Pro joystick and 4 drive motors connected as follows:
     *     - PWM 0 - Connected to front left drive motor
     *     - PWM 1 - Connected to rear left drive motor
     *     - PWM 2 - Connected to front right drive motor
     *     - PWM 3 - Connected to rear right drive motor
     */
    class MecanumDefaultCode : public frc::TimedRobot
    {
    	
    	frc::Spark m_frontLeft{0};		
    	frc::Spark m_rearLeft{1}; 
    	frc::Spark m_frontRight{2};
    	frc::Spark m_rearRight{3};
    	frc::MecanumDrive m_drive{m_frontLeft, m_rearLeft, m_frontRight, m_rearRight};
    	frc::Joystick m_driveStick{1};
    
    	/**
    	 * Gets called once for each new packet from the DS.
    	 */
    	void TeleopPeriodic override (void)
    	{
    		m_robotDrive.MecanumDrive_Cartesian(m_driveStick.GetX(), m_driveStick.GetY(), m_driveStick.GetZ());
    	}
    
    };
    START_ROBOT_CLASS(MecanumDefaultCode);
    import edu.wpi.first.wpilibj.Joystick;
    import edu.wpi.first.wpilibj.RobotDrive;
    import edu.wpi.first.wpilibj.TimedRobot;
    
    /*
     * Simplest program to drive a robot with mecanum drive using a single Logitech
     * Extreme 3D Pro joystick and 4 drive motors connected as follows:
     *     - PWM 0 - Connected to front left drive motor
     *     - PWM 1 - Connected to rear left drive motor
     *     - PWM 2 - Connected to front right drive motor
     *     - PWM 3 - Connected to rear right drive motor
     */
    
    public class MecanumDefaultCode extends TimedRobot {
         //Create a robot drive object using PWMs 0, 1, 2 and 3
         Spark m_frontLeft = new Spark(1);	
    		Spark m_rearLeft = new Spark(2);
    		Spark m_frontRight = new Spark(3);	
    		Spark m_rearRight = new Spark(4);
         //Define joystick being used at USB port 1 on the Driver Station
         Joystick m_driveStick = new Joystick(1);
    
         public void teleopPeriodic() 
    		{
              m_robotDrive.mecanumDrive_Cartesian(m_driveStick.getX(), m_driveStick.getY(), m_driveStick.getZ());
         }
    }
    m_robotDrive.MecanumDrive_Cartesian(m_driveStick.GetX(), m_driveStick.GetY(), m_driveStick.GetZ(), m_gyro.GetAngle());
    m_robotDrive.mecanumDrive_Cartesian(m_driveStick.getX(), m_driveStick.getY(), m_driveStick.getZ(), m_gyro.getAngle());
    C++
    Servo *exampleServo = new Servo(1);
    Java
    Servo exampleServo = new Servo(1);
    
    C++
    
    exampleServo->Set(.5);
    exampleServo->SetAngle(75);
    
    Java
    
    exampleServo.set(.5);
    exampleServo.setAngle(75);
    C++
    
    Relay *exampleRelay = new Relay(1);
    Relay *exampleRelay = new Relay(1, Relay::Value::kForward)
    
    exampleRelay->Set(Relay::Value::kOn);
    exampleRelay->Set(Relay::Value::kForward);
    
    Java
    
    exampleRelay = new Relay(1);
    exampleRelay = new Relay(1, Relay.Value.kForward);
    
    exampleRelay.set(Relay.Value.kOn);
    exampleRelay.set(Relay.Value.kForward);
    
    Compressor *c = new Compressor(0);
    
    c->SetClosedLoopControl(true);
    c->SetClosedLoopControl(false);
    
    Compressor c = new Compressor(0);
    
    c.setClosedLoopControl(true);
    c.setClosedLoopControl(false);
    bool enabled = c->Enabled();
    bool pressureSwitch = c->GetPressureSwitchValue();
    double current = c->GetCompressorCurrent();
    
    boolean enabled = c.enabled();
    boolean pressureSwitch = c.getPressureSwitchValue();
    double current = c.getCompressorCurrent();
    frc::Solenoid exampleSolenoid {1};
    
    exampleSolenoid.Set(true);
    exampleSolenoid.Set(false);
    
    Solenoid exampleSolenoid = new Solenoid(1);
    
    exampleSolenoid.set(true);
    exampleSolenoid.set(false);
    frc::DoubleSolenoid exampleDouble {1, 2};
    
    exampleDouble.Set(frc::DoubleSolenoid::Value::kOff);
    exampleDouble.Set(frc::DoubleSolenoid::Value::kForward);
    exampleDouble.Set(frc::DoubleSolenoid::Value::kReverse);
    
    DoubleSolenoid exampleDouble = new DoubleSolenoid(1, 2);
    
    exampleDouble.set(DoubleSolenoid.Value.kOff);
    exampleDouble.set(DoubleSolenoid.Value.kForward);
    exampleDouble.set(DoubleSolenoid.Value.kReverse);
    Logo
    https://www.youtube.com/watch?v=L3GJGQ7mJqkwww.youtube.com
    https://www.youtube.com/watch?v=kCcDw3lDYiswww.youtube.com
    Görüntü İşleme Workshop | Fikret Yüksel Foundation #FRCTurkeyYouTube
    NI Activation Wizard (4)

    WPILib sensörleri

    WPILib Sensör Genel Bakış

    WPI Robotik Kütüphanesi, parçaların FRC kitinde bulunan sensörleri ve endüstriyel ve hobi robotik tedarikçileri aracılığıyla FIRST takımlarına yaygın olarak kullanılan birçok sensörü destekler.

    Desteklenen sensör türleri

    roboRIO günü, FPGA olursa olsun birçok sensörler ve motorlar robota nasıl bağlandığını hassas ölçümler sağlamak adanmış donanım aracılığıyla tüm yüksek hızlı ölçümleri uygular. Bu, karmaşık gerçek zamanlı yazılım rutinlerini gerektiren önceki sistemlere göre bir gelişmedir. Kütüphane, aşağıda gösterilen kategorilerde algılayıcıları kendiliğinden destekler:

    • Tekerlek / motor pozisyonu ölçümü - Gear-Toth sensörleri, enkoderler, analog enkoderler ve potansiyometreler

    • Robot oryantasyonu - Pusula, jiroskop, ivmeölçer, ultrasonik rangefinder

    • Genel - Darbe çıkışı Sayıcılar, analog, I2C, SPI, Serial, Dijital giriş

    WPI Robotics Kütüphanesinde, önceden yazılmış sınıflara sahip olmayan sensörleri kolayca uygulamanızı sağlayan birçok özellik vardır. Örneğin, genel amaçlı sayaçlar periyodu ölçebilir ve çıkış darbeleri üreten herhangi bir cihazdan sayılabilir.

    Anahtarlar - Limitleyici Anahtarların Kullanımı

    Limit anahtarları genellikle robotlardaki mekanizmaları kontrol etmek için kullanılır. Limit şalterlerinin kullanımı basit olmakla birlikte, sadece hareketli bir parçanın tek bir pozisyonunu algılayabilirler. Bu, hareketin bir sınırı aşmadığından emin olmak için idealdir, ancak hareketin hızını sınırlara yaklaştıkça kontrol etmede o kadar da iyi değildir. Örneğin, bir robot kolu üzerindeki rotasyonel bir omuz eklemi, bir potansiyometre veya mutlak enkoder kullanılarak en iyi şekilde kontrol edilir, limit şalteri, potansiyometrenin arızalanması durumunda, limit anahtarın robotun çok ileri gitmesini ve hasara neden olmasını engelleyebilir.

    Limit anahtarıyla hangi değerler sağlanır?

    Limit anahtarları "normalde açılmış" veya "normalde kapalı" çıkışlara sahip olabilir. Düğmeyi kablolamanın olağan yolu, dijital giriş sinyali bağlantısı ile toprak arasındadır. Dijital giriş, şalter açıkken girişi yüksek (1 değer) yapacak olan çekme dirençlerine sahiptir, fakat anahtar kapandığında, değer şuan toprağa bağlı olduğu için 0'a gider. Burada gösterilen anahtar hem normalde açık ve normalde kapalı çıkışlara sahiptir.

    Anahtardan kapalı olduğunda değer almak

    Limit anahtarını okuyan ve tekrar tekrar okuyan çok basit bir kod parçası yazabilir, böylece değeri 1'den (açık) 0'a (kapalı) geçişini algılayana kadar bekleyebilirsiniz.

    Sınır anahtarına kadar çalışacak Command Based program

    Komutlar, execute () ve isFinished () yöntemlerini saniyede 50 kez veya her 20 ms hızında söyler. Limit anahtar kapanıncaya kadar motoru çalıştıracak bir komut, isFinished () yöntemindeki dijital giriş değerini okuyabilir ve anahtar doğru duruma dönüştüğünde doğru döner. Daha sonra komut motoru durdurabilir.

    Unutmayın, mekanizmanın (bu durumda bir Kol) biraz eylemsizliği vardır bundan dolayı hemen durmayabilir, kol yavaşlarken hiçbir şeyin kırılmadığından emin olmanız önemlidir.

    Anahtarın kapanmasını algılamak için bir sayaç kullanma

    Bir limit anahtarının kapanabileceği, ardından bir mekanizmanın anahtardan geçerken tekrar açılabileceği mümkündür. Kapak yeterince hızlıysa, program anahtarın kapalı olduğunu fark etmeyebilir. Anahtar kapamayı yakalamak için alternatif bir yöntem, bir Counter nesnesi kullanmaktır. Sayaçlar donanımda uygulandığından, en hızlı anahtarların kapanmasını yakalayabilir ve sayımını artırabilir. Daha sonra program, sayımın arttığını ve operasyonu yapmak için gerekli olan adımları attığını fark edebilir.

    Yukarıda, limit anahtarını izlemek ve değerin değişmesini beklemek için bir sayaç kullanan bir alt sistemdir. Bu olduğunda, sayaç artar ve bu bir komut izlenebilir.

    Anahtar kapamayı algılamak için sayacı kullanan bir komut oluşturun.

    Bu komut, yukarıdaki alt sistemdeki sayacı başlatır ve ardından motoru hareket ettirmeye başlar. Ardından, limit anahtarı değişimini saymak için bekleyen isFinished () yöntemindeki sayaç değerini test eder. Ne zaman, kol durdurulur. Bir donanım sayacı kullanarak, çok hızlı açılıp kapanabilen bir anahtar program tarafından hala yakalanabilir.

    İvmeölçerler - hızlanma ve eğimi ölçme

    İvmeölçerler bir veya daha fazla eksende ivmeyi ölçer. Tipik bir kullanım robot hızlanmasını ölçmektir. Diğer bir yaygın kullanım robot eğimini ölçmektir, bu durumda yerçekimine bağlı ivmeyi ölçer.

    İki eksenli analog ivmeölçer

    Yaygın olarak kullanılan bir kısım (yukarıdaki resimde gösterildiği gibi) iki eksenli bir ivmeölçerdir. Bu cihaz, devre kartına göre X ve Y eksenlerinde hızlandırma verileri sağlayabilir. WPI Robotik Kütüphanesi'ni, biri X ekseni, diğeri Y ekseni için olmak üzere iki ayrı cihaz olarak değerlendirirsiniz. İvmeölçer, yerçekimi ivmesini ölçerek bir eğim sensörü olarak kullanılabilir. Bu durumda, cihazı yana çevirmek 1000 miliG veya bir tane G gösterir. Gösterilen, robot üzerindeki iki analog girişe bağlı 2 eksenli bir ivmeölçer kartıdır.

    Örnek Kod:

    public class AccelerometerSample extends SampleRobot { AnalogAccelerometer accel; double acceleration;

    Analog kanal 1'e bağlı bir analog ivmeölçer nasıl ayarlandığını gösteren yukarıda bir kısa kod örneği gösterilmektedir. Hassasiyet ve sıfır voltajları veri sayfasına göre ayarlanmıştır (varsayılan bölüm ADXL193, sıfır gerilimi ideal olarak ayarlanmıştır.)

    İvmeölçer arayüzü

    ADXL345 için her iki sınıf ve Dahili İvmeölçer sınıfının tümü ortak bir İvmeölçer arabirimini devralır / uygular. Gelecekte plan, AnalogAccelerometer sınıfının bu arayüzden türetilmesini sağlamaya çalışmaktır. Bu sensörlerden birini kullanmayı planlıyorsanız, kodunuzu genel arayüze karşı yazmanız önerilir. Bu şekilde, altta yatan sınıflar arasında, eğer istenirse, kodunuzda en az değişiklikle değiştirebilirsiniz. Ayrıca, bu yeteneğin gelişmeye devam ettiği için kodunuzu simülasyonla daha uyumlu hale getirmeye yardımcı olacaktır.

    ADXL345 İvmeölçer

    ADXL345, 2012-2014 KOP'taki sensör kartının bir parçası olarak sağlanan üç eksenli bir ivmeölçerdir. ADXL345, +/- 16g'ye kadar olan hızları ölçebilir ve I2C veya SPI üzerinden iletişim kurabilir. Protokol için bağlantı yönergeleri FRC bileşen veri sayfasında bulunabilir. Ek bilgi Analog Cihazlar ADXL345 veri sayfasında bulunabilir. WPILib, her bir protokol için, veri yolunun ayarlanması ve sensörün etkinleştirilmesinin ayrıntılarını ele alan ayrı bir sınıf sağlar.

    ADXL345 Örnek Kod:

    Yukarıda yerleşik I2C veriyoluna bağlı ADXL345'in kullanımını gösteren kısa bir kod örneği gösterilmiştir. İvmeölçer +/- 2g modunda çalışacak şekilde ayarlanmıştır. Örnek, hem Accelerometer arabirimini kullanarak, sensör değerlerini elde etmenin sadece tek eksenli yöntemini göstermektedir. 3 eksende senkronize okumaya ihtiyacınız varsa, arabirimi terk etmeniz ve doğrudan GetAccelerations () yöntemine erişmek için ADXL345 sınıfını kullanmanız gerekir. SPI işlemi benzerdir, SPI üzerinden sensör kullanımı hakkında ek ayrıntılar için ADXL345_SPI sınıfı için Javadoc / Doxygen'ye başvurun.

    Yerleşik İvmeölçer

    RoboRIO, +/- 8 g, 12 bit çözünürlük ve 800 Örnek / sn örnekleme hızına sahip dahili 3 eksenli bir ivmeölçer içerir. Bu ivmeölçeri kullanmak için, BuiltInAccelerometer sınıfını kullanın. Genel İvmeölçer arabirimini kullanarak +/- 4g modunda çalışan bu ivme ölçer kullanımını gösteren kod için yukarıdaki İvmeölçer Arayüzü bölümüne bakın (bu arabirimi, dahili ivmeölçerin +/- 16g modunu desteklemediğini unutmayın).

    Jiroskop(gyro) - Dönüş yönü ve robotun sürüş yönünü kontrol etme

    Parçaların FIRST kitinde tipik olarak Gyros, Analog Devices tarafından sağlanır ve aslında açısal oran sensörleridir. Çıkış gerilimi, jiro çipinin üst paket yüzeyine dik eksen ekseninin dönüş hızı ile orantılıdır. Değer mV / ° / saniye olarak ifade edilir (derece / saniye veya bir voltaj olarak ifade edilen dönüş). Zaman içinde hız çıkışını entegre ederek (toplayarak), sistem robotun nispi yönünü türetebilir.

    Gyro için bir başka önemli özellik, tam ölçekli aralığıdır. Yüksek ölçekli tam aralıklara sahip Gyroslar, çıkışı "sabitlemeksizin" hızlı dönüşü ölçebilir. Ölçek çok daha büyüktür, bu nedenle daha hızlı dönme oranları okunabilir, ancak aynı sayıda dijital analog girişe yayılan çok daha büyük değerler aralığı nedeniyle daha az çözünürlük vardır. Bir jiro seçerken, robotunuzun yaşayacağı en hızlı dönüş oranına uyan tam ölçekli bir menzile sahip olanı seçmeniz gerekir. Bu, robotun bu aralığı asla aşmaması koşuluyla mümkün olan en yüksek doğruluğu sağlayacaktır.

    AnalogGyro sınıfını kullanma Gyro nesnesi, RobotBase türetilmiş nesnenin yapıcısında oluşturulmalıdır. AnalogGyro nesnesi kullanıldığında, robotun sürüklenmeyi en aza indirmek için dinlenirken, hız çıkışının ofsetini ölçmek için bir kalibrasyon periyodundan geçecektir. Bu, robotun sabit ve jiroskopun kalibrasyon tamamlanana kadar kullanılamaz olmasını gerektirir.

    Başladıktan sonra, Gyro nesnesinin GetAngle () (veya Java'daki getAngle ()) yöntemi, kalibrasyon süresi boyunca robotun konumuna göre pozitif veya negatif bir sayı olarak dönme derecelerinin sayısını döndürecektir. Sıfır başlığı, herhangi bir zamanda, AnalogGyro nesnesindeki Reset() yöntemini çağırarak sıfırlanabilir.

    AnalogGyro nesnelerini kullanma fikri için aşağıdaki kod örneklerine bakın.

    Robotu düz sürmek için gyro kullanmak

    Aşağıdaki örnek programlar, robotun, GRO sensörünü RobotDrive sınıfı ile birlikte kullanarak düz bir çizgide sürmesine neden olur. RobotDrive.Drive yöntemi, hızı ve dönüş oranını argüman olarak alır; her ikisi de -1.0 ila 1.0 arasında değişir. Jiro, robotun ilk başlığından saptığı derecenin pozitif veya negatif sayısını gösteren bir değer döndürür. Robot düz gitmeye devam ettiği sürece, başlık sıfır olacaktır. Bu örnek, Drive yönteminin dönüş parametresini değiştirerek robotu devam ettirmek için gyro'yu kullanır.

    Açı, robot sürücünün hızı için ölçeklendirmek üzere orantılı bir ölçekleme sabiti (Kp) ile çarpılır. Bu faktöre oransal sabit veya döngü kazancı denir. Artan Kp robotun daha hızlı düzeltmesine neden olur (ancak çok yüksek ve osilasyon yapar). Değerin azaltılması, robotun daha yavaş bir şekilde düzeltilmesine neden olur (muhtemelen istenen pozisyona asla ulaşmaz). Bu, oransal kontrol olarak bilinir ve ileri programlama bölümünün PID kontrol bölümünde daha ayrıntılı tartışılır.

    Ultrasonik Sensörler

    Ultrasonik Rangefinder, algılama konisi içindeki en yakın nesneye olan mesafeyi belirlemek için ultrasonik darbenin hareket süresini kullanır. Çeşitli ultrasonik sensörlerin aşağıdakileri içeren ölçüm sonuçlarını iletmesi için çeşitli farklı yollar vardır:

    • Ping-Response (ex. , )

    • Analog (ex. )

    • I2C (ex. )

    Ping-Response Ultrasonik sensörler

    Yukarıda görülen Devantech SRF04 gibi Ping-Response Ultrasonik sensörlerin kullanımına yardımcı olmak için WPILib bir Ultrasonik sınıf içerir. Bu tip sensörde iki transdüser, ultrasonik ses patlaması yapan bir hoparlör ve sesin yakındaki bir nesneden yansıyacağını dinleyen bir mikrofon bulunur. Bu, roboRIO'ya, ping'i başlatan diğerine ses geldiğinde söyleyen iki bağlantı gerektirir. Ultrasonik nesne, aktarım ile yankı alımı arasındaki süreyi ölçer.

    Ultrasonik bir nesne oluşturmak ve mesafeyi okumak

    Yankı Darbe Çıkışı ve Tetik Darbe Girişinin her ikisi de bir Dijital Bölme üzerindeki dijital G / Ç bağlantı noktalarına bağlanmalıdır. Ultrasonik nesneyi oluştururken, yukarıdaki örneklerde gösterildiği gibi kurucuya hangi kanalları bağlı olduğunu belirtin. Bu durumda, ULTRASONIC_ECHO_PULSE_OUTPUT ve ULTRASONIC_TRIGGER_PULSE_INPUT, dijital G / Ç bağlantı noktası numaraları olarak tanımlanan iki sabittir. Bu bağlantılara sahip olmayan ultrasonik rangefinder için ultrasonik sınıfı kullanmayın. Bunun yerine, analog voltaj olarak aralığı döndüren bir ultrasonik sensör için bir AnalogChannel nesnesi gibi sensör için uygun sınıfı kullanın.

    Analog Rangefinders

    Birçok ultrasonik Rangefinder, menzili analog voltaj olarak geri döndürür. Mesafeyi elde etmek için analog voltajı hassasiyet veya ölçek faktörü ile çarpın (tipik olarak inç / V veya inç / mV cinsinden). Bu tip bir sensörü WPILib ile kullanmak için, bunu bir Analog Kanal olarak oluşturabilir ve doğrudan robot kodunuzda ölçeklendirmeyi yapabilir ya da bir ölçüm isteğinde bulunduğunuzda ölçeklendirmeyi yapacak bir sınıf yazabilirsiniz.

    I2C ve diğer Dijital Rangefinders

    I2C, SPI veya Serial üzerinden dijital olarak haberleşen Rangefinder de roboRIO ile birlikte kullanılabilir, ancak bu cihazlar için WPILib aracılığıyla belirli sınıflar sağlanmaz. Kullanılan veriyoluna bağlı olarak uygun iletişim sınıfını kullanın ve cihazı hangi veri veya isteklerin gönderileceğini ve alınan verilerin hangi formatta yer alacağını belirlemek için bölümün veri sayfasına bakın.

    Counters - Dönüş rotasyonu, sayma darbeleri ve daha fazlası

    Counter nesneler, bir dijital giriş sinyali veya bir analog tetikleyiciden gelen girdileri sayabilen son derece esnek öğelerdir.

    Counter genel bakış

    FPGA'da bulunan ve her biri giriş sinyalinin türüne bağlı olarak birkaç modda çalışabilen 8 adet Yukarı / Aşağı Sayıcı birimi vardır:

    • Gear-Tooth/ Darbe Genişliği modu - Giriş darbesinin genişliğine bağlı olarak yukarı / aşağı sayımını etkinleştirir. Bu, GearTooth sensör sınıfını yön algılama ile uygulamak için kullanılır.

    • Semi-Period modu - Giriş sinyalinin bir kısmının periyodunu sayar. Bu mod, eko pulsunun uçuş süresini ölçmek için Ultrasonik sınıf tarafından kullanılır.

    • Harici Yön modu - Bir girişin sinyallerini, bir girişe ikinci giriş tarafından belirlenen yön (yukarı / aşağı) ile sayar.

    Gear-Tooth Modu ve GearTooth sensörleri

    GearTooth sensörleri, demirli dişliye veya zincir dişi dişlerine bitişik olarak monte edilecek ve bir dişin ne zaman geçtiğini algılayacak şekilde tasarlanmıştır. Gear-Tooth sensörü, geçmekte olan dişlerin neden olduğu tarladaki değişimleri ölçebilen bir mıknatıs ve katı-hal cihazı kullanan bir Hall-Effect cihazdır. Yukarıdaki resim, metal dişli rotasyonunu ölçmek için monte edilmiş GearTooth sensörünü göstermektedir. Plastik dişliye bir metal dişli bağlandığına dikkat edin. Gear Tooth sensörünün dönüşü tespit etmek için onun tarafından geçen bir demir materyaline ihtiyacı vardır.

    FPGA sayacının Gear-Tooth modu, 2006 FRC'de verilen ATS651 gibi her dişin geçtiği gibi yaydığı nabzın uzunluğunu değiştirerek dönme yönünü gösteren Gear Tooth sensörleri ile çalışmak üzere tasarlanmıştır. KOP.

    Semi-Period modu

    C++

    Counter *exampleCounterHi = new Counter(0); Counter *exampleCounterLow = new Counter(3); exampleCounterHi->SetSemiPeriodMode(true); exampleCounterLow->SetSemiPeriodMode(false); double highPulse = exampleCounterHi->GetPeriod(); double lowPulse = exampleCounterLow->GetPeriod();

    Java Counter exampleCounterHi = new Counter(0); Counter exampleCounterLow = new Counter(3); exampleCounterHi.setSemiPeriodMode(true); exampleCounterLow.setSemiPeriodMode(false); double highPulse = exampleCounterHi.getPeriod(); double lowPulse = exampleCounterLow.getPeriod();

    Sayacın Semi-Period modu, tek bir kaynaktan (Yukarı Kaynak) yüksek bir darbenin (düşen kenarın düşme kenarına kadar) ya da düşük bir darbenin (yükselen kenara düşen kenar) darbe genişliğini ölçecektir. Yüksek darbeleri ölçmek için setSemiPeriodMode (true) ve düşük atımları ölçmek için setSemiPeriodMode (yanlış) çağrısı yapın. Her iki durumda da, son ölçülen nabzın uzunluğunu (saniye cinsinden) elde etmek için getPeriod () öğesini çağırın.

    Dış yön modu

    Sayacın harici yön modu, bir kaynaktan (Yukarı Kaynak) kenarları sayar ve yönü belirlemek için diğer kaynağı (Aşağı Kaynak) kullanır. Bu modun en yaygın kullanımı 1x ve 2x modunda dördün kod çözme işlemidir. Bu kullanım durumu, bir dahili Sayaç nesnesini oluşturan Enkoder sınıfı tarafından ele alınmakta ve bir sonraki eşyada Enkoder - Bir tekerleğin ya da başka bir milin dönmesinin ölçülmesiyle kapsanmaktadır.

    Normal mod

    C++ Counter *normalCounter = new Counter(); normalCounter->SetUpSource(1); normalCounter->SetUpDownCounterMode(); Java Counter normalCounter = new Counter(); normalCounter.setUpSource(1); normalCounter.setUpDownCounterMode();

    Yukarı / Aşağı modu veya İki Darbe modu olarak da bilinen sayacın "normal modu", iki ayrı kaynağa kadar meydana gelen darbeleri, Yukarı için bir kaynak ve Aşağı için bir kaynak sayar. Bu modun ortak kullanım durumu, tek yönlü bir kodlayıcı olarak yansıtıcı bir sensör veya hall effect sensörü ile tek bir kaynak (Up Source) kullanmaktadır. Yukarıdaki kod örneği, Sayaç kaynaklarını ayarlamak için alternatif bir yöntem göstermektedir, bu yöntem, modlardan herhangi biri için geçerlidir. Semi Period modu örneğinde gösterilen yöntem, Normal Mod dahil olmak üzere sayacın tüm modları için de geçerlidir.

    Counter Ayarları

    C++ Counter *normalCounter = new Counter(1); normalCounter->SetMaxPeriod(.1); normalCounter->SetUpdateWhenEmpty(true); normalCounter->SetReverseDirection(false); normalCounter->SetSamplesToAverage(10); normalCounter->SetDistancePerPulse(12); Java Counter normalCounter = new Counter(1); normalCounter.setMaxPeriod(.1); normalCounter.setUpdateWhenEmpty(true); normalCounter.setReverseDirection(false); normalCounter.setSamplesToAverage(10); normalCounter.setDistancePerPulse(12);

    Sayaç davranışının çeşitli yönlerini kontrol etmek için ayarlanabilen birkaç farklı parametre vardır:

    • Max Period - Cihazın hala hareket ettiği düşünülen maksimum süre (saniye cinsinden). Bu değer, getStopped () yönteminin durumunu belirlemek ve getPeriod () ve getRate () yöntemlerinin çıkışını etkilemek için kullanılır.

    • Update When Empty - Sahte olarak ayarlanması, sayaç durduğunda (yukarıda tanımlanan Maks. Periyot'a göre) en son süreyi sayaçta saklar. Bu parametrenin True olarak ayarlanması, 0 durmuş sayacın periyodu olarak geri döner.

    • Reverse Direction - Sadece harici yön modunda geçerlidir. Bu parametrenin true olarak ayarlanması, sayacın harici yön modunun sayma yönünü tersine çevirir.

    Counter'i sıfırlama

    C++ Counter *normalCounter = new Counter(1); normalCounter->Reset(); Java Counter normalCounter = new Counter(1); normalCounter.reset();

    Counter değerlerini almak

    C++ Counter *normalCounter = new Counter(1); int count = normalCounter->Get(); double distance = normalCounter->GetDistance(); double period = normalCounter->GetPeriod(); double rate = normalCounter->GetRate(); bool direction = normalCounter->GetDirection(); bool stopped = normalCounter->GetStopped(); Java Counter normalCounter = new Counter(1); int count = normalCounter.get(); double distance = normalCounter.getDistance(); double period = normalCounter.getPeriod(); double rate = normalCounter.getRate(); boolean direction = normalCounter.getDirection(); boolean stopped = normalCounter.getStopped();

    Aşağıdaki değerler Counter'den alınabilir:

    • Count - Mevcut sayım. reset() çağrılarak sıfırlanabilir

    • Distance - Sayaçtan güncel uzaklık okuması. Bu Sayım Başına Ölçek Faktörü ile çarpılan sayıdır.

    • Period - Sayacın saniye cinsinden geçerli periyodu. Sayaç durdurulursa, Boş Değer Güncelleme parametresinin ayarına bağlı olarak bu değer 0'a dönebilir.

    • Rate - Sayacın birim / saniye cinsinden geçerli oranı. DistancePerPulse kullanılarak döneme bölünerek hesaplanır. Sayaç durdurulursa, bu değer dile bağlı olarak Inf veya NaN'ye dönüşebilir.

    Enkoderler - Bir tekerleğin veya diğer milin dönüşünün ölçülmesi

    Enkoderler, bir eğirme milinin dönüşünü ölçmek için cihazlardır. Enkoderler tipik olarak, bir çarkın döndüğü mesafeyi ölçmek için kullanılır; bu, robotun gittiği mesafeye tercüme edilebilir. Ölçülen bir süre boyunca kat edilen mesafe, robotun hızını temsil eder ve enkoderler için başka bir yaygın kullanımdır. Enkoderler, darbeler arasındaki süreyi belirleyerek de dönüş oranını doğrudan ölçebilir. Bu makalede, dörtlü enkoderlerin (aşağıda tanımlanmıştır) kullanımı ele alınmıştır. Kuadratür olmayan artımlı enkoderler için, sayaçlarla ilgili makaleye bakınız. Mutlak enkoderler için uygun makale giriş tipine (en yaygın olarak analog, I2C veya SPI) bağlı olacaktır.

    Quadrature Enkoder Genel Bakış

    Dörtlü bir enkoder, 90 derece faz dışı iki algılama elemanından oluşan şaft dönüşünü ölçen bir cihazdır. FRC'de tipik olarak kullanılan en yaygın enkoder türü, şeritli veya yarık kod tekerleğine ve bir tanesi iki ayrı 90 derece aralıklı bir veya daha fazla ışık kaynağı (LED) kullanan bir optik enkoderdir (bunlar, iletimi algılamak için LED'in karşısında bulunabilirler) yansımayı ölçmek için LED ile aynı tarafta). Sinyaller arasındaki faz farkı, hangi sinyalin diğerini "yönlendirdiğini" belirleyerek dönme yönünü tespit etmek için kullanılabilir.

    Enkoderler vs Counters

    FRC FPGA, 2 kanallı bir dörtlü enkoder sinyalin 4x kod çözme işlemini yapabilen 8 adet Quadrature dekoder modülüne sahiptir. Bu, modülün, her bir kanalın her birindeki her bir darbenin yükselen ve düşen kenarlarını, kod çarkındaki her şerit için 4 kenara sahip olacak şekilde sayması anlamına gelir. Quadrature dekoder modülü ayrıca, her bir devir başına bir puls üreten bazı enkoderlerde özellik olan bir endeks kanalını idare edebilir. Counter FPGA modülleri, bir kanalın yükselen veya yükselen ve düşen kenarlarının sayıldığı ve ikinci kanalın yönü belirlemek için kullanıldığı 1x veya 2x kod çözme için kullanılır. Her iki durumda da, tüm kareleme encoderler için Encoder sınıfının kullanılması tavsiye edilir; sınıf, seçtiğiniz kodlama türüne göre uygun FPGA modülünü atayacaktır.

    Bir Enkoder nesnesinin oluşturulması

    C++ Encoder *enc; enc = new Encoder(0, 1, false, Encoder::EncodingType::k4X); Java Encoder enc; enc = new Encoder(0, 1, false, Encoder.EncodingType.k4X);

    Enkoder oluşturmak için kullanabileceğiniz birçok kurucu vardır, ancak en yaygın olarak yukarıda gösterilmiştir. Örnekte, 0 ve 1, iki dijital giriş için port numaralarıdır ve false, Enkoderin sayma yönünü tersine çevirmemesini söyler. Algılanan yön, enkoderin ölçülen şafta göre nasıl monte edildiğine bağlı olabilir. K4X, FPGA'dan bir enkoder modülünün kullanılmasını ve 4X doğruluğunun elde edilmesini sağlar.

    Enkoder Parametrelerini Ayarlama

    C++ Encoder *sampleEncoder = new Encoder(0, 1, false, Encoder::EncodingType::k4X); sampleEncoder->SetMaxPeriod(.1); sampleEncoder->SetMinRate(10); sampleEncoder->SetDistancePerPulse(5); sampleEncoder->SetReverseDirection(true); sampleEncoder->SetSamplesToAverage(7); Java Encoder sampleEncoder = new Encoder(0, 1, false, Encoder.EncodingType.k4X); sampleEncoder.setMaxPeriod(.1); sampleEncoder.setMinRate(10); sampleEncoder.setDistancePerPulse(5); sampleEncoder.setReverseDirection(true); sampleEncoder.setSamplesToAverage(7);

    Enkoder sınıfının aşağıdaki parametreleri kod aracılığıyla ayarlanabilir:

    • Max Period - cihazın hala hareket ettiği düşünülen maksimum süre (saniye cinsinden). Bu değer, getStopped () yönteminin durumunu belirlemek ve getPeriod () ve getRate () yöntemlerinin çıkışını etkilemek için kullanılır. Bu, bireysel kanaldaki atımlar arasındaki zamandır (ölçek faktörü hesaba katılır). Min Hız parametresinin, darbe başına düşen mesafeyi hesaba katan, bunun yerine mühendislik ünitelerinde hızı ayarlamanıza izin vermesi önerilir.

    • Min Rate - Cihaz durdurulan kabul edilmeden önce asgari hızını ayarlar. Bu, hem darbe faktörü hem de darbe başına uzaklığı telafi eder ve bu nedenle mühendislik ünitelerine (RPM, RPS, Derece / sn, In / s, vb.) Girilmelidir.

    • Distance Per Pulse - Puls ve mesafe arasındaki ölçek faktörünü ayarlar. Kütüphane, kod çözme ölçeği faktörünü (1x, 2x, 4x) ayrı ayrı hesaba katar,

    Enkoderleri Başlatmak, Durdurmak ve Sıfırlamak

    C++ Encoder *sampleEncoder = new Encoder(0, 1, false, Encoder::EncodingType::k4X); sampleEncoder->Reset(); Java Encoder sampleEncoder = new Encoder(0, 1, false, Encoder.EncodingType.k4X); sampleEncoder.reset();

    Kodlayıcı, oluşturulduğu anda saymaya başlayacaktır. Enkoder değerini sıfırlamak için reset() komutunu kullanın.

    Enkoder Değerlerini Almak

    C++ Encoder *sampleEncoder = new Encoder(0, 1, false, Encoder::EncodingType::k4X); int count = sampleEncoder->Get(); double distance = sampleEncoder->GetRaw(); double distance = sampleEncoder->GetDistance(); double period = sampleEncoder->GetPeriod(); double rate = sampleEncoder->GetRate(); boolean direction = sampleEncoder->GetDirection(); boolean stopped = sampleEncoder->GetStopped(); Java Encoder sampleEncoder = new Encoder(0, 1, false, Encoder.EncodingType.k4X); int count = sampleEncoder.get(); double distance = sampleEncoder.getRaw(); double distance = sampleEncoder.getDistance(); double period = sampleEncoder.getPeriod(); double rate = sampleEncoder.getRate(); boolean direction = sampleEncoder.getDirection(); boolean stopped = sampleEncoder.getStopped();

    Aşağıdaki değerler Enkoderden alınabilir:

    • Count - Mevcut sayım. reset() ile sıfırlanabilir.

    • Raw Count - Kod çözme faktörü için telafisiz sayım.

    • Distance - Counterden güncel uzaklık okuması. Bu Sayım Başına Ölçek Faktörü ile çarpılan sayıdır.

    • Period - Counterin saniye cinsinden geçerli periyodu. Sayaç durdurulursa bu değer 0'a dönebilir. Bu kullanımdan kaldırılır, bunun yerine oranın kullanılması önerilir.

    Analog Girişler

    RoboRIO Analog to Digital modülünün daha basit kontrol cihazlarında bulunmayan bazı özellikleri vardır. Analog kanalları, yuvarlak bir robin tarzında otomatik olarak örnekleyerek, 500 ks / s (500.000 örnek / saniye) bir kombine örnek oranı sağlar. Bu kanallar, program tarafından kullanılan değeri sağlamak için isteğe bağlı olarak aşırı örneklenebilir ve ortalaması alınabilir. Ortalama değerlere ek olarak, ham tamsayı ve kayan noktalı voltaj çıkışı vardır. Aşağıdaki şema bu süreci özetlemektedir.

    Sistem birkaç örnek ortalama olduğunda, bölünme, tamsayı değerli sonucun üretilmesinde kaybedilen cevabın kesirli bir kısmıyla sonuçlanır. Aşırı örnekleme, fazladan örneklerin toplandığı ancak ortalama üretmek için bölünmediği bir tekniktir. Sistemin 16 kez fazla örnekleme olduğunu varsayın - bu, döndürülen değerlerin aslında ortalama 16 kat olduğu anlamına gelir. Aşırı örneklenmiş değeri kullanmak, döndürülen değerde ek bir hassasiyet sağlar.

    Bir Analog Giriş Oluşturmak

    C++ AnalogInput *ai; ai = new AnalogInput(0); Java AnalogInput ai; ai = new AnalogInput(0);

    Bir AnalogInput nesnesini oluşturmak için, istenen girişin kanal numarasını girmeniz yeterlidir.

    Aşırı Örnekleme ve Ortalama Alma

    Ortalama ve aşırı örneklenmiş değerlerin sayısı her zaman ikidir (aşırı örnekleme / ortalama alma sayısı). Bu nedenle, aşırı örneklenmiş veya ortalama değerler iki bittir; burada "bitler", yöntemlere geçirilir: SetOversampleBits (bitler) ve SetAverageBits (bitler). Değerlerin analog giriş kanalından üretildiği gerçek oran, ortalama ve fazla örneklenmiş değerler ile azaltılır. Örneğin, aşırı örneklenmiş bitlerin sayısını 4'e ve ortalama bitleri 2'ye ayarlamak, teslim edilen örneklerin sayısını 16x ve 4x veya toplam 64x azaltacaktır.

    Örnek Kodlar

    C++ AnalogInput *exampleAnalog = new AnalogInput(0); int bits; exampleAnalog->SetOversampleBits(4); bits = exampleAnalog->GetOversampleBits(); exampleAnalog->SetAverageBits(2); bits = exampleAnalog->GetAverageBits(); Java AnalogInput exampleAnalog = new AnalogInput(0); int bits; exampleAnalog.setOversampleBits(4); bits = exampleAnalog.getOversampleBits(); exampleAnalog.setAverageBits(2); bits = exampleAnalog.getAverageBits();

    Yukarıdaki kod, bir analog kanaldaki fazla örnek bitlerinin ve ortalama bitlerin sayısını alma ve ayarlamanın bir örneğini gösterir.

    Sample Rate

    C++ AnalogInput::SetSampleRate(62500); Java AnalogInput.setGlobalSampleRate(62500);

    Sample Rate analog I / O modülü başına sabitlenmiştir, böylece belirli bir modüldeki tüm kanallar aynı hızda örneklenmelidir. Bununla birlikte, her bir kanal için ortalama ve sample rate değiştirilebilmektedir. Bazı sensörlerin (şu anda sadece Gyro) kullanımı, smaple rate bağlı olduğu modül için belirli bir değere ayarlayacaktır. Yukarıdaki örnek, bir modül için sample ratenin, saniyede kanal başına 62.500 örnek varsayılan değerine (toplam 500kS / s) ayarlandığını göstermektedir.

    Analog Değerleri Okuma

    C++ AnalogInput *exampleAnalog = new AnalogInput(0); int raw = exampleAnalog->GetValue(); double volts = exampleAnalog->GetVoltage(); int averageRaw = exampleAnalog->GetAverageValue(); double averageVolts = exampleAnalog->GetAverageVoltage(); Java AnalogInput exampleAnalog = new AnalogInput(0); int raw = exampleAnalog.getValue(); double volts = exampleAnalog.getVoltage(); int averageRaw = exampleAnalog.getAverageValue(); double averageVolts = exampleAnalog.getAverageVoltage();

    Bir analog kanaldan Analog giriş değerlerini okumak için bir dizi seçenek vardır:

    1. Raw value - ADC'nin 0-5V aralığını temsil eden anlık ham 12 bit (0-4096) değeri. Bu yöntemin, modülde depolanan kalibrasyon bilgilerini dikkate almadığını unutmayın.

    2. Voltage - Kanalın anlık voltaj değeri. Bu yöntem, ham değeri bir voltaja dönüştürmek için modülde depolanan kalibrasyon bilgilerini dikkate alır.

    3. Average Raw value - Aşırı örnekleme ve ortalama motorun ham, ölçeklendirilmemiş değer çıkışı. Aşırı örnekleme ve ortalama alma ve her biri için bit sayısını nasıl ayarlayacağınız hakkında bilgi için yukarıya bakın.

    Akümülatör

    Analog akümülatör, FPGA'nın analog sinyaller için bir integratör olarak görev yapan ve zaman içindeki değeri toplayan bir parçasıdır. Bu davranış, istenen yere ait genel örnek bir gyro içindir. Bir gyro, dönme hızına karşılık gelen bir analog sinyal çıkarır, ancak yaygın olarak istenen ölçüm, yönlendirme veya toplam rotasyonel yer değiştirmedir. Orandan çıkmak için bir entegrasyon gerçekleştirirsiniz. Bu işlemi donanım seviyesinde gerçekleştirerek, robot kodunda uygulamayı denemenizden çok daha hızlı gerçekleşebilir. Akümülatör ayrıca akümülatöre eklemeden önce analog değere bir denge de uygulayabilir. Gyro örneğine dönersek, çoğu jiroskop dönmediğinde tam skalanın 1 / 2'lik bir voltajını verir ve dönüş yönünü belirtmek için bu referansın üstünde ve altında voltajı değiştirir.

    Akümülatör kurmak

    C++ AnalogInput *exampleAnalog = new AnalogInput(0); exampleAnalog->SetAccumulatorInitialValue(0); exampleAnalog->SetAccumulatorCenter(2048); exampleAnalog->SetAccumulatorDeadband(10); exampleAnalog->ResetAccumulator(); Java AnalogInput exampleAnalog = new AnalogInput(0); exampleAnalog.setAccumulatorInitialValue(0); exampleAnalog.setAccumulatorCenter(2048); exampleAnalog.setAccumulatorDeadband(10); exampleAnalog.resetAccumulator();

    FPGA'da, 0 ve 1 kanallarına bağlı iki adet akümülatör vardır. Analog akümülatör ile kullanmak istediğiniz herhangi bir cihaz, bu iki kanaldan birine bağlanmalıdır. Akümülatörü kullanmak için ayarlanması gereken zorunlu parametreler yoktur, ancak cihaza bağlı olarak aşağıdakilerden bazılarını veya tümünü ayarlamak isteyebilirsiniz:

    1. Accumulator Initial Value -Bu, akümülatörün sıfırlanırken geri döndürdüğü ham değerdir. Değer koda geri gönderilmeden önce donanım akümülatörünün çıkışına eklenir.

    2. Accumulator Center - sample akümülatöre uygulanmadan önce her bir sample bu ham değer çıkarılır. Akümülatörün boru hattındaki fazla örnek ve ortalama motordan sonra olduğuna dikkat edin, bu nedenle aşırı örnekleme bu parametre için uygun değeri etkileyecektir.

    3. Accumulator Deadband - Akümülatörün sampleyi 0 olarak ele alacağı merkez noktası çevresindeki ölü değer.

    Akümülatörden Değer Okuma

    C++ AnalogInput *exampleAnalog = new AnalogInput(0); long count = exampleAnalog->GetAccumulatorCount(); long value = exampleAnalog->GetAccumulatorValue(); AccumulatorResult *result = new AccumulatorResult(); exampleAnalog->GetAccumulatorOutput(result); count = result->count; value = result->value; Java AnalogInput exampleAnalog = new AnalogInput(0); long count = exampleAnalog.getAccumulatorCount(); long value = exampleAnalog.getAccumulatorValue(); AccumulatorResult result = new AccumulatorResult(); exampleAnalog.getAccumulatorOutput(result); count = result.count; value = result.value;

    Potansiyometre - Ortak açı veya doğrusal hareket ölçme

    Potansiyometreler, bir mekanizmanın mutlak açısal dönüşünü veya doğrusal hareketini ölçmek için kullanılan ortak bir analog sensördür. Potansiyometre, değişken direnç bölücüden hareketli bir kontak kullanan üç terminalli bir cihazdır. Dış kontaklar 5V ve toprağa bağlandığında ve değişken kontak bir analog girişe bağlandığında, analog giriş potansiyometre çevrildiğinde değişen bir analog voltaj görülecektir.

    Potansiyometre Koniği(incelmesi)

    Potansiyometrenin incelmesi, pozisyon ve direnç arasındaki ilişkiyi açıklar. İki ortak incelici doğrusal ve logaritmiktir. Doğrusal bir konik potansiyometre, direnci milin dönüşüne orantılı olarak değiştirecektir; Örneğin, şaft, dönme noktasının orta noktasında direnç değerinin% 50'sini ölçecektir. Logaritmik bir konik potansiyometre, milin dönüşüyle logaritmik olarak direnci değiştirecektir. Logaritmik potansiyometreler, ses seviyesinde insan algısı da logaritmik olduğundan, ses kontrollerinde yaygın olarak kullanılmaktadır.

    Potansiyometreler FRC için lineer potansiyometreleri kullanılmalıdır, böylece açı doğrudan voltajdan çıkarılabilir.

    WPILib ile Potansiyometre kullanma

    Potansiyometreler AnalogInput sınıfı ile okunabilir veya Potansiyometre arayüzünü uygulayan AnalogPotentiometer sınıfı ile birlikte okunabilir. AnalogPotentiometer sınıfı, sensörü orantısal olarak okuyacaktır (Analog besleme voltajını dengeleyecektir) ve anlamlı birimleri döndürmek için gerilimi ölçekleyecek ve dengeleyecektir.

    Potansiyometre Oluşturmak

    C++ Potentiometer *pot; pot = new AnalogPotentiometer(0, 360, 30); AnalogInput *ai = new AnalogInput(1); pot = new AnalogPotentiometer(ai, 360, 30); Java Potentiometer pot; pot = new AnalogPotentiometer(0, 360, 30); AnalogInput ai = new AnalogInput(1); pot = new AnalogPotentiometer(ai, 360, 30);

    Potansiyometre kurucusu 3 parametre alır: analog giriş için bir kanal numarası, faydalı birimleri döndürmek için 0-1 oranmetrik değerini çarpmak için bir ölçek faktörü ve ölçeklemeden sonra eklenecek bir ofset. Genel olarak, en kullanışlı ölçek faktörü, potansiyometrenin açısal veya doğrusal tam ölçeği olacaktır. Örneğin, bir robot koluna bağlı ideal bir tek dönüşlü doğrusal potansiyometreye sahip olduğunuzu varsayalım. Bu pot, 0V-5V aralığında 360 derece dönecek, bu yüzden ölçek faktörü için, çıktılar derece cinsinden olacak. Potansiyometrenin hizalamada küçük kayma nedeniyle kırılmasını önlemek için, kolun "sıfır noktası" ile potansiyometrelerin aralığına çok az bir şekilde monte edilebilir, yukarıdaki örnek başlangıç ​​değerine sahip olan potansiyometreyi gösterir. Uzaklık kullanılarak reddedilen 30 derece, böylece mekanizmanın "sıfır noktası" nda çıktı 0 olur.

    Hesaplamalar

    Potansiyometre çıkışı aşağıdaki formül kullanılarak hesaplanır: (Analog Giriş Voltajı / Analog Besleme Gerilimi) * FullScale + Offset. Gördüğünüz gibi, hesaplamanın ilk kısmının sonucu 0 ila 1 aralığında birimsizdir. Bu, çıkış birimlerinin ölçek faktörünün birimleri ile aynı olduğu anlamına gelir. Ofset, ölçeklendirilmiş miktara eklenir, böylece ölçek faktörü ile aynı birimlere sahip olmalıdır.

    Çıktının Okunması

    C++ Potentiometer *pot = new AnalogPotentiometer(0, 360, 30); double degrees = pot->Get(); Java Potentiometer pot = new AnalogPotentiometer(0, 360, 30); double degrees = pot.get()

    Analog tetikleyiciler

    Analog bir tetikleyici, bir analog sinyali FPGA'ya yerleşik kaynakları kullanarak dijital sinyale dönüştürmenin bir yoludur. Elde edilen dijital sinyal daha sonra doğrudan kullanılabilir veya sayaç veya enkoder modülleri gibi FPGA'nın diğer dijital bileşenlerine beslenebilir. Analog tetikleme modülü, analog sinyalleri kod tarafından belirlenen bir voltaj aralığına göre karşılaştırarak çalışır. Spesifik dönüş tipleri ve anlamları, kullanımdaki analog tetikleme moduna bağlıdır.

    Bir Analog Tetikleyici Oluşturulması

    C++ AnalogTrigger *trigger0 = new AnalogTrigger(0); AnalogInput *ai1 = new AnalogInput(1); AnalogTrigger *trigger1 = new AnalogTrigger(ai1); Java AnalogTrigger trigger0 = new AnalogTrigger(0); AnalogInput ai1 = new AnalogInput(1); AnalogTrigger trigger1 = new AnalogTrigger(ai1);

    Bir analog tetikleyici oluşturmak, bir kanal numarasının veya oluşturulmuş bir Analog Kanal nesnesinin geçirilmesini gerektirir.

    Analog Tetik Voltaj Aralığı Ayarı

    C++ AnalogTrigger *trigger = new AnalogTrigger(0); trigger->SetLimitsRaw(2048, 3200); trigger->SetLimitsVoltage(0, 3.4); Java AnalogTrigger trigger0 = new AnalogTrigger(0); trigger.setLimitsRaw(2048, 3200); trigger.setLimitsVoltage(0, 3.4);

    Analog tetikleyicinin voltaj aralığı, ham birimlerde (0V ila 5V'yi temsil eden 0 ila 4096) veya voltajlarda ayarlanabilir. Her iki durumda da, yüksek hızda örnekleme kullanılıyorsa, değer kümesi dikkate alınmaz, kullanıcı kodu ayarlanmadan önce tetik penceresinin uygun telafisini gerçekleştirmelidir.

    Filtreleme ve Ortalama Alma

    C++ AnalogTrigger *trigger = new AnalogTrigger(0); trigger->SetAveraged(true); trigger->SetAveraged(false); trigger->SetFiltered(true); Java AnalogTrigger trigger0 = new AnalogTrigger(0); trigger.setAveraged(true); trigger.setAveraged(false); trigger.setFiltered(true);

    Analog tetikleyici, isteğe bağlı olarak, ya ortalama değerin (ortalama ve aşırı örnek motorun çıkışı) ya da ham analog kanal değeri yerine filtrelenmiş bir değeri kullanacak şekilde ayarlanabilir. Bu seçeneklerden en fazla biri bir seferde seçilebilir, filtre, ortalama sinyalin üstüne uygulanamaz.

    Analog tetikleyicinin filtreleme seçeneği 3 noktalı ortalama reddetme filtresi kullanır. Bu filtre, son üç veri noktasının dairesel bir arabelleğini kullanır ve çıktı olarak medyana en yakın nokta seçer. Bu filtrenin birincil kullanımı, analog tetikleyicinin Yükselen Kenarı ve Düşen Kenar işlevini kullanarak geçişleri algıladığında pencerenin içinde (ortalamaya veya örneklemeye bağlı olarak) ortaya çıkan veri noktalarını reddetmektir (aşağıya bakınız).

    Analog Tetikleyiciden Doğrudan Çıkışlar

    C++ AnalogTrigger *trigger = new AnalogTrigger(0); bool value; value = trigger->GetInWindow(); value = trigger->GetTriggerState(); Java AnalogTrigger trigger0 = new AnalogTrigger(0); boolean value; value = trigger.getInWindow(); value = trigger.getTriggerState();

    Analog tetikleme sınıfının iki doğrudan çıkışı vardır:

    • In Window - Değer menzil dahilinde ise true ve eğer dışındaysa (yukarıda veya aşağıda) false döndürür

    • Trigger State - Değer üst limitin üzerindeyse, eğer alt limitin altında ise false değerini döndürür ve eğer varsa, önceki durumu korur.

    "Normal mod" / İki Darbe modu - 2 bağımsız kaynaktan kenarları sayabilir (1 yukarı, 1 aşağı)

    Samples to Average - Dönemi belirlerken numune sayısını ortalamaya ayarlar. Ortalama alma, mekanik kusurları (örneğin, bir yansıtıcı sensörü bir kodlayıcı olarak kullanırken eşit olmayan aralıklı reflektörler gibi) veya çözünürlüğü arttırmak için aşırı örneklemeyi hesaba katmak istenebilir. Geçerli değerler 1 ila 127 örnektir.

  • Distance Per Pulse - getDistance () yöntemini kullanırken saymadan uzaklığı belirlemek için kullanılan çarpanı ayarlar.

  • Direction - Son değer değişiminin yönü (Yukarı doğru, Aşağı doğru yanlış)

  • Stopped - Sayaç şu anda durdurulduysa (süre Max Dönemini aşmıştır)

  • Reverse Direction - Enkoder montajı varsayılan sayma yönünü anlamsız hale getiriyorsa yönü çevirmek için kullanılan enkoder sayımlarını belirler.

  • Samples to Average - Dönemi belirlerken numune sayısını ortalamaya ayarlar. Ortalama alma, mekanik kusurları (örneğin, bir yansıtıcı sensörü bir kodlayıcı olarak kullanırken eşit olmayan aralıklı reflektörler gibi) veya çözünürlüğü arttırmak için aşırı örneklemeyi hesaba katmak istenebilir. Geçerli değerler 1 ila 127 örnektir.

  • Rate - Sayacın birim / saniye cinsinden geçerli oranı. DistancePerPulse kullanılarak döneme bölünerek hesaplanır. Sayaç durdurulursa, bu değer dile bağlı olarak Inf veya NaN'ye dönüşebilir.

  • Direction - Son değer değişiminin yönü (Yukarı True ,Aşağı False)

  • Stopped - sayaç şu anda durdurulursa (periyot Max Dönemi aşmıştır)

  • Average Voltage - Aşırı örnekleme ve ortalama motordan ölçülen voltaj değeri çıkışı. Bu yöntem, ham ortalama değerini bir voltaja dönüştürmek için saklanan kalibrasyon bilgisini kullanır.
    Accumulator Reset - Akümülatörün değerini Başlangıç Değerine sıfırlar (varsayılan olarak 0'dır).
    Devantech SRF04
    VEX Ultrasonic Rangefinder
    Maxbotix LV-MaxSonar-EZ1
    Maxbotix I2CXL-MaxSonar-EZ2
    Analog System Diagram
    C++
    
    #include "WPILib.h"
    
    
    class Robot: public SampleRobot
    {
    	DigitalInput limitSwitch;
    	
    public:
    	Robot() {
    		
    	}
    
    	void RobotInit()
    	{
    		limitSwitch = new DigitalInput(1);
    	}
    
    	void OperatorControl() {
    		// more code here
    		while (limitSwitch.Get()) {
    			Wait(10);
    		}
    		// more code here
    	}
    
    Java
    
    package org.usfirst.frc.team1.robot;
    
    import edu.wpi.first.wpilibj.DigitalInput;
    import edu.wpi.first.wpilibj.SampleRobot;
    import edu.wpi.first.wpilibj.Timer;
    
    public class RobotTemplate extends SampleRobot {
    
    	DigitalInput limitSwitch;
    
     \   public void robotInit() {
        	limitSwitch = new DigitalInput(1);
        }
    
     \   public void operatorControl() {
        	// more code here
        	while (limitSwitch.get()) {
        		Timer.delay(10);
        	}
            // more code here
        }
    
    package edu.wpi.first.wpilibj.templates.commands;
    
    public class ArmUp extends CommandBase {
        public ArmUp() {
        }
    
        protected void initialize() {
            arm.armUp();
        }
    
        protected void execute() {
        }
    
        protected boolean isFinished() {
            return arm.isSwitchSet();
        }
    
        protected void end() {
            arm.armStop();
        }
    
        protected void interrupted() {
            end();
        }
    }
    package edu.wpi.first.wpilibj.templates.subsystems;
    import edu.wpi.first.wpilibj.Counter;
    import edu.wpi.first.wpilibj.DigitalInput;
    import edu.wpi.first.wpilibj.SpeedController;
    import edu.wpi.first.wpilibj.Victor;
    import edu.wpi.first.wpilibj.command.Subsystem;
    public class Arm extends Subsystem {
    
        DigitalInput limitSwitch = new DigitalInput(1);
        SpeedController armMotor = new Victor(1);
        Counter counter = new Counter(limitSwitch);
    
        public boolean isSwitchSet() {
            return counter.get() > 0;
        }
    
        public void initializeCounter() {
            counter.reset();
        }
    
        public void armUp() {
            armMotor.set(0.5);
        }
    
        public void armDown() {
            armMotor.set(-0.5);
        }
    
        public void armStop() {
            armMotor.set(0.0);
        }
        protected void initDefaultCommand() {
        }
    }
    package edu.wpi.first.wpilibj.templates.commands;
    
    public class ArmUp extends CommandBase {
    
        public ArmUp() {
        }
    
        protected void initialize() {
            arm.initializeCounter();
            arm.armUp();
        }
    
        protected void execute() {
        }
    
        protected boolean isFinished() {
            return arm.isSwitchSet();
        }
    
        protected void end() {
            arm.armStop();
        }
    
        protected void interrupted() {
            end();
        }
    }
    class AccelerometerSample: public SampleRobot {
    	AnalogAccelerometer *accel;
    	double acceleration;
    AccelerometerSample()
    {
        accel = new AnalogAccelerometer(0); //create accelerometer on analog input 0
        accel->SetSensitivity(.018); // Set sensitivity to 18mV/g (ADXL193)
        accel->SetZero(2.5); //Set zero to 2.5V (actual value should be determined experimentally)
    }
    
    public void OperatorControl() {
        while(IsOperatorControl() && IsEnabled())
        {
            acceleration = accel->GetAcceleration();
        }
    }
    }
    AccelerometerSample()
    {
        accel = new AnalogAccelerometer(0); //create accelerometer on analog input 0
        accel.setSensitivity(.018); // Set sensitivity to 18mV/g (ADXL193)
        accel.setZero(2.5); //Set zero to 2.5V (actual value should be determined experimentally)
    }
    
    public void operatorControl() {
        while(isOperatorControl() && isEnabled())
        {
            acceleration = accel.getAcceleration();
        }
    }
    }
    C++
    Accelerometer *accel;
    accel = new BuiltInAccelerometer(Accelerometer:kRange_4G); 
    double xVal = accel->GetX();
    double yVal = accel->GetY();
    double zVal = accel->GetZ();
    Java
    Accelerometer accel;
    accel = new BuiltInAccelerometer(); 
    accel = new BuiltInAccelerometer(Accelerometer.Range.k4G); 
    double xVal = accel.getX();
    double yVal = accel.getY();
    double zVal = accel.getZ();
    C++
    class AccelerometerSample: public SampleRobot {
    	Accelerometer *accel;
    	double accelerationX;
    	double accelerationY;
    	double accelerationZ;
    
    	AccelerometerSample()
    	{
    		accel = new ADXL345_I2C(I2C::Port::kOnboard, Accelerometer::Range::kRange_4G);
    	}
    
    	public void OperatorControl() {
    		while(IsOperatorControl() && IsEnabled())
    		{
    			accelerationX = accel->GetX();
    			accelerationY = accel->GetY();
    			accelerationZ = accel->GetZ();
    		}
    	}
    }
    
    Java
    public class AccelerometerSample extends SampleRobot {
    	Accelerometer accel;
    	double accelerationX;
    	double accelerationY;
    	double accelerationZ;
    
    	AccelerometerSample()
    	{
    		accel = new ADXL345_I2C(I2C.Port.kOnboard, Accelerometer.Range.k4G);
    	}
    
    	public void operatorControl() {
    		while(isOperatorControl() && isEnabled())
    		{
    			accelerationX = accel.getX();
    			accelerationY = accel.getY();
    			accelerationZ = accel.getZ();
    		}
    	}
    }
    C++
    
    class GyroSample : public SampleRobot
    {
    	RobotDrive myRobot; // robot drive system
    	AnalogGyro gyro;
    	static const float kP = 0.03;
    	
    public:
    	GyroSample():
    		myRobot(1, 2), // initialize the sensors in initilization list
    		gyro(1)
    	{
    		myRobot.SetExpiration(0.1);
    	}
    	
    	void Autonomous()
    	{
    		gyro.Reset();
    		while (IsAutonomous())
    		{
    			float angle = gyro.GetAngle(); // get heading
    			myRobot.Drive(-1.0, -angle * kP); // turn to correct heading
    			Wait(0.004);
    		}
    		myRobot.Drive(0.0, 0.0); // stop robot
    	}
    };
    
    Java
    
    package edu.wpi.first.wpilibj.templates;
    import edu.wpi.first.wpilibj.AnalogGyro;
    import edu.wpi.first.wpilibj.RobotDrive;
    import edu.wpi.first.wpilibj.SampleRobot;
    import edu.wpi.first.wpilibj.Timer;
    public class GyroSample extends SampleRobot {
    
     \   private RobotDrive myRobot; // robot drive system
        private Gyro gyro;
    
     \   double Kp = 0.03;
    
        public GyroSample() {
            gyro = new AnalogGyro(1); \            // Gyro on Analog Channel 1
            myRobot = new RobotDrive(1,2); \ // Drive train jaguars on PWM 1 and 2
            myRobot.setExpiration(0.1);
     \   }
    
        public void autonomous() {
            gyro.reset();
            while (isAutonomous()) {
                double angle = gyro.getAngle(); // get current heading
                myRobot.drive(-1.0, -angle*Kp); // drive towards heading 0
                Timer.delay(0.004);
            }
            myRobot.drive(0.0, 0.0);
     \   }
    }
    
    C++
    
    class ultrasonicSample : public SampleRobot
    {
    	Ultrasonic *ultra; // creates the ultra object
    
    public:
    	ultrasonicSample()
    	{
    		ultra = new Ultrasonic(1, 1); // assigns ultra to be an ultrasonic sensor which uses DigitalOutput 1 for the echo pulse and DigitalInput 1 for the trigger pulse
    		ultra->SetAutomaticMode(true); // turns on automatic mode
    	}
    
    	void Teleop()
    	{
    		int range = ultra->GetRangeInches(); // reads the range on the ultrasonic sensor
    	}
    };
    
    Java
    
    import edu.wpi.first.wpilibj.SampleRobot;
    import edu.wpi.first.wpilibj.Ultrasonic;
    
    public class RobotTemplate extends SampleRobot {
    
    	Ultrasonic ultra = new Ultrasonic(1,1); // creates the ultra object andassigns ultra to be an ultrasonic sensor which uses DigitalOutput 1 for 
            // the echo pulse and DigitalInput 1 for the trigger pulse
        public void robotInit() {
        	ultra.setAutomaticMode(true); // turns on automatic mode
        }
    
        public void ultrasonicSample() {
        	double range = ultra.getRangeInches(); // reads the range on the ultrasonic sensor
        }
    Logo

    Command Based Programlama

    Command Based programlama nedir?

    WPILib, "Command Based programlama" adlı programlar yazma yöntemini destekler. Command Based programlama, robot programlarınızı düzenlemenize yardımcı olacak bir tasarım modelidir. Diğer masaüstü programlarından farklı olabilecek bazı robot programlarının özellikleri şunlardır:

    • Faaliyetler zamanla gerçekleşir, örneğin bir Frizbi çekmek veya bir asansör yükseltmek ve bir hedefe bir tüp yerleştirmek için bir dizi adım.

    • Bu aktiviteler eşzamanlı olarak gerçekleşir, bu da robot performansını arttırmak için bir asansör, bilek ve kavrayıcının hepsi aynı zamanda bir alma pozisyonuna hareket etmesi istenebilir.

    • Robot mekanizmalarını ve aktivitelerini, robotunuzu hata ayıklamaya yardımcı olmak için ayrı ayrı test etmek istenebilir.

    • Çoğu zaman programın son dakikada belki de yarışmalarda ek otonom programlarla güçlendirilmesi gerekir, bu nedenle kolayca genişletilebilir kod önemlidir.

    Command based programlama, robot programını daha az yapılandırılmış bir teknik kullanmaktan çok daha basit hale getirmek için tüm bu hedefleri kolayca destekler.

    Komutlar ve alt sistemler

    WPILib kütüphanesine dayalı programlar iki temel kavram etrafında düzenlenmiştir: Alt Sistemler ve Komutlar.

    Alt sistemler - robotun her bir parçasının yeteneklerini tanımlar ve Alt Sistemin alt sınıflarıdır.

    Komutlar - alt sistemlerde tanımlanan yetenekleri içeren robotun çalışmasını tanımlar. Komutlar Komut veya KomutGrup alt sınıflarıdır. Komutlar, zamanlanmış veya SmartDashboard'dan basılan düğmelere veya sanal düğmelere yanıt olarak çalışır.

    Komutlar nasıl çalışır

    Komutlar, robotu küçük parçalar halinde çalıştırmanın görevlerini çözmenizi sağlar. Her komutun, bazı çalışma yapan bir execute () yöntemi ve tamamlandığını söyleyen isFinished () yöntemi vardır. Bu, sürücü istasyonundan veya her 20 ms'den bir güncellemede gerçekleşir. Komutlar birlikte gruplandırılabilir ve sıralı olarak gerçekleştirilebilir, bir önceki grupta olduğu gibi grupta bir sonraki başlar.

    Eşzamanlılık

    Bazen eşzamanlı olarak gerçekleşen çeşitli operasyonların olması arzu edilir. Önceki örnekte, asansör hareket ederken bileğerin konumunu ayarlamak isteyebilirsiniz. Bu durumda bir komut grubu çalışan bir paralel komut (veya komut grubu) başlatabilir.

    Nasıl Çalışır - Komutları Zamanlama

    Komutların planlandığı üç ana yol vardır:

    1. Elle, komut üzerindeki start () yöntemini çağırarak (otonom olarak kullanılır)

    2. Programlayıcı tarafından otomatik olarak kodda belirtilen düğme / tetikleme eylemlerine dayanır (genellikle OI sınıfında tanımlanır ancak Zamanlayıcı tarafından kontrol edilir).

    3. Bir önceki komut tamamlandığında otomatik olarak (varsayılan komutlar ve komut grupları).

    Sürücü istasyonu yeni veriler aldığında, robot programınızın periyodik yöntemi denir. Herhangi bir komutun planlanması veya iptal edilmesi gerekip gerekmediğini görmek için tetikleyici koşullarını kontrol eden bir Zamanlayıcı çalıştırır.

    Bir komut zamanlandığında, Zamanlayıcı, başka hiçbir komutun, yeni komutun gerektirdiği aynı alt sistemleri kullanmadığından emin olmayı denetler. Alt sistemlerden biri veya daha fazlası şu anda kullanılıyorsa ve geçerli komut kesilirse, kesintiye uğrayacak ve yeni komut zamanlanacaktır. Geçerli komut kesilmezse, yeni komut programlanamaz.

    Nasıl Çalışır - Komutları Çalıştırma

    Yeni komutları kontrol ettikten sonra, programlayıcı aktif komutlar listesinden geçer ve her komutta execute () ve isFinished () yöntemlerini çağırır. Görünür eşzamanlı yürütmenin, programa karmaşıklık katacak iş parçacıkları veya görevler kullanılmadan gerçekleştirildiğine dikkat edin. Her bir komutun basitçe, hedefine doğru ilerlemek için bir kod (yürütme yöntemi) ve komutun hedefe ulaşıp ulaşmadığını belirleyen bir yöntem (isFinished) vardır. Execute ve isFinished yöntemleri tekrar tekrar denir.

    Komut grupları

    Daha basit komutlardan daha karmaşık komutlar oluşturulabilir. Örneğin, bir diski çekmek, birbiri ardına yürütülen uzun bir komut dizisi olabilir. Belki sıradaki bu komutların bazıları eşzamanlı olarak yürütülebilir. Komut grupları komutlardır, ancak bir Tamamlanmamış ve yürütme yöntemine sahip olmak yerine, yürütmek için başka komutların bir listesi vardır. Bu, daha basit işlemlerden daha karmaşık işlemlerin oluşturulmasına olanak tanır, programlamada temel bir ilkedir. Bireysel küçük komutların her biri önce kolayca test edilebilir, daha sonra grup test edilebilir. Komut grupları hakkında daha fazla bilgi, Komut grubu oluşturma komutları makalesinde bulunabilir.

    Bir robot projesi oluşturma

    Eclipse eklentileri ile sağlanan şablon projelerinden birini kullanarak bir komut tabanlı robot projesi oluşturun. Proje Oluştur

    Proje gezgini penceresinde boş bir alanda sağ tıklayın. "New" i ve ardından "Project ..." i seçin.

    Proje tipinin seçilmesi

    Gerekirse WPILib Robot C ++ veya Java Geliştirme klasörlerini genişletin ve uygun proje türünü seçin, Robot C ++ veya Java Project. Sadece yüklediğiniz eklentinin seçeneklerini göreceksiniz.

    Örnek Bir Proje Seçmek

    Proje isminizi kutuya yazıp Command-Based Robot için radyo düğmesini seçin.

    Proje Gezgini penceresindeki örnek projeye bakın

    CommandBasedRobotTemplate projesinin Project Explorer penceresinde bulunmuş olabilecek diğer projelere eklendiğine dikkat edin. Komutlar için bir klasör ve Alt sistemler için başka bir klasör var.

    Projeye Komut ve Alt Sistemlerin Eklenmesi

    Komutlar ve Altsistemler her biri sınıf olarak oluşturulur. Eklenti, programınıza eklemenizi kolaylaştırmak için hem Komutlar hem de Alt Sistemler için yerleşik şablonlara sahiptir.

    Projeye alt sistemler ekleme

    Bir alt sistem eklemek için, proje adına sağ tıklayın ve açılan menüden "new" ve "Subsystem" i seçin.

    Alt sistemi adlandırma

    Alt sistem için bir ad doldurun. Bu alt sistem için sonuçta ortaya çıkan sınıf adı olacaktır, bu nedenle adınız sizin diliniz için geçerli bir sınıf adı olmalıdır.

    Projede oluşturulan alt sistem

    Projedeki Subsystems klasöründe oluşturulan yeni alt sistemi görebilirsiniz. Alt sistemler oluşturma hakkında daha fazla bilgi için Basit alt sistemler makalesine bakın.

    Projeye bir komut eklemek

    Bir alt sistem oluşturmaya benzer adımlar kullanarak proje için bir komut oluşturulabilir. Proje Gezgini'nde proje adına ilk olarak sağ tıklayın ve new -> Command seçin.

    Komut adını ayarla

    Komut adını iletişim kutusundaki "Class Name" alanına girin. Bu, Komuta için sınıf adı olacaktır, bu nedenle diliniz için geçerli bir sınıf adı olmalıdır.

    Komut projede oluşturuldu

    Komutun Proje Gezgini penceresinde projedeki Komutlar klasöründe oluşturulduğunu görebilirsiniz. Komut oluşturma hakkında daha fazla bilgi için Basit Komutlar Oluşturma makalesine bakın.

    Basit Alt Sistemler

    Bir alt sistem oluşturma

    Bu bir robot üzerinde bir pençe çalışan oldukça basit bir alt sisteme bir örnektir. Pençe mekanizması, pençeyi açmak ve kapatmak için tek bir motora sahiptir ve sensörler yoktur (pratikte mutlaka iyi bir fikir değildir, ancak örnek için çalışır). Buradaki fikir, açık ve kapalı işlemlerin basitçe zamanlanmasıdır. Pençe motorunu çalıştıran üç yöntem vardır, open (), close () ve stop (). Çenenin açılıp kapanmadığını kontrol eden belirli bir kodun bulunmadığına dikkat edin. Açık yöntem, tırnağı açık yönde hareket ettirir ve yakın yöntem, pençenin yakın yönde hareket etmesini sağlar. Pençenin belirli bir süre boyunca açılıp kapanmasını sağlamak için bu işlemin zamanlamasını kontrol etmek için bir komut kullanın.

    Pençeyi bir komutla çalıştırma

    Komutlar, alt sistemlerin işlemlerinin zamanlamasını sağlar. Her komut alt sistemle farklı bir işlem yapar. Komutlar, açma veya kapama için zamanlamayı sağlar. İşte pençenin açılmasını kontrol eden basit bir Komutanlık örneği. Bu komut için bir zaman aşımı ayarlandığına dikkat edin (0.9 saniye), pençenin açılmasını ve isFinished () yöntemindeki süreyi kontrol etmeyi zamanlamak için. Komutları kullanma hakkında makalede daha fazla ayrıntı bulabilirsiniz.

    Yerleşik PID kontrolü için PIDSubsystems

    Bir bilek ekleminin açısını kontrol etmek için bir PIDSubsystem

    Bu örnekte, bilek eklemi için bir PIDSubsystem'in temel öğelerini görebilirsiniz:

    Basit Komutlar Oluşturma

    Bu makalede, bir Komutun temel biçimi açıklanmakta ve robotunuzu Joystick'lerle sürmek için bir komut oluşturma örneği sunulmaktadır.

    Temel Komut Biçimi

    Bir komutu uygulamak için, WPILib Command sınıfından bir takım yöntemler geçersiz kılınır. Yöntemlerin çoğu, kazan plakasıdır ve çoğu zaman göz ardı edilebilir, ancak ihtiyacınız olduğunda maksimum esneklik için vardır. Bu temel komut sınıfında birkaç parça var:

    Basit Komut Örneği

    Bu örnek, robotun tank tahriklerini kullanarak joysticklerin sağladığı değerlerle sürecek basit bir komutu göstermektedir.

    Komut grupları oluşturma

    Karmaşık bir işlem yapmak için bir komut oluşturma

    Bu, bir sodayı masaya yerleştiren bir komut grubunun örneğidir. Bunu başarmak için, (1) robot elevatörü "TABLE_HEIGHT" a geçmeli, (2) bilek açısını ayarlamalı, ardından (3) tırnağı açmalıdır. Tüm bu görevler, sodanın düşemeyeceğinden emin olmak için sırayla çalıştırılmalıdır. AddSequential () yöntemi, bir komutu (veya komut grubunu) bir parametre olarak alır ve bu komut programlandığında bunları birbiri ardına yürütür.

    Komutları paralel olarak çalıştırma

    Programı daha verimli hale getirmek için, çoğu kez aynı anda birden fazla komutun çalıştırılması istenir. Bu örnekte, robot bir soda alabilir. Robot hiçbir şey tutmadığından, tüm eklemler bir şey düşürmekten endişe etmeden aynı anda hareket edebilir. Burada tüm komutlar paralel olarak çalışır, böylece tüm motorlar aynı anda çalışır ve her isFinished () yöntemi çağrıldığında tamamlanır. Komutlar emredilemez. Adımlar şunlardır: (1) bileği başlatma ayar noktasına getirin, daha sonra (2) asansörü yerden teslim konumuna getirin ve (3) tırnağı açın.

    Paralel ve sıralı komutları karıştırma

    Genellikle, diğer parçaların çalıştırılmasından önce tamamlanması gereken bir komut grubunun bazı bölümleri vardır. Bu örnekte, bir soda kabı tutulur, daha sonra asansör ve bilek istiflenmiş konumlarına hareket edebilir. Bu durumda, el bileği ve asansörü, kap kapana kadar beklemek zorundadır, sonra bağımsız olarak çalışabilirler.

    Joystick inputları ile komutları çalıştırma

    Düğmeye basılı tutulduğunda kumanda düğmelerine basıldığında, serbest bırakıldığında veya sürekli olarak komutların çalışmasına neden olabilirsiniz. Bu sadece birkaç satırlık kod gerektiren yapmak için son derece kolaydır.

    OI sınıfı

    Komut tabanlı şablon, Operatör Arayüzü davranışlarının tipik olarak tanımlandığı OI.java'da bulunan OI adında bir sınıf içerir. Eğer RobotBuilder kullanıyorsanız bu dosya org.usfirst.frc ####. NAME paketinde bulunabilir.

    Joystick nesnesini ve JoystickButton nesnelerini oluşturun

    Bu örnekte Joystick 1 olarak bağlı bir Joystick nesnesi vardır. Daha sonra robotun çeşitli yönlerini kontrol etmek için bu joystick üzerinde 8 düğme tanımlanmıştır. Bu, test için özellikle yararlıdır, ancak SmartDashboard üzerindeki butonların üretilmesi komutların test edilmesi için başka bir alternatiftir.

    Düğmeleri komutlarla ilişkilendirin

    Bu örnekte, önceki kod parçasından gelen joystick düğmelerinin çoğu, komutlarla ilişkilendirilmiştir. İlgili tuşa basıldığında komut çalıştırılır. Bu, özel eylemler yapmak için düğmeleri olan bir teleop programı oluşturmanın mükemmel bir yoludur.

    Diğer seçenekler

    Yukarıda gösterilen "whenPressed ()" koşuluna ek olarak, düğmeleri komutlara bağlamak için kullanabileceğiniz birkaç başka koşul vardır:

    • Komutlar, bir düğme WhenPold () yerine whenReleased () kullanılarak serbest bırakıldığında çalışabilir.

    • Komutlar, whileHeld () öğesini çağırmak suretiyle tuşa basarken sürekli olarak çalışabilir.

    • ToggleWhenPressed () kullanılarak bir tuşa basıldığında komutlar değiştirilebilir.

    • CancelWhenPressed () kullanılarak bir tuşa basıldığında bir komut iptal edilebilir.

    Ayrıca, komutlar, Düğme yerine Trigger sınıfını kullanarak seçiminizin keyfi koşulları tarafından tetiklenebilir. Tetikleyiciler (ve Düğmeler) genellikle her 20 ms'de veya zamanlayıcı çağrıldığında her zaman sorgulanır.

    Otonom periyodu boyunca komutları çalıştırma

    Otonom Periyodunda kullanılacak bir komut oluşturma

    Robotumuz, otonom dönemde aşağıdaki görevleri yerine getirmelidir: yerden bir soda alabilir, daha sonra bir masadan belirli bir mesafeyi sürdürebilir ve oradaki tenekeyi teslim edebilir. Süreci oluşur:

    1. Kapmak için hazırlayın (asansör, bilek ve kavrayıcıyı yerine hareket ettirin)

    2. Sodayı tutabilirsiniz.

    3. Ultrasonik telemetre ile gösterilen tablodan bir mesafeye kadar sürün

    4. Sodayı bırakın

    Bu görevleri yapmak için, bu örnekte gösterildiği gibi sırayla yürütülen 6 komut grubu vardır.

    Otonom çalışacak şekilde bu komutu ayarlama

    SodaDelivery komutunu otonom program olarak çalıştırmak için

    1. Bunu RobotInit () yönteminde örneklendirin. RobotInit (), robot başladığında sadece bir kez çağrılır, böylece komut örneğini oluşturmak için iyi bir zaman olur.

    2. AutonomousInit () yöntemi sırasında başlatın. AutonomousInit (), otonom dönemin başlangıcında bir kez çağrılır, böylece oradaki komutu programlanır.

    3. Programlayıcıya AutonomousPeriodic () yöntemi sırasında tekrar tekrar denir. AutonomousPeriodic () her 20 ms'de (nominal olarak) çağrılır, böylece programlanmış olan tüm komutlar boyunca geçiş yapan zamanlayıcıyı çalıştırmak için iyi bir zamandır.

    Basit Otonom Bir Programı Command-Based Otonom Programa Dönüştürme

    Döngüler ile ilk otonom kod

    Yukarıdaki kod bir atıcıyı hedefler, sonra bir tekerleği döndürür ve son olarak, tekerlek istenen hızda çalıştığında frizbi vurur. Kod üç farklı eylemden oluşur: amaç, hızlanmak ve Frizbi'yi vurmak. İlk iki eylem, dört bölümden oluşan bir komut desenini takip eder:

    1. Başlatma: eylemin gerçekleştirilmesini hazırlar.

    2. Durum: her şey yolunda iken döngü devam ediyor.

    3. Yürütme: koşulu yanlış yapmak için kodu tekrar tekrar günceller.

    4. Son: Bir sonraki eyleme geçmeden önce herhangi bir temizleme ve son görevi gerçekleştirir.

    Son eylem sadece açık bir başlatma özelliğine sahiptir, ancak nasıl okunduğunuza bağlı olarak, bir dizi koşul altında örtülü olarak sona erebilir.

    Komut olarak yeniden yazma

    Aynı kod, her eylemin kendi komutu olarak yazıldığı üç eylemi gruplandıran bir KomutGrup olarak yeniden yazılabilir. Öncelikle, komut grubu yazılacak, daha sonra üç eylemi gerçekleştirmek için komutlar yazılacaktır. Bu kod oldukça basittir. Ardı ardına üç eylem yapar, bu birbiri ardına gerçekleşir. Çizgi 3 robotu hedefliyor, sonra 4 numaralı çizgi shooterup'ı çeviriyor ve son olarak 5. hat aslında frizbiyi vuruyor. AddSequential () yöntemi, bu komutların birbiri ardına çalışması için ayarlar.

    Aim Komutu

    Gördüğünüz gibi, komut daha önce tartıştığımız eylemin dört bölümünü yansıtıyor. Ayrıca aşağıda tartışılacak olan interrupted () yöntemine de sahiptir. Diğer önemli fark, isFinished () öğesindeki koşulun while döngüsünün koşulu olarak ne koyacağınızın tersi olması, eğer yürütme yöntemini false yerine çalıştırmayı durdurmak istediğinizde true olarak geri dönmesidir. Başlatma, yürütme ve sonlandırma tamamen aynıdır, sadece yaptıkları şeyi belirtmek için kendi yöntemlerine girerler.

    SpinUpShooter komutu

    Spin up shooter komutu, Aim komutuna çok benziyor, aynı temel fikir.

    Shoot Komutu

    Shoot komutu yine aynı temel dönüşümdür, ancak hemen sona erecek şekilde ayarlanmıştır. CommandBased programlamada, fırlatma eylemi bittiğinde, Bitmiş yöntemin doğru olması için daha iyidir, ancak bu, orijinal kodun daha doğrudan bir çevirisidir.

    Varsayılan Komutlar

    Bazı durumlarda, ne olursa olsun her zaman bir komut çalıştırmak istediğiniz bir alt sisteminiz olabilir. Peki, şu anda çalıştırmakta olduğunuz komut ne zaman bitiyor? Burada varsayılan komutlar gelir.

    Varsayılan komut nedir?

    Her bir alt sistem, alt sistem boşta olduğunda programlanmış olan varsayılan bir komut içerebilir, ancak bunun için gerekli değildir (sistem şu anda tamamlanması gereken komut). Varsayılan komutun en yaygın örneği, normal joystick kontrolünü uygulayan aktarma organları için bir komuttur. Bu komut, belirli manevralar ("hassas mod", otomatik hizalama / hedefleme, vb.) İçin başka komutlar tarafından kesintiye uğrayabilir, ancak aktarma organlarının tamamlanmasını gerektiren herhangi bir komutun ardından joystick komutu tekrar programlanır.

    Varsayılan komutu ayarlama

    Tüm alt sistemler, istenirse varsayılan komutu ayarlayacağınız initDefaultCommand () adında bir yöntem içermelidir. Varsayılan bir komut kullanmak istemiyorsanız, bu yöntemi boş bırakın. Varsayılan bir komut ayarlamak isterseniz, setDefaultCommand'ı bu yöntem içinden çağırarak, varsayılan olarak ayarlanacak komutu iletin.

    İki komutu senkronize etme

    Komutlar daha karmaşık komutlar oluşturmak için komut gruplarının içine yerleştirilebilir. Daha basit komutlar, sıralı olarak (her komut bir sonraki başlatmadan önce bitirilir) veya paralel olarak (komut zamanlanır ve bir sonraki komut da hemen programlanır) komut gruplarına eklenebilir. Bazen, bir sonraki komuta geçmeden önce iki paralel komutun tamamlandığından emin olmak istediğiniz zamanlar vardır. Bu makalede, bunun nasıl yapılacağı anlatılmaktadır.

    Sıralı ve paralel komutlarla bir komut grubu oluşturma

    Bu örnekte, bazı komutlar paralel olarak eklenir ve diğerleri CommandGroup CoopBridgeAutonomous (1) öğesine ardışık olarak eklenir. SetVirtualSetpoint komutu başlamadan önce ilk komut "SetTipperState" eklenir ve tamamlanır (2). SetVirtualSetpoint komutu tamamlanmadan önce, SetVirtualSetpoint paralel olarak eklendiğinden hemen DriveToBridge komutuna programlanır (3). Bu örnek, komutların nasıl planlandığı konusunda size bir fikir verebilir.

    Örnek Akış Şeması

    Yukarıda gösterilen kod bir akış şeması olarak gösterilmiştir. "Add Parallel" kullanılarak planlanan komutlardan herhangi bir bağımlılık olmadığına dikkat edin, MoveBallToShooter komutuna ulaşıldığında bu komutların ikisi de veya ikisi de çalışıyor olabilir. Bir paralel komut tarafından kullanılan bir alt sistemi gerektiren ana dizideki (burada sağdaki sıra) herhangi bir komut, paralel komutun iptal edilmesine neden olur. Örneğin, FireSequence, SetVirtualSetpoint tarafından kullanılan bir alt sistem gerektiriyorsa, FireSequence zamanlandığında SetVirtualSetpoint komutu iptal edilir.

    Uzaklık mesafesinden bir mesafeye geri dönüş

  • Tutucuyu yeniden yerleştirmek

  • Java
    
    import edu.wpi.first.wpilibj.*;
    import edu.wpi.first.wpilibj.command.Subsystem;
    import org.usfirst.frc.team1.robot.RobotMap;
    
    public class Claw extends Subsystem {
    
    	Victor motor = RobotMap.clawMotor;
    
        public void initDefaultCommand() {
        }
    
        public void open() {
        	motor.set(1);
        }
    
        public void close() {
        	motor.set(-1);
        }
    
        public void stop() {
        	motor.set(0);
        }
    }
    
    
    Java
    
    package org.usfirst.frc.team1.robot.commands;
    
    import edu.wpi.first.wpilibj.command.Command;
    import org.usfirst.frc.team1.robot.Robot;
    /**
     *
     */
    public class OpenClaw extends Command {
    
        public OpenClaw() {
            requires(Robot.claw);
            setTimeout(.9);
        }
    
        protected void initialize() {
        	Robot.claw.open()
        }
    
        protected void execute() {
        }
    
        protected boolean isFinished() {
            return isTimedOut();
        }
    
        protected void end() {
        	Robot.claw.stop();
        }
    
        protected void interrupted() {
        	end();
        }
    }
    
    Java
    
    package org.usfirst.frc.team1.robot.subsystems;
    import edu.wpi.first.wpilibj.*;
    import edu.wpi.first.wpilibj.command.PIDSubsystem;
    import org.usfirst.frc.team1.robot.RobotMap;
    
    
    public class Wrist extends PIDSubsystem { // This system extends PIDSubsystem
    
    	Victor motor = RobotMap.wristMotor;
    	AnalogInput pot = RobotMap.wristPot();
    
    	public Wrist() {
    		super("Wrist", 2.0, 0.0, 0.0);// The constructor passes a name for the subsystem and the P, I and D constants that are used when computing the motor output
    		setAbsoluteTolerance(0.05);
    		getPIDController().setContinuous(false);
    	}
    	
        public void initDefaultCommand() {
        }
    
        protected double returnPIDInput() {
        	return pot.getAverageVoltage(); // returns the sensor value that is providing the feedback for the system
        }
    
        protected void usePIDOutput(double output) {
        	motor.pidWrite(output); // this is where the computed output value fromthe PIDController is applied to the motor
        }
    }
    
    C++
    
    #include "MyCommandName.h"
    
    /*
    	 * 1.	Constructor - Might have parameters for this command such as target positions of devices. Should also set the name of the command for debugging purposes.
    	 *  This will be used if the status is viewed in the dashboard. And the command should require (reserve) any devices is might use.
    	 */
    MyCommandName::MyCommandName() : CommandBase("MyCommandName") 
    {
    	Requires(Elevator);
    }
    
    // initialize() - This method sets up the command and is called immediately before the command is executed for the first time and 
    // every subsequent time it is started . Any initialization code should be here.
    void MyCommandName::Initialize()
    {
    
    }
    
    /*
     *	execute() - This method is called periodically (about every 20ms) and does the work of the command. Sometimes, if there is a position a
     *  subsystem is moving to, the command might set the target position for the subsystem in initialize() and have an empty execute() method.
     */
    void MyCommandName::Execute()
    {
    
    }
    
    bool MyCommandName::IsFinished()
    {
    	return false;
    }
    
    void MyCommandName::End()
    {
    
    }
    
    // Make this return true when this Command no longer needs to run execute()
    void MyCommandName::Interrupted()
    {
    
    }
    
    Java
    
    public class MyCommandName extends Command {
    
    	/*
    	 * 1.	Constructor - Might have parameters for this command such as target positions of devices. Should also set the name of the command for debugging purposes.
    	 *  This will be used if the status is viewed in the dashboard. And the command should require (reserve) any devices is might use.
    	 */
        public MyCommandName() {
        	super("MyCommandName");
            requires(elevator);
        }
    
        // 	initialize() - This method sets up the command and is called immediately before the command is executed for the first time and every subsequent time it is started .
        //  Any initialization code should be here. 
        protected void initialize() {
        }
    
        /*
         *	execute() - This method is called periodically (about every 20ms) and does the work of the command. Sometimes, if there is a position a
         *  subsystem is moving to, the command might set the target position for the subsystem in initialize() and have an empty execute() method.
         */
        protected void execute() {
        }
    
        // Make this return true when this Command no longer needs to run execute()
        protected boolean isFinished() {
            return false;
        }
    }
    
    C++
    
    #include "DriveWithJoysticks.h"
    #include "RobotMap.h"
    
    DriveWithJoysticks::DriveWithJoysticks() : CommandBase("DriveWithJoysticks")
    {
    	Requires(Robot::drivetrain); // Drivetrain is our instance of the drive system
    }
    
    // Called just before this Command runs the first time
    void DriveWithJoysticks::Initialize()
    {
    
    }
    
        /*
         * execute() - In our execute method we call a tankDrive method we have created in our subsystem. This method takes two speeds as a parameter which we get from methods in the OI class.
         * These methods abstract the joystick objects so that if we want to change how we get the speed later we can do so without modifying our commands
         * (for example, if we want the joysticks to be less sensitive, we can multiply them by .5 in the getLeftSpeed method and leave our command the same).
         */
    void DriveWithJoysticks::Execute()
    {
    	Robot::drivetrain->Drive(Robot::oi->GetJoystick());
    }
    
        /*
         * isFinished - Our isFinished method always returns false meaning this command never completes on it's own. The reason we do this is that this command will be set as the default command for the subsystem. This means that whenever the subsystem is not running another command, it will run this command. If any other command is scheduled it will interrupt this command, then return to this command when the other command completes.
         */
    bool DriveWithJoysticks::IsFinished()
    {
    	return false;
    }
    
    void DriveWithJoysticks::End()
    {
    	Robot::drivetrain->Drive(0, 0);
    }
    
    // Called when another command which requires one or more of the same
    // subsystems is scheduled to run
    void DriveWithJoysticks::Interrupted()
    {
    	End();
    }
    
    Java
    
    public class DriveWithJoysticks extends Command {
    
        public DriveWithJoysticks() {
        	requires(drivetrain);// drivetrain is an instance of our Drivetrain subsystem
        }
    
        protected void initialize() {
        }
    
        /*
         * execute() - In our execute method we call a tankDrive method we have created in our subsystem. This method takes two speeds as a parameter which we get from methods in the OI class.
         * These methods abstract the joystick objects so that if we want to change how we get the speed later we can do so without modifying our commands
         * (for example, if we want the joysticks to be less sensitive, we can multiply them by .5 in the getLeftSpeed method and leave our command the same).
         */
        protected void execute() {
        	drivetrain.tankDrive(oi.getLeftSpeed(), oi.getRightSpeed());
        }
    
        /*
         * isFinished - Our isFinished method always returns false meaning this command never completes on it's own. The reason we do this is that this command will be set as the default command for the subsystem. This means that whenever the subsystem is not running another command, it will run this command. If any other command is scheduled it will interrupt this command, then return to this command when the other command completes.
         */
        protected boolean isFinished() {
            return false;
        }
    
        protected void end() {
        }
    
        protected void interrupted() {
        }
    }
    
    C++
    
    #include "PlaceSoda.h"
    
    PlaceSoda::PlaceSoda()
    {
    	AddSequential(new SetElevatorSetpoint(TABLE_HEIGHT));
    	AddSequential(new SetWristSetpoint(PICKUP));
    	AddSequential(new OpenClaw());
    }
    
    
    Java
    
    public class PlaceSoda extends CommandGroup {
    
        public  PlaceSoda() {
        	addSequential(new SetElevatorSetpoint(Elevator.TABLE_HEIGHT));
        	addSequential(new SetWristSetpoint(Wrist.PICKUP));
        	addSequential(new OpenClaw());
        }
    }
    
    C++
    
    #include "PrepareToGrab.h"
    
    PrepareToGrab::PrepareToGrab()
    {
    	AddParallel(new SetWristSetpoint(PICKUP));
    	AddParallel(new SetElevatorSetpoint(BOTTOM));
    	AddParallel(new OpenClaw());
    }
    
    Java
    
    public class PrepareToGrab extends CommandGroup {
    
        public  PrepareToGrab() {
        	addParallel(new SetWristSetpoint(Wrist.PICKUP));
        	addParallel(new SetElevatorSetpoint(Elevator.BOTTOM));
        	addParallel(new OpenClaw());
        }
    }
    C++
    
    #include "Grab.h"
    
    Grab::Grab()
    {
    	AddSequential(new CloseClaw());
    	AddParallel(new SetElevatorSetpoint(STOW));
    	AddSequential(new SetWristSetpoint(STOW));
    }
    
    Java
    
    public class Grab extends CommandGroup {
    
        public  Grab() {
        	addSequential(new CloseClaw());
        	addParallel(new SetElevatorSetpoint(Elevator.STOW));
        	addSequential(new SetWristSetpoint(Wrist.STOW));
        }
    }
    C++
    
    OI::OI()
    {
    	joy = new Joystick(1);
    
    	JoystickButton* button1 = new JoystickButton(joy, 1),
    			button2 = new JoystickButton(joy, 2),
    			button3 = new JoystickButton(joy, 3),
    			button4 = new JoystickButton(joy, 4),
    			button5 = new JoystickButton(joy, 5),
    			button6 = new JoystickButton(joy, 6),
    			button7 = new JoystickButton(joy, 7),
    			button8 = new JoystickButton(joy, 8);
    	
    }
    
    Java
    
    public class OI {
        // Create the joystick and the 8 buttons on it
    	Joystick leftJoy = new Joystick(1);
    	Button button1 = new JoystickButton(leftJoy, 1),
    			button2 = new JoystickButton(leftJoy, 2),
    			button3 = new JoystickButton(leftJoy, 3),
    			button4 = new JoystickButton(leftJoy, 4),
    			button5 = new JoystickButton(leftJoy, 5),
    			button6 = new JoystickButton(leftJoy, 6),
    			button7 = new JoystickButton(leftJoy, 7),
    			button8 = new JoystickButton(leftJoy, 8);
    	
    }
    C++
    
    	button1->WhenPressed(new PrepareToGrab());
    	button2->WhenPressed(new Grab());
    	button3->WhenPressed(new DriveToDistance(0.11));
    	button4->WhenPressed(new PlaceSoda());
    	button6->WhenPressed(new DriveToDistance(0.2));
    	button8->WhenPressed(new Stow());
    	
    	button7->WhenPressed(new SodaDelivery());
    
    Java
    
    	public OI() {
    		button1.whenPressed(new PrepareToGrab());
    		button2.whenPressed(new Grab());
    		button3.whenPressed(new DriveToDistance(0.11));
    		button4.whenPressed(new PlaceSoda());
    		button6.whenPressed(new DriveToDistance(0.2));
    		button8.whenPressed(new Stow());
    		
    		button7.whenPressed(new SodaDelivery());
    	}
    
    C++
    
    	button1->WhenPressed(new PrepareToGrab());
    	button2->WhenPressed(new Grab());
    	button3->WhenPressed(new DriveToDistance(0.11));
    	button4->WhenPressed(new PlaceSoda());
    	button6->WhenPressed(new DriveToDistance(0.2));
    	button8->WhenPressed(new Stow());
    	
    	button7->WhenPressed(new SodaDelivery());
    
    Java
    
    	public OI() {
    		button1.whenPressed(new PrepareToGrab());
    		button2.whenPressed(new Grab());
    		button3.whenPressed(new DriveToDistance(0.11));
    		button4.whenPressed(new PlaceSoda());
    		button6.whenPressed(new DriveToDistance(0.2));
    		button8.whenPressed(new Stow());
    		
    		button7.whenPressed(new SodaDelivery());
    	}
    
    C++
    
    Command* autonomousCommand;
    
    class Robot: public IterativeRobot {
    
        /**
         * This function is run when the robot is first started up and should be
         * used for any initialization code.
         */
    	void RobotInit()
    	{
            // instantiate the command used for the autonomous period
    		autonomousCommand = new SodaDelivery();
    		oi = new OI();
    
    	}
    	
    
    	void AutonomousInit()
    	{
            // schedule the autonomous command (example)
    		if(autonomousCommand != NULL) autonomousCommand->Start();
    	}
    	/*
    	 * This function is called periodically during autonomous
    	 */
    	void AutonomousPeriodic()
    	{
    		Scheduler::GetInstance()->Run();
    	}
    
    Java
    
    public class Robot extends IterativeRobot {
    
    
    
        Command autonomousCommand;
    
        /**
         * This function is run when the robot is first started up and should be
         * used for any initialization code.
         */
        public void robotInit() {
    		oi = new OI();
            // instantiate the command used for the autonomous period
            autonomousCommand = new SodaDelivery();
        }
    
        public void autonomousInit() {
            // schedule the autonomous command (example)
            if (autonomousCommand != null) autonomousCommand.start();
        }
    
        /**
         * This function is called periodically during autonomous
         */
        public void autonomousPeriodic() {
            Scheduler.getInstance().run();
        }
    C++
    
    // Aim shooter
    SetTargetAngle(); // Initialization: prepares for the action to be performed
    while (!AtRightAngle()) { // Condition: keeps the loop going while it is satisfied
    	CorrectAngle(); // Execution: repeatedly updates the code to try to make the condition false
    	delay(); // Delay to prevent maxing CPU
    }
    HoldAngle(); // End: performs any cleanup and final task before moving on to the next action
    
    // Spin up to Speed
    SetTargetSpeed(); // Initialization: prepares for the action to be performed
    while (!FastEnough()) { // Condition: keeps the loop going while it is satisfied
    	SpeedUp(); // Execution: repeatedly updates the code to try to make the condition false
    	delay(); // Delay to prevent maxing CPU
    }
    HoldSpeed();
    
    // Shoot Frisbee
    Shoot(); // End: performs any cleanup and final task before moving on to the next action
    }
    
    Java
    
    // Aim shooter
    SetTargetAngle(); // Initialization: prepares for the action to be performed
    while (!AtRightAngle()) { // Condition: keeps the loop going while it is satisfied
    	CorrectAngle(); // Execution: repeatedly updates the code to try to make the condition false
    	delay(); // Delay to prevent maxing CPU
    }
    HoldAngle(); // End: performs any cleanup and final task before moving on to the next action
    
    // Spin up to Speed
    SetTargetSpeed(); // Initialization: prepares for the action to be performed
    while (!FastEnough()) { // Condition: keeps the loop going while it is satisfied
    	SpeedUp(); // Execution: repeatedly updates the code to try to make the condition false
    	delay(); // Delay to prevent maxing CPU
    }
    HoldSpeed();
    
    // Shoot Frisbee
    Shoot(); // End: performs any cleanup and final task before moving on to the next action
    }
    C++
    
    #include "AutonomousCommand.h"
    
    AutonomousCommand::AutonomousCommand()
    {
         AddSequential(new Aim());
         AddSequential(new SpinUpShooter());
         AddSequential(new Shoot());
    }
    
    Java
    
    public class AutonomousCommand extends CommandGroup {
    
        public  AutonomousCommand() {
        	addSequential(new Aim());
        	addSequential(new SpinUpShooter());
        	addSequential(new Shoot());
        }
    }
    
    C++
    
    #include "Aim.h"
    
    Aim::Aim()
    {
         Requires(Robot::turret);
    }
    
    // Called just before this Command runs the first time
    void Aim::Initialize()
    {
         SetTargetAngle();
    }
    
    // Called repeatedly when this Command is scheduled to run
    void Aim:Execute()
    {
     \    CorrectAngle();
    }
    
    // Make this return true when this Command no longer needs to run execute()
    bool Aim:IsFinished()
    {
         return AtRightAngle();
    }
    
    // Called once after isFinished returns true
    void Aim::End()
    {
         HoldAngle();
    }
    // Called when another command which requires one or more of the same
    // subsystems is scheduled to run
    void Aim:Interrupted()
    {
         End();
    }
    
    Java
    
    public class Aim extends Command {
    
        public Aim() {
        	requires(Robot.turret);
        }
    
        // Called just before this Command runs the first time
        protected void initialize() {
        	SetTargetAngle();
        }
    
        // Called repeatedly when this Command is scheduled to run
        protected void execute() {
        	CorrectAngle();
     \   }
    
        // Make this return true when this Command no longer needs to run execute()
        protected boolean isFinished() {
            return AtRightAngle();
     \   }
    
        // Called once after isFinished returns true
        protected void end() {
        	HoldAngle();
        }
    
        // Called when another command which requires one or more of the same
        // subsystems is scheduled to run
        protected void interrupted() {
        	end();
        }
    }
    
    C++
    
    #include "SpinUpShooter.h"
    
    SpinUpShooter::SpinUpShooter()
    {
         Requires(Robot::shooter)
    }
    
    // Called just before this Command runs the first time
    void SpinUpShooter::Initialize()
    {
     \    SetTargetSpeed();
    }
    
    // Called repeatedly when this Command is scheduled to run
    void SpinUpShooter::Execute()
    {
         SpeedUp();
    }
    
    // Make this return true when this Command no longer needs to run execute()
    bool SpinUpShooter::IsFinished()
    {
     \    return FastEnough();
    }
    
    // Called once after isFinished returns true
    void SpinUpShooter::End()
    {
         HoldSpeed();
    }
    
    // Called when another command which requires one or more of the same
    // subsystems is scheduled to run
    void SpinUpShooter::Interrupted()
    {
         End();
    }
    
    Java
    
    public class SpinUpShooter extends Command {
    
        public SpinUpShooter() {
            requires(Robot.shooter);
     \   }
    
        // Called just before this Command runs the first time
        protected void initialize() {
        	SetTargetSpeed();
        }
    
        // Called repeatedly when this Command is scheduled to run
        protected void execute() {
        	SpeedUp();
     \   }
    
        // Make this return true when this Command no longer needs to run execute()
        protected boolean isFinished() {
            return FastEnough();
     \   }
    
        // Called once after isFinished returns true
        protected void end() {
        	HoldSpeed();
        }
    
        // Called when another command which requires one or more of the same
        // subsystems is scheduled to run
        protected void interrupted() {
        	end();
        }
    }
    
    C++
    
    #include "Shoot.h"
    
    Shoot::Shoot()
    {
         Requires(Robot.shooter);
    }
    
    // Called just before this Command runs the first time
    void Shoot::Initialize()
    {
     \    Shoot();
    }
    
    // Called repeatedly when this Command is scheduled to run
    void Shoot::Execute()
    {
    }
    
    // Make this return true when this Command no longer needs to run execute()
    bool Shoot::IsFinished()
    {
         return true;
    }
    
    // Called once after isFinished returns true
    void Shoot::End()
    {
    }
    
    // Called when another command which requires one or more of the same
    // subsystems is scheduled to run
    void Shoot::Interrupted()
    {
         End();
    }
    
    Java
    
    public class Shoot extends Command {
    
        public Shoot() {
            requires(shooter);
        }
    
        // Called just before this Command runs the first time
        protected void initialize() {
        	Shoot();
        }
    
        // Called repeatedly when this Command is scheduled to run
        protected void execute() {
        }
    
        // Make this return true when this Command no longer needs to run execute()
        protected boolean isFinished() {
            return true;
        }
    
        // Called once after isFinished returns true
        protected void end() {
        }
    
        // Called when another command which requires one or more of the same
        // subsystems is scheduled to run
     \   protected void interrupted() {
        	end();
        }
    }
    C++
    
    #include "ExampleSubsystem.h"
    
    ExampleSubsystem::ExampleSubsystem()
    {
         // Put methods for controlling this subsystem
         // here. Call these from Commands.
    }
    
    ExampleSubsystem::InitDefaultCommand()
    {
         // Set the default command for a subsystem here.
         SetDefaultCommand(new MyDefaultCommand());
    }
    
    Java
    
    public class ExampleSubsystem extends Subsystem {
    
        // Put methods for controlling this subsystem
        // here. Call these from Commands.
    
        public void initDefaultCommand() {
            // Set the default command for a subsystem here.
            setDefaultCommand(new MyDefaultCommand());
        }
    }
    C++
    
    #include "CoopBridgeAutonomous.h"
    
    CoopBridgeAutonomous::CoopBridgeAutonomous()
    {
         // SmartDashboard->PutDouble("Camera Time", 5.0);
         AddSequential(new SetTipperState(READY_STATE);
         AddParallel(new SetVirtualSetpoint(HYBRID_LOCATION);
         AddSequential(new DriveToBridge());
         AddParallel(new ContinuousCollect());
         AddSequential(new SetTipperState(DOWN_STATE));
    
         // addParallel(new WaitThenShoot());
    
         AddSequential(new TurnToTargetLowPassFilterHybrid(4.0));
         AddSequential(new FireSequence());
         AddSequential(new MoveBallToShooter(true));
    }
    
    Java
    
    public class CoopBridgeAutonomous extends CommandGroup {
    
        public  CoopBridgeAutonomous() {
        	//SmartDashboard.putDouble("Camera Time", 5.0);
        	addSequential(new SetTipperState(BridgeTipper.READY_STATE)); // 1
        	addParallel(new SetVirtualSetpoint(SetVirtualSetpoint.HYBRID_LOCATION)); // 2
        	addSequential(new DriveToBridge()); // 3
        	addParallel(new ContinuousCollect());
        	addSequential(new SetTipperState(BridgeTipper.DOWN_STATE));
        	
        	// addParallel(new WaitThenShoot());
        	
        	addSequential(new TurnToTargetLowPassFilterHybrid(4.0));
        	addSequential(new FireSequence());
        	addSequential(new MoveBallToShooter(true));
        }
    }