Softivation

Python'dan RC override yolluyorum, Pixhawk drone kalkmıyor

RC override gönderiyorsun ama Pixhawk drone kalkmıyor. Gönderici kimliği, 3 saniyelik zaman aşımı ve gaz eşiğinin paketi nasıl yok saydığını adım adım gör.

Furkan IŞIKAY 8 dk okuma

Python'dan gaz paketini yolluyorsun, kodda hata yok, drone ARM oldu. Gaz değerini 1550 yapıyorsun ama drone yerinden kımıldamıyor.

Paketin otopilota ulaşıp ulaşmadığını bilemiyorsun, çünkü otopilot paketi reddederken sana bir hata mesajı göndermiyor. Önce bunu görünür yapalım, sonra sebebi bulalım.

Otopilot paketi gerçekten kabul etti mi

Otopilot, kanalları nasıl gördüğünü düzenli olarak geri yollar. Gönderdiğin 1550 orada gaz kanalının değeri olarak görünüyorsa paket kabul edilmiştir.

Görünmüyorsa gaz değerine ve ARM'a bakmayı bırak. Paket daha otopilotun kapısında takılmıştır.

Paket nerede düşüyor

Paketin önünde dört engel var: kimin gönderdiği, ne sıklıkla yenilendiği, gaz değerinin ne kadar düşük olduğu ve drone'un hangi modda olduğu. İlk ikisi hata mesajı üretmeden paketi düşürdüğü için en çok vakit kaybettiren onlardır.

Aşağıdaki şemada her engelin ekranda nasıl bir iz bıraktığını görüyorsun. Üstteki iki dalda tek iz, gaz kanalının yerinden oynamamasıdır.

Override paketi otopilota varınca nerede düşer

Override paketinin beş sonu: kimlik tutmazsa sessizce atılır, 3 saniyede yenilenmezse kanal kumandaya döner, gaz eşiğin altındaysa Radio Failsafe, GUIDED'de roll okunmaz, hepsi geçerse kanal 3 gönderilen değer olur
Nereye bak: üstteki iki dal ekrana hiçbir şey yazmaz; kanal 3'ün değişmediğini yalnızca otopilotun geri yolladığı kanal değerinden anlarsın.

Gönderici kimliği

Otopilot override paketini yalnızca MAV_GCS_SYSID parametresindeki kimlikten kabul eder ve varsayılan değeri 255'tir. Kodun başka bir kimlikle konuşuyorsa otopilot paketi sessizce atar.

Eski dokümanlarda bu parametre SYSID_MYGCS adıyla geçer, güncel sürümde adı değişti.

ArduCopter 4.7.1'de aynı gaz paketini 255, 254 ve 1 kimlikleriyle yollarsan yalnızca 255 kabul edilir. Diğer ikisinde otopilotun gördüğü gaz kanalı yerinden oynamaz.

Örnek: Sürü uçuşunda her aracın Raspberry Pi'sine ayrı bir kimlik verdin, diyelim 11 ve 12; araçlardaki MAV_GCS_SYSID ise 255'te kaldı. Pi'den yolladığın gaz paketi otopilota varıyor ama kimlik tutmadığı için sessizce atılıyor ve geri gelen kanal 3 yerinden oynamıyor. Ya kodun source_system değerini 255 yap ya da her aracın MAV_GCS_SYSID değerini o aracın Pi kimliğine eşle.

Paketi neden sürekli yollamalısın

Override kalıcı bir komut değildir. RC_OVERRIDE_TIME varsayılan olarak 3 saniyedir ve paketler kesilince kanal kumandaya geri döner.

Şekildeki alt şeride bak: tek paket gönderdiğinde gaz 3 saniye boyunca 1550'de kalır, sonra kumandanın değerine düşer. Bu yüzden paketi bir döngü içinde saniyede birkaç kez göndermelisin.

Kanal, son paketten 3 saniye sonra kumandaya döner

10 Hz döngüyle gönderilen override kanal 3'ü kod durana kadar 1550'de tutar, tek paket ise 3 saniye sonra düşer; iki durumda da son paketten 3 saniye sonra kanal kumandanın değerine döner
Nereye bak: kırmızı 3 sn okları son paketten başlar. Mavi çentikler gönderilen paketlerdir; döngü sürdükçe süre her pakette yeniden başlar. RC_OVERRIDE_TIME varsayılanı 3 saniyedir.

En sık yapılan hata: override'ı tek paketle gönderip drone'un hareket etmesini beklemek. Paket yaklaşık 3 saniyede düşer ve gaz kumandaya geri döner.

Gaz değeri ve mod

Gazı FS_THR_VALUE eşiğinin altına gönderirsen otopilot bunu radyo kaybı sayar ve failsafe'e geçer. Varsayılan eşik 975'tir.

Kaynak kodda GUIDED modu roll ve pitch kumanda kanalına hiç bakmaz, bu yüzden bu modda roll override'ı drone'u yönlendirmez. Gaz ve yön girdisini okuyan STABILIZE gibi bir modda dene.

Kullanmadığın kanala 0 yazmak o kanalı kumandaya bırakır. Aşağıdaki kod bu yüzden roll, pitch ve yaw için her pakette 1500 gönderir.

Kodu çalıştır

Kod kimliği okur, override'ı saniyede 10 kez gönderir ve otopilotun gördüğü kanal 3 değerini yazdırır. Pervaneleri sök, çünkü kod drone'u ARM eder.

Python · pymavlink
from pymavlink import mavutil
import time

BAGLANTI = "udpin:0.0.0.0:14550"   # kendi bağlantı adresin
GONDEREN_ID = 255                  # MAV_GCS_SYSID ile aynı olmalı

m = mavutil.mavlink_connection(BAGLANTI, source_system=GONDEREN_ID)
m.wait_heartbeat()
hedef = m.target_system

# 1) Otopilot hangi gönderici kimliğini GCS sayıyor
m.mav.param_request_read_send(hedef, 0, b"MAV_GCS_SYSID", -1)
p = m.recv_match(type="PARAM_VALUE", blocking=True, timeout=5)
print("MAV_GCS_SYSID =", int(p.param_value), "| bizim kimlik =", GONDEREN_ID)

# 2) RC_CHANNELS mesajını iste, otopilotun gördüğü değeri okuyacağız
m.mav.command_long_send(hedef, 0, mavutil.mavlink.MAV_CMD_SET_MESSAGE_INTERVAL,
                        0, 65, 100000, 0, 0, 0, 0, 0)

# 3) STABILIZE moduna al ve ARM et (pervaneler sökülü olsun)
m.mav.command_long_send(hedef, 0, mavutil.mavlink.MAV_CMD_DO_SET_MODE,
                        0, 1, 0, 0, 0, 0, 0, 0)
for _ in range(20):
    m.mav.command_long_send(hedef, 0, mavutil.mavlink.MAV_CMD_COMPONENT_ARM_DISARM,
                            0, 1, 0, 0, 0, 0, 0, 0)
    time.sleep(1)
    if m.motors_armed():
        break

# 4) Override'ı tek seferde değil, döngüyle gönder (10 Hz)
def gonder(gaz, roll=1500, pitch=1500, yaw=1500):
    m.mav.rc_channels_override_send(hedef, 0, roll, pitch, gaz, yaw, 0, 0, 0, 0)

def son_rc():
    rc = None
    while True:                      # birikmiş eski mesajları at, sonuncuyu al
        x = m.recv_match(type="RC_CHANNELS", blocking=False)
        if x is None:
            return rc
        rc = x

bitis = time.time() + 5
while time.time() < bitis:
    gonder(gaz=1550)
    time.sleep(0.1)
    rc = son_rc()
    if rc:
        print("otopilotun gördüğü kanal 3:", rc.chan3_raw)

Doğru çalışınca ekranda ne görürsün

Kimlik tutuyorsa kodu çalıştırdığında otopilotun gördüğü kanal 3, senin gönderdiğin değere eşit olur:

Kod
MAV_GCS_SYSID = 255 | bizim kimlik = 255
otopilotun gördüğü kanal 3: 1550
otopilotun gördüğü kanal 3: 1550
otopilotun gördüğü kanal 3: 1550
otopilotun gördüğü kanal 3: 1550
otopilotun gördüğü kanal 3: 1550
...

Kimlik tutmuyorsa aynı kod şu çıktıyı verir. Kanal 3 gönderdiğin 1550'ye hiç çıkmaz, nedeni de hiçbir yerde yazmaz:

Kod
MAV_GCS_SYSID = 255 | bizim kimlik = 1
otopilotun gördüğü kanal 3: 1000
otopilotun gördüğü kanal 3: 1000
otopilotun gördüğü kanal 3: 1000
otopilotun gördüğü kanal 3: 1000
otopilotun gördüğü kanal 3: 1000
...

Gerçek donanımda ne değişir

Paketin kabul edilmesi otopilot yazılımının kararıdır ve gerçek kartta da aynı işler. Telemetri hattındaki gecikmeyi ve gazın gerçek tepkisini ise ancak kendi drone'unda görebilirsin.

Resmî doküman da MAVLink üzerinden gelen kumandanın telemetri hattı yüzünden gecikmeli tepki verebildiğini yazıyor.

Hata Mesajları

Radio Failsafe

Gaz override'ını FS_THR_VALUE eşiğinin altına indirdiğinde görünür. FS_THR_ENABLE açıksa otopilot modu değiştirir. Çözüm: gazı 1000'in altına gönderme.

Radio Failsafe Cleared

Gaz değeri eşiğin üstüne döndüğünde görünür. Failsafe bitmiştir ama modu yine de kontrol et, otopilot seni eski moda geri almayabilir.

PreArm: Radio failsafe on

ARM denerken radyo failsafe aktifse görünür. Gaz değerini eşiğin üstüne getirip failsafe'in temizlendiğini bekle, sonra tekrar dene.

Python kursunda devamı

Bu davranışı kaynak koddan, log desenlerinden ve forum vakalarından adım adım ayıran ders, Python ile Sıfırdan İHA Kontrolü eğitiminin Güncel Eklemeler bölümünde duruyor.

Bu yazı işinize yaradı mı?

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