Softivation

Python kodu durunca drone RTL yapmıyor

Python kodun durunca drone RTL yapmıyor, FAILSAFE açık görünüyor. Otopilot yer istasyonunu hiç görmediği için GCS failsafe sayacı çalışmıyor; çözüm burada.

Furkan IŞIKAY 5 dk okuma

Yardımcı bilgisayardan GUIDED modda uçarken Python kodun durdu ya da bağlantı koptu. Beklentin drone'un eve dönmesiydi; oysa drone olduğu yerde asılı kaldı ve ekrana tek bir uyarı bile düşmedi.

Parametrelere bakınca her şey yerinde görünür: FAILSAFE açık, süre ayarlı. Asıl mesele otopilotun bir yer istasyonunu ne zaman gördüğünü saydığıdır.

Otopilot kodunu yer istasyonu saymıyor

ArduCopter, GCS failsafe'i son heartbeat'in üzerinden geçen süreye bakarak işletir. Bu sayaç ancak otopilot en az bir kez kendi yer istasyonundan heartbeat gördüyse başlar.

Hiç görmediyse sayaç sıfırda kalır ve failsafe kontrolü daha başında sessizce sonlanır. Şekilde ikinci soruya bak: senin kodun tam olarak orada düşüyor.

Otopilot GCS failsafe'e karar verirken hangi sırayla bakıyor

GCS failsafe kontrolü: failsafe kapalıysa hiçbir şey olmaz, yer istasyonu hiç görülmediyse sessizce çıkar, süre dolmadıysa bekler, dolduysa FAILSAFE eylemi başlar
Nereye bak: ikinci soru. Otopilot bir yer istasyonundan hiç heartbeat almadıysa kontrol burada biter; süre sorusuna hiç gelinmez. Kaynak: ArduCopter/events.cpp, failsafe_gcs_check().

pymavlink ile bağlanan çoğu Python kodu komut gönderir ama heartbeat göndermez. Otopilotun gözünde böyle bir program yer istasyonu sayılmaz. Kod çalışırken de çökerken de failsafe sayacı hiç dönmez.

Aynı ayar, iki farklı son

İki durumda da FS_GCS_ENABLE, FS_GCS_TIMEOUT ve MAV_GCS_SYSID birebir aynı. Tek fark, kodun saniyede bir heartbeat gönderip göndermediği.

Kod durduğunda iki durumda otopilotun modu

Heartbeat göndermeyen kodda mod GUIDED kalıyor; saniyede bir heartbeat gönderen kod durunca 5 saniye sonra mod RTL'e geçiyor
Nereye bak: alttaki sarı pencere. Sayaç son heartbeat'te başlar ve FS_GCS_TIMEOUT dolunca mod RTL olur. Üstte heartbeat hiç gelmediği için böyle bir pencere yok.

Şekildeki üst şeride bak: heartbeat hiç gönderilmezse drone 15 metrede GUIDED'da asılı kalır, yarım dakika geçse de bir şey değişmez. Alt şeritte heartbeat gönderilip sonra kesilir; otopilot yaklaşık beş saniye içinde RTL'e geçer ve alçalmaya başlar.

Koduna heartbeat ekle

Çözüm, kodun doğru kimlikle heartbeat göndermesi. Bağlantıyı açarken source_system değerini yer istasyonu numaranla eşle, sonra ayrı bir iş parçacığında saniyede bir heartbeat yolla.

Python
from pymavlink import mavutil
import threading, time

master = mavutil.mavlink_connection('udpout:127.0.0.1:14550', source_system=255)
master.wait_heartbeat()

def kalp_at():
    while True:
        master.mav.heartbeat_send(mavutil.mavlink.MAV_TYPE_GCS,
                                  mavutil.mavlink.MAV_AUTOPILOT_INVALID, 0, 0, 0)
        time.sleep(1)

# Ayri bir is parcaciginda saniyede bir heartbeat: kod canliyken
# otopilot bir yer istasyonu gorur, kod durunca sayac islemeye baslar.
threading.Thread(target=kalp_at, daemon=True).start()

Bu haldeyken otopilot kodunu yer istasyonu olarak sayar. Kod çökerse heartbeat kesilir, FS_GCS_TIMEOUT dolar ve FS_GCS_ENABLE'da seçtiğin eylem devreye girer.

Uçuştan önce üç parametreyi bir kez kontrol et. MAV_GCS_SYSID, kodun source_system değerini kapsamıyorsa otopilot senin heartbeat'ini yer istasyonu saymaz. MAVProxy'de şu komutla bakabilirsin:

Kod
param show FS_GCS_ENABLE FS_GCS_TIMEOUT MAV_GCS_SYSID

Örnek: Yarışmadan önceki provada bunu bilerek dene. Drone GUIDED'da birkaç metre yüksekte, kumanda pilotun elinde ve kodundan başka bir yer istasyonu bağlı değilken kodu Ctrl+C ile durdur, kronometre tut. Yaklaşık beş saniye içinde drone eve dönmeye başlıyorsa otopilot kodunu yer istasyonu sayıyor demektir; olduğu yerde asılı kalıyorsa heartbeat gitmiyor ya da MAV_GCS_SYSID ile source_system uyuşmuyor.

Hata Mesajları ve Anlamları

Bu konuda ekranda gördüğün ya da hiç göremediğin birkaç satır:

GCS Failsafe

Otopilot yer istasyonunu FS_GCS_TIMEOUT boyunca göremedi ve failsafe başladı. Bu satırı görüyorsan sayaç çalışıyor demektir; hiç görmüyorsan otopilot bir yer istasyonu hiç saymamış olabilir.

GCS Failsafe Cleared

Bağlantı geri geldi ve failsafe koşulu kalktı. Otopilot yine de failsafe moduna kilitli kalır, önceki moduna kendiliğinden dönmez. Geri almak için modu elle değiştirmen gerekir.

PreArm: GCS failsafe on

Yerde, failsafe etkinken ARM etmeye çalıştın. Önce bağlantıyı ve heartbeat akışını düzelt, sonra ARM et.

Bu konuyu uçtan uca öğren

Python ile Sıfırdan İHA Kontrolü eğitiminde pymavlink ve DroneKit ile bağlantı kurmayı, GUIDED görevlerini ve yardımcı bilgisayardan otonom kontrolü adım adım işliyoruz.

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.