Mission Planner rotayı fazladan bir satırla geri veriyor
Mission Planner'da geri okuduğun rota bir öğe fazla çıkıyor. Sıfırıncı öğe Home noktası; MISSION_CURRENT alanlarını ve DO_JUMP hedefini buna göre oku.
Rotayı çizdin, Write dedin, sonra Read ile geri okudun. Ekranda altı satır vardı, geri gelen listede yedi öğe var. Ya da kodla bağlanıp sayıyı okudun, çizdiğinden bir fazla çıktı. Rotayı silip yeniden çizmek bir şey değiştirmiyor.
Görev listesinin sıfırıncı öğesi Home noktasıdır. Onu sen çizmedin, otopilot kendisi yazdı. Geri okumada fazladan gördüğün satır budur.
Ekranda gördüğün satır, otopilotta hangi numara
Flight Plan ekranındaki tablo 1'den başlar. Otopilotun belleğindeki liste 0'dan başlar ve 0. sıra Home noktasına ayrılmıştır. Bu yüzden ekrandaki 1. satır otopilotta da 1. sıradır; satır numaraları ile sıra numaraları birebir örtüşür, listede fazladan duran öğe en baştaki Home'dur.
| Flight Plan ekranı | Otopilottaki sıra (seq) | Komut |
|---|---|---|
| (karşılığı yok) | 0 | Home |
| 1. satır | 1 | TAKEOFF |
| 2. satır | 2 | WAYPOINT |
| 3. satır | 3 | DO_SET_ROI |
| 4. satır | 4 | WAYPOINT |
| 5. satır | 5 | WAYPOINT |
| 6. satır | 6 | RTL |
Tablodaki DO_SET_ROI satırına dikkat et. Drone o noktaya uçmaz, sadece burnunu çevirir. Ama listede bir sıra numarası tüketir. Yani ekrandaki dördüncü satır, üçüncü uçulan nokta olur.
Aynı mesaj, iki farklı sayma
Otopilotun yolladığı MISSION_CURRENT mesajında iki alan var: hangi öğede olduğunu söyleyen seq ve toplam kaç öğe olduğunu söyleyen total. Bu ikisi Home'u aynı şekilde saymıyor.
Beş satırlık rotada MISSION_CURRENT alanları
Beş satırlık bir rotada seq 5'e kadar çıkıyor, total ise 5'te sabit duruyor. Yer kontrol istasyonunu kendin yazıyorsan ve ilerlemeyi seq bölü total diye hesaplıyorsan, yüzde yüzü son öğe henüz uçulurken görürsün.
Grafikteki seq atlamalarına da bak. 3'ten doğrudan 5'e çıkıyor, çünkü aradaki 4 numaralı öğe bir DO_JUMP komutu ve bu alan yalnızca uçuşla ilgili komutları raporluyor. Dizinin başındaki atlamanın sebebi başka: araç AUTO moduna havadayken girdiği için kalkış öğesi raporlanmıyor.
Kendi aracında nasıl bakarsın
Ekranı yorumlamak yerine listeyi doğrudan araçtan iste. Aşağıdaki kod bağlanır, kayıtlı öğe sayısını okur ve her öğenin seq numarasını ekrandaki satır karşılığıyla yan yana yazar.
from pymavlink import mavutil
arac = mavutil.mavlink_connection("tcp:127.0.0.1:5760")
arac.wait_heartbeat()
# Araçtaki görev listesini baştan sona iste
arac.mav.mission_request_list_send(arac.target_system, arac.target_component)
sayim = arac.recv_match(type="MISSION_COUNT", blocking=True, timeout=10)
print("Araçta kayıtlı öğe sayısı:", sayim.count)
ADLAR = {16: "WAYPOINT", 20: "RTL", 21: "LAND", 22: "TAKEOFF",
177: "DO_JUMP", 201: "DO_SET_ROI"}
for i in range(sayim.count):
arac.mav.mission_request_int_send(arac.target_system, arac.target_component, i)
oge = arac.recv_match(type="MISSION_ITEM_INT", blocking=True, timeout=10)
if oge is None:
print(i, "cevap gelmedi")
break
ekran = "Home (ekranda yok)" if oge.seq == 0 else f"{oge.seq}. satır"
print(f"seq={oge.seq:<3} {ADLAR.get(oge.command, oge.command):<10} -> {ekran}")
# Okuma bitti, araca teyit gönder
arac.mav.mission_ack_send(arac.target_system, arac.target_component, 0)Altı satırlık bir rota yüklüyken çalıştırırsan şu çıktıyı alırsın:
Araçta kayıtlı öğe sayısı: 7
seq=0 WAYPOINT -> Home (ekranda yok)
seq=1 TAKEOFF -> 1. satır
seq=2 WAYPOINT -> 2. satır
seq=3 DO_SET_ROI -> 3. satır
seq=4 WAYPOINT -> 4. satır
seq=5 WAYPOINT -> 5. satır
seq=6 RTL -> 6. satırİlk satırdaki seq 0 senin çizmediğin öğedir. Geri kalan altı satır, ekranda gördüğün altı satırın birebir karşılığıdır.
DO_JUMP hedefini yazarken
DO_JUMP komutunda hedef alanına yazdığın sayı, rotanın kaçıncı uçuş noktası olduğu değil, listedeki sıra numarasıdır. DO_SET_ROI gibi yardımcı komutlar da sıra tükettiği için bu iki sayı ayrışır.
Örnek: Yük bırakma görevinde rotayı iki tur uçmak istiyorsun ve son satıra bir DO_JUMP koyuyorsun. Yukarıdaki tablodaki rotada üçüncü uçulan nokta ekrandaki dördüncü satır olduğu için hedefe 4 yazarsın; 3 yazarsan hedef DO_SET_ROI satırı olur, dönmek istediğin waypoint olmaz. Yükledikten sonra Read ile geri okuyup hedefin istediğin satıra denk geldiğine bak.
Rotanın başına dönmek istiyorsan yazacağın değer 1'dir. 0 Home'a aittir ve otopilot yükleme sırasında bu öğeyi reddeder. Üç belirtiyi şöyle ayırt edersin:
| Belirti | Ne anlama gelir |
|---|---|
| Geri okunan sayı, çizdiğin satırdan 1 fazla | Beklenen davranış. Fark Home öğesidir. |
| DO_JUMP hedefine 0 yazdın | Yükleme reddedilir, onayda MAV_MISSION_ERROR döner. |
| seq, total alanına eşitleniyor | İki alan farklı sayıyor: seq Home dahil, total hariç. |
Hata Mesajları
Aşağıdakiler görev yüklerken karşılaşacağın gerçek dönüş kodlarıdır.
MAV_MISSION_ERROR
Görev yükleme onayında bu kod dönerse öğelerden biri kabul edilmemiştir. DO_JUMP hedefini 0 yazarsan bu kod döner. Hedefi 1 yapıp aynı rotayı gönderirsen MAV_MISSION_ACCEPTED gelir.
MAV_MISSION_INVALID_SEQUENCE
Öğeleri otopilotun istediği sırayla göndermediğinde döner. Yükleme sırasında hangi seq numarasının istendiğini kendin takip etme; gelen isteğin seq alanını oku ve o öğeyi yolla.
MAV_MISSION_NO_SPACE
Gönderdiğin öğe sayısı otopilotun saklayabileceğinden fazla. Sayıya Home öğesinin de dâhil olduğunu unutma.
Bu konu hangi eğitimde işleniyor
Rota planlama ekranını, parametre listesini ve görev yükleme adımlarını baştan sona anlattığımız eğitim: Sıfırdan Mission Planner. Bu yazıdaki eşleme tablosunun uzun hâli, log imzaları ve kart bazlı farklar eğitimin içindeki derste var.
Bu yazı işinize yaradı mı?
Bu konuyu baştan sona öğrenin
Sezon: altı eğitimin hepsi 9 ay, ayda ₺790. Lise ve üniversite öğrencisine ayda ₺390, üye kodunuzla ilk ay ₺351. İstediğiniz ay bırakırsınız. Sezon'a başlayın · Öğrenciyim