Softivation

Mission Planner ekranı donuyor (telemetri bağlı)

Mission Planner telemetri verisini geç gösteriyor, ekran donuyor. 57600 baud hattın kapasitesi, akış gruplarının bayt maliyeti ve kendi hattını ölçen kod.

Furkan IŞIKAY 7 dk okuma

Telemetri bağlı, sinyal seviyesi iyi, uçuş ekranında irtifa ve hız yazıyor. Sonra haritadaki drone bir yerde duruyor, birkaç saniye sonra zıplayarak yeni konumuna geçiyor.

Yatay durum göstergesi takılıyor, batarya değeri geç yenileniyor. Bağlantı kopmuyor, sadece ekran geriden geliyor.

Bu tabloda ilk şüpheli genelde telsiz oluyor: anten değişiyor, radyonun yeri değişiyor, baud yükseltiliyor. Çoğunda hiçbiri sonucu değiştirmiyor, çünkü sorun sinyalin kalitesinde değil, hattan geçirilmek istenen veri miktarında.

Hattın taşıyabileceği bayt sayısı sabit

57600 baud bir seri hat saniyede 57600 bit taşır. Yaygın 8N1 çerçevede her bayt için hatta 10 bit gider: sekiz veri biti, bir başlangıç, bir durdurma.

Hesabın sonucu tek bir sayı: saniyede 5760 bayt. Hattan bundan fazlasını geçirmek isteyen her şey beklemek zorunda kalır.

Akış hızı arttıkça yük nasıl büyüyor

Yer kontrol istasyonu bütün akış gruplarını aynı hıza çektiğinde hatta binen yük hızla birlikte büyür. Şekilde ArduCopter 4.7.0'da beş farklı istek için gelen paketlerin ham uzunluğunun saniyelik toplamı var.

İstenen akış hızı arttıkça hattaki bayt yükü

Akış isteği yokken 96 B/s, 1 Hz 1038, 2 Hz 2314, 4 Hz 4535, 10 Hz 11384 B/s; 57600 baud hattın sınırı 5760 B/s
Nereye bak: kırmızı çizgi. 4 Hz sütunu sınırın altında ama ona yakın; 10 Hz sütunu hattın taşıyabileceğinin iki katına çıkıyor.

Kırmızı çizgiye bak: dört hertzde hat yüzde 79 dolu, on hertzde istenen veri hattın taşıyabileceğinin iki katı.

Fazlalık havada kaybolmuyor. Otopilot gönderemediği mesajı atmıyor, sıraya alıyor ve bir sonraki turda yeniden deniyor. Ekranda gördüğün gecikme o sıranın uzamasıdır.

Akış hızını yükseltmek işi tersine çeviriyor

Ekran takılınca çoğu kullanıcı refleksle akış hızını yükseltiyor. Hat zaten doluysa bu, sıraya daha çok mesaj eklemekten başka bir şey yapmıyor; yeni veri eskisinin arkasına diziliyor ve ekrandaki değer daha da geriden geliyor.

Aynı şey parametre listesi inerken de oluyor. Kaynak kodda akış aralığına doğrudan bir çarpan uygulanıyor: parametre gönderilirken aralık dört katına, görev noktaları istenirken bir dört katına daha çıkıyor. Yani parametre penceresi açıkken ekranı firmware bilerek yavaşlatıyor.

Parametre indirmeye ayrılan pay da hattın kapasitesinden hesaplanır. libraries/AP_HAL/UARTDriver.h içindeki bw_in_bytes_per_second() öntanımlı olarak 5760 döndürür.

Sırayla neye bakılır

  1. Hat bağlı mı, veri hiç geliyor mu? HEARTBEAT düşüyorsa sorun bant genişliği değil, fiziksel hattır.
  2. Akış hızlarını kim belirliyor? Yer kontrol istasyonu her bağlanışta kendi hızını istiyor olabilir.
  3. Hattaki bayt yükünü ölç. Mesaj boylarını topla, saniyeye böl; tahmin etme.
  4. Yük hattın kapasitesini aşıyor mu? 57600 baud 8N1 hat saniyede 5760 bayt taşır.
  5. Aşıyorsa hangi akışı kısacağına karar ver. Ekranda okumadığın mesaj grubunu sıfırla.

İlk adımı atlama. Kalp atışı mesajı saniyede bir düşmüyorsa bant genişliğini bırak; kabloya, konnektöre ve iki radyonun ayar eşleşmesine bak.

Örnek: Pist kenarında Mission Planner açık, parametre penceresinden bir değer değiştirmek için listenin inmesini bekliyorsun; harita o sırada takılıyor. Takım arkadaşın akış hızını yükseltmeyi öneriyor. Listeye yukarıdaki sırayla bak: HEARTBEAT saniyede bir düşüyorsa hat sağlam, parametre indirme sürerken ekranın yavaşlaması beklenen davranış. Liste indikten sonra ekran hâlâ geriden geliyorsa kodu çalıştırıp doluluğu ölç, okumadığın akışı sıfırla.

Kendi hattındaki yükü ölç

Tahmin etmenin anlamı yok, ölçmek birkaç satır. Aşağıdaki kod hatta ne gelirse ham paket uzunluğunu topluyor ve sonucu baud değerinden çıkan kapasiteyle karşılaştırıyor. Nasıl çalıştırılacağı kodun en üstündeki açıklamada yazıyor.

Python · hat_yuku.py
"""Telemetri hattindaki gercek bayt yukunu olcer.
Kullanim: python3 hat_yuku.py /dev/ttyUSB0 57600 20
SITL icin: python3 hat_yuku.py tcp:127.0.0.1:5760 57600 20
"""
import sys, time, collections
from pymavlink import mavutil

adres = sys.argv[1] if len(sys.argv) > 1 else "tcp:127.0.0.1:5760"
baud = int(sys.argv[2]) if len(sys.argv) > 2 else 57600
sure = int(sys.argv[3]) if len(sys.argv) > 3 else 20

baglanti = mavutil.mavlink_connection(adres, baud=baud)
if baglanti.wait_heartbeat(timeout=30) is None:
    sys.exit("HEARTBEAT gelmedi, hat ayakta degil")

bayt = collections.Counter()
adet = collections.Counter()
basla = time.time()
while time.time() - basla < sure:
    m = baglanti.recv_match(blocking=True, timeout=1)
    if m is None or m.get_type() == "BAD_DATA":
        continue
    ham = m.get_msgbuf()
    bayt[m.get_type()] += len(ham) if ham else 0
    adet[m.get_type()] += 1

gecen = time.time() - basla
toplam = sum(bayt.values()) / gecen
butce = baud / 10.0                      # 8N1: her bayt 10 bit
print("olcum suresi      : %.1f sn" % gecen)
print("hattaki yuk       : %.0f B/s" % toplam)
print("hattin kapasitesi : %.0f B/s  (%d baud, 8N1)" % (butce, baud))
print("doluluk           : %%%.0f" % (100 * toplam / butce))
print("-" * 52)
for ad, b in sorted(bayt.items(), key=lambda x: -x[1])[:8]:
    print("%-24s %6.1f B/s  %5.1f Hz" % (ad, b / gecen, adet[ad] / gecen))

Dört hertzlik akışa bağlanıp çalıştırırsan şuna benzer bir çıktı alırsın:

Kod
olcum suresi      : 20.2 sn
hattaki yuk       : 3874 B/s
hattin kapasitesi : 5760 B/s  (57600 baud, 8N1)
doluluk           : %67
----------------------------------------------------
SIMSTATE                  224.7 B/s    4.0 Hz
ESC_TELEMETRY_1_TO_4      224.7 B/s    4.0 Hz
RC_CHANNELS               216.6 B/s    4.0 Hz
BATTERY_STATUS            212.6 B/s    4.0 Hz
GPS_RAW_INT               208.6 B/s    4.0 Hz
ATTITUDE                  202.1 B/s    5.1 Hz
SYS_STATUS                172.5 B/s    4.0 Hz
RAW_IMU                   164.5 B/s    4.0 Hz

Buradaki toplam grafikteki dört hertz sütunuyla birebir aynı değil. Aynı istek bir seferinde 4535, başka bir seferinde 3874 B/s verebilir, çünkü hangi mesajın hangi turda sıraya girdiği tur tur değişir. Kararı kendi hattında ölçtüğün sayıya göre ver.

Ekran takıldığında akış hızını yükseltmek en sık yapılan hata. Yük zaten hattın kapasitesinin üstündeyse hız artışı yalnızca sırayı uzatır.

Hata Mesajları ve Anlamları

Yer kontrol istasyonu ya da yardımcı bilgisayar, otopilotun akışa koymadığı bir mesaj için aralık istediğinde çıkar. Komut sonucu MAV_RESULT_DENIED döner, istenen mesaj hiç gelmez.

Kaynakta bu metin yalnızca bir derleme koşulu altında basılıyor, kendi kartında satırı görmeyebilirsin. Kartta bakacağın yer reddedilmiş komut sonucudur.

Getting Params

Mission Planner bağlanırken parametre listesini indirir ve bu satırda bekler. Hat doluyken bu aşama uzar; forumda dakikalarca süren, hatta hiç bitmeyen vakalar bildirilmiş. Bekleme sırasında canlı veri akmaya devam eder, bu yüzden bağlantı sağlam görünür.

High Latency enabled

Dar hatlar için ayrı bir çalışma kipi var. Seri portun protokolü 43 yapıldığında otopilot normal akışları kesip tek bir özet mesaja geçer ve bu satırı yazar. Uydu bağlantısı gibi çok dar hatlarda kullanılır; normal telsizde ekranın canlılığını kaybedersin.

Bu konunun devamı

Hattı ölçmek başlangıç. Hangi mesaj grubunun kapatılacağı, otopilotun sıraya alma kararını nereden verdiği ve tlog üzerinde bu davranışın imzasının nasıl okunacağı İHA Haberleşme Teknolojileri eğitimi içinde adım adım işleniyor.

Bu yazı işinize yaradı mı?

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