GÖREV KAYDI

GÖREV KAYDI

KAYIT AÇIK

ATILIM UAV · YER KONTROL İSTASYONU

GÖREV KAYDI / DETAY

Arşiv

CANLI · OKUMA MODU

Yazılım

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

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

FIG. 01

KAYIT KÜNYESİ

Kategori

Yazılım

TARİH

TÜM KAYITLAR

Bir saha test günü şöyle geçiyor: sabah 7'de kalkıyorsunuz, iki saat yol gidiyorsunuz ve batarya paketlerini şarj etmeyi unutmadıysanız kurulum 40 dakika sürüyor. Sonra daha ilk AUTO görevinde hava aracı ikinci waypoint'e gitmek yerine RTL'e (Return To Launch) geçiyor. Sebep? Görev dosyasındaki irtifa referansı yanlış. Bunu çözmek 20 dakikanıza, düzeltip yeniden denemek bir bataryanıza mal oluyor.

Bu aksaklıkların ortak yanı şu: hiçbirini bulmak için uçmak gerekmiyordu. Görev planlama mantığı, mod geçişleri, failsafe (güvenli-mod) eşikleri, parametre setleri; hepsi masa başında yakalanabilir. Bunları önceden temizlemek, saha gününü gerçekten uçulması gereken işlere bırakıyor.

Bu yazıda ArduPilot SITL'i, onu Gazebo ile nasıl birleştirdiğimizi ve masa başında hangi testleri koştuğumuzu anlatıyoruz. Sonda da en az bunlar kadar önemli olan bölüm var: simülasyonun test edemediği şeyler.

SITL nedir, HITL'den farkı ne?

SITL (Software In The Loop), ArduPilot uçuş yazılımının sıradan bir C++ derleyicisiyle PC için derlenmiş hâli; hiç donanım olmadan kodun nasıl davrandığını test etmenizi sağlayan yerel (native) bir çalıştırılabilir dosya. Sensör verisi gerçek sensörler yerine bir uçuş dinamiği modelinden geliyor; kodun geri kalanı gerçek uçuşta koşanın birebir aynısı.

HITL (Hardware In The Loop) ise gerçek uçuş kontrolcüsünü kullanıyor: Pixhawk üzerinde normal firmware koşuyor, sensör verisi simülatörden kabloyla besleniyor. Teoride daha gerçekçi ama ArduPilot tarafında bu yol pratikte artık önerilen yol değil.



SITL

HITL

Ne koşuyor

PC için derlenmiş ArduPilot

Gerçek FC üzerindeki firmware

Donanım gerekiyor mu

Hayır

Evet (FC + kablo)

Zaman ölçekleme

Hızlandırılabilir: SIM_SPEEDUP

Yalnızca gerçek zamanlı

Debugger, statik analiz

Var

Zor

ArduPilot desteği

Aktif, birincil yol

X-Plane ve FlightGear üzerinden, yalnızca Plane; dokümantasyon bunu arşivlenmiş ve artık desteklenmiyor olarak işaretliyor

Ne zaman tercih edilir

Neredeyse her zaman

FC'ye özgü bir sürücü ya da donanım zamanlama sorunundan şüphelendiğinizde (onun için bile ArduPilot artık "Simulation on Hardware" yolunu işaret ediyor)

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

SITL kurulumu ve çalıştırılması

Kurulum, normal bir ArduPilot geliştirme ortamı kurmaktan farksız. Depoyu alt modülleriyle birlikte klonluyor ve ön koşul 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

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

Not: bu betik, standart destek süresi dolmuş 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 must be on your PATH
sim_vehicle.py -v ArduCopter -f quad --console --map -w
./waf configure --board sitl
./waf copter

# Tools/autotest/sim_vehicle.py must be on your PATH
sim_vehicle.py -v ArduCopter -f quad --console --map -w

Buradaki bayraklar önemli:

Bayrak

Ne işe yarar

-v ArduCopter

Araç tipi

-f quad

Gövde (frame) tipi

--console

MAVProxy durum konsolu

--map

Harita penceresi

-w

Sanal EEPROM'u siler, varsayılan parametrelerden başlar

-L <name>

Başlangıç konumu; kaynak: Tools/autotest/locations.txt

--no-mavproxy

MAVProxy olmadan başlatır (kendi istemcinizi bağlayacaksanız)

-w bayrağını yalnızca ilk çalıştırmada ya da parametreleri gerçekten sıfırlamak istediğinizde kullanın; her seferinde geçerseniz kurduğunuz her şey uçar.

Gazebo'yu döngüye dahil etmek

SITL'in kendi yerleşik fizik modeli, görev mantığı testlerinin çoğu için yeterli. Gazebo'yu, ortamı görsel olarak görmek ve bir kameradan video akıtmak istediğimizde ekliyoruz.

ardupilot_gazebo eklentisi ikisi arasında köprü kuruyor. 2026 itibarıyla eklenti Gazebo Garden, Harmonic (LTS), Ionic ve Jetty (LTS) sürümlerini destekliyor; deponun önerisi Harmonic.

git clone https://github.com/ArduPilot/ardupilot_gazebo
cd ardupilot_gazebo
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4
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
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

Sonra da iki terminalde:

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

# Terminal 2
sim_vehicle.py -v ArduCopter -f gazebo-iris --model JSON --map --console
# Terminal 1
gz sim -v4 -r iris_runway.sdf

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

Kritik ayrıntı şu: --model JSON. SITL ile Gazebo arasındaki veri alışverişi JSON arayüzü üzerinden yürüyor ve gövde adının şununla başlaması gerekiyor: gazebo-. Eklentinin gimbal kamerası videoyu varsayılan olarak GStreamer üzerinden şu UDP adresine akıtıyor: 127.0.0.1:5600. Bu da SIYI A8 mini'den aldığımız RTSP akışı için yedek test kaynağımız oldu.

Bağlantı katmanı: hangi port nereye gidiyor

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

İstemci

Bağlantı

Notlar

Mission Planner

TCP 127.0.0.1:5760

MAVProxy çalışmıyorsa doğrudan bu porta bağlanın

Mission Planner (MAVProxy çalışırken)

UDP 14550

MAVProxy'nin varsayılan yerel çıkışlarından biri

pymavlink betiği

UDP 14551

İkinci yerel çıkış; GCS ile çakışmıyor

Uzak makine

output add <ip>:14550 (MAVProxy içinde)

Ağ üzerinden ikinci bir istasyon

MAVProxy konsolundan tipik bir kalkış ve görev dizisi:

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

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

pymavlink tarafında bağlantı kalıbı gayet sade:

from pymavlink import mavutil

conn = mavutil.mavlink_connection('udpin:localhost:14551')
conn.wait_heartbeat()
print("Heartbeat: system %u, component %u" %
      (conn.target_system, conn.target_component))

msg = conn.recv_match(type='GLOBAL_POSITION_INT', blocking=True)
from pymavlink import mavutil

conn = mavutil.mavlink_connection('udpin:localhost:14551')
conn.wait_heartbeat()
print("Heartbeat: system %u, component %u" %
      (conn.target_system, conn.target_component))

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

Bizde bu betik, FastMosaic'in telemetri girişini besleyen kodun ta kendisi. Yani SITL ile konuşan kodla gerçek hava aracıyla konuşan kod arasındaki tek fark, bağlantı dizesi.

Neleri test ediyoruz

Senaryo

Nasıl tetiklenir

Bize ne söyler

Waypoint sırası ve irtifa referansı

wp load ... + mode auto

Görev dosyası doğru mu, hava aracı 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, devreye girmesi ne kadar sürüyor

GPS kaybı

param set SIM_GPS_DISABLE 1. Parametre adı sürümler arasında değişebiliyor; önce param show SIM_GPS* ile kontrol edin

EKF davranışı, mod geri düşüşü

Rüzgâr

param set SIM_WIND_SPD 10 ve SIM_WIND_DIR 180

Konum tutma hatası, görev süresi

Sensör gürültüsü

param set SIM_ACC_RND 3 (m/s²)

Titreşime yatkın bir hava aracında filtre davranışı

PID ayarı

Kazanç parametrelerini değiştirip aynı görevi tekrarlayın

Kararlılığın hangi yöne gittiğine dair kaba bir fikir

Zaman hızlandırma

param set SIM_SPEEDUP 5

Gerçek zamanın 5 katı; uzun görevleri hızla tüketmek için

Bir uyarı: SIM_SPEEDUP için dokümantasyon, yüksek hızlandırma değerlerinde MAVProxy'nin ağ trafiğine yetişemeyebileceğini ve "Set RC override timeout" gibi hatalar ya da GCS failsafe'i görebileceğinizi belirtiyor. Çözüm basit: çarpanı düşürün.

Simülasyonun test EDEMEDİĞİ şeyler

Bu bölümü atlamayın; SITL'e fazla güvenmek, en az onu hiç kullanmamak kadar pahalıya mal olur.

  • Tespit başarımı. Gazebo kamerası sentetik görüntü üretiyor. Yalnızca havadan görüntülerden oluşan doğrulama setindeki 0.950'lik mAP50 değerimiz gerçek uçuş karelerinden geldi; sentetik görüntü üzerinde ölçülen bir skor sahada hiçbir şey ifade etmez. 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 throttling ve RTSP gecikmesi masaüstünde ölçülemez.

  • Titreşim, EMI, gerçek sensör kusurları. SIM_ACC_RND gürültü ekliyor ama gövdenizin rezonans frekansı hakkında hiçbir şey bilmiyor.

  • Mekanik. Bırakma servosu, gimbal bağlantısı, kablo gerilimi: hiçbiri simülasyonda yok. Sahada ~20 m'den yaptığımız otonom airdrop testinden simülasyonun yeniden üretebildiği tek şey, "servo komutu doğru anda çıktı mı" sorusu.

  • Telsiz menzili ve gerçek link kalitesi. localhost'ta paket kaybı olmaz.

Sık düşülen tuzaklar

  • Parametreleri sahaya taşımayı unutmak. SITL'de bulduğunuz iyi failsafe ayarı kendi kendine gerçek hava aracına geçmiyor. Parametre dosyasını sürüm kontrolünde tutun.

  • -w'yi her çalıştırmada geçmek. Sanal EEPROM siliniyor ve bir önceki oturumda kurduğunuz her şey gidiyor.

  • Yanlış gövde adı. Gazebo ile birlikte gövde adının şununla başlaması gerekiyor: gazebo- ve --model JSON geçmeniz şart; aksi hâlde SITL kendi iç modeliyle uçuyor, Gazebo'daki araç hiç kıpırdamıyor ve neden hiçbir şeyin çalışmadığını uzun uzun arıyorsunuz.

  • Ortam değişkenlerini kalıcı hâle getirmemek. GZ_SIM_SYSTEM_PLUGIN_PATH ve GZ_SIM_RESOURCE_PATH yeni bir terminalde kayboluyor. Bunları şuraya yazın: .bashrc.

  • Port çakışmaları. Aynı makinede hem Mission Planner'ı hem de kendi betiğinizi 14550'ye bağlamaya çalışmak. İkincisini 14551'e alın.

  • Simülasyonda geçen bir testi "doğrulandı" saymak. SITL'de geçmek uçmaya hazır olduğunuz anlamına gelmiyor; sahaya çıkmaya hazır olduğunuz anlamına geliyor.

Pratik özet

  1. Önce düz SITL, sonra Gazebo. Görev mantığı, mod geçişi ve failsafe testlerinin çoğu Gazebo'ya ihtiyaç duymuyor; kurulum yükünü boşuna sırtlamayı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 hava aracına da aynı kodla bağlanmalı. Birbirinden ayrışan iki kod yolu sahada sürpriz üretir.

  3. Failsafe senaryolarını kontrol listesi olarak yazın. Her firmware güncellemesinden sonra SIM_RC_FAIL, GPS kapalı ve rüzgâr testlerini tekrarlayın. Beş dakikalık iş.

  4. Parametre setini tek bir kaynaktan yönetin. SITL'de ayarlayıp sahada uçtuğunuz değerler aynı dosyadan çıkmalı.

  5. Simülasyonun sınırlarını yazılı tutun. "Bu test SITL'de yapılamaz" listesi, saha günü vaktinizin nereye gideceğine gerçekten karar veren belgedir.

©2026 ATILIM UAV TEAM

©2026 ATILIM UAV TEAM