Bileşen Tabanlı Robotik Mühendisliği

Temel bir robot sisteminde; güç beslemesi, motor, tekerlekler, entegre, birkaç sensor vs. vardır. Robotik araştırmalarda, robotik işlevlerin, tek başına donanımla değil; donanımlar üzerinde bilgi işleyen yazılımlarla ilerleyebileceği gayet açıktır. Örneğin; ışık takip eden bir robot üzerinde bulunan optik bir sensorün, donanımsal yeti olarak sadece ışığı takip etmesi değil de, belki yazılımsal yetenekler de eklenerek, ışık kaynağının işaretleyici bir lazer mi(nesne takibi sağlayan sistem) yoksa normal bir ışık kaynağı mı olduğunu anlaması sağlanabilir.

            Türkiye, ne çizgi takip eden ne de ışık takip eden robotçuklarla oyalanarak, robot teknolojisinde bir yerlere gelemez. Peki ne işe yarar çizgi takip eden oyuncaklar? Nerede kullanabiliriz? Biz neredeyiz? Dünya bu alanda neler yapıyor?

Sıfırdan bir robot geliştirmek, (çizgi izleyen dahi olsa) bir insan ömrünün yetmeyeceği pahalı bir süreçtir. Bundan dolayı bilgi birikimi ve paylaşımı önem kazanıyor. Elde edilenlerle yetinilmemeli, yeni robot trendleri takip edilmeli, hedefler büyük tutulmalıdır. Üretilmiş çözümler incelenmeli, varolanların üzerine daha etkin bileşenler geliştirilmeli ve ulusal bilgi birikimi oluşturulmalıdır.

Temel bir robot sisteminde; güç beslemesi, motor, tekerlekler, entegre, birkaç sensor vs. vardır. Robotik araştırmalarda, robotik işlevlerin, tek başına donanımla değil; donanımlar üzerinde bilgi işleyen yazılımlarla ilerleyebileceği gayet açıktır. Örneğin; ışık takip eden bir robot üzerinde bulunan optik bir sensorün, donanımsal yeti olarak sadece ışığı takip etmesi değil de, belki yazılımsal yetenekler de eklenerek, ışık kaynağının işaretleyici bir lazer mi(nesne takibi sağlayan sistem) yoksa normal bir ışık kaynağı mı olduğunu anlaması sağlanabilir.

Bütün donanımların genelde Çin’de üretildiği göz önünde bulundurulursa  kullanımının ise sadece donanımla ilgili veri sayfalarını okumaktan ibaret olduğu düşünülürse, donanımla çok karmaşık işlerin yapılamayacağı kolaylıkla anlaşılabilir. Örneğin, fotoğraf makinelerine; kırmızı göz yok etme, gülen yüz algılaması, titreşimden kaynaklanan kaymaların azaltılması gibi özellikler kazandırılamaz. Dolayısıyla yazılımda, tek sınırımız hayal gücümüzdür ve karmaşık robot sistemleri ancak ve ancak güçlü yazılım sistemleri ile oluşturulabilir. Robotik alanında, Türkiye’nin geri kalmışlığının en büyük sebebi; yazılıma gereken önemi vermeyip, temel donanım seviyesinde kalınmasıdır.

Donanım alanında, Çin’in hâkimiyeti bütün dünya tarafından kabul edilmiş durumdadır. Yazılımın gerek yeşil teknoloji olmasından, gerekse Türkiye’deki genç nüfusun yoğunluğunun avantajı açısından, Türkiye yazılım sayesinde üreten ülke haline gelebilir. Robotik yazılımlarında ilk adım, hali hazırda geliştirilmiş olan açık kaynaklı yazılımları en ince ayrıntısına kadar incelenmek, işlevlerin nasıl gerçekleştiği üzerine kafa yormaktır. Açık kaynaklı robotik işlevlerin projelere entegre edilebilmesi için yeniden kullanılabilir parçalar çok önemlidir.

Bu yazımız ise, yazılım mühendisliği kavramlarını, robotik bileşenler tasarlanmasında nasıl kullanabiliriz sorusu üzerine olacaktır.

Çoğu robotik işlevleri gerçekleştiren bileşenler yeniden kullanılabilir şekilde tasarlanmalıdır. Geliştiriciyi, sıfırdan bileşen geliştirme zahmetinden kurtarır ve geliştiricinin farklı sistemlere adaptasyonunu kolaylaştırır. Bundan dolayı, robotik sistemlerde yeniden kullanılabilir bileşenler çok önemlidir.

Yeniden kullanılabilirlik iki şekilde gerçekleştirilebilir. Yöntemlerden biri olan opportunistic yöntemde, bileşenler içinden var olan probleme uyan alınıp, kullanılır. Bir diğer yöntem olan sistematik yöntemde ise, yeniden kullanılabilir bileşenler daha etkin hale getirilip kullanılır.

Yazılımda yeniden kullanılabilirlik kavramını incelemek gerekirse, 50 yıl önce COBOL derleyicisi kütüphane kavramını derlenmiş fonksiyonlardan oluşan kütüphane sistemi olarak oluşturmaya çalıştı. Derlenmiş işlevler, programa eklenerek yeniden kullanılabilirlik sağlanılmaya çalışılmıştı. Fakat, bu sadece sayısal analiz (karekök, matrix işlemleri) yapacak fonksiyonlarda sağlanabilmişti. Fortran ve C’nin gelişmesinden sonra, veri ve kod sarmalanamadığı için(çok biçimlilik[polymorphism] ve parametrelerin farklı olması), çoğu diğer alanlarda(GUI gibi) yeniden kullanılabilirlik sağlanamadı. Bu problemleri ortadan kaldırmak için sınıf yapısı ortaya çıktı. Bu yöntemin dezavantajı ise ata sınıf bilinmeden, çocuk sınıfların anlaşılamamasıydı. Bundan sonra, yazılım mühendisliğinde olduğu gibi bileşen tabanlı(Component Based) tasarımlara önem verilmeye başlandı. Yazılım sistemleri karmaşıklaştıkça, sistemlerin daha iyi anlaşılması için yazı ve grafiklerden oluşan OMG(Object Management Group) ve UML(Unified Modeling Language) gibi gösterim dilleri oluşmuştur. Bu diller yardımıyla da bileşen tanımları programlama dillerinden bağımsız(pseudo kodlardan bağımsız) olarak temsil edildi.

Şekil 1 : Claraty Mimarisi

Bir bileşen, herhangi bir robot sistemindeki bir işlevi gerçekleştiren yazılım parçacıklarıdır. Bileşenler, robot sistemindeki; veri akışını, durum bilgilerini ve kontrol aktivitelerini tanımlar. Claraty mimarisi bu konudaki güzel örneklerdendir. Kontrol mimarisi, karar ve işlevsel katman olmak üzere iki mimariye ayrılmıştır.

Her katmandaki bileşenler, yön bulma, hareket, duruş tahmini,  sensor işleme ve motor kontrol gibi farklı algoritmaları gerçekleştirirler. Robot fonksiyonların, bileşenlerle olan bağını iyi bir şekilde tanımlamak, kodun yeniden kullanımı açısından oldukça önemlidir. Bu açıdan, temel robot fonksiyonları içeren bileşenlerin, diğer projelerde de kullanılabilmesi gereklidir.

Robot yazılım bileşeninin kaliteleri; hesaplama performansına (bir video karesini işlemek için geçen süre), etkinlik ölçülerine (yol haritası oluşturmak için gerekli olan bellek miktarına) ve güvenirlik (herhangi bir sensörün gerekli zamanda bilgi dönebilmesi) gibi parametrelere bağlıdır. Açık kaynaklı yazılım topluluklarında, bu parametrelere bağlı olarak oluşturulmuş belirli test sonuçları mevcuttur. Performans bilgileri bu tür topluluklardan öğrenilebilir. Bileşenlerin, teknik olarak yeniden kullanılabilirliği ise, yazılım bileşenin platformlar arası entegre olabilme kabiliyetidir. Eğer yazılım bileşeninin yeterli belgelendirmesi yoksa ve bileşenin sisteme entegresi pahalıysa, bu durumda bileşenin yeniden kullanılması mümkün değildir. Bu gibi durumlarda en yaygın yapılan şey bileşeni yeni baştan kodlamaktır. Sistemdeki diğer bileşenlerle çalışabilirlik (interoperability); bileşenler veya bileşenlerden oluşan sistemler arasında veri transferinin sağlıklı bir biçimde yapılabilmesidir. Bu tip bileşenler; iyi tanımlanmış arayüzler, protokoller, veri iletişim formatları geliştirilerek tasarlanabilir.

İşlevsel özellikler açısından yeniden kullanılabilir bileşenler uygulama alanlarına göre 2 temel gruba ayrılabilir. Dikey ve yatay bileşenler. Yatay bileşenler geniş bir uygulama spektrumuna işlevsellik sağlar. Yatay bileşenler;  donanım aygıtlarına arabirim, hesaplama kütüphaneleri, iletişim servisleri, ve matematik fonksiyonlarının gerçekleştirimini sunar. Dikey bileşenler ise araştırma-geliştirme gruplarının kendilerine özel olmak üzere, hareket planlama, hedef saptama, hassas (deliberative) kontrol gibi konularda çözümler üretir. İşlevsel robot yazılımı bileşenlerini geliştirebilmek için robotik sistemlerinin nasıl çalıştığı konusunda iyi bir fikir sahibi olunması ve gelecek yıllardaki trendlerin iyi belirlenmesi gerekmektedir.Buradaki anahtar fikir ise; eğer en kaliteli ve en gerekli bileşenin işlevi geçersiz kalırsa, bu bileşen bir daha hiç kullanılmamalı. Eğer arabirim uyumsuzsa en kaliteli ve en gerekli bileşenler dahi kullanılamaz.

“Yazılım bileşeni, kesin hatlarla tanımlanmış arabirimleri olan, iyi tanımlanmış olarak dışa bağımlığı bulunan küme birimidir ve bu bileşen herhangi bir 3. Parti uygulamalar, kütüphaneler tarafından entegre edilebilir. ” Örneğin aşağıda robot path sınıfı UML ile gösterilmiştir.

Yol planlama kütüphanesinin yapısını inceleyelim. “shortest path – en kısa yol” nesnesi start ve end değişkenleri(dahili durum) ile engelsiz robot yolu tanımlayabilir, ayrıca başka nesneler tarafından çağrılabilecek appendPathLeg() (nesnenin arabirimi) gibi operasyonları gerçekleştirebilir, ve end değişkenini güncellemek için matematiksel operasyonları(davranışı) gerçekleştirebilir.

NYP 3 basit teknik sayesinde yeniden kullanılabilirliği destekler:

  • Ø Robot path sınıfı, configuration sınıfının nesnelerini içermektedir. NYP, bir sınıfın başka bir sınıftan oluşan nesneleri kullanmasını kompozisyon(composition) olarak tanımlar.
  • Ø Parametrik çokbiçimlilik (parametric polymorphism), her parametre tipine göre yeni bir sınıf yazmaya gerek kalmadan, bir sınıfın çok biçimli parametreleri desteklemesine olanak tanır. Örneğin, List koleksiyon sınıfı, parametre olarak ister int, ister double tutabilir. Robot path ise tasarımında, bu özellik sayesinde navigableLeg nesnelerini tutabilir
  • Ø Var olan ata sınıfların genişletilerek, sınıf değişkenleri ve fonksiyonların yeniden kullanımını kalıtım(inheritance) sağlar. Örneğin, UML gösteriminde, Segment sınıfı Geometric Curve sınıfını genişleterek (extend) curvilinear_x değişkenini yeniden kullanarak yeniden kullanılabilirliği sağlamıştır.

Ata sınıf anlaşılmadan, çocuk sınıfların anlaşılamamasından dolayı, bileşen tabanlı tasarım önem kazanmıştır. Bileşen tabanlı tasarımın en önemli özelliği, bileşen tanımı ile bileşen gerçekleştiriminin ayrı olmasıdır.

            Somut Bir Örnek

         Hareket planlama, engel kontrol, çevre örneklemleme ve yol belirleme(path planning) gibi algoritmalardan oluşan bir robot işlevidir. Bu işlevlerle ilgili birkaç açık kaynaklı yazılım mevcuttur.(bkz: MPKit-motion planning kit ve motion strategy library-MSL ) Avrupa ülkeleri yeniden kullanılabilir bileşenlerin geliştirilmesine BRICS programı ile destek veriyor. Bu çalışmalardan elde ettiğimiz bir örneği inceleyelim. Aşağıda Cartesian space(Kartezyen uzayı), configuration space(nesne uzayı), collision checker (engel kontrolü), path planner (yol planlayıcısı)gibi bileşenlerin mimarisi verilmiştir.

Cartesian Space(Kartezyen Uzayı) bileşeni, robotun fiziksel özellikleri ve çevresel özelliklerini tanımlamıştır. Bu bileşen etrafındaki nesnelerin şekillerini, koordinatlarını tutar ve nesneler arasındaki konumlarla ilgili hesaplamalar yapar.

Configuration Space(Nesne Uzayı) bileşeni, robotun nesnel özelliklerini tanımlar ve nesneler arasında uzaklık ölçümü, büyüklük küçüklük algılamalarını sağlar.

Collision Checker(Engel Kontrolu) bileşeni, Cartesian Space nesne girdisi olarak gelen ortamda, robot yolunun engelsiz olup olmadığını kontrol eder.

Path Planner(Yol Hesaplayıcısı) bileşeni, start ve end konfigürasyonları arasında yol hesaplar. Robotun takip edebileceği engelsiz ve sürekli bir yol planı çıkarır.

         Arabirim Özellikleri

       Bileşenin geniş çaplı yazılımlarda, başarılı bir parçacık olarak kullanılabilmesi bileşenin iyi bir şekilde tanımlanmasına bağlıdır. Bu kısımda arabirim tasarlama yöntemlerinden bahsedeceğiz.

İlk olarak, bir bileşen birden fazla arabirimi gerçekleştirebilir. Örneğin CollisionChecking arabirimi, farklı bileşenler tarafından, bileşenlerin görevlerine özel bir şekilde kullanılabilir.

Bir bileşen, bir ya da birden çok istemciye sağlanan servis arabirimlerinden ve çeşitli fonksiyonları gerçekleştirmek için ihtiyaç duyulan bağımlı arabirimlerden-interface dependency- oluşur. İstemciye sağlanan servis arabiriminden kasıt, bileşenin istemciye ya da diğer bileşenlere sunduğu işlevlerdir. Bağımlı arabirimden kasıt ise, bileşenin işlevlerini yerine getirebilmesi için ihtiyaç duyduğu alt birimlerdir. Örneğin; PathPlanner PathPlaning işlevini istemciye sunar. ConfiguraitonSampling ve CollisionChecking alt işlemlerine ihtiyaç duyar.

Bileşenler arasındaki veri iletişimi, kesin hatlarla tanımlanmış getter() ve setter() fonksiyonlarıyla gerçekleştirilir. Servis arabirimleri ise gerekli olan parametrelerin tanımlanmasıyla alakalıdır. Örneğin; CollisionChecking robot konfigürasyonu parametresini servis arabirimi olarak kullanır. Arabirimler parametre ve çıktı türlerine göre tam ve esnek parametre listeli arabirimler olarak tanımlanmıştır. Tam tanımlanmış parametre listeli arabirimler, girdi ve çıktı türlerini tam olarak tanımlar. Örneğin, ConfigurationSampling sınıfında bulunan sample() fonksiyonu Configuration türünde bir nesne döndürür. Bu nesne de, collisionChecking sınıfında bulunan checkCollision fonksiyonuna girdi parametresi olarak verilir. Bu tasarımın tersinde, özellikle servis arabirimlerinin parametre listelerindeki tür tanımları daha esnektir.

Örneğin; assert(), define(), query() gibi standart iletişim fonksiyonları XML gibi standart dillerle kullanılır. Her iki tasarımın da avantajları ve dezavantajları vardır. Tam tanımlanmış parametre listeli arabirimlerin dezavantajı yeniden kullanılabilirliği azaltmasıdır. Avantajı ise daha etkin bileşen gerçekleştirimine olanak sağlar. Esnek tanımlanmış parametre listeli arabirimlerin avantajı yeniden kullanılabilirliği artırmasıdır. Dezavantajı ise hatalara daha çok açık olup, geliştiricinin katkısına daha çok ihtiyaç duymasıdır.

Durumsal arabirimlerin çalışması sonucunda, arabirimin tanımlandığı nesnedeki bazı değişkenlerin durumu değişir ve arabirimlerden dönen değerler, değişen bu duruma göre hesaplanır. Örneğin; spaceBrowsing sınıfında bulunan getNextObstacle() arabirimi engel listesindeki bir sonraki engeli gösterir. Böylece sonuç, fonksiyonun çağrılma sayısına göre değişir. Zaten, istemci tipleri aynı olamayan engelleri alıp değerlendirir. Bundan dolayı bu arabirim durumsal olarak tanımlanır. Durum bağımsız arabirimler ise parametre olarak verilen girdilere göre sonuç üretir. Nesnedeki durum  değişikliğine bağlı olarak hesaplama değişikliği olmaz. Örneğin, getJoint(int robotID, int jointID) arabirimde parametrelerini aldığı nesnenin diğer durum bilgilerine ihtiyaç duymaz.

Bir arabirim istemci ile bileşen arasındaki bir anlaşma olarak tanımlanabilir. Bu anlaşma gereğince, arabirimin istemcinin beklediği ön koşullara ve protokolde belirtilen kurallara uyması gerekir.

         Bileşen Gerçekleştirimi

         Bir bileşenin farklı gerçekleştirimleri; çalışma karakterlerine göre (performans, bakım, dokümantasyon, güvenirlilik), verileri depolama yöntemine (geometrik uzayın XML kullanılarak veya resim formatında depolanması) ve hatta programlama dili şeklinde de farklılık gösterebilir.

Bileşenler gerçekleştirilirken, kullanılacak olan arabirimlerin tanımının literatüre uygun olması bileşenlerin esnekliğini arttırır. Dolayısıyla , bir kara kutu misali sistem entegrasyonu kolaylaşır.

Yeniden kullanılabilirlik, farklı gerçekleştirimlere sahip bileşenin, farklı gerçekleştirimlerdeki benzer özelliklerin tespit edilerek, yararlanılması sayesinde sağlanabilir. Özellikle “yatay bileşenler” de yeniden kullanılabilirlik, tanımlanan problem alanı dışında karşılaşılan girdiler karşısında da esneklik gösterebilmesine bağlıdır.

         Bileşen Uygulama Çatısı (Component Framework)

    Bileşen uygulama çatısı, daha özel bileşen tasarımı için kullanılacak temel değiştiriciler tarafından tanımlanan bileşenlerin genel gerçekleştirim kurallarıdır. Bileşen uygulama çatısı, nesne tabanlı programlama ile önem kazanmıştır. Uygulama çatısını tanımlanması ise çok geniş bir şekilde yapılabilir.

Beyaz -kutu, siyah-kutu olarak tanımlanan uygulama çatılarının farklı iki yaklaşımı tek bir çatı altında gerçekleştirilebilir. Uygulama çatılarını oluşturan sınıf kütüphaneleri tarafından sağlanan, değiştirilebilir beyaz kutu olarak tanımlanan ata sınıflara, gerekli olduğunda alt sınıfları da ekleyerek, uygulama çatısı geri kalanıyla entegre olabilir.  Her uygulama çatısının aslında bir gelişme süreci vardır. Bu gelişme sürecinde, özel uygulama alanlarından bağımsız olan temel mimariler öncelikle gerçekleştirilir ve diğer alt bileşenler de gerçekleştirilerek uygulama çatısı oluşturulmaya başlanır. Bileşenlerin gerçekleştirimi sırasında tekrarlanan özelliklerin soyut bir biçimde tanımlanması önemlidir. Bu soyut tanımlar, tasarım örüntüleri(design patterns) yardımıyla bileşen gerçekleştirimi sırasında saptanabilir. Uygulama çatısının ilk başlarda sadece ata sınıflardan oluşan beyaz kutu görünümü vardı. Daha sonra özel veri yapıları ve algoritmaların eklenmesiyle karmaşıklık arttı. Bu süreçte gerçekleştirilen bileşenlerin sayısı arttığından bileşenlerin daha çok kara-kutu olması ihtiyacı doğdu. Şekil 4‘de belirtilen uygulama çatısı, çok kullanılan birkaç arayüzü gerçekleştiren benzer bileşenlerden oluşan bir ailedir. Şekil 4’de verilen uygulama çatısında siyah kutular stabil veri yapılarını, mavi kutular varyasyon noktalarını, kırmızı kutular ise nesnel(concrete) değişkenleri gösterir. Stabil girdiler, Configuration ve Kartezyen Space sınıflarıdır. Koordinatlar bilgisi, robotik sistemin hareket edebileceği bir ya da daha fazla uzay bilgisi içerir. Değişken noktalar, Interpolator, Sampler ve Distance Metric gibi sınıflar tarafından temsil edilir. Bu sınıflar, temel veri yapıları ve yaygın kullanılan soyut algoritma tanımları içerir. Bileşen geliştiricisi, bu soyut sınıfları kullanarak, yeni soyut olmayan sınıflar (linear interpolator, uniform sampler, Manhattan)  geliştirir. Cartesian Space Factory sınıfı, prototip örüntüye (prototype pattern) göre gerçekleştirir. Bileşen uygulama çatısı tarafından gerçekleştirilen tüm değişkenleri tutar.

Değişkenlik gerçekleştirimi   

         Farklı bileşenlerin gerçekleştirimindeki farklılık seviyesi yazılım geliştirme süreçlerindeki aşamalara göre karar verilebilir. Bunlar:

Derleme süresi:  Önişlem direktifleri (preprocessor directives) yardımıyla başlık dosyalarının projelere dahil edilmesi kontrol edilerek, derlenme süresini değişkenliğinin azaltılmasıdır.

Bağlama süresi: Kodun kütüphane ve modüllerle bağlanması bu aşamada gerçekleştirilir.

Çalışma zamanı: Değişkenlik program çalışma sırasında çözümlenir.

Çalıştırılabilir dosyalara, kütüphanelerin sonradan eklenmesi.

 Aşağıdaki özellikler sayesinde değişkenlik gerçekleştirimi sağlanır.

Kalıtım temel fonksiyonların ve değişkenlerin üst sınıflara, eklemelerin alt sınıflara yansıtılmasını sağlar.

Nesne tabanlı programlamanın güzel özelliklerinden birisi değer ve referans olarak parametreleri geçirmesidir.

Sonuç olarak, iki seriden oluşan yazının, ilk serisi olan bu makalede bileşen tabanlı robot tasarımının temel konseptlerini ve yeniden kullanılabilir robot işlevlerini sağlayan parçaların geliştirilme süreçlerini inceledik. Bu makalenin odaklandığı nokta, bileşen tanımı ve bileşen gerçekleştirimini ayırarak, bileşenlerin birlikte işlerliğini ve esnekliğini artırma yollarını anlamaktı. Yazının diğer kısmı olan ikinci parçada ise, bileşenlerin dağıtık ve geniş modül sistemlerinde simgesel olarak tanımlamak ve uygulamaya özel yeniden kullanılabilir parçalar üretmek üzerine olacaktır.

Kaynak : Reusable Building Blocks / By Davide BRUGALI and Patrizia SCANDURRA



Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir