Softivation

Pixhawk takeoff komutunu reddediyor, önce ARM ve moda bak

Python ile gönderdiğin takeoff komutu reddedilirse drone kalkmıyor. ACK sonucuna, ARM'a, GUIDED moduna ve hedef yüksekliğe bak, çalışan kod da burada.

Furkan IŞIKAY 8 dk okuma

Python'dan takeoff komutu gönderiyorsun, kod hatasız bitiyor, drone yerinde duruyor. Motorlar dönmüyor, ekranda da hata yok.

Otopilot komutu alıyor, bir kontrol listesinden geçiriyor ve kontrollerden biri tutmazsa reddediyor. Reddettiğini sana bir cevapla bildiriyor, çoğu kod o cevabı hiç okumuyor.

Drone takeoff komutunu neden sessizce yok sayıyor

ArduPilot takeoff komutunu alınca dört şeye bakar: motorlar ARM edilmiş mi, drone yerde mi, seçili mod kalkışı destekliyor mu ve hedef yükseklik mevcut yükseklikten büyük mü. İlk tutmayan kontrol komutu reddeder.

Reddedilen komutun cevabında sonuç olarak 4 yazar, kabul edilen komutun cevabında 0 yazar. Kod bu sayıya bakmıyorsa "komutu gönderdim" ile "drone kalktı" birbirine karışır.

Aşağıdaki şekilde dört kontrolün sırasına ve hepsinin aynı kırmızı banda çıktığına bak.

Takeoff komutu dört kontrolden sırayla geçer

Takeoff komutu ARM, yerde olma, mod ve hedef yükseklik kontrollerinden sırayla geçer; ilk hayır cevabı sonuç 4 ile reddeder, dördü de evetse sonuç 0 gelir.
Nereye bak: dört kırmızı okun dördü de aynı sonuç 4'e çıkıyor. Hangi kontrolde takıldığını ARM, mod ve hedef yükseklik sırasıyla bakarak bulursun.

Hangi modda takeoff komutu işe yarar

Takeoff komutunu GUIDED modunda gönder. Kaynak kodda LOITER, POSHOLD ve ZIGZAG modları da komutun mod kontrolünü geçiyor. STABILIZE modunda komut reddedilir, AUTO modu için kaynak kodda kalkış desteği tanımlı değildir.

ALT_HOLD, FLOWHOLD ve SPORT modlarında komut yalnızca üçüncü parametreye yatay konumun gerekmediğini söyleyen bayrak verilirse kabul edilir. Varsayılan gönderimde bu bayrak yoktur, o yüzden bu üç modda da komut reddedilir.

Sıra ArduCopter kaynak kodundaki sıradır. Kontroller takeoff.cpp dosyasında, hangi modun kalkışı desteklediği ise mode.h içindeki has_user_takeoff fonksiyonunda tanımlıdır.

ARM ettikten sonra neden hemen takeoff göndermelisin

Yerde ARM edilmiş ve gazı sıfır olan drone için ArduCopter varsayılan olarak 10 saniye sonra motorları kendisi DISARM eder. Süre DISARM_DELAY parametresinde tutulur, varsayılanı config.h içinde 10 olarak tanımlıdır.

Kodunu ARM sonucunu bekleyip hemen ardından takeoff gönderecek biçimde yaz. Araya kullanıcı girdisi ya da uzun bir hesap girerse drone takeoff gelmeden DISARM olur ve komut reddedilir; şekildeki iki şeridi karşılaştır.

ARM ile takeoff arasındaki süre penceresi

ARM sonrası yerde gaz sıfırken 10 saniye içinde takeoff gelirse kabul edilir; 10. saniyede motorlar DISARM olur ve sonra gelen takeoff sonuç 4 alır.
Nereye bak: kesikli kırmızı çizgi. Takeoff bu çizginin solunda gelmeli; sağında drone artık DISARM durumdadır ve komut ilk kontrolde elenir.

Örnek: Teknofest pistinde yer istasyonundaki arkadaşın ARM tuşuna basıyor, sonra hakemin kalkış işaretini bekliyor. İşaret 10 saniyeden geç gelirse drone çoktan DISARM olmuştur ve ardından yolladığın takeoff komutunun cevabında 4 yazar. ARM ile takeoff'u aynı akışa koy, ikisini de hakem işaretinden sonra başlat.

Önce cevaba bak, sonra kodu düzelt

Aşağıdaki kod GPS 3D fix'i bekliyor, modu GUIDED'a alıyor, ARM edilene kadar deniyor, takeoff komutunu gönderiyor ve cevabın sonucunu okuyor. Sonuç 0 değilse hata fırlatıyor, böylece reddedilen komut sessiz kalmıyor.

Python
from pymavlink import mavutil
import time

mv = mavutil.mavlink
m = mavutil.mavlink_connection('tcp:127.0.0.1:5760')
m.wait_heartbeat()
m.mav.request_data_stream_send(m.target_system, m.target_component,
                               mv.MAV_DATA_STREAM_ALL, 10, 1)

GUIDED = 4  # ArduCopter GUIDED mod numarasi


def gps_bekle():
    while True:
        g = m.recv_match(type='GPS_RAW_INT', blocking=True, timeout=5)
        if g and g.fix_type >= 3 and g.satellites_visible >= 6:
            return


def mod_degistir(mod):
    m.mav.command_long_send(m.target_system, m.target_component,
                            mv.MAV_CMD_DO_SET_MODE, 0, 1, mod, 0, 0, 0, 0, 0)
    bitis = time.time() + 5
    while time.time() < bitis:
        h = m.recv_match(type=&#x27;HEARTBEAT&#x27;, blocking=True, timeout=1)
        if h and h.custom_mode == mod:
            return True
    return False


def arm_et():
    for deneme in range(10):
        m.mav.command_long_send(m.target_system, m.target_component,
                                mv.MAV_CMD_COMPONENT_ARM_DISARM, 0, 1, 0, 0, 0, 0, 0, 0)
        bitis = time.time() + 1.5
        while time.time() < bitis:
            h = m.recv_match(type=&#x27;HEARTBEAT&#x27;, blocking=True, timeout=0.5)
            if h and h.base_mode & mv.MAV_MODE_FLAG_SAFETY_ARMED:
                return True
    return False


def takeoff(yukseklik):
    m.mav.command_long_send(m.target_system, m.target_component,
                            mv.MAV_CMD_NAV_TAKEOFF, 0, 0, 0, 0, 0, 0, 0, yukseklik)
    ack = None
    bitis = time.time() + 5
    while time.time() < bitis:
        a = m.recv_match(type=&#x27;COMMAND_ACK&#x27;, blocking=True, timeout=1)
        if a and a.command == mv.MAV_CMD_NAV_TAKEOFF:
            ack = a
            break
    if ack is None:
        raise RuntimeError(&#x27;takeoff icin ACK gelmedi&#x27;)
    if ack.result != mv.MAV_RESULT_ACCEPTED:
        raise RuntimeError(&#x27;takeoff reddedildi, sonuc=%d&#x27; % ack.result)


gps_bekle()
if not mod_degistir(GUIDED):
    raise RuntimeError(&#x27;GUIDED moduna gecilemedi&#x27;)
if not arm_et():
    raise RuntimeError(&#x27;ARM edilemedi&#x27;)
takeoff(10)

while True:
    p = m.recv_match(type=&#x27;GLOBAL_POSITION_INT&#x27;, blocking=True, timeout=5)
    if p and p.relative_alt / 1000.0 >= 9.5:
        print(&#x27;yukseklik: %.1f m&#x27; % (p.relative_alt / 1000.0))
        break

Komut reddedilirse program "takeoff reddedildi, sonuc=4" hatasıyla durur. ARM edilmemiş drone'a ya da STABILIZE modunda ARM edilmiş drone'a takeoff yollarsan bu sonucu alırsın.

GUIDED modunda ARM edilmiş drone'a 10 metrelik komutu yollarsan cevap 0 gelir, drone 9,5 metreyi geçince program yüksekliği yazıp biter. Yükselme süresi drone'un kütlesine ve itkisine bağlıdır, kendi drone'unda logdan ölç.

Cevabı okurken komut numarasına bak.
ARM komutunun cevabı da aynı hattan gelir. ack.command değeri 22 değilse o cevap takeoff'a ait değildir.

Kartta ARM iznine ayrıca bak

Gerçek Pixhawk'ta ARM izni GPS 3D fix'e, uydu sayısına ve EKF durumuna bağlıdır. ARM gelmiyorsa takeoff'a hiç sıra gelmez; Mission Planner'ın mesaj ekranındaki PreArm satırlarını oku.

Hata Mesajları

Konsolda ya da Mission Planner'ın mesaj ekranında şu satırlarla karşılaşabilirsin.

Got COMMAND_ACK: NAV_TAKEOFF: FAILED

MAVProxy konsolunda görülen satırdır, forumda bir kullanıcı bildirdi. Otopilot takeoff komutunu reddetti. ARM'ı, modu ve hedef yüksekliği sırayla kontrol et.

PreArm: Need Position Estimate

ARM komutu geldiğinde otopilot konum kestirimini henüz bulamadıysa bu satır düşer. GPS 3D fix gelene ve EKF GPS'i kullanmaya başlayana kadar bekle, sonra ARM'ı yeniden dene.

Auto: Missing Takeoff Cmd

AUTO moda geçerken motorlar ARM edilmiş, drone yerde ve görevin ilk komutu takeoff değilse bu satır düşer, metin mode_auto.cpp içinde geçer. Önce GUIDED'da kalk, sonra AUTO'ya geç ya da görevi takeoff komutuyla başlat.

Karar zincirini satır satır görmek istersen

Takeoff komutunun kaynak kodda hangi sırayla elendiğini ve forumdaki vakaları Python ile Sıfırdan İHA Kontrolü kursunda ders olarak anlatıyoruz.

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.