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_RNDgü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 JSONverilmeli; 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_PATHveGZ_SIM_RESOURCE_PATHyeni 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
- Ö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.
- Bağlantı dizesi dışında hiçbir şeyi değiştirmeyin. Yer yazılımınız SITL’e
udpin:localhost:14551ile bağlanıyorsa, gerçek araca da aynı kodla bağlanmalı. Ayrışan iki kod yolu, sahada sürpriz üretir. - 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ş. - Parametre setini tek kaynaktan yönetin. SITL’de ayarlayıp sahada kullanacağınız değerler aynı dosyadan gelsin.
- 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