📌 Hızlı Özet:
ROS 2 Humble uzerinde Nav2, USV navigasyonu icin guclu bir iskelet sunar; fakat karasal varsayimlari oldugu gibi denize tasimak hatadir. Bu yazida harita/costmap, kontrolcu, davranis agaci ve guvenlik katmanini Pusula USV yazilim deneyimiyle temellendiriyorum — mucize parametre seti iddiasi olmadan.
Giris: Denizde “navigate_to_pose” ne anlama gelir?
Karada Nav2 cogu zaman lidar + occupancy grid + diff-drive ile anlatilir. Insansiz deniz aracinda (USV) hedefe gitmek; akinti, dalga, GPS sicramasi ve itici doyumu ile birlikte gelir. Ben Abdullah Aksoy, Pusula USV yazilim tarafinda bu yigini “hazir sihir” gibi degil, kontratlari net bir dugum grafi olarak kuruyorum.
Bu rehber kurulum sihirbazi degil; Humble + Nav2 ile USV’ye baslarken hangi kavramlarin onemli oldugunu anlatır.
Yazilim yigininın iskeleti
Tipik bir Humble navigasyon dongusu:
- Localizasyon: GPS/IMU (ve varsa RTK) →
odom/mapcerceveleri - Harita / costmap: sığlık, yasak bolge, iskele, diger araclar
- Planner: hedefe kaba rota
- Controller: anlik hız / heading komutu
- Behavior / recovery: takilinca ne yapilacagi
- Guvenlik: geofence, E-stop, manuel override
ROS 2’de bunlar topic, action ve TF ile baglanir. Nav2’nin getirdigi sey, bu parcalari davranis agaciyla orkestra etmesidir. Orkestra yanlis enstrumanla (yanlis motion model) guzel calmaz.
TF ve cerceve disiplini (once bunu duzeltin)
USV’de en sik sessiz hata TF’dedir:
base_linkarac govdesiodomsurekli ama kayabilen lokal cercevemap/earth/ UTM baglantisi GPS ile
GPS’i dogrudan base_linke “teleport” etmek yerine, uygun lokalizasyon dugumu (ör. EKF ile robot_localization) kullanin. Heading’i dereceden radyana cevirmeyi unutmak, “Nav2 bozuk” sanrisina yol acar.
Kural: Nav2 parametrelerine dokunmadan once ros2 run tf2_tools view_frames ve tf2_echo ile agaci dogrulayın.
Costmap’i denize gore dusunmek
Karasal lidar costmap’i kopyalamak yetmez. Deniz icin pratik yaklasimlar:
- Statik katman: sığlık / kayalik poligonlari (mission planner’dan)
- Keepout filter: liman, yasak bolge
- Inflation: arac genisligi + guvenlik payi (footprint’i gercekci tutun)
- Dinamik engel: AIS veya goruntu ile gelen hedefler (varsa ayri katman)
USV footprint’i dikdortgen veya ozel polygon olabilir; cok dar footprint “duvardan geciyorum” hissi verir, cok genis “hic yol yok” dedirtir. Bunu suda deneyerek, tek seferde “optimal” diye dondurmeden ayarlayın.
Planner ve controller: beklentiyi yonetmek
Nav2’de Smac, NavFn, DWB, MPPI gibi secenekler vardir. USV icin kritik sorular:
- Arac yerinde donabiliyor mu, yoksa minimum donus yaricapı mi var?
- Ileri-geri simetrik mi? (cift itici farkli cevap verir)
- Hiz komutu motor surucusune nasil map ediliyor? (
cmd_vel→ thruster allocation)
Diff-drive icin yazilmis ornek parametre setini katamaran USV’ye basmak, simde bile osilasyon uretebilir. Baslangic icin:
- Basit bir controller ile duz gun baslangic
- Heading + surge ayri PI/PID (veya mevcut USV kontrolcunuz) ile Nav2’yi once “ust seviye hedef” ureticisi gibi kullanmak
- Olcuden sonra Nav2 controller’a daha cok yetki vermek
Bu, “Nav2 kullanmiyoruz” demek degil; entegrasyonu kademeli yapmak demek.
Behavior tree: recovery deniz anlamı kazanmali
Karada “spin + clear costmap” yaygındır. Denizde kontrolsuz spin tehlikeli veya anlamsiz olabilir. Recovery’leri USV’ye gore yeniden yazın:
- Hiz dusur, bekle, GPS coviyansina bak
- Keepout icindeyse hedefi iptal et / guvenli noktaya don
- Manuel RC override algilaninca Nav2’yi preempt et
Davranis agaci XML/plugin’leri ezberlemek yerine, sahada istenmeyen davranisi yazip “bu durumda ne olmali?” diye tasarlayın.
Action arayuzu ve mission katmani
Ust seviye gorev yoneticiniz (Python) tipik olarak navigate_to_pose veya waypoint takip action’ini cagirır. Iyi pratikler:
- Her hedefte timeout
- Iptal (cancel) yolunu test etmek — yarismada “dur” emri kadar onemli
- Feedback’ten mesafe/heading hatasini loglamak
- Basari kriteri: “pose tolerance” karada oldugu gibi dar olmamalı; GPS gurultusune gore gevsetin
Teknofest gorevlerinde nokta atışı GPS toleransi bazen gercekci degildir. Toleransi sahada olcun; dokumandan kopyalamayin.
QoS, frekans ve “gercek zaman” efsanesi
ROS 2 QoS (reliable vs best effort) yanlis secilince “bazen calisiyor” sendromu baslar. Sensor stream best effort; kritik komut ve lifetime/latch gerekenler dikkatli secilmeli.
Frekans yarisi yapmayın: 100 Hz kontrol her zaman daha iyi degildir. Iticilerin ve odometrinin gercek bant genisligine uyun. Nav2’nin icine girmeden once kendi kontrolcunuzun kararlı oldugunu gosterin.
Sim → saha gecisi
Gazebo (veya diger sim) ile Nav2’yi baglamak iyidir; ama simdeki mukemmel GPS’i sahaya tasimayın. Geciste checklist:
- Gurultulu GPS / IMU modeli
- Akinti (dis kuvvet) — yoksa controller asırı iyimser kalır
- Haberleşme kopmasi (teleop ve Nav2 yarisi)
- E-stop: yazilim ve donanim bagimsiz tetik
“Simde %100 basari” iddiasi saha icin anlamli degildir. Anlamli olan, bilinen stress senaryolarinin listesidir.
Guvenlik katmani (pazarlik edilmez)
Navigasyon stack ne kadar akilli olursa olsun:
- Donanimsal E-stop
- Yazilimsal geofence
- Manuel override onceligi
- Arming mantigi (kazara otonom baslatmama)
Bunlar Nav2’nin disinda, daha sade ve test edilebilir dugumlerde dursun. LLM veya kopyala-yapistir parametre ile “guvenlik sonra” demeyin.
Ogrenme yolu (onerilen sira)
- Humble + TF +
cmd_velile manuel surus - Basit waypoint takip (Nav2 olmadan) — arac dinamigini ogren
- Costmap + tek hedef
navigate_to_pose - Recovery ve iptal senaryolari
- Gorev yoneticisi ile coklu waypoint
- Saha log’undan parametre ince ayar
Bu sira, “tum Nav2’yi bir gecede kurayim” yaklasimindan daha yavas baslar; yarışma haftasinda daha az surpriz birakir.
Kapanis
ROS 2 Humble ve Nav2, USV navigasyonu icin uygun bir omurga olabilir — dogru TF, deniz costmap’i, uygun motion model ve pazarlik edilmez guvenlik ile. Hazir parametre dosyasi mucizesi yok; olcum ve kademeli entegrasyon var. Pusula’da basariyi “Nav2 actik” diye degil, “operator ve arac guvenle hedefe gidebiliyor” diye tanimliyoruz.