Softivation

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.

Furkan IŞIKAY 6 dk okuma

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)0Home
1. satır1TAKEOFF
2. satır2WAYPOINT
3. satır3DO_SET_ROI
4. satır4WAYPOINT
5. satır5WAYPOINT
6. satır6RTL

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 MISSION_CURRENT seq alanı 5'e çıkarken total alanı 5'te sabit kalıyor; DO_JUMP olan 4 numaralı öğe raporlanmıyor.
Nereye bak: mavi basamağın kırmızı kesikli çizgiye değdiği an. seq son öğeye geldiğinde total ile eşitleniyor, Home iki alanda farklı sayılıyor.

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.

Python
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:

Kod
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:

BelirtiNe anlama gelir
Geri okunan sayı, çizdiğin satırdan 1 fazlaBeklenen davranış. Fark Home öğesidir.
DO_JUMP hedefine 0 yazdınYü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ı?

Ücretsiz kaynakPixhawk ve ArduPilot hata mesajları sözlüğüBu yazıdaki 3 mesaj ve benzerleri sözlükte: ne demek, neden çıkar, ilk neye bakılır.