İçeriğe geç

Teknik Yazılar

Yazılım ve Araçlar··6 dk okuma

SITL + Gazebo ile Simülasyon: Uçmadan Önce Test Etmek

Sahada bir görev dosyasını yanlış yazmanın bedeli bir uçuş günü; masada aynı hatayı yapmanın bedeli 30 saniye. Aradaki farkı SITL kuruyor.

Bir saha testi günü şöyle geçiyor: sabah 7’de kalkıyorsunuz, iki saat yol gidiyorsunuz, pil paketlerini şarj etmeyi unutmadıysanız kurulum 40 dakika sürüyor. Sonra ilk AUTO görevinde araç ikinci waypoint’e gitmek yerine RTL’e (Return To Launch, kalkış noktasına dönüş) geçiyor. Sebep? Görev dosyasındaki irtifa referansı yanlış. Bunu anlamanız 20 dakika, düzeltip yeniden denemeniz bir pil daha.

Bu tür hataların ortak özelliği, hiçbirinin uçmayı gerektirmemesi. Görev planlama mantığı, mod geçişleri, failsafe eşikleri, parametre setleri — hepsi masada yakalanabilecek şeyler. Bunları önceden elemek, sahada gerçekten uçmayı gerektiren şeylere zaman bırakıyor.

Bu yazıda ArduPilot SITL’i, Gazebo ile nasıl birleştirdiğimizi ve hangi testleri masada yaptığımızı anlatıyoruz. Sonunda da en az onun kadar önemli olan kısım var: simülasyonun neyi test edemediği.

SITL nedir, HITL’den ne farkı var?

SITL (Software In The Loop, “yazılım döngüde”), ArduPilot uçuş yazılımının sıradan bir C++ derleyicisiyle PC için derlenmiş hali — donanım olmadan kodun davranışını test etmenizi sağlayan yerel bir çalıştırılabilir dosya. Sensör verileri gerçek sensörler yerine bir uçuş dinamiği modelinden geliyor; kodun geri kalanı gerçek uçuştaki ile aynı.

HITL (Hardware In The Loop, “donanım döngüde”) ise gerçek uçuş kartını kullanır: Pixhawk üzerinde normal firmware koşar, sensör verisi bir kabloyla simülatörden beslenir. Teoride daha gerçekçi, pratikte ArduPilot tarafında bu yol artık önerilmiyor.

SITL HITL
Ne koşar PC için derlenmiş ArduPilot Gerçek FC üzerindeki firmware
Donanım gerekir mi Hayır Evet (FC + kablo)
Hız kontrolü SIM_SPEEDUP ile hızlandırılabilir Gerçek zamanlı
Debugger, statik analiz Kullanılabilir Zor
ArduPilot desteği Aktif, birincil yol X-Plane ve FlightGear ile, yalnızca Plane, dokümantasyonda “arşivlendi, artık desteklenmiyor” notu var
Ne zaman tercih edilir Neredeyse her zaman FC’ye özgü sürücü/donanım zamanlaması şüphesi varsa — ki bunun için ArduPilot artık “Simulation on Hardware” yolunu öneriyor

Kısacası: SITL’den başlayın. Biz de öyle yaptık.

SITL’i kurmak ve çalıştırmak

Kurulum, normal ArduPilot geliştirme ortamının kurulumuyla aynı. Depoyu alt modülleriyle klonlayıp hazırlık betiğini çalıştırıyorsunuz:

git clone --recurse-submodules https://github.com/ArduPilot/ardupilot
cd ardupilot
Tools/environment_install/install-prereqs-ubuntu.sh -y
. ~/.profile

Not: bu betik, standart desteği bitmiş Ubuntu sürümlerinde (örneğin 20.04 LTS) çalışmıyor. Güncel bir LTS kullanın.

Derleme ve çalıştırma:

./waf configure --board sitl
./waf copter

# Tools/autotest/sim_vehicle.py PATH'e eklenmiş olmalı
sim_vehicle.py -v ArduCopter -f quad --console --map -w

Buradaki bayraklar önemli:

Bayrak Ne yapar
-v ArduCopter Araç tipi
-f quad Çerçeve (frame) tipi
--console MAVProxy durum konsolu
--map Harita penceresi
-w Sanal EEPROM’u siler, varsayılan parametrelerle başlar
-L <isim> Tools/autotest/locations.txt içinden başlangıç konumu
--no-mavproxy MAVProxy’siz başlatır (kendi istemcinizi bağlayacaksanız)

-w bayrağını yalnızca ilk çalıştırmada veya parametreleri sıfırlamak istediğinizde kullanın; her seferinde verirseniz yaptığınız ayarlar uçar.

Gazebo’yu devreye almak

SITL’in kendi dahili fizik modeli çoğu görev mantığı testi için yeter. Gazebo’yu, ortamı görsel olarak görmek ve kameradan görüntü akıtmak istediğimizde ekliyoruz.

Bağlantıyı ardupilot_gazebo eklentisi kuruyor. 2026 itibarıyla eklenti Gazebo Garden, Harmonic (LTS), Ionic ve Jetty (LTS) sürümlerini destekliyor; depo Harmonic’i öneriyor.

git clone https://github.com/ArduPilot/ardupilot_gazebo
cd ardupilot_gazebo
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4

Ardından iki ortam değişkeni:

export GZ_SIM_SYSTEM_PLUGIN_PATH=$HOME/ardupilot_gazebo/build:$GZ_SIM_SYSTEM_PLUGIN_PATH
export GZ_SIM_RESOURCE_PATH=$HOME/ardupilot_gazebo/models:$HOME/ardupilot_gazebo/worlds:$GZ_SIM_RESOURCE_PATH

İki terminalde sırayla:

# Terminal 1
gz sim -v4 -r iris_runway.sdf

# Terminal 2
sim_vehicle.py -v ArduCopter -f gazebo-iris --model JSON --map --console

Kritik nokta --model JSON: SITL ile Gazebo arasındaki veri alışverişi JSON arayüzü üzerinden yapılıyor ve çerçeve adı gazebo- ile başlamak zorunda. Eklentinin gimbal kamerası görüntüyü GStreamer ile varsayılan olarak 127.0.0.1:5600 UDP adresine akıtıyor — bu, bizim SIYI A8 mini’den gelen RTSP akışının yerine geçen test kaynağı oldu.

Bağlantı katmanı: hangi port neye gider

SITL, seri portlarını TCP portlarına eşliyor: seri 0–3 sırasıyla 5760–5763. Yer istasyonu bağlantısı için varsayılan olan 5760. sim_vehicle.py MAVProxy’yi de başlattığında, MAVProxy bu bağlantıyı alıp yerel UDP portlarına dağıtıyor.

İstemci Bağlantı Not
Mission Planner TCP 127.0.0.1:5760 MAVProxy koşmuyorsa doğrudan bu porta bağlanın
Mission Planner (MAVProxy varken) UDP 14550 MAVProxy’nin varsayılan yerel çıkışlarından biri
pymavlink betiği UDP 14551 İkinci yerel çıkış; GCS ile çakışmaz
Uzak makine MAVProxy’de output add <ip>:14550 Ağ üzerinden ikinci istasyon

MAVProxy konsolundan tipik bir kalkış-görev döngüsü:

mode guided
arm throttle
takeoff 40
wp load Tools/autotest/Generic_Missions/CMAC-circuit.txt
mode auto
wp set 2
param show sim*

pymavlink tarafında bağlanma kalıbı sade:

from pymavlink import mavutil

conn = mavutil.mavlink_connection('udpin:localhost:14551')
conn.wait_heartbeat()
print("Heartbeat: sistem %u, bileşen %u" %
      (conn.target_system, conn.target_component))

msg = conn.recv_match(type='GLOBAL_POSITION_INT', blocking=True)

Bizim tarafta bu betik, FastMosaic’in telemetri girdisini besleyen kodun aynısı. Yani SITL’e bağlanan kodla gerçek araca bağlanan kod arasındaki tek fark bağlantı dizesi.

Neleri test ediyoruz

Senaryo Nasıl tetiklenir Ne öğreniriz
Waypoint sırası ve irtifa referansı wp load ... + mode auto Görev dosyası doğru mu, araç beklenen sırayı izliyor mu
RC kaybı failsafe’i param set SIM_RC_FAIL 1 (tam kayıp), 2 (nötr kanallar) Failsafe eylemi doğru mu, ne kadar sürede tetikleniyor
GPS kaybı param set SIM_GPS_DISABLE 1 — parametre adı sürüme göre değişebilir, önce param show SIM_GPS* ile kontrol edin EKF davranışı, mod düşüşü
Rüzgâr param set SIM_WIND_SPD 10 ve SIM_WIND_DIR 180 Pozisyon tutma hatası, görev süresi
Sensör gürültüsü param set SIM_ACC_RND 3 (m/s²) Titreşimli bir araçta filtre davranışı
PID ayarı Kazanç parametrelerini değiştirip aynı görevi tekrarlamak Kabaca kararlılık yönü
Hızlandırma param set SIM_SPEEDUP 5 5x gerçek zaman; uzun görevleri hızlı elemek

SIM_SPEEDUP’ta dikkat: dokümantasyon yüksek hızlanma değerlerinde MAVProxy’nin ağ trafiğine yetişemeyebileceğini, “Set RC override timeout” gibi hatalar veya GCS failsafe’i görülebileceğini söylüyor. Çözüm basit — çarpanı düşürün.

Simülasyonun test EDEMEDİĞİ şeyler

Bu bölümü atlamayın; SITL’e fazla güvenmek de en az hiç kullanmamak kadar pahalıya patlıyor.

  • Tespit performansı. Gazebo kamerası sentetik görüntü üretir. Bizim aerial-only doğrulama setinde mAP50 0.950 sonucumuz gerçek uçuş karelerinden geldi; sentetik görüntüde alınan bir skorun sahada karşılığı yok. Model doğrulaması gerçek veriyle yapılır.
  • Companion computer yükü. Jetson Orin NX üzerindeki 15-20 FPS’lik çıkarım hızı, termal kısıtlama ve RTSP gecikmesi masaüstünde ölçülemez.
  • Titreşim, EMI, gerçek sensör kusurları. SIM_ACC_RND gürültü ekler ama sizin gövdenizin rezonans frekansını bilmez.
  • Mekanik. Bırakma servosu, gimbal montajı, kablo gerilimi — hiçbiri simülasyonda yok. Sahada ~20 m’den yaptığımız otonom bırakma testinin simülasyonda karşılığı yalnızca “servo komutu doğru anda gitti mi” sorusudur.
  • Radyo menzili ve gerçek link kalitesi. Localhost’ta paket kaybı yok.

Sık düşülen tuzaklar

  • Parametreleri sahaya taşımayı unutmak. SITL’de bulduğunuz iyi failsafe ayarı, gerçek araca kendiliğinden geçmez. Parametre dosyasını sürüm kontrolünde tutun.
  • -w’yi her seferinde vermek. Sanal EEPROM sıfırlanır, önceki oturumda ayarladığınız her şey gider.
  • Yanlış çerçeve adı. Gazebo kullanırken çerçeve adı gazebo- ile başlamalı ve --model JSON verilmeli; aksi halde SITL kendi dahili modeliyle uçar, Gazebo’daki araç kıpırdamaz ve neden çalışmadığını uzun süre ararsınız.
  • Ortam değişkenlerini kalıcılaştırmamak. GZ_SIM_SYSTEM_PLUGIN_PATH ve GZ_SIM_RESOURCE_PATH yeni terminalde kaybolur. .bashrc’ye yazın.
  • Port çakışması. Aynı makinede hem Mission Planner hem kendi betiğinizi 14550’ye bağlamaya çalışmak. İkincisini 14551’e alın.
  • Simülasyonda geçen testi “doğrulandı” saymak. SITL’de geçmek, uçuşa hazır olmak değil; sahaya çıkmaya hazır olmak demek.

Pratik özet

  1. Önce sade SITL, sonra Gazebo. Görev mantığı, mod geçişleri ve failsafe testlerinin çoğu için Gazebo’ya gerek yok; kurulum yükünü boşuna almayın.
  2. Bağlantı dizesi dışında hiçbir şeyi değiştirmeyin. Yer yazılımınız SITL’e udpin:localhost:14551 ile bağlanıyorsa, gerçek araca da aynı kodla bağlanmalı. Ayrışan iki kod yolu, sahada sürpriz üretir.
  3. Failsafe senaryolarını bir kontrol listesine dökün. SIM_RC_FAIL, GPS devre dışı ve rüzgâr testlerini her firmware güncellemesinden sonra tekrarlayın — beş dakikalık iş.
  4. Parametre setini tek kaynaktan yönetin. SITL’de ayarlayıp sahada kullanacağınız değerler aynı dosyadan gelsin.
  5. Simülasyonun sınırını yazılı tutun. “Bu test SITL’de yapılamaz” listesi, saha gününde neye zaman ayıracağınızı belirleyen asıl belge.
  • SITL
  • Gazebo
  • ArduPilot
  • MAVProxy
  • simülasyon

Zor bir mühendislik probleminiz mi var?

Yapılabilir mi, ne kadar sürer, nasıl kurulur: konuşarak başlayalım.

Projenizi Konuşalım