C# yer kontrol istasyonunda parametre eksik geliyor
C# yer kontrol istasyonunda parametre listesi neden eksik geliyor? ArduPilot listeyi tek seferde gönderir, kaybolan parametreyi otomatik yeniden yollamaz.
C# ile yazdığın yer kontrol istasyonu ArduPilot'a bağlanıyor, telemetri akıyor ama parametre listesi her seferinde eksik geliyor. Bazen 1200 parametre bekliyorsun, ekrana 1150 civarı düşüyor ve hangi 50 tanesinin gitmediğini bilmiyorsun.
Sebep ArduPilot'un parametreleri gönderme biçimi. Liste bir kere akıtılır, yolda kaybolan parametre kendiliğinden tekrar gelmez.
Neden oluyor
Yer istasyonu bağlanınca listenin tamamını ister. ArduPilot da elindeki her parametreyi ilk sıradan başlayarak tek tek yollar; her mesajda o parametrenin sıra numarası ve listedeki toplam parametre sayısı yazar.
Bu akış hattın kaldırabileceği hıza göre kısılır. Bağlantıda donanımsal akış kontrolü yoksa ArduPilot her turda yalnızca birkaç mesaj gönderir, çünkü daha hızlı gönderim hattı tıkar.
Resmî ArduPilot dokümanı da MAVLink'in teslimat garantisi vermediğini, bu yüzden yer istasyonunun eksik parametreleri kendisinin fark edip yeniden istemesi gerektiğini söylüyor. Akışı neyin yavaşlattığı ve tur başına kaç mesaj gittiği ise yalnızca kaynak kodda var.
Mesajlar hangi sırayla gidiyor
Yer istasyonu PARAM_REQUEST_LIST gönderir. ArduPilot buna index 0'dan başlayan PARAM_VALUE mesajlarıyla cevap verir; her mesaj parametrenin kendi index'ini ve toplam sayıyı (param_count) taşır.
Akış kontrolü (RTS/CTS) yoksa bir turda en fazla 5 PARAM_VALUE gider. Şekildeki kırmızı çarpıya bak: index 37 yolda kaybolursa ArduPilot onu bir daha göndermez, eksiği yer istasyonu bulup tek tek ister.
Parametre listesi tek seferde akar, kaybolan geri gelmez
Tur başına 5 mesaj sınırı resmî dokümanda geçmiyor. GCS_Param.cpp içindeki handle_param_request_list() ve queued_param_send() fonksiyonlarında duruyor.
Bağlantı tipi neden fark yaratıyor
Pixhawk'ı bilgisayara USB ile bağladığında ArduPilot, o kanalda akış kontrolünü var sayar (hal.gpio->usb_connected() true dönünce). Bu yüzden USB üzerinden indirilen parametre listesi pratikte tek seferde ve hızlı tamamlanır.
Raspberry Pi ya da başka bir yardımcı bilgisayarı TELEM portuna sade bir UART (yalnızca TX, RX, GND) ile bağladığında akış kontrolü yok sayılır. Düşük baud hızında, uzun parametre listesinde bu, gerçek paket kaybı ihtimalini artırır.
Bilgisayarda TCP üzerinden test edersen bu farkı göremezsin, çünkü TCP teslimatı zaten garanti eder.
Örnek: Yer istasyonunu masada Pixhawk'a USB ile bağlayıp geliştirdin, parametre listesi her seferinde eksiksiz geldi. Sahada aynı yer istasyonu Raspberry Pi üzerinden TELEM hattıyla konuşuyor ve kalkıştan önce değiştirmek istediğin parametre listede görünmüyor. Kod değişmedi, hat değişti; ilk kayıp o gün ortaya çıkar.
En sık yapılan hata: GCS'in 'akış durdu' anını 'liste tamamlandı' sanması. Kısa bir sessizlik penceresinden sonra dinlemeyi kesen bir okuyucu, gerçekte kaybolmuş parametreleri hiç fark etmez.
Çözüm
Gelen her PARAM_VALUE'nun index'ini bir kümede topla. Akış durduğunda, 0 ile param_count-1 arasında kümede olmayan index'leri çıkar ve yalnızca onlar için PARAM_REQUEST_READ gönder. ArduPilot tek bir index istendiğinde yalnızca o parametreyi geri döndürür.
public class ParamListTracker
{
private readonly HashSet<ushort> _received = new();
private ushort _paramCount;
public void OnParamValue(ushort paramIndex, ushort paramCount)
{
_paramCount = paramCount;
_received.Add(paramIndex);
}
public IReadOnlyList<ushort> FindMissingIndexes()
{
var missing = new List<ushort>();
for (ushort i = 0; i < _paramCount; i++)
{
if (!_received.Contains(i)) missing.Add(i);
}
return missing;
}
public bool IsComplete() => _paramCount > 0 && _received.Count == _paramCount;
}
Eksik liste nasıl görünür
1369 parametrelik bir listede 37, 812, 813 ve 1200 numaralı index'ler kaybolursa bu sınıf eksik dört index'i bulur. Her biri için PARAM_REQUEST_READ gönderdiğinde liste tamamlanır. Çıktı şuna benzer:
received=1365 / paramCount=1369
complete=False
missingCount=4
missingIndexes=37,812,813,1200
-> PARAM_REQUEST_READ gonderiliyor: param_index=37
-> PARAM_REQUEST_READ gonderiliyor: param_index=812
-> PARAM_REQUEST_READ gonderiliyor: param_index=813
-> PARAM_REQUEST_READ gonderiliyor: param_index=1200
tamamlandiktan sonra complete=True
Hata Mesajları
Bu sorunun ArduPilot tarafında bir hata metni yok; kaybolan parametre için uyarı gelmez. Eksikliği yalnızca kendi sayacın gösterir. Yukarıdaki sınıfın çıktısında şu iki satıra bak:
complete=False satırı: gelen index sayısı param_count'a ulaşmamış. Akış durduysa liste bitmiş değildir, eksik index'leri iste.
missingIndexes=37,812,813,1200 satırı: hangi parametrelerin kaybolduğunu söyler. Bu index'lerin her biri için ayrı bir PARAM_REQUEST_READ gönder.
Bu konuyu daha derinden görmek istersen
Kaynak kodun karar sırasını, gerçek parametre varsayılanlarını, kart bazlı farkları ve hızlı teşhis kartını Sıfırdan İleri Seviyeye C# eğitiminin ilgili dersinde bulabilirsin.
Softivation YKİ kütüphanesi: C# ile kendi yer kontrol istasyonunu yazarken MAVLink bağlantısı, Türkçe dokümantasyon ve hazır test arayüzüyle başla.
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