Softivation

Python kodu konum alamıyor (bağlantı kurulu görünüyor)

Python kodu konum alamıyor, bağlantı kurulu görünüyor. Sebep akış hızının sıfır olması. Konum akışını açmayı ve verinin geldiğini doğrulamayı burada gör.

Furkan IŞIKAY 7 dk okuma

Kodu çalıştırıyorsun, ekrana bağlantı kuruldu yazısı düşüyor, sonra enlem boş, boylam boş, yükseklik boş. Kabloyu oynatıyorsun, baud oranını değiştiriyorsun, yer kontrol istasyonunu açıp bakıyorsun; orada her şey yerli yerinde duruyor.

Bu tabloda hat kopuk değil. Otopilot o veriyi hiç üretmiyor.

Bağlı sinyali başka, veri başka

Otopilot iki ayrı iş yapıyor. Birincisi, hattın ucunda birinin durduğunu bildiren sabit aralıklı bir sinyal.

İkincisi, konum, duruş ve uydu bilgisi gibi mesaj gruplarını akıtmak. Birinci iş her koşulda yapılıyor, ikincisi yapılmıyor.

Kod yalnızca birinci işi görüyor ve bağlantının kurulduğuna karar veriyor. İkinci iş için otopilotun bir akış tablosu var ve o tabloda çok rotorlu araçlar için bütün satırlar sıfır.

Sıfır olan bir satır, o grubun hiç doğmayacağı anlamına geliyor. Doğmayan mesaj hatta çıkmıyor, koda ulaşmıyor, öznitelik de dolmuyor. Beklemekle de geçmiyor; ertesi gün beklesen yine gelmez.

Aynı bağlantıda dört farklı durum

Kodun ne istediğini değiştirdikçe aynı bağlantıda farkı açıkça görürsün. Bağlantı hiç kopmaz, araç yeniden başlamaz; değişen tek şey konum mesajının hızı.

Aynı bağlantıda dört durum: bağlı sinyali hep var, konum yalnızca istenince

Bağlı sinyali dört bölümde de saniyede bir gelir; konum mesajı istek yokken sıfır, istek gönderilince 5 ve 4 Hz
Nereye bak: ilk bölüm. Bağlı sinyali akarken konum çizgisi sıfırda; kodun bağlantıyı kurulu sanıp boş konum okuduğu durum budur.

Şekilde ilk bölüme bak: bağlı sinyali akıyor, konum mesajı sıfırda. İstek gönderildiği anda aynı hat üzerinden konum mesajı gelmeye başlıyor.

En sık yapılan hata

Akış hızını bir kere ayarlayıp unutmak. Çok rotorlu araçta akış isteğiyle gelen hız kalıcı değil; otopilot kapanıp açıldığında değer sıfıra dönüyor. Kod her açılışta isteği yeniden göndermek zorunda.

Örnek: Sabahki ilk uçuşta her şey yolunda; batarya değişiminde drone'u kapatıp açıyorsun, kodun yine "bağlı" yazıyor ama enlem ve boylam boş kalıyor. Sabah gönderdiğin akış isteği otopilotla birlikte sıfırlandı. Kodun bağlantıyı her kurduğunda, batarya değişiminden sonra da, akış isteğini yeniden gönderip ilk konum mesajını görmesi gerekir.

Çalışan istek

İstek göndermek yetmiyor, gönderdiğinin karşılık bulduğunu görmek gerekiyor. Otopilot isteği kabul ettiğini bildirebilir ve yine de tek bir mesaj yollamayabilir. Aşağıdaki kısa parça isteği gönderiyor, sonra mesajın kendisini bekliyor ve gelmezse tekrar deniyor.

Python
from pymavlink import mavutil

# Otopilota baglan ve ilk bagli sinyalini bekle
arac = mavutil.mavlink_connection("tcp:127.0.0.1:5760")
arac.wait_heartbeat()
print("bagli:", arac.target_system, arac.target_component)

def konum_akisini_ac(arac, hz=5):
    """GLOBAL_POSITION_INT icin mesaj araligi ister ve gercekten aktigini dogrular."""
    aralik_us = int(1_000_000 / hz)
    for deneme in range(1, 6):
        arac.mav.command_long_send(
            arac.target_system, arac.target_component,
            mavutil.mavlink.MAV_CMD_SET_MESSAGE_INTERVAL, 0,
            mavutil.mavlink.MAVLINK_MSG_ID_GLOBAL_POSITION_INT,
            aralik_us, 0, 0, 0, 0, 0)
        # Onay tek basina yeterli degil: mesajin kendisini bekle
        veri = arac.recv_match(type="GLOBAL_POSITION_INT", blocking=True, timeout=3)
        if veri is not None:
            print("akis acildi, deneme:", deneme)
            return True
        print("akis yok, tekrar isteniyor:", deneme)
    return False

if not konum_akisini_ac(arac):
    raise SystemExit("Konum mesaji hic gelmedi. Akis hizini ve kanal secenegini kontrol et.")

for _ in range(5):
    v = arac.recv_match(type="GLOBAL_POSITION_INT", blocking=True, timeout=3)
    print("enlem %.7f  boylam %.7f  yerden yukseklik %.2f m" %
          (v.lat / 1e7, v.lon / 1e7, v.relative_alt / 1000.0))

Buradaki kritik satır, onay yerine mesajın kendisini bekleyen satır. Onay yalnızca isteğin işlendiğini gösterir; akışın başladığını ancak gelen ilk mesajdan anlarsın.

Açılışın ilk saniyelerinde sıfır görürsen

Akışı açtıktan hemen sonra ikinci bir yanılgı bekliyor: mesaj gelmeye başlar ama içindeki sayılar sıfır çıkabilir. Bu, mesajın gelmediği anlamına gelmiyor; otopilot henüz konum başlangıcını oturtmamış demek.

Aynı kodu açılıştan hemen sonra ve yarım dakika sonra çalıştırırsan şunu alırsın:

Kod
# hemen açılıştan sonra
bagli: 1 0
akis acildi, deneme: 1
enlem 0.0000000  boylam 0.0000000  yerden yukseklik 0.00 m
enlem 0.0000000  boylam 0.0000000  yerden yukseklik 0.00 m
enlem 0.0000000  boylam 0.0000000  yerden yukseklik 0.00 m
enlem 0.0000000  boylam 0.0000000  yerden yukseklik 0.00 m
enlem 0.0000000  boylam 0.0000000  yerden yukseklik 0.00 m

# yarım dakika sonra, aynı kod
bagli: 1 0
akis acildi, deneme: 1
enlem 37.1590998  boylam 38.7969001  yerden yukseklik -0.01 m
enlem 37.1590998  boylam 38.7969001  yerden yukseklik -0.01 m
enlem 37.1590998  boylam 38.7969001  yerden yukseklik -0.01 m
enlem 37.1590998  boylam 38.7969001  yerden yukseklik -0.01 m
enlem 37.1590998  boylam 38.7969001  yerden yukseklik -0.01 m

Boş öznitelik ile sıfır değer aynı şey değil. Birincisinde mesaj hiç yok, ikincisinde mesaj var ama içi henüz dolmamış. Kodda bu ikisini ayırmazsan yanlış yerde arama yaparsın.

Hata Mesajları ve Anlamları

dronekit.TimeoutError: wait_ready experienced a timeout after 30 seconds.

Kod öznitelikler dolsun diye bekliyor, mesajlar hiç gelmediği için bekleme süresi doluyor. Hattın kopuk olduğu anlamına gelmiyor; akış hızı sıfırken de bu satır çıkar.

Bu satır bir uyarı, hata değil. Burada eksik olan bağlı sinyalinin kendisi, yani sorun akış hızında değil hatta. Kablo, baud ve seri port protokolüne bak.

İstediğin mesajı otopilot hiç üretmiyor. Akış hızını yükseltmek bir şey değiştirmez, çünkü ortada bir akış yok. Bu satır yalnızca simülasyonda basılır; kartta karşılığı isteğin reddedilmesidir.

Sahada ne değişir

Akış tablosunu işleten kod, kartta çalışan kodun aynısı. Sahada fark hatta çıkıyor: telemetri modülünde paket kaybı varsa mesaj doğuyor ama sana ulaşmıyor.

İki durumu ayırt etmek için otopilotun mesajı ürettiğini önce kısa kabloyla doğrula, menzil sorununa sonra bak.

Bu konuyu uçtan uca çalışmak istersen

Akış hızları, öznitelik dinleyicileri ve otonom komutların tamamı Python ile Sıfırdan İHA Kontrolü eğitiminde adım adım işleniyor. Bu yazıdaki tabloyu derste karar zinciri, kaynak kod kanıtı ve log imzası tablolarıyla birlikte bulacaksın.

Bu yazı işinize yaradı mı?

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