İ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_SPEED → WP_SPD, RTL_ALT → RTL_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.

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_OPTIONSparametresi 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_MAX − FENCE_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(eskiWPNAV_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ı veyaSERVOn_FUNCTION’ın 0 bırakılmaması.- Terrain seçip
TERRAIN_ENABLE = 0bı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
- Referansı bir kere seçin, görev boyunca değiştirmeyin. Düz sahada Relative, eğimli arazide Terrain (+
TERRAIN_ENABLE = 1ve indirilmiş SRTM verisi). - 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.
- Her Write’ın peşine Read koyun ve görevi
.waypointsolarak sürüm sürüm saklayın. - 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.
- Fence ve RTL sayılarını görevle birlikte doğrulayın:
RTL_ALT_M<FENCE_ALT_MAX−FENCE_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