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.
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
Ş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.
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:
# 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 mBoş ö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.
Link timeout, no heartbeat in last 5 seconds
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.
No ap_message for mavlink id (141)
İ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ı?
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