Softivation

ArduPilot batarya failsafe'de Python komutunu dinlemiyor

Batarya failsafe devreye girince ArduPilot modu RTL yapar, GUIDED'daki Python komutu sessizce atılır. Kodunun modu izleyip ne zaman duracağını burada gör.

Furkan IŞIKAY 5 dk okuma

Python kodun GUIDED modda hız komutu yolluyor, drone bir noktadan sonra komutlara cevap vermiyor ve kendi başına eve dönmeye başlıyor. Döngü çalışıyor, komutlar da gidiyor.

Yer istasyonunda sarı bir batarya uyarısı geçip gittiyse sorunun yerini buldun. Uyarıyı hiç görmediysen de okumaya devam et, çünkü uyarı kodun gözünden kaçabilir.

Drone komutu alıyor ama uygulamıyor

Batarya voltajı eşiğin altında yeterince uzun kalınca ve batarya failsafe'ine bir eylem atanmışsa otopilot modu kendisi değiştirir. Senin kodun hâlâ GUIDED'da olduğunu sanıp hız komutu göndermeye devam eder.

Otopilot bu komutlara ret ya da hata cevabı yollamaz. Hız hedefi yalnızca araç GUIDED modundayken işlenir, başka bir moddayken mesaj sessizce atılır.

Voltaj eşiğin altına indikten sonra komutlarına ne olur

Voltaj 9.5 V'a düşünce 10 saniye sonra mod GUIDED'dan RTL'ye döner; moda bakmayan kodun bundan sonraki komutları atılır, modu izleyen kod durur
Nereye bak: kesikli dikey çizgi. Ondan sonra moda bakmayan kodun her komutu gri: gidiyor ama işlenmiyor. Modu izleyen kod aynı anda susar.

Şekildeki kesikli çizgiye bak. Mod RTL'ye döndükten sonra moda bakmayan kodun gönderdiği her komut boşa gider; modu izleyen kod ise o anda durur ve sana haber verir.

Varsayılan ayarda bunu hiç görmezsin

Varsayılan ayarda otopilot batarya düşünce yalnızca uyarır ve modu değiştirmez. Sorun, failsafe eylemini RTL ya da LAND gibi bir değere çevirdiğin gün ortaya çıkar.

Voltaj Copter'da varsayılan 10.5 V olan düşük voltaj eşiğinin altında, varsayılan 10 saniyelik süre boyunca kesintisiz kalmalı. Anlık bir voltaj çöküşü failsafe başlatmaz.

Kod modu kendisi izlemeli

Çözüm, komut göndermeden önce aracın hangi modda olduğuna bakmak. HEARTBEAT mesajındaki mod numarası GUIDED'dan (4) başka bir değere dönerse kod komut göndermeyi bırakır ve sana haber verir.

Python · guided_ucus.py
import time
from pymavlink import mavutil

GUIDED = 4                       # ArduCopter'da GUIDED modunun numarası
OTOPILOT = 1                     # otopilotun MAVLink bileşen numarası
HIZ_MASKE = 0b0000111111000111   # yalnızca hız alanları geçerli


def guided_ucus(master, vn, ve, sure_sn):
    """Hız komutunu yalnızca araç hâlâ GUIDED'dayken gönderir."""
    mod = GUIDED
    bitis = time.time() + sure_sn
    while time.time() < bitis:
        while True:
            msg = master.recv_match(type=['HEARTBEAT', 'STATUSTEXT'], blocking=False)
            if msg is None:
                break
            if msg.get_type() == 'STATUSTEXT':
                print('Otopilot:', msg.text)
            elif msg.get_srcSystem() == master.target_system:
                mod = msg.custom_mode
        if mod != GUIDED:
            print('Mod değişti, numara', mod, '- komut göndermeyi bırakıyorum')
            return False
        master.mav.set_position_target_local_ned_send(
            0, master.target_system, OTOPILOT,
            mavutil.mavlink.MAV_FRAME_LOCAL_NED, HIZ_MASKE,
            0, 0, 0, vn, ve, 0, 0, 0, 0, 0, 0)
        time.sleep(0.1)
    return True

Kod kararı HEARTBEAT'teki mod numarasına göre veriyor. Batarya uyarısı eylem sıfırken de gelir ve modu değiştirmez; modun gerçekten değiştiğini HEARTBEAT içindeki numara gösterir.

Örnek: Kodun drone'u GUIDED'da hız komutuyla yük bırakma noktasına götürüyor. Uzun bir uçuşun sonunda voltaj eşiğin altına iner ve failsafe eylemi RTL ise otopilot eve dönmeye başlar. Moda bakmayan kod hâlâ bırakma noktasına doğru hız komutu yollar; yukarıdaki kod ise HEARTBEAT'te mod numarasının artık 4 olmadığını görür, "Mod değişti" yazar ve durur. Sen de yer istasyonundaki batarya uyarısıyla sebebi anlarsın.

Simülasyonda kendin gör

Yukarıdaki üç ayarın parametre adları şunlar: eylem BATT_FS_LOW_ACT (varsayılanı 0, yalnızca uyarı), eşik BATT_LOW_VOLT, süre BATT_LOW_TIMER.

Failsafe'i gerçek bataryayı boşaltarak denemek hem tehlikeli hem tekrarlanamaz. ArduPilot SITL'de voltajı parametreyle düşürür, aynı davranışı güvenle izlersin.

SITL'i -w ile başlat, BATT_FS_LOW_ACT değerini 2 (RTL) yap. Kodun GUIDED'da hız komutu gönderirken SIM_BATT_VOLTAGE değerini 9.5 V'a çek.

Voltaj 12.6 V'tan 9.5 V'a indikten yaklaşık 10 saniye sonra mod GUIDED'dan RTL'ye döner. Modu izlemeyen bir döngü bu sırada komut göndermeyi sürdürür ve mod değiştikten sonra gönderdiklerinin hepsi atılır.

Gerçek uçuşta voltajın eşiğin altına ne zaman ineceği bataryana ve yüküne bağlı.

Hata Mesajları

Battery 1 is low 9.50V used 469 mAh

Voltaj ya da kalan kapasite eşiği geçti. Voltaj ve mAh değerleri senin bataryanın o anki durumudur. Eylem 0 ise mod değişmez.

Battery Failsafe

Otopilot failsafe'i işledi. Eylem 0'dan farklıysa mod değişmiştir, HEARTBEAT içindeki mod numarasına bak.

Battery Failsafe - Disarming

Drone yerdeyken failsafe devreye girdi ve otopilot motorları kapattı. Havadaki bir drone bu mesajı vermez.

Kodla uçurmayı baştan öğrenmek istersen

Pymavlink ile bağlantıdan otonom göreve kadar adım adım gidiyoruz. Eğitim: Python ile Sıfırdan İHA Kontrolü.

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.