Softivation

Pixhawk telemetrisi neden havada kopuyor

Telemetri kopuyor ama Mission Planner'da sinyal dolu görünüyor. RADIO_STATUS alanlarıyla hattın doymuş mu zayıf mı olduğunu ayırt et ve kendi hattını ölç.

Furkan IŞIKAY 9 dk okuma

Drone havalanıyor, ilk birkaç dakika her şey normal. Sonra Mission Planner ekranında rakam akışı duruyor, harita üstündeki ikon donuyor. Bir süre sonra kendi kendine geri geliyor, sonra yine kesiliyor.

Çoğu kişi burada menzil sorunu olduğunu düşünüp anten arıyor. Bazen haklı çıkıyor. Ama aynı belirti, drone yerden elli metre uzaktayken de olabiliyor ve o zaman anten değiştirmek hiçbir şeyi düzeltmiyor.

Ayırt etmenin yolu var. Radyo, hattın kendi durumunu otopilota söylüyor; sadece nereye bakacağını bilmek gerekiyor.

Radyo zaten sana durumunu söylüyor

SiK radyo, MAVLink akışının içine kendi durum mesajını sokuyor. Mission Planner bunu sinyal çubuğu olarak gösteriyor ama çubuk, içindeki en önemli bilgiyi saklıyor.

Bu mesaj dört ayrı soruyu cevaplıyor: senin tarafın ne duyuyor, karşı taraf ne duyuyor, radyonun gönderim tamponunda ne kadar boş yer kaldı ve gürültü tabanı ne. İki tarafın sinyali arasındaki fark büyükse sorun tek yönlüdür ve hangi ucun anteniyle uğraşacağın belli olur.

Asıl yanıltıcı olan tampon. Tampon doluluğu bir sinyal göstergesi değildir ve sinyal mükemmelken bile dolabilir.

Sinyal tamken donmasının sebebi

Radyo, taşıyabileceğinden fazla veri gelirse tamponu dolduruyor. Otopilot bunu görüyor ve gönderim hızını kendisi kısıyor. Yani ekranı çoğu zaman otopilotun kendi frenlemesi donduruyor; sinyal o sırada gayet iyi olabilir.

Bu fren keyfî değil, sabit eşiklere bağlı. Şekilde tampon boşluğu azaldıkça her raporda gönderim aralığına ne kadar eklendiğine bak.

Tampon doldukça otopilot kendi gönderimini yavaşlatır

Basamak grafiği: tampon boşluğu yüzde 20'nin altındaysa her raporda gönderim aralığına 60 ms, 20 ile 50 arasında 20 ms eklenir; 50 ile 90 arası ölü banttır; 90'ın üstünde 20 ms, 95'in üstünde 40 ms çıkarılır.
Nereye bak: soldaki iki basamak. Sinyal ne kadar iyi olursa olsun tampon boşluğu %50'nin altına inince ekrana gelen veri seyrekleşir.

Tampon yüzde yirminin altına inince her raporda gönderim aralığına altmış milisaniye ekleniyor. Toplam yavaşlama iki saniyede duruyor, ama mesajlar arası süre altmış saniyeye kadar uzayabiliyor.

En sık yapılan hata burada başlıyor: ekran dondu diye Mission Planner'dan akış hızlarını yükseltmek. Hat zaten doymuşken hızı artırmak tamponu daha da doldurur ve otopilot daha sert kısar.

Mesajın alanlarını tanı

Radyonun kendi ürettiği bu mesajın adı RADIO_STATUS (mesaj 109). Mission Planner'ın sinyal çubuğunun arkasındaki alanlar şunlar:

AlanNe söyler
rssisenin tarafının duyduğu sinyal
remrssikarşı tarafın duyduğu sinyal
txbufradyonun gönderim tamponunda kalan boş yer (%)
noisegürültü tabanı
rxerrorsaçılıştan beri hatalı paket sayısı
fixedECC ile düzeltilen paket sayısı

Yukarıdaki eşikler ArduPilot kaynağında libraries/GCS_MAVLink/GCS_Common.cpp içindeki handle_radio_status fonksiyonundan geliyor: txbuf 20'nin altında +60 ms, 50'nin altında +20 ms, 90'ın üstünde −20 ms, 95'in üstünde −40 ms.

Kendi hattını ölç

Sinyal çubuğuna bakmak yerine sayı üret. Aşağıdaki kod hatta düşen çerçeveleri MAVLink sıra numarasındaki boşluklardan sayıyor ve radyo durum mesajı geliyorsa alanlarını basıyor.

Drone yerdeyken, motorlar dururken bir kez çalıştır. Sonra motorları çalıştırıp tekrar çalıştır. İki çıktı arasındaki fark, girişimin ne kadarını motorların ürettiğini gösterir.

Python
from pymavlink import mavutil
import time

# SiK radyo takiliysa: mavutil.mavlink_connection('/dev/ttyUSB0', baud=57600)
baglanti = mavutil.mavlink_connection('tcp:127.0.0.1:5760')
baglanti.wait_heartbeat()
print('heartbeat geldi, olcum basliyor')

# Copter'da akis hizlari varsayilan olarak sifir, once akisi iste
for akis, hiz in [(mavutil.mavlink.MAV_DATA_STREAM_EXTENDED_STATUS, 2),
                  (mavutil.mavlink.MAV_DATA_STREAM_POSITION, 3),
                  (mavutil.mavlink.MAV_DATA_STREAM_EXTRA1, 4)]:
    baglanti.mav.request_data_stream_send(
        baglanti.target_system, baglanti.target_component, akis, hiz, 1)

son_seq = None
bosluk = saglam = bozuk = 0
baslangic = time.time()

while time.time() - baslangic < 60:
    msg = baglanti.recv_match(blocking=True, timeout=2)
    if msg is None:
        continue
    if msg.get_type() == 'BAD_DATA':
        bozuk += 1
        continue
    saglam += 1
    seq = msg.get_header().seq
    if son_seq is not None:
        fark = (seq - son_seq) & 0xFF
        if fark != 1:
            bosluk += (fark - 1) & 0xFF
    son_seq = seq
    if msg.get_type() == 'RADIO_STATUS':
        print('rssi=%d remrssi=%d txbuf=%d noise=%d rxerrors=%d'
              % (msg.rssi, msg.remrssi, msg.txbuf, msg.noise, msg.rxerrors))

toplam = saglam + bosluk
oran = 100.0 * bosluk / toplam if toplam else 0.0
print('saglam=%d  bosluk=%d  bozuk=%d  kayip=%.2f%%' % (saglam, bosluk, bozuk, oran))

Bağlantı satırını kendi portuna göre değiştir. SiK radyo yer tarafında USB'den görünür, Linux'ta genelde şu adrestedir:

Kod
/dev/ttyUSB0   57600 baud

Kayıpsız bir hatta kodu çalıştırırsan şuna benzer bir çıktı alırsın:

Kod
heartbeat geldi, olcum basliyor
saglam=1962  bosluk=0  bozuk=4  kayip=0.00%

Örnek: Harita donduğunda kodun bastığı RADIO_STATUS satırına bak. rssi ile remrssi ikisi de yüksek, txbuf 50'nin altındaysa hat doymuştur; anten değiştirmek yerine akış hızını düşür. remrssi rssi'den belirgin biçimde düşükse sorun tek yönlüdür; önce drone tarafındaki antene bak.

Hat neden birden çöker

Bir MAVLink çerçevesi onlarca bayt uzunlukta olduğu için tek bir bozuk bayt bütün çerçeveyi çöpe atar. Bu yüzden kayıp sezgiye ters biçimde artar: binde iki bayt kaybı çerçevelerin yüzde seksen ikisini götürür.

Kodun kaybı yakaladığını kendin görmek istersen onu SITL'e bağla ve SIM_UART_LOSS parametresiyle hatta bayt kaybı ekle. Şekildeki sayılar ArduCopter 4.7.0'da her basamak için 18 saniyelik ölçümden geliyor; kendi ölçümünde sayılar birebir aynı çıkmaz.

Bayt kaybı binde ikiye çıkınca çerçevelerin çoğu gider

Bayt kaybı yüzde 0'da çerçeve kaybı yüzde 0; yüzde 0,2'de yüzde 82,08; yüzde 0,5'te yüzde 94,07; yüzde 1'de yüzde 96,05.
Nereye bak: 0 ile 0,2 arasındaki dik sıçrama. Noktalar arasındaki kesik çizgi yalnızca sırayı gösterir, ara değer ölçümü değildir.

Kodun saydığı bozuk çerçeve sayısı da aynı yönde büyür: 3, 303, 757 ve 1079. Pratikte hat ya çalışır ya çökmüştür; "biraz zayıf ama idare eder" diyebileceğin bir ara bölge yok.

İki radyo aynı ayarda mı

Hat hiç kurulmuyorsa ya da yerde bile kopuyorsa, sıradaki şüpheli ayar uyuşmazlığı. Bazı ayarların iki radyoda birebir aynı olması zorunlu, bazıları serbest.

Ayarlar
İki radyoda aynı olmak zorundafirmware sürümü, AIR_SPEED, MIN_FREQ, MAX_FREQ, NUM_CHANNELS, NETID, ECC, LBT_RSSI, MAX_WINDOW
Farklı olabilirSERIAL_SPEED (USB/seri hız), TXPOWER, DUTY_CYCLE

Liste ardupilot.org'daki SiK Radio Advanced Configuration sayfasından. Zorunlu ayarlardan tek bir tanesi tutmazsa link kurulur gibi görünür ama veri geçmez.

LED'in sabit yeşil olması yanıltıcıdır. O sadece iki radyonun birbirini bulduğunu gösterir, MAVLink verisinin geçtiğini değil.

Eski anlatımların tıkandığı yer

Akış hızını düşürmek için internetteki hemen her kaynak SR0_ ve SR1_ ile başlayan parametreleri söylüyor. ArduCopter 4.7.0'ın parametre listesinde bu adlardan hiçbiri yok.

Adları değişmiş. Artık MAV1_ ve MAV2_ önekiyle geçiyorlar, SYSID_MYGCS ise MAV_GCS_SYSID olmuş. Olmayan bir parametreyi yazmaya çalışınca hata da almıyorsun, sadece hiçbir şey olmuyor.

Kod
SR1_EXTRA1      ->  MAV2_EXTRA1
SR1_POSITION    ->  MAV2_POSITION
SYSID_MYGCS     ->  MAV_GCS_SYSID  (varsayilan 255)

Kendi kartında hangisinin geçerli olduğunu görmek için Mission Planner'ın tam parametre listesinde MAV yazıp aratman yeterli.

Hata Mesajları ve Anlamları

Telemetri kesildiğinde Mission Planner'ın mesaj penceresine düşen satırlar. Hepsi ArduCopter kaynak kodundaki birebir metinlerdir.

GCS Failsafe

Yer istasyonundan beş saniye boyunca heartbeat gelmedi ve FS_GCS_ENABLE sıfırdan farklı. Süre FS_GCS_TIMEOUT ile ayarlanır, varsayılanı 5 saniyedir. Bu mesaj sinyal seviyesine bakmaz; sadece heartbeat sayacına bakar.

GCS Failsafe - Continuing Pilot Control

Failsafe tetiklendi ama pilot kumandayla uçuşu sürdürdüğü için otopilot müdahale etmedi. FS_OPTIONS parametresinin dördüncü biti bunu sağlar ve varsayılan olarak açıktır.

GCS Failsafe - Continuing Landing

Failsafe geldiğinde drone zaten iniş yapıyordu ve FS_OPTIONS'ta inişe devam seçeneği (üçüncü bit) açık. Otopilot inişi kesmeden tamamlıyor.

GCS Failsafe Cleared

Heartbeat geri geldi. Dikkat: uçuş modu kendiliğinden eski haline dönmez, failsafe hangi moda geçirdiyse orada kalır.

Sahada ne değişir

Bu belirtilerin çoğu masa üstünde ortaya çıkmaz. Motorlar dönerken güç hattındaki gürültü, gövde içindeki anten konumu ve batarya kütlesinin sinyali gölgelemesi hep uçuş sırasında devreye girer.

Ölçüm için basit bir kural var: rssi ile noise arasındaki farkı ikiye böl, elindeki fade margin desibel cinsinden çıkar. Her 6 dB menzili ikiye katlar. İki radyoyu bir metre arayla tutup baktığında standart bir SiK radyoda rssi değerinin 190 üstünde olması beklenir.

Bunun altındaysa anten ya da radyo kusurludur ve havada yapacağın hiçbir ayar bunu kurtarmaz.

Konunun devamı kursta

Telemetri hattını uçtan uca kurmayı, kaynak koddaki karar zincirini ve log imzalarından arıza ayırt etmeyi anlatan ders İHA Haberleşme Teknolojileri eğitiminin içinde.

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.