Softivation

Raspberry Pi bağlıyken telemetri gelmiyor, hattı çoğalt

Raspberry Pi bağlıyken telemetri gelmiyorsa hat bölüşülmüştür. Seri portu tek proses açsın, akışı mavlink-router ile çoğalt; her uç aynı veriyi görsün.

Furkan IŞIKAY 6 dk okuma

Raspberry Pi'yi otopilota bağladın, kendi Python kodun telemetriyi okuyor. Sonra yer kontrol istasyonunu da aynı hatta bağlamak istiyorsun ve ekran boş kalıyor.

Kablo yerinde, baud doğru, kodun hâlâ veri basıyor. Bu tabloda kablo aramak zaman kaybı: bir MAVLink hattını iki program aynı anda okuyamaz.

Bir seri hattı iki program neden bölüşemez

Seri hat noktadan noktaya çalışır. Otopilot baytları sırayla gönderir, karşı taraftaki okuyucu onları toplayıp MAVLink çerçevesine dönüştürür.

İşletim sistemi aynı seri aygıtı ikinci kez açmaya izin verir ve bunu sana söylemez. İki proses aynı akıştan sırayla okur, her biri çerçevenin bir parçasını alır. Sağlaması tutmayan çerçeve sessizce atılır.

Şeklin üst yarısında baytların iki program arasında nasıl bölündüğüne bak. İkinci programın portu açması sessizdir; hata mesajı gelmediği için sorun kabloda aranır, oysa hat bölüşülmüştür.

Aynı baytlar: iki okuyucuya bölünürse, çoğaltıcıdan kopyalanırsa

Üst panel: Pixhawk'ın gönderdiği iki çerçevenin baytları /dev/serial0'ı açan iki program arasında bölünür, ikisi de yarım çerçeve alır ve çerçeveler atılır. Alt panel: portu yalnızca mavlink-routerd açar, yer kontrol istasyonu UDP 14550'den, Python kodu UDP 14551'den tam kopya alır.
Nereye bak: üst panelde iki programın kutusundaki renk dizisi yarım kalıyor; alt panelde her uca on iki baytın hepsi gidiyor.

Ağ tarafında tablo daha nettir. Tek istemci kabul eden bir uca ikinci bağlantı kurulur, bağlantı açık görünür, içinden tek bayt akmaz.

Tek okuyucu kur, akışı çoğalt

Çözüm, hattın önüne bir çoğaltıcı koymak. Seri portu tek bir proses açar; yer kontrol istasyonu, görev kodu ve kayıt aracı o prosesin açtığı ağ uçlarına bağlanır.

Şeklin alt yarısı bu düzeni gösteriyor. Uçlardan biri kapansa bile diğerleri akışı görmeye devam eder; seri porta dokunan proses değişmez.

Otopilotta iki ayrı telemetri portu varsa ikisini birden kullanabilirsin. TELEM1 telemetri radyosuna, TELEM2 yardımcı bilgisayara ayrılır; bunlar farklı seri portlardır ve birbirini engellemez. Çoğaltma ihtiyacı, tek portu birden çok programın paylaşması gerektiğinde çıkar.

Örnek: Görev kodun Pi üzerinde seri portu açmış, telemetriyi okuyor. Takım arkadaşın uçuşu yer istasyonundan izlemek için Pi'de aynı portu açan ikinci bir program başlatıyor; onun ekranı boş kalıyor, senin kodun da bir süre sonra akış kesildi basmaya başlıyor. Çoğaltıcıyı kurduğunda ikisi de aynı akışı görür: yer kontrol istasyonu 14550 ucundan, senin kodun 14551 ucundan.

Yapılandırma

Yardımcı bilgisayarda mavlink-router çalıştır. Seri ucu bir kez tanımla, her tüketici için ayrı bir UDP ucu aç.

mavlink-router yapılandırması
# /etc/mavlink-router/main.conf
[UartEndpoint to_fc]
Device = /dev/serial0
Baud = 57600

[UdpEndpoint gcs]
Mode = Server
Address = 0.0.0.0
Port = 14550

[UdpEndpoint gorev_betigi]
Mode = Normal
Address = 127.0.0.1
Port = 14551

Python tarafında tek değişiklik bağlantı adresi. Kodun artık seri porta değil, çoğaltılmış uca bağlanır.

Python
from pymavlink import mavutil

# Seri porta degil, router'in cogalttigi UDP ucuna baglan.
arac = mavutil.mavlink_connection("udpin:127.0.0.1:14551", source_system=251)

if arac.wait_heartbeat(timeout=30) is None:
    raise SystemExit("heartbeat gelmedi: once routerd calisiyor mu bak")

print("baglandi:", arac.target_system, arac.target_component)

arac.mav.request_data_stream_send(
    arac.target_system, arac.target_component,
    mavutil.mavlink.MAV_DATA_STREAM_ALL, 4, 1)

while True:
    m = arac.recv_match(type="ATTITUDE", blocking=True, timeout=5)
    if m is None:
        print("akis kesildi")
        continue
    print(round(m.roll, 3), round(m.pitch, 3), round(m.yaw, 3))

Çoğaltıcı arkasına iki istemci bağlarsan ikisi de aynı akışı eş zamanlı alır. Aynı uca doğrudan ikinci bir istemci bağlarsan bağlantı açık görünür ama tek bayt gelmez. ArduCopter 4.7'de istemcilerin aldığı mesaj sayıları şöyle:

İstemciAldığı mesajSüre
Tek istemci, doğrudan uçta29966 sn
Aynı uca ikinci istemci06 sn
Router arkası istemci A1101720 sn
Router arkası istemci B1101820 sn

Gerçek radyo hattında mutlak sayılar düşer; iki istemci arasındaki fark aynı kalır.

Aynı işi MAVProxy ile de yapabilirsin: bir tane --master ve istediğin kadar --out verirsin. MAVProxy zayıf bir Raspberry Pi'de işlemciyi yorabilir; ArduPilot dokümanı bu durumda mavlink-router'a geçmeyi öneriyor.

Hata Mesajları ve Anlamları

Aşağıdaki satırlar araçların kendi kaynak kodunda geçen dizelerdir. Hangisini görüyorsan bakacağın yer değişir.

MAVProxy seri porta bağlanıp heartbeat alamadığında çıktı şöyle akar:

Kod
Connect /dev/serial0 source_system=255
Log Directory:
Telemetry log: mav.tlog
Waiting for heartbeat from /dev/serial0
MAV> link 1 down

MAVProxy belirlenen süre boyunca tek paket almadığında bu satırı basar. Hat hiç akmıyor ya da başka bir proses aynı portu paylaşıyor demektir. Önce portu kimin açtığına bak.

Waiting for heartbeat from /dev/serial0

İlk heartbeat hiç gelmemiş. Burada paylaşım değil, temel bağlantı sorunu vardır: TX ile RX ters bağlanmış, baud uyuşmuyor ya da açtığın aygıt yolu yanlış olabilir.

Akış başlamış, sonra kesilmiş. Paylaşılan hatta tipik görüntü budur: çerçeveler bir süre toplanır, sonra iki okuyucu birbirinin baytını alır ve sağlama tutmaz.

Timeout in initializing connection.

DroneKit bağlantıyı kurdu, ama başlangıç parametre akışını tamamlayamadı. Bant genişliği yetmiyor olabilir; hattı ikinci bir programla paylaşıyorsan sebep de budur.

WARNING: You should uninstall ModemManager as it conflicts with APM and Pixhawk

Sistemde ModemManager kurulu. Bu servis USB seri aygıtları kendiliğinden açar ve hattı üçüncü bir taraf olarak tutar. Yardımcı bilgisayarda bu servisi kaldır.

Bu konuyu derinleştirmek istersen

Yardımcı bilgisayar ile yer kontrol istasyonu arasındaki hattı baştan sona kuran ders anlatımı ve uygulamalar İHA Haberleşme Teknolojileri eğitimi içinde. Kaynak kod kanıtları, log imzası tabloları ve saha vakaları da orada.

Bu yazı işinize yaradı mı?

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