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...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
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.
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 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.
Daha fazla bilgi için adresini ziyaret edin
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.
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.
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 !
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.
Öğ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ı.
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.
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.
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 ve adresini ziyaret edebilirsiniz.
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. .
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.
Bir FRC takımı kurmaya karar verdiniz ancak nereden başlayacağınızı bilemiyorsanız aşağıdaki maddeleri inceleyerek yardım alabilirsiniz.
Takım kaydına geçmeden önce bir FRC takımını başlatmadan önce aşağıdaki konulara hakim olduğunuzdan emin olunuz.
Buraya kadar yapılan tüm açıklamaları okuyup kavradıktan sonra takım oluşturma adımlarına devam edebilirsiniz.
Her takımın kurucu mentoru (Lead Mentor) ve ikincil mentoru (Lead 2 Mentor) olur.
Takım kaydınızı yaptınız ise tabiki öğrencilerin kaydı ile devam edebilirsiniz. Öğrenci kayıtlarının tamamlanmış olması
Aynı zamanda ülkemizde çalışmalarına devam FRC takımlarımız ile iletişim kurup onlardan yardım isteyebilirsiniz().
Programın en önemli kazanımlarından biri olan sahibi FRC takımlarımız sizlere yardımcı olacaktır.
Tüm takım kayıtları sitesi üzerinden yapılmaktadır. Takım kaydı ile ilgili örnek kılavuza ulaşabilirsiniz.
Takımların bölge seçiminde tercih ağırlıklı sistem kullanılmaktadır. Bu sistem ile ilgili tüm detaylara ulaşabilirsiniz.
Bölge seçimi ile ilgili sık sorulan sorular kılavuzuna erişebilirsiniz.
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.
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.
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.
Ç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.
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.
Tüm Kullanıcılar'ı seçerseniz, görünen güvenlik istemini kabul etmeniz gerekir.
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.
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.
Ç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ı
Ç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.
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.
Windows kurulumunuz için uygun yükleyiciyi (32 bit veya 64 bit) indirin.
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.
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).
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 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.
Bu konu ile ilgili en önemli bağlantı muhtemelen 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.
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.
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ı, 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.
Hareket Yönü
Sol Ön
Sağ Ön
Sol Arka
Sağ Arka
İleri
İleri
İleri
İleri
İleri
Geri
Geri
Geri
Geri
Geri
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
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 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
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
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.
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.
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.
Solenoid'e genel bakış
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.
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:
Jaguar hız kontrolörleri
CAN-Talon hız kontrolörleri
Güç Dağıtım Panosu (PDP)
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.
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:
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.
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.
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:
SetMode () yöntemini kullanarak istenen modu ayarlayın
Doğru ayar modu yönteminde P, I ve D sabitlerini sağlayın
Operasyon için uygun bir sensör sağlayın
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.
Çı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ü, 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.
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.
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.
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.
C ++ ve Java WPILib'in mevcut sürümleriyle çalışmak için PDP için CAN ID 0 olmalıdır.
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.
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.
Java'da roboRIO'ya bağlı nesneler oluşturma
Genellikle roboRİO breakout panolarından(Türkiye'de bilinen adıyla roborio üzerindeki pin girişleri) birine bağlanan WPILib'deki tüm nesneler, bağlandığı kanal veya bağlantı noktası numarasını belirttiğiniz yerde oluşturulduğunda oluşturucuda bir argümana sahiptir. Yukarıdaki örnek Java için WPILib kullanılan kuralları göstermektedir.
Analog kanal 1'e bağlı bir AnalogGyro nesnesi oluşturur ve adresini "headingGyro" içine kaydeder.
Geçerli pozisyonu AnalogGyro'dan derece olarak alır ve değişken "heading" içinde saklar.
Genel olarak Driver Station PC'sine USB üzerinden bağlanan nesneler, bağlandıkları USB portunu belirten tek bir argüman alırlar. FRC Driver Station ile çalışan herhangi bir joystick veya gamepad ile arabirim kurmak için gereken işlevselliği sağlayan tek bir Joystick sınıfı sağlanmıştır.
DS'deki USB bağlantı noktasına 1'e bağlı bir Joystick nesnesi oluşturur.
Joystick'in geçerli X ekseni değerini alır ve "speed" değişkeninde saklar.
Aşağıdaki kod asla döngüden çıkamayacaktır! Tüm JVM durduğunda duracaktır. Thread tek başına çıkmadığı sürece thread'ı durdurmak için hiçbir yol yoktur. Bu problemi yaşayan takımlar genelde otonom içerisinde bu hatayı yapmaktadırlar. Bu da maç esnasında otonom bittikten sonra teleop kodlarını asla kullanamayacağınız anlamına gelmektedir.
Kötü Örnek:
Bir flag ayarlayarak bu sorunu çözebiliriz. Java'da her thread için tasarlanmış bir flag vardır. Bu flag'ı kontrol etmek için kodumuzu değiştirmemiz gerek. Bu örneğe bir göz atın:
Base class
Application
SampleRobot
SampleRobot base class'ı kulağa hoş geliyor, küçük örnek programlar yazmak için iyi, özellikle fikirleri denemek için. Bir yarışma programı oluşturmak için kullanılabilir olsa da, ek yetenekler eklendikçe genişletilmesi çok zor olduğu için tavsiye edilmez. Bunun yerine, aşağıda açıklanan diğer şablonlardan birini seçebilirsiniz.
IterativeRobot
IterativeRobot base class, yeni veriler sürücü istasyonundan geldiğinde her zaman periyodik olarak çağrılan yöntemlere sahiptir. Fikir, robotun (özerk, teleop veya test) çalıştığı her mod için, programın az miktarda iş yaptığı uygun periyodik yöntem denir. Döngüler veya gecikmeler gibi periyodik yöntemlerde uzun süre çalışan bir kod bulundurmamak önemlidir. Bunu yapmak, robot performansını olumsuz yönde etkileyebilecek eksik sürücü istasyonu güncellemelerine neden olabilir. Her periyot yaklaşık olarak 20 milisaniye olup, roboRİO, Driver Station bilgisayarı veya ağ trafiği üzerindeki CPU yüküne bağlı olarak değişebilir. Eğer hassas zamanlama gerekiyorsa, örneğin robot kontrol algoritmaları uygulamak için tavsiye edilmez. bunun yerine TimedRobot (aşağıda) kullanabilirsiniz.
TimedRobot
TimedRobot, periyodik yöntemlerin öngörülebilir bir zaman aralığında çağrıldığını garanti etmek için bir timer (Notifier) kullanması dışında IterativeRobot ile aynıdır. Joystick değerleri gibi sürücü istasyonu verilerini alırken, zaman aralığı 20 milisaniye veri dağıtımı ile gecikme yaşamayacağı için en iyi performans sağlanacaktır. Bu, çoğu robot programı için önerilen temel sınıftır. Tıpkı IterativeRobot gibi, periyodik yöntemlerde uzun süre çalışan kod veya döngülere sahip olmak çok önemlidir.
Command based robot
TimedRobot temel sınıfına dayanırken, çoğu takım için Command bassed robot programlama stili önerilir. Program üzerinde bir kolun bir yere yükseltilmesi, bir mesafe sürmesi vb. gibi bazı robot davranışlarını uygulayan komutlara ayırmayı kolaylaştırır. Ayrıca programı kolayca genişletilebilir ve test edilebilir hale getirir. RobotBuilder programı (eclipse eklentileri ile birlikte) programı organize etmek için kolay bir yol sağlar. Dashboard'lar (SmartDashboard ve Shuffleboard) kolayca hata ayıklama ve komut tabanlı programları test etmek için izin verir.
C++
Java
Iterative Robot, en yaygın kod yapısına, robot kodunun yerine taban sınıfında durum geçişlerini ve döngülerini ele alarak destekler.
TimedRobot temel sınıfı, belirtilen zaman aralığını kullanarak periyodik işlevleri çağırması dışında IterativeRobot (yukarıdaki) ile aynıdır. Her bir çağrı için uygun periyodik fonksiyona varsayılan zaman aralığı 0.02 saniyedir (20 milisaniye). Varsayılan süre dahili setPeriod (java) veya SetPeriod (C ++) değeri saniye cinsinden çift değer olarak çağrılarak geçersiz kılınabilir. Dahili olarak bir Notifier, aralığı ayarlamak için kullanılır.
C++
Java
SampleRobot , durum akışının çoğunun doğrudan programınızda göründüğü ve WPILib kodunda gizlenmediği en basit şablondur. Olumsuz yanı, bu durum akışının yanlış uygulanması, programlarınızda karmaşıklığa neden olabilir. Yeni başlayanların Iterative Template veya Command Based robotunu seçmeleri önerilir.
Kesinlikle bir temel sınıf olmasa da, Command-Based robot modeli, daha kolay genişletilebilen daha büyük programları oluşturmak için bir yöntemdir. Robotunuzu tasarlamayı, alt sistemleri oluşturma ve robot ile operatör arayüzü arasındaki etkileşimleri kontrol etmeyi kolaylaştıran bir dizi sınıfla desteklenmiştir. Ayrıca, otonom programlar yazmak için basit bir mekanizma sağlar.
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.
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.
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 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 oluşturma adımları burada ana hatlarıyla belirtilmiştir:
Oluşturmak istediğiniz projenin türünü seçin. Örnek bir proje veya WPILib tarafından sağlanan şablon projelerden biri olabilir.
Projeniz için kullandığınız dili seçin.
Bir şablonda - şablon tipini seçin (Zamanlı robot, İteratif robot, Komut robotu, vb.)
Projenin yerleştirileceği klasörü seçin.
"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.
son olarak, "Generate Projectr" i tıklayın ve VS Kodu projeyi belirtilen yerde oluşturacaktır.
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 ++ 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 projesini oluşturmak için şunlardan birini yapın:
Komut Paletini açın ve "Robot Kodu Oluştur" u seçin.
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.
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 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.
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.
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ş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).
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.
Ç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.
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, 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.
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.
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,
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,
Eşzamanlılık ve threads hakkında daha fazla bilgi için Oracle tarafından yayınlanan bakın. Aşağıda açıklanamayan hatalara neden olacak WPILib'de yazılan robot programları için önemli bilgiler bulacaksınız.
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.
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.
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.
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.
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, 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.
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.
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.
Ç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.
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.
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.
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.
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 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.
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.
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.
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.
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 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, 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).
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.
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 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:
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.
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.
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, 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.
Counter nesneler, bir dijital giriş sinyali veya bir analog tetikleyiciden gelen girdileri sayabilen son derece esnek öğelerdir.
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.
"Normal mod" / İki Darbe modu - 2 bağımsız kaynaktan kenarları sayabilir (1 yukarı, 1 aşağı)
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.
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.
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.
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.
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.
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.
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)
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,
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.
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.
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.
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)
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.
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.
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:
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.
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.
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.
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.
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:
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.
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.
Accumulator Deadband - Akümülatörün sampleyi 0 olarak ele alacağı merkez noktası çevresindeki ölü değer.
Accumulator Reset - Akümülatörün değerini Başlangıç Değerine sıfırlar (varsayılan olarak 0'dır).
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;
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.
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.
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.
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 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.
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.
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.
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).
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.
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:
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
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.
Raspberry Pi İle Pixy Kullanımı içeriğinde sağladığı kaynaklar için #6025 Adroit Anroids takımına teşekkürler!
İş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.
Pixy Modülün Kullanımı ve Ayarları
Wiki sayfasında PixyMon adlı programı işletim sisteminize uyumlu linkten indirin.
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.
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.
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.
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.
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.
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.
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.
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.
Limelight'ınızı monte etmek için nylock somunlarıyla birlikte dört adet 1/4 ”10-32 vida kullanın.
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.
Windows7 kullanmayın.
Güç kaynağınızdan çıkarın.
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
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)
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.
Ş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.
Bunları import etmeyi unutmayın :
Labview:
C++
Python
Java Hedef Hizalama
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.
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.
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.
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.
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.
Click "Next"
Click "Next"
Un-check the box, then click "Next"
Click "Next"
Check "I accept..." then Click "Next"
Check "I accept..." then Click "Next"
If you see this screen, Click "Next"
If you see this screen, click "Next"
Click "Next"
Overall installation progress will be tracked in this window
Each product installed will also create an individual progress window like the one shown above.
Click "Next"
If internet access is available and you are ready to activate, click "Next"; otherwise uncheck the "Run License Manager..." and click "Next".
Log into your ni.com account. If you don't have an account, select 'Create account' to create a free account.
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".
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”.
Click "Close".
Select "Yes"
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).
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.
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.
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.
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).
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.
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.
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.
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ı (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.
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.
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
Görüntü işleme için görüntüleri OpenCV "Mat" nesnelerine dönüştürün
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 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.
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:
Sınırların etrafında sınırlayıcı dikdörtgenler çizmek için boundingRect yöntemini kullanın
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.
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 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:
Bunun yerine instead kullanmayı deneyin
Çeşitli mesafelerde ölçüm yapın ve bir lookup tablosu veya regresyon fonksiyonu oluşturun
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!)
İçerik için Imperium #6874 takımına teşekkür ederiz.
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
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.
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.
Yaşadıkları problemleri ve çözümleri bizlere aktaran #6038 ITOBOT takımına ve #6025 Adroit Anroids takımına teşekkürler!
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.
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.
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.
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!
Bu kısmı buradan daha detaylı bir şekilde izleyebilirsiniz:
Co-Processor olarak Raspberry PI kullanacağız.
Ö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.
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:
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.
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 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.
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.
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.
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.
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, 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.
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:
Elle, komut üzerindeki start () yöntemini çağırarak (otonom olarak kullanılır)
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).
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.
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.
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.
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.
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.
Proje isminizi kutuya yazıp Command-Based Robot için radyo düğmesini seçin.
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.
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.
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 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.
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.
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ı 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.
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.
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.
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.
Bu örnekte, bilek eklemi için bir PIDSubsystem'in temel öğelerini görebilirsiniz:
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.
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:
Bu örnek, robotun tank tahriklerini kullanarak joysticklerin sağladığı değerlerle sürecek basit bir komutu göstermektedir.
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.
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.
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.
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.
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.
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.
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.
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.
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:
Kapmak için hazırlayın (asansör, bilek ve kavrayıcıyı yerine hareket ettirin)
Sodayı tutabilirsiniz.
Ultrasonik telemetre ile gösterilen tablodan bir mesafeye kadar sürün
Sodayı bırakın
Uzaklık mesafesinden bir mesafeye geri dönüş
Tutucuyu yeniden yerleştirmek
Bu görevleri yapmak için, bu örnekte gösterildiği gibi sırayla yürütülen 6 komut grubu vardır.
SodaDelivery komutunu otonom program olarak çalıştırmak için
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.
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.
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.
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:
Başlatma: eylemin gerçekleştirilmesini hazırlar.
Durum: her şey yolunda iken döngü devam ediyor.
Yürütme: koşulu yanlış yapmak için kodu tekrar tekrar günceller.
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.
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.
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.
Spin up shooter komutu, Aim komutuna çok benziyor, aynı temel fikir.
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.
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.
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.
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.
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.
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.
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.
Ping-Response (ex. , )
Analog (ex. )
I2C (ex. )
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 : )
Pixy wiki sayfasını açın >>
Signature 1 kısmından uygun görünümü yakalayana kadar değerleri değiştirin.
En güncel flash aracını ve image 'ndan indirin.
Bonjour'u adresinden yükleyin
Either locate and insert the LabVIEW DVD or download the LabVIEW 2018 installer from
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.
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.
Ş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:
OpenCV kullanarak perspektif bozulmasını düzeltin. Bunu yapmak için kameranızı OpenCV ile burada açıklandığı şekilde kalibre etmeniz gerekecektir: 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).
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.
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.
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.
Dilerseniz bu kodlara ulaşabilirsiniz. Github üzerinden kolayca wget komutu ile indirebilirsiniz.
wget
En prestijli FIRST® ödülü. Diğer takımlara örnek olan ve FIRST ruhunu en iyi yansıtan takıma verilir.
Bu ödül sadece rookie takımlardan birine verilebilir. Öğrencileri bilim ve teknoloji
alanında en çok ilhamlandıran takıma verilir.
Robot Performansında kazanan ittifak.
Bir rookie takımın okullarında ve çevrelerinde mühendislik alanında yarattıkları başarı ve ilham için verilir.
Takımın okulunda ve çevresinde mühendislik alanında yarattığı başarı ve ilham için verilir.
Diğer takımlarla ve çevreleriyle ilişkileri FIRST’in çekirdek değerlerini en iyi temsil eden takıma verilir.
Takım hedeflerini gerçekleştirebilmek için girişimcilik ruhunu gösteren ve en iyi iş çerçevesini hazırlayan takıma verilir.
tasarım, bileşen kullanımı veya oyun stratejisi yaratıcılığını en iyi yansıtan takıma verilir.
Yarışma süresince, takımın benzersiz çabaları, performansı ve dinamiğini en iyi yansıtan takıma verilir.
Olağandışı tasarıma ve kullanılabilirliğe sahip robota verilir.
Konsept ve makine sağlamlığını en iyi sağlayan takıma verilir.
Finalist İttifak
Karşılaşmalar sonucunda en yüksek puana sahip rookie takıma verilir.
Bu ödül verimli bir şekilde tasarlanmış robot ve oyun görevlerini etkili bir şekilde yerine getiren takıma verilir.
İnovatif yöntemler kullanarak sıradan güvenlik önlemlerini aşan ve tehlikelere karşı önlem alan takımlara verilir.
Elektronik, mekanik ya da yazılımsal açıdan yenilikçi bir control sistemi ya da parçaları yapan ve kullanan takımlara verilir.
Sıradışı ve coşkulu takım dinaminiğine ve takım çalışmasına sahip takıma verilir.
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.
İyi iletişim teknikleri kullanarak takımına liderlik eden, geliştiren, öğreten ve ilham veren en iyi mentora verilir.
Takımın güvenlik odağını göstermek için çekilen kısa animasyonlardan en iyisine verilir.
Gracious professionalism ile ilgili en iyi kısa animasyonu yapan takıma verilir.
Harcadığı eforla ve ürettiği sonuçlarla öne çıkan gönüllüye verilir.
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.
Bu içeriğin oluşumuna katkı sağladığı için Istanbulls 6064 takımına teşekkür ederiz.
Bu içeriğe destek sağladığı için 6025 Adroit Androids takımına teşekkür ederiz.
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)
1/16" Hex anahtarı
Tel kesiciler, sıyırıcılar ve kıvırıcılar
7/16” kutu uç anahtarı
Bileşenleri tahtaya yerleştirin. Çalışması gereken bir düzen, yukarıdaki görüntülerde gösterilmektedir.
Ç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.
Dikkat: Batarya Konektörüne bağlı olan kablolar 6AWG olmalıdır.
Terminal pabuçları batarya konnektörüne takın.
1/16 "Alyan anahtarı kullanarak, PDP terminal kapağını sabitleyen iki vidayı sökün.
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.
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.
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.
Terminali kırmızı 6AWG kablosunun 2. ucuna kesin, bantlayın ve kıvırın.
7/16 "kutu ucunu kullanarak, kabloyu 120A ana şalterin " AUX "tarafına sabitleyin.
5 mm'yi kullanarak diğer ucunu PDP pozitif terminaline sabitleyin.
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.
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.
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 :
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.
Her bir telin bir ucunu soyun, sonra Wago terminallerine yerleştirin.
Her kablonun diğer ucunu soyun ve bir halka veya çatal terminaline sıkıştırın.
Terminali motor sürücü giriş terminallerine takın (kırmızı ila +, siyah - -)
Pwm kablosu entegreli motor sürücüler için(2. resim) :
Kırmızı ve siyah güç giriş tellerini kesin ve bantlayın, ardından 40A Wago terminal çiftlerinden birine takın.
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.
Gerektirir: 10A / 20A mini sigortalar, Kablo soyucu, çok küçük düz tornavida, 18AWG Kırmızı ve Siyah
PDP'deki 10A ve 20A mini sigortaları, yukarıdaki resimde gösterilen yerlerde takın.
Hem kırmızı hem de siyah 18AWG kablosuna ~ 5/16 "takın ve PDB üzerindeki" Vbat Controller PWR "terminallerine bağlayın.
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.
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.
Requires: Kablo soyucu, küçük düz uçlu tornavida(isteğe bağlı), 18AWG kırmızı ve siyah kablo
Kırmızı ve siyah 18 AWG kablosunun ucunu soyun.
Kabloyu, PDP üzerindeki "Vbat VRM PCM PWR" etiketli iki terminal çiftinden birine bağlayın.
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.
Telin ucundan ~ 5/16 "kesin ve soyun.
Kabloyu VRM 12Vin terminallerine bağlayın.
Gerektirir: Kablo soyucu, küçük düz tornavida (isteğe bağlı), 18AWG kırmızı ve siyah kablo
Kırmızı ve siyah 18 AWG kablosunun ucunu soyun.
Kabloyu, PDP üzerindeki "Vbat VRM PCM PWR" etiketli iki terminal çiftinden birine bağlayın.
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.
Telin ucundan ~ 5/16 "kesin ve soyun.
Kabloyu VRM 12Vin terminallerine bağlayın.
Gerekenler: Küçük düz tornavida (isteğe bağlı), Rev kablosuz PoE kablosu
PoE kablosunun yüksüklerini VRM'nin 12V / 2A bölümündeki ilgili renkli terminallere takın.
Kablonun ethernet ucunu, güç konektörüne en yakın Ethernet portuna (18-24v POE etiketli) bağlayın.
Gerektirir : Ethernet Kablosu
Rev Passive POE kablosunun dişi RJ45 (Ethernet) portundan bir Ethernet kablosunu, roboRIO üzerindeki RJ45 (Ethernet) portuna bağlayın.
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
Seçenek 1 (Doğrudan bağlantı):
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 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.
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.
Gerektirir: Kablo soyucu, 2 pin kablo, Robot Sinyal Işığı, 18AWG kırmızı kablo, çok küçük düz tornavida
Siyah kabloyu merkeze, "N" terminaline takın ve terminali sıkın.
18AWG kırmızı kabloyu soyun ve "La" terminaline takın ve terminali sıkın.
"Lb" terminaline takmak için 18AWG kablosunun diğer ucunu kesin ve soyun
Kırmızı kabloyu iki pin kablosundan 18AWG kırmızı kablo ile "Lb" terminaline takın ve terminali sıkı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.
RSL'yi robot inşa edildiğinde daha görünür bir yere taşımanız önerilir
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.
Her bir CIM motoru için:
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:
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:
Victor SP'den gelen beyaz ve yeşil kabloları bantlayın
Motor kablolarını Victor SP çıkış kablolarına bağlayın (kırmızı kabloyu beyaz M + çıkışına bağlamanız önerilir).
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.
Bu içeriğin gelişmesine katkı sağladığı için 6064 Istanbulls takımına teşekkür ederiz.
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.
buradan takımların geçmiş yıllara ait iş planlarını bulabilirsiniz.
Veteran yıllarına ait iş planları
Rookie yıllarına ait iş planları
Kullanılması ZORUNLU DEĞİLDİR
. Ücetsiz bir çok şase tasarımını da internet üzerinde bulabilir, yada kendi tasarımlarınızı yapabilirsiniz.
Altyazı çevirisi için 'a teşekkür ederiz.
[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:
[ENG] FRC Robot tasarımları, mühendislik defterleri ve juri kitapçıkları bulunduran bir sitedir.
[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.
Sneaky Sneakes 7285 2020 Infinite Recharge robot yazılımına kısmından ulaşabilirsiniz.
[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.
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.
Not: İçerikler yetkili kişiler tarafından incelendikten sonra yayına alınacaktır.
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.
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.
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.