Bu yazıda, geçen sezon yazılım ekibi üyelerine verilen ödevlerden birine bakacağız. Bu ödevde, akustik yerelleştirme tekniklerini kullanarak bir su altı pinger'ının (akustik verici) kesin yerini ve derinliğini belirlemeyi ele aldık. data.csv adlı bir dosyada sağlanan veriler, birden fazla akustik sensörle alınan ölçümleri içeren başlangıç noktamızdı. Bu ölçümler, sensörlerin GPS koordinatlarını, sensörlerin su yüzeyinden derinliğini ve sensörlerden pinger'a olan mesafeleri içerir. Görevimiz, bu veri noktalarını kullanarak pinger'ın kesin enlemini, boylamını ve derinliğini belirlemekti.
Öncelikle veri işleme aşamasına geçtik. Verileri data.csv'den okuduk, doğru hesaplamalar için mesafe değerlerini ikiyle çarparak ayarladık. Daha sonra enlem, boylam ve derinlik sütunlarını merkezler olarak ve mesafe sütununu yarıçaplar olarak çıkardık.
Sonra, bir küre üzerindeki iki nokta arasındaki mesafeyi hesaplayan Haversine formülünü tanımladık. Bu formül, Dünya'nın eğriliğini göz önünde bulundurarak hesaplamalarımız için önemliydi.
Daha sonra hesaplanan yarıçap ile bilinen yarıçap arasındaki kare farkların toplamını hesaplayan rezidü fonksiyonuna geçtik. Bu fonksiyon hesaplamalarımızı optimize etmek için çok önemliydi.
Optimizasyon süreci için, merkezler dizisinin ortalaması olarak hesaplanan bir başlangıç tahminiyle başladık. En küçük kareler yöntemini kullanarak, sensör ölçümlerini temsil eden kürelerin kesişim noktasını bulmayı amaçladık. Bu süreç, pinger'ın koordinatlarını hassasiyetle tahmin etmemize yardımcı oldu.
Tahmini koordinatlara sahip olduğumuzda, Folium kullanarak etkileşimli bir harita oluşturduk. Bu harita, sensör konumlarını ve tahmini pinger konumunu görselleştirmemizi sağladı. Her sensör konumu için daireler ve işaretleyiciler ve pinger için ayrı bir işaretleyici ekledik. Son olarak, kolay erişim ve inceleme için haritayı pingermap.html olarak kaydettik.
Çabalarımızın sonucu olarak pingerin tahmini koordinatları 42.43869 Enlem ve 18.58540 Boylam olarak belirlendi.
Bu sene çalışma fırsatını bulduğum en büyük projelerden biri olan pasif sonar projesinden size bahsetmek istiyorum. Aracımızın bu seneki katılacağı Robosub 2024 yarışmasındaki yüzleşeceği en kritik problemlerden biri görev bölgelerinin belli bir frekansta tekrarlı ve kesik bir şekilde sinyal gönderen "pinger" adı verlien cihazlar ile işaretlenmiş olması. Aracımızın bu görevlere ulaşabilmesi için etkili bir şekilde dinleme yaparak ve bu iş için hazırlanmış algoritmasını kullanarak görev yerlerini ayırt edebilmesi gerekiyor.
Donanımsal anlamda bu görev için hidrofon denilen su altı mikrofonlarından yararlanıyoruz. Hidrofonlarımızdan aldığımız sinyalleri akustik işleme kartımızdan (APB) geçirerek ve daha sonrasında analog olan sinyalimizi dijital ortama aktararak hazırlanan algoritmamızda işlenebilir hale getiriyoruz.
Yazılımsal anlamda ise gelen sinyalin bir sinüs şeklinde olmasından yararlanarak tepe noktaları arasındaki voltaj değerlerini PWM benzeri değerlere bölerek bu değerler arasındaki gelen farklı sinyallerin geliş süreleri ve hidrofonlarımızın geometrik kendi aralarındaki açısal konumlarından yola çıkarak sinyalin geliş süresi ve aracımıza geliş açısını hesaplıyoruz. Bu bilgiyi kullanarak aracımızı sinyal kaynağına yönlendirerek görev bölgemizi bulabiliyoruz.
Anakartın gömülü yazılımını geliştirme üzerinde çalışıyorum. Aracımız ROS ile çalıştığı için anakart üzerinde rosserial_arduino paket haberleşmesi kullanıyoruz. Bu paketleyici kütüphane, esasında anakartı sağlayıcı (Host) bilgisayar ile gerçek ROS konuşması yaptırmak yerine köprü görevi gören bir python yazılımıyla simüle ettiriyor.
Şu anda anakart üzerinden ping sonarlar okunuyor. Ping sonrarları bir ROS servisi aracılığıyla açıp kapatabiliyoruz. Ping sonarlar sayesinde su altında 30 derecelik aralıkla karşımızdaki nesnenin bize olan uzaklığını ölçebiliyoruz. Bu verileri matematiksel fonksiyonlara sokarak su altı haritalandırmamızın doğruluğunu arttırıyoruz.
Ayrıca anakartımız üzerinden torpido ateşleme sistemini kullanabiliyoruz. Bu özelliği bir rosservis çağırarak kullanıyoruz. Şu anda bir servis çağrıldığında o fonksiyon hariç tüm haberleşmeler fonksiyon işlevini bitirene kadar duruyor. Her ne kadar bu süre yarım saniye gibi kısa da olsa bu sorunun çözümü üzerinde uğraşıyoruz.
Son olarak birçok özelliklerinin dışında anakartımız aslında güç bölücü devrelere sahip olan bir güç dağıtım kartıdır. Bu sayede birçok farklı voltaj seviyesi isteyen sensörlerimizi çalıştırabiliyoruz.
AUV Yazılım ekibinde uğraştığım projelerden bir tanesi, sensor birleşim algoritmalarının Simulink üzerinden modellenmesinin gerçekleştirilmesiydi. Aracın otonom hareket için hayati öneme sahip konum ve yönelim bilgilerini ölçen sensörler, belirli bir hata birikmesine ve gürültüye sahipler. Bu hatalar, Kalman Filtresi adı verilen bir matematiksel algoritmayla, çoğunlukla birden fazla sensörden gelen verilerin birleştirilmesiyle, düzeltilir ve iyileştirilir.
Kalman Filtresi algoritması, Simulink içinde bir blok olarak bulunmaktadır. Algoritmayı Simulink içinde modelledikten sonra, aracı çalıştırdığımız ROS ortamına Simulink’te bulunan C/C++ kodu oluşturma özelliği ile geçebiliyoruz. Program, ROS workspace’lerine uyarlı C++ kodu yaratımını sağlıyor.
Simulink üzerinde modellemeyi gerçekleştirmek, modelin genel görünümüne daha görsel ve bütüncül bir bakış açısına sahip olmamamızı sağlamaktadır. Simulink ortamı ayrıca, veri inceleme ve hata giderimi süreçlerini bizim için kolaylaştırmaktadır.
Merhaba, size gripper tasarım sürecimizden biraz bahsetmek istiyorum. Öncelikle gripper, nesneleri manipüle etmeye ve yerlerini değiştirmeye yarar. Başlayalım...
Gripper v1: İlk tasarımımız, bevel gear içeren bir sistemdi. Bu sistemde, 2 dişli ve bunların arasında pinion dişli bulunuyordu. Tahrik gücü servo motor ile sağlanıyordu. Ancak, 3 boyutlu baskı alındığında pençelerin toleransları ve boyutlarında sorunlar yaşandı. Bu nedenle, tasarımı yeniden gözden geçirmek zorunda kaldık ve 2. versiyona geçtik.
Gripper v2: İlk versiyona kıyasla, gripper'ın boyutlandırmasını yeniden yaptık ve tasarımı %125 küçülttük. Pençeler arasına 0.3 mm tolerans verildi ve topoloji optimizasyonu yapılarak yanlarda gerekli boşluklar bırakıldı. Ancak, bevel gear sistemi nedeniyle dikey kullanım için uygun olmasına rağmen, servo motorun yer kaplaması nedeniyle aracın alt bölmesine konumlandırmada sorunlar yaşandı. Bu nedenle, yatay kullanım için 3. versiyona geçtik.
Gripper v3: Yeni bir tasarım stratejisi izleyerek her bir komponenti parametrik ve ayrı ayrı tasarladık. Önceki tasarımda birleşik ve bütün olarak çalışıyorduk, bu da ilerleyen aşamalarda bir şeyi düzeltmeyi zorlaştırıyordu. Bu yeni yaklaşım, tasarımı daha modüler ve esnek hale getirdi.
Umarım gripper tasarlarken karşılaştığımız zorluklar ve bu zorlukların üstesinden gelme yöntemlerimizi beğenmişsinizdir :)
Merhaba, sitemize bir blog sayfası eklemeye karar verdik. Burada aracımızın gelişim sürecini sizlerle paylaşacağız. Ne yazık ki dinamik web sayfası kullanmak bizim için bir opsiyon değil, bundan dolayı yeni bir blog yazısı eklemek istediğimizde doğrudan sayfanın kodunu modifiye etmemiz gerekiyor. Gelecekte görüşme dileğiyle :)