12.1. Neden bir protokol kütüphanesi¶
Bir kameradan ana bilgisayara bayt taşımak için bir çift kablo ve bir baud hızı yeterlidir. USB-CDC ve UART, kamera programına write ile bir uçtan bayt koyup read ile diğer uçtan aldığınız bir akış sağlar. Peki bir protokol kütüphanesi bunun üzerine ne ekler?
Ham baytlar üzerine doğrudan ciddi bir kamera-ana bilgisayar kanalı kurmaya çalışırsanız, her seferinde kendiniz yazmak zorunda kalacağınız üç şey:
Çerçeveleme. Bir bayt akışının doğal bir yapısı yoktur. Kamera temp=42 yazar ve ana bilgisayar önce temp= okur, ardından araya bir kesme girer, sonra 42 gelir ve onunla birlikte humid=... ile başlayan bir sonraki mesaj da içine karışmış halde gelir. Baytların sınırları yoktur. Önemsiz olmayan her ana bilgisayar bağlantısı, alıcının bir mesajın nerede bitip diğerinin nerede başladığını bilmesi için sonunda bir işaretçi icat etmek zorunda kalır – mesajlar arasında \n, uzunluk önekli başlıklar, ikili yükler için kaçış dizileri gibi. Protokol kütüphanesi size bir senkronizasyon sözcüğü ve bir uzunluk alanı olan tek tip bir paket biçimi verir ve alıcının asla tahmin etmesi gerekmez.
Güvenilirlik. USB-CDC normal çalışmada baytları sessizce düşürmez, ancak UART düşürür (ana bilgisayar bağlantı noktasını yeterince hızlı işleyemediğinde) ve bir seri kablonun çıkarılıp yeniden takılması bir tarafta yarım bir paket bırakabilir. Yapılması gereken doğru şey, bozulmayı tespit etmek, diğer taraftan yeniden iletim istemek ve uygulama koduna yalnızca sağlam ulaşan mesajları teslim etmektir. Protokol kütüphanesi bunu her paket için bir CRC ve paket başına onaylarla yapar – varsayılan olarak açıktır; uygulama yeniden denemeleri görmez.
Çoğullama. Kamera ile ana bilgisayar arasında tam olarak bir USB-CDC bağlantı noktası vardır. Kamera bir görüntü akışı sağlıyorsa ve ana bilgisayar ona yapılandırma gönderiyorsa ve IDE print çıktısı için stdout okuyorsa, bu üç alışverişin de tek bir bayt akışını paylaşması gerekir. Protokol kütüphanesi her bağımsız akışa bir kanal numarası verir, kameranın her biri için bir Python sınıfı kaydetmesine olanak tanır ve ana bilgisayarın her kanaldaki okumalarının diğerlerini etkilemesini önler. Uygulama kodu açısından her kanal kendine özel bir bağlantı gibi görünür.
12.1.1. Bunu neden kendiniz yazmıyorsunuz¶
Yazabilirsiniz. Bir seri hat üzerinde her üçünü de doğru hale getirmek birkaç haftalık iştir; ardından çerçevelemenin sıcak takma kurtarmasını temiz bir şekilde ele almasını, yeniden iletimlerin gidiş-dönüşlerde enerji harcamadan çalışmasını ve çoğullayıcının bir kanalın baytlarını başka birininkine bozmadan kısmi okumalardan sağ çıkmasını sağlamak için birkaç hafta daha gerekir.
Protokol kütüphanesi bu işi çoktan yaptı, desteklenen her kamerada doğrulandı ve ana bilgisayar tarafında aynı kablo biçimini konuşan eşleşen kütüphanelere sahip. Onu kullanmak, kamera tarafındaki kodun kanal başına küçük bir sınıf, ana bilgisayar tarafındaki kodun ise channel_read ve channel_write yöntemlerine sahip bir Camera nesnesi olması anlamına gelir. Kazanılan zihinsel alan, uygulamanın gerçekte yaptığı her neyse ona ayrılır.
Bu bölüm protokolü temelden öğretir: kablo biçimi, çerçeveleme kuralları, güvenilirlik mekanizması, kanal modeli ve son olarak her iki uçtaki Python sınıfları. Bölümün sonunda okuyucu, kamerayla konuşan bir ana bilgisayar GUI’si, kameradan dizüstü bilgisayara sensör verisi akıtan bir betik ve openmv-projects/tools/ içinde gelen türden etkileşimli bir kalibrasyon aracı oluşturabilir.