ROS2 Robot Framework
Öncelikle bu yazıya başlamadan önce, robot framework’ün ne olduğunu anlatmak gerekiyor, çünkü ROS ekosisteminde robot dediğimizde (bende dahil) herkesin aklına fiziksel gerçek robotlar geliyor. Ancak robot framework’teki robotun nedeni bir şeyleri otomatize etmek, sizin yerinize yapmasını sağladığı için verilmiş bir isim. Robot framework aslında kabul testlerini ve bazı processleri otonom hale getirmek için geliştirilmiş bir ortam yazılımı. Yani bu yazılım ile geliştirdiğiniz web uygulamalarını, mobil uygulamaları hatta embedded uygulamaları bile test edebilirsiniz. Farklı işlemler için komüniteler tarafından geliştirilmiş bir çok farklı hazır kullanılabilir library var.
Daha önce geliştirdiğim ROS2 projelerinde ve paketlerde her zaman ortaya şu soru çıkıyordu, “Bu paketi nasıl test edeceğiz?” ROS projelerinde sadece unit test yazmak proje için yeterli olmuyor çünkü paketler ne kadar fonksiyonlarla test ediliyor da olsa, ortamdaki sensör noiselerinden dolayı her zaman sonuçlar gerçek hayatla tutarlı olmuyor. Zaten bu yüzden projeleri gerçek hayatta test etmeden önce simülasyonlar kullanıyoruz (gazebo, webots etc).
Diğer taraftan ROS paketleri izole çalışmıyorlar, aslında bunu microservis architecture’ına benzetebiliriz, yani monolitik bir projeye sahip olmuyorsunuz. Bir localizasyon paketiniz bir navigasyon paketiniz, hardware’lar ile iletişime geçecek başka bir paket vs. Her paketin fonksiyonlarının unit testler ile test edilmesi kesinlikle gerekli ve doğru bir yaklaşım olduğunu düşünüyorum. Ancak bazı durumlarda bunun yeterli olmadığını da biliyorum. Örneğin localizasyon paketinde değiştirdiğiniz bir parametre belki de unit testler tarafından kabul edilecektir. Ancak bu gerçek hayatta robotunuzun tamamen farklı bir davranışına neden olacaktır. Bunun için de CI testleri arasında simülasyon çalıştırılarak sonuçların ölçülmesi ve görevlerin tamamlanması için belirli testler yazılır. Ancak bu testleri daha hızlı, verimli, ve dinamik hale getirmek aslında çok da zor değil.
Robot framework aslında bu iş için geliştirilmiş bir araç. Projelerinizi test etmek veya bazı görevleri otomatikleştirmek istiyorsanız aradığınız tool olabilir. Basitçe .robot uzantılı test ya da task dosyaları oluşturabilir ve bu işlemleri robot framework ile çalıştırıp metrikleri ölçebilirsiniz. Şunu sorduğunuzu duyar gibiyim, “Bir başka dependency’e ne gerek var, bir de bunu mu maintain etmekle uğraşacağız?”. Eğer hiç acceptance testiniz yoksa veya test etmek istemiyorsanız tabii gerek yok :) Ayrıca bunun yerine kullanacağınız in-house geliştirilmiş test projelerine bakım oranınız çok daha yüksek olacak. Bir başka nokta ise burada geliştireceğiniz testler keyword driven olduğu için oluşturmak ya da testleri değiştirmek de bir o kadar kolay olması.
Peki bu robot framework nasıl çalışıyor. Basitçe ros2_robotframework size bir çok farklı fonksiyonu hazır olarak sağlıyor. Sizin yapmanız gereken neleri test etmek istediğinize karar vermek. Örneğin bir action service call’u ile robotunuza navigasyon komutu gönderip belirli bir timeout ile o noktaya varıp varmadığını kontrol edebilirsiniz. Ya da bir launch dosyasını başlatıp servis oluşana kadar bekleyip sonra servisi çağırıp sonucu kontrol edebilirsiniz. Launch dosyanızda simülasyonu başlatıp robotun açılmasını bekleyip sonra farklı konumlarda biraz hareket ettikten sonra robotun konumunu, gerçek konumla kıyaslayıp ne kadarlık bir hata olduğunu raporlayabilirsiniz. Bu gibi testleri oluşturmak robot framework ile oluşturmak gerçekten çok kolay.
Değinmek istediğim bir başka nokta ise robot framework sadece test için değil aynı zamanda bazı işlemleri otomatik hale getirmek için de çok verimli. Örneğin bir localizasyon projesi geliştiriyorsunuz, değişikliklerden sonra her seferinde simülasyonu çalıştırıp, robotu farklı konumlara gönderip konumu kıyaslıyorsunuz. İşte bu iş için de ros2_robotframework tam anlamıyla uygun bir tool. Sadece bir satırlık komut satırı ile bunların hepsini sizin için otomatik hale getiriyor. Zaten robot framework bu amaçlar için bir çok farklı kütüphaneye sahip.

