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.
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
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ç.
# /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 = 14551Python tarafında tek değişiklik bağlantı adresi. Kodun artık seri porta değil, çoğaltılmış uca bağlanır.
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:
| İstemci | Aldığı mesaj | Süre |
|---|---|---|
| Tek istemci, doğrudan uçta | 2996 | 6 sn |
| Aynı uca ikinci istemci | 0 | 6 sn |
| Router arkası istemci A | 11017 | 20 sn |
| Router arkası istemci B | 11018 | 20 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:
Connect /dev/serial0 source_system=255
Log Directory:
Telemetry log: mav.tlog
Waiting for heartbeat from /dev/serial0
MAV> link 1 downMAV> 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.
Link timeout, no heartbeat in last 5 seconds
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ı?
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