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.
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ü
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
- Hat bağlı mı, veri hiç geliyor mu? HEARTBEAT düşüyorsa sorun bant genişliği değil, fiziksel hattır.
- Akış hızlarını kim belirliyor? Yer kontrol istasyonu her bağlanışta kendi hızını istiyor olabilir.
- Hattaki bayt yükünü ölç. Mesaj boylarını topla, saniyeye böl; tahmin etme.
- Yük hattın kapasitesini aşıyor mu? 57600 baud 8N1 hat saniyede 5760 bayt taşır.
- 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.
"""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:
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 HzBuradaki 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ı
No ap_message for mavlink id (30000)
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ı?
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