İçeriğe geç

Teknik Yazılar

İHA ve Aviyonik··7 dk okuma

Mission Planner ile Otonom Görev Planlama: Waypoint, Grid ve AUTO Mod

Haritaya tıklayıp waypoint dizmek 5 dakika sürüyor; o görevin sahada beklediğiniz gibi uçması ise irtifa referansı, home noktası ve WP radius gibi üç beş ayrıntıya bakıyor.

Sahada en sık yaşadığımız senaryo şu: görevi akşam evde planlıyoruz, sabah araca yazıyoruz, AUTO’ya geçiyoruz ve araç planladığımızdan 20 metre alçakta uçuyor. Kimse bir şey yanlış yapmadı — sadece irtifa referansı (altitude frame) “Relative” iken home noktası, kalkış yaptığımız noktadan farklı bir rakımda set edilmişti.

Haritaya tıklayarak waypoint dizmek kolay; görevin dört farklı arazide, dört farklı home noktasında aynı davranışı göstermesi ise disiplin istiyor. Bu yazıda SUAS 2026 hazırlığında kullandığımız akışı anlatıyoruz: ekranın anatomisi, komut seçimi, Survey/Grid ile tarama planı üretme, görevi araca yazma ve AUTO moda geçişin ön koşulları.

Parametre isimleri ArduPilot Copter için. Copter-4.7.0 ile birçoğu SI birimlerine çevrilip yeniden adlandırıldı (WPNAV_SPEEDWP_SPD, RTL_ALTRTL_ALT_M gibi); eski sürümdeyseniz parantez içindeki karşılıklara bakın.

Flight Plan ekranının anatomisi

Ekranın üstünde harita, altında görev tablosu var; tablodaki her satır bir komuttur. Default Alt alanı yeni eklenen waypoint’lerin varsayılan irtifasını belirler. Haritaya tıkladığınızda o noktanın enlem/boylamı ile yeni bir NAV_WAYPOINT satırı eklenir.

Sağ tık menüsü asıl işi yapan yer: Draw Polygon → Add Polygon Point ile tarama alanının sınırlarını çizersiniz, Auto WP → Survey (Grid) ile o poligondan otomatik tarama görevi üretirsiniz, Prefetch ile saha için harita karolarını önden indirirsiniz (sahada internet olmayabilir — bunu her seferinde yapıyoruz).

Alt taraftaki dört düğme görevin ömrünü belirler:

Düğme Ne yapar Ne zaman
Write Görevi otopilota gönderir ve EEPROM’a yazar Plan bittiğinde
Read Araçtaki görevi geri okur Write’tan hemen sonra, doğrulama için
Save WP File .waypoints dosyası olarak diske kaydeder Sürüm takibi, yedek
Load WP File Kayıtlı görevi yükler Sahada hızlı geri dönüş

Verify height kutusu, Google Earth topoloji verisini kullanarak her waypoint’in irtifasını altındaki zemin yüksekliğine göre düzeltir. Eğimli arazide çalışıyorsanız faydalı, ama tek başına terrain following değil — sadece plan anındaki bir düzeltme.

İrtifa referansı: hataların yarısı burada

Her waypoint’in bir irtifa referansı var ve bu referansı karıştırmak en pahalı hata. Üç seçenek:

Referans Sıfır noktası Ne zaman kullanılır Risk
Relative Home noktasının rakımı Düz sahada varsayılan tercih; yarışma görevlerinin çoğu Home yanlış set edilirse tüm görev dikeyde kayar
Absolute Ortalama deniz seviyesi (AMSL) Size AMSL cinsinden tavan verildiyse (NOTAM, ATC kısıtı) Barometre/GPS rakım hatası doğrudan irtifaya yansır
Terrain Zeminin kendisi Eğimli/tepeli arazi, sabit yerden yükseklik gereken tarama TERRAIN_ENABLE=1 ve SRTM verisi indirilmiş olmalı

Terrain kullanacaksanız iki şart var: TERRAIN_ENABLE = 1 olmalı ve yer istasyonu MAVLink üzerinden SRTM verisini araca aktarmış olmalı (Mission Planner, QGroundControl ve MAVProxy destekliyor). ArduPilot dokümanı SRTM doğruluğunun ortalama 10 metre mertebesinde olduğunu, bölgeye göre değiştiğini söylüyor ve terrain following’i 60 m üstü irtifalar için öneriyor; daha alçakta rangefinder tabanlı takip daha doğru sonuç verir.

Pratik kuralımız: bir görev dosyası içinde referans karıştırmayın.

Komut seti: hangi satırı ne için koyuyoruz

Komut Kritik alanlar Ne zaman tercih edilir
NAV_TAKEOFF Alt Görevin ilk NAV komutu. Araç zaten bu irtifanın üstündeyse komut tamamlanmış sayılıp sonraki waypoint’e geçilir
NAV_WAYPOINT Delay, Hit Rad, Yaw Ang, Lat/Lon/Alt Gövde. Delay > 0 ise nokta üstünde bekler
NAV_LOITER_TIME / NAV_LOITER_TURNS Time (s) / Turns, Radius Gözlem duraklaması ya da hedef etrafında dönerek görüntü toplama
NAV_SPLINE_WAYPOINT Lat/Lon/Alt Hız kaybetmeden yumuşak viraj; tarama hatlarında süreyi kısaltır
DO_SET_ROI Lat/Lon/Alt Burnu/gimbal’ı sabit bir hedefe kilitleme
DO_CHANGE_SPEED Type, Speed (m/s) Tarama hattında yavaşlama, transitte hızlanma
DO_SET_SERVO Ser No, PWM (1000–2000) Airdrop kilidini açma
DO_SET_CAM_TRIGG_DIST Distance (m) Mesafe bazlı kamera tetikleme (Survey aracı kendi hesaplar)
DO_JUMP WP no, tekrar sayısı Aynı turu N kez uçurma
NAV_RETURN_TO_LAUNCH RTL_ALT_M irtifasına tırmanıp home’a döner
NAV_LAND Lat/Lon Belirli bir noktaya iniş

Görev sırasında aynı anda en fazla bir “Navigation” ve bir “Do” komutu çalışır; Do komutları kendinden önceki navigation komutu bittikten sonra işlenir. Bu yüzden DO_SET_SERVO görevin ilk veya son komutu olamaz. Airdrop tarafında bizi bir gün yakan ikinci ayrıntı: komutun çalışması için ilgili çıkışın SERVOn_FUNCTION değeri 0 (Disabled) olmalı; fonksiyon başka bir şeye atanmışsa komut sessizce yok sayılır.

Bizim servo tabanlı airdrop bırakmalarımız yaklaşık 20 m irtifadan yapıldı; DO_SET_SERVO’yu bırakma noktasının hemen öncesindeki NAV_WAYPOINT’ten sonraki satıra koyuyoruz.

Güvenlik: Servo/airdrop testini pervaneler sökülü halde yapın. Pixhawk sınıfı otopilotlar servoyu doğrudan besleyemez; harici bir 5V BEC gerekir. Arm etmeden servo komutu denemek, tetikleme mantığını doğrulamanın en ucuz yolu.

Survey/Grid: hat aralığını tahminle değil formülle kurun

Poligonu çizip Auto WP → Survey (Grid) dediğinizde Mission Planner kamera modelini, overlap (ileri bindirme) ve sidelap (yan bindirme) değerlerini sorar; gelişmiş seçenekler açıldığında lens/sensör alanları görünür. Girdiğiniz değerlerden DO_SET_CAM_TRIGG_DIST mesafesini kendisi hesaplar ve görev sonunda bu değeri sıfırlayan bir komut ekler. Alan adları MP sürümüne göre değişebiliyor, ama arkasındaki matematik sabit:

# Yer izdüşümü (pinhole yaklaşımı, lens distorsiyonu ihmal)
genislik_m  = 2 * irtifa_m * tan(HFOV / 2)
yukseklik_m = 2 * irtifa_m * tan(VFOV / 2)

# 16:9 kare için VFOV'u HFOV'dan türet
tan(VFOV/2) = tan(HFOV/2) * (9 / 16)

# Planlama çıktıları
hat_araligi_m   = genislik_m  * (1 - sidelap)
tetik_mesafesi_m = yukseklik_m * (1 - overlap)   # DO_SET_CAM_TRIGG_DIST
GSD_cm_px        = (genislik_m * 100) / goruntu_genisligi_px

Kendi kurulumumuzla (SIYI A8 mini, 81° HFOV, 1080p) 40 m irtifa için adım adım:

tan(81/2) = tan(40.5°) = 0.854
genislik  = 2 * 40 * 0.854 = 68.3 m
tan(VFOV/2) = 0.854 * 0.5625 = 0.480  ->  VFOV = 51.3°
yukseklik = 2 * 40 * 0.480 = 38.4 m

sidelap %60 -> hat_araligi   = 68.3 * 0.40 = 27.3 m
overlap %75 -> tetik_mesafesi = 38.4 * 0.25 =  9.6 m
GSD = 6830 cm / 1920 px = 3.6 cm/px

300 × 200 m’lik bir alanı 300 m’lik hatlarla tararsanız: 200 / 27.3 = 7.3 → 8 hat. Toplam yol ≈ 8×300 + 7×27.3 = 2591 m. WP_SPD = 8 m/s ile ≈ 324 s, dönüşlerdeki yavaşlamalarla kabaca 6-7 dakika. Tek uçuşta bitmiyorsa alanı ikiye bölmek, irtifayı yükseltmekten daha iyi bir fikir — çünkü GSD tespit tarafını doğrudan ilgilendiriyor: 3.6 cm/px’te 30 cm’lik bir hedef ~8 piksel eder ve bu ham çıkarım için sınırda bir değer. Detaylar küçük nesne tespiti ve SAHI dilimli çıkarım yazısında.

Tarama geometrisi: HFOV, yer izdüşümü, hat aralığı ve sidelap

Görevi yazmak ve AUTO’ya geçmek

Write’a basmadan önce kontrol ettiğimiz ön koşullar:

  • 3D GPS fix ve makul HDOP. ArduPilot dokümanı AUTO için HDOP’un 1.4’ün altında olmasını referans alıyor.
  • Home noktası set edilmiş olmalı. Home, arm anında aracın bulunduğu konuma yazılır — GCS’den “Set Home Here” ile elle oynadıysanız RTL o noktaya döner.
  • Arm. Varsayılan ayarda AUTO modda arm edilemez; başka bir modda (örneğin Loiter) arm edip AUTO’ya geçersiniz. AUTO_OPTIONS parametresi bu davranışı değiştirebilir.
  • Yerde başlıyorsanız gaz kolu kısık olmalı; AUTO’ya geçtikten sonra gazı sıfırın üstüne aldığınız anda görev başlar. Havadaysanız AUTO’ya geçtiğiniz anda ilk komuttan başlar.
  • Yeniden AUTO’ya geçtiğinizde görev son komuttan devam eder; baştan başlaması için MIS_RESTART = 1.

Simülasyonda (bkz. SITL + Gazebo rehberi) bu ön koşulları elle tıklamak yerine betikle doğruluyoruz:

from pymavlink import mavutil

m = mavutil.mavlink_connection('udp:127.0.0.1:14550')
m.wait_heartbeat()

gps = m.recv_match(type='GPS_RAW_INT', blocking=True)
assert gps.fix_type >= 3, "3D fix yok"

m.mav.command_long_send(m.target_system, m.target_component,
    mavutil.mavlink.MAV_CMD_GET_HOME_POSITION, 0, 0, 0, 0, 0, 0, 0, 0)
home = m.recv_match(type='HOME_POSITION', blocking=True, timeout=5)
assert home is not None, "home noktasi yok"

m.set_mode('AUTO')          # Copter icin custom mode = 3

MAVLink tarafını companion computer üzerinden kurguluyorsanız MAVLink rehberimiz bu akışın devamını anlatıyor.

Geofence ve RTL irtifası

Geofence’i görevden ayrı düşünmeyin: iki sayı çelişirse araç görev ortasında mod değiştirir. FENCE_ENABLE = 1 ile açılır; FENCE_TYPE bir bit maskesidir (bit 0: maksimum irtifa, bit 1: home etrafında silindirik “tin can”, bit 2: poligon, bit 3: minimum irtifa). FENCE_RADIUS en az 30 m olmalı ve FENCE_MARGIN’den büyük kalmalı. İhlalde ne olacağını FENCE_ACTION belirler (RTL, LAND, BRAKE gibi).

RTL_ALT_M (eski adı RTL_ALT, cm) aracın eve dönmeden önce çıkacağı minimum irtifadır; ArduPilot dokümanına göre varsayılanı 15 m, 0 verirseniz mevcut irtifasında döner. RTL_ALT_TYPE = 1 ise bu irtifa zemin üstü olarak yorumlanır. Kontrol kuralı basit: RTL_ALT_M < FENCE_ALT_MAXFENCE_MARGIN, ve en yüksek waypoint’iniz de bu tavanın altında kalsın.

Sık düşülen tuzaklar

  • Yanlış irtifa referansı. Sahanın rakımı ile planı çizdiğiniz haritanın rakımı farklıysa Relative görev olduğu gibi kayar. Sahaya vardığınızda home’u yeniden set edip Verify Height ile bir tur geçin.
  • Home noktası sürprizi. Home arm anında yazılır. Aracı taşıyıp başka noktadan kalkarsanız eski görev dosyasındaki mesafeler doğru, irtifa referansı yanlış olur.
  • WP radius’u büyütmek. WP_RADIUS_M (eski WPNAV_RADIUS, cm; varsayılan 2 m) waypoint’in “tamamlandı” sayılma yarıçapıdır. Büyütürseniz araç köşe keser ve airdrop noktasını metrelerce ıskalayabilir; küçültürseniz dur-kalk davranışı ve süre artışı görürsünüz.
  • DO_SET_SERVO’nun ilk/son satıra konması veya SERVOn_FUNCTION’ın 0 bırakılmaması.
  • Terrain seçip TERRAIN_ENABLE = 0 bırakmak. Görev yazılır ama irtifa beklediğiniz gibi yorumlanmaz.
  • Write’tan sonra Read yapmamak. Telemetri linki zayıfsa görev eksik yazılabilir; Read 5 saniyelik bir sigorta.

Pratik özet

  1. Referansı bir kere seçin, görev boyunca değiştirmeyin. Düz sahada Relative, eğimli arazide Terrain (+ TERRAIN_ENABLE = 1 ve indirilmiş SRTM verisi).
  2. Tarama irtifasını GSD hesabıyla belirleyin, “yüksekten uçalım hepsi girsin” ile değil. Formülü kendi kameranızın HFOV değeriyle bir kez çalıştırıp not edin.
  3. Her Write’ın peşine Read koyun ve görevi .waypoints olarak sürüm sürüm saklayın.
  4. AUTO öncesi dört kontrol: 3D fix, home doğru, başka modda arm, gaz kısık. Bunları sahada ezberden değil kontrol listesinden okuyun.
  5. Fence ve RTL sayılarını görevle birlikte doğrulayın: RTL_ALT_M < FENCE_ALT_MAXFENCE_MARGIN, ve en yüksek waypoint bu tavanın altında.

Bu akışı SITL’de en az bir kez uçurmadan sahaya götürmüyoruz; simülasyonda 10 dakikada yakalanan bir referans hatası, sahada yarım günü yiyor.

  • mission-planner
  • ardupilot
  • otonom-ucus
  • waypoint
  • survey-grid

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