Softivation

Drone arm olmuyor (GPS ve uydu normal)

Pixhawk GPS fix aldı, uydu sayısı yeterli ama drone ARM olmuyor. ArduPilot engeli hangi mesajda söylüyor, nasıl okursun? Kısa bir Python koduyla adım adım.

Furkan IŞIKAY 6 dk okuma

Kod hazır, drone ARM olmuyor

Saha günü. Batarya takılı, GPS'in ışığı yanıyor, Mission Planner "10 uydu" diyor. ARM'a basıyorsun, olmuyor.

Takım kabloyu oynatıyor, kartı yeniden başlatıyor, pusulayı bir daha kalibre ediyor. On beş dakika gidiyor, sonra drone bir anda kendiliğinden ARM oluyor ve kimse nedenini bilmiyor.

Oysa ArduPilot engelin ne olduğunu baştan beri biliyordu. Bu yazıdaki kısa Python kodu engeli okuyup sebebini ekrana yazıyor.

Otopilot engeli iki ayrı yerden söyler

Otopilotun söylediği iki şey var. Biri drone'un ARM olmaya hazır olup olmadığını gösteren bir bayrak; bu bayrak otopilotun durum mesajının içinde taşınır. Öteki engelin nedenini anlatan kısa bir metin.

Metin sürekli akmaz. ArduPilot onu yarım dakikada bir tekrarlar, bir de sen ARM denediğin anda yollar. Pasif dinlersen birkaç saniye boyunca hiçbir sebep duymayabilirsin.

GPS gelince ARM olur sanma

GPS fix ve 10 uydu varken bile ARM reddedilebilir. Sebep çoğu zaman GPS değildir: gyro'lar henüz termal dengeye gelmemiş olabilir ve otopilot bunu tutarsız gyro mesajıyla söyler.

GPS beklemek gerekli ama yeterli değil. Hangi sensörün beklediğini görmek için sebebi otopilottan okumak gerekir.

Engeli ve sebebini okuyan kod

Kod iki işi sırayla yapar. Önce SYS_STATUS mesajındaki 0x10000000 bitine bakar; bu bit "engel var mı" sorusunu ARM denemesi gerektirmeden cevaplar. Sonra tek bir ARM denemesi gönderir ve ardından gelen STATUSTEXT mesajlarını üç saniye dinler.

Şekildeki kırmızı oklara bak: sebep metinleri ARM komutundan hemen sonra gelir.

Engelin var olduğunu ve sebebini otopilottan sırayla almak

Kod SYS_STATUS ister, otopilot bayrağı yollar ama sebep yok; kod bir kez ARM komutu gönderince otopilot sebepleri STATUSTEXT olarak yollar
Nereye bak: kırmızı oklar. SYS_STATUS yalnızca engel olup olmadığını söyler; sebep metinleri ARM komutundan hemen sonra, sarı pencerenin içinde gelir.
Python
import time
from pymavlink import mavutil

mav = mavutil.mavlink
PREARM_BIT = 0x10000000          # SYS_STATUS icindeki "prearm gecti mi" biti

arac = mavutil.mavlink_connection('tcp:127.0.0.1:5760')
arac.wait_heartbeat()

# SYS_STATUS varsayilanda akmayabilir - acikca 2 Hz iste
arac.mav.command_long_send(
    arac.target_system, arac.target_component,
    mav.MAV_CMD_SET_MESSAGE_INTERVAL,
    0, mav.MAVLINK_MSG_ID_SYS_STATUS, 500_000, 0, 0, 0, 0, 0)
time.sleep(1)


def armlanabilir_mi(arac):
    """Tek guvenilir gosterge. ARM denemesi gerektirmez."""
    s = arac.recv_match(type='SYS_STATUS', blocking=True, timeout=5)
    return bool(s.onboard_control_sensors_health & PREARM_BIT) if s else None


def neden_bloke(arac, bekleme=3.0):
    """
    SEBEBI beklemeden ogrenmek icin tek bir ARM denemesi gonder.
    ArduPilot PreArm gerekcesini disarm iken 30 sn'de bir kendisi de
    yayar; ARM denemesi gerekceyi hemen yollatir.
    """
    arac.mav.command_long_send(
        arac.target_system, arac.target_component,
        mav.MAV_CMD_COMPONENT_ARM_DISARM, 0, 1, 0, 0, 0, 0, 0, 0)
    sebepler = []
    bitis = time.time() + bekleme
    while time.time() < bitis:
        m = arac.recv_match(type='STATUSTEXT', blocking=True, timeout=1)
        if m and m.text.strip().startswith(('PreArm:', 'Arm:')):
            sebepler.append(m.text.strip())
    return sebepler


print(f"armlanabilir : {armlanabilir_mi(arac)}")
for s in neden_bloke(arac):
    print(f"  > {s}")

Kod varsayılan olarak simülatöre bağlanır. Kartın USB ya da telemetri portundaysa bağlantı satırına o portu yaz.

Drone yanında değilse SITL'de dene

Kodu sahaya çıkmadan denemek istersen ArduCopter simülatörünü (SITL) kendi bilgisayarında açabilirsin. Aşağıdaki komutlar simülatörü indirir ve başlatır; ardından Python kodunu ayrı bir terminalde çalıştır.

Bash
mkdir -p ~/sitl && cd ~/sitl
curl -sL -o arducopter \
  https://firmware.ardupilot.org/Copter/stable/SITL_x86_64_linux_gnu/arducopter
chmod +x arducopter
curl -sL -o copter.parm \
  https://raw.githubusercontent.com/ArduPilot/ardupilot/master/Tools/autotest/default_params/copter.parm
pip install pymavlink

./arducopter -S -I0 --model + --speedup 1 --defaults copter.parm \
  --sysid 1 --home 37.1591,38.7969,500,0

Çalıştırınca ne görürsün

Drone'u açtıktan hemen sonra çalıştırırsan ArduCopter 4.7.0'da şuna benzer bir çıktı alırsın:

Kod
$ python3 prearm_mini.py
armlanabilir : False
  > Arm: Accels inconsistent
  > Arm: EKF attitude is bad
  > Arm: AHRS: not using configured AHRS type

Üç sebep birden geliyor. Hiçbiri kabloyla ilgili değil, hiçbiri GPS değil; üçü de "biraz daha bekle" diyor. Bu çıktı elinde olsaydı o on beş dakikayı harcamazdın.

Örnek: Sırada beklerken drone'u açar açmaz bu kodu çalıştır. Üç satır da "bekle" diyorsa kabloya ve kalibrasyona dokunma, bir süre sonra kodu yeniden çalıştır; armlanabilir satırı True olunca ARM'a geç. Beklemekle geçmeyen bir satır kalırsa sebep metnini olduğu gibi takıma ilet, kalibrasyon ya da kablo o zaman gündeme gelir.

Hata Mesajları

Arm: Gyros inconsistent

Gyro'lar birbirini tutmuyor. GPS hazır olsa bile gelebilir; çoğu zaman gyro'lar henüz termal dengeye gelmemiştir. Bekleyip yeniden dene.

Arm: Accels inconsistent

İvmeölçerler birbirini tutmuyor. Açılıştan hemen sonra geliyorsa biraz bekleyip ARM'ı yeniden dene.

Arm: EKF attitude is bad

Otopilotun yönelim kestirimi henüz oturmamış. Açılışta görülür; beklemek gerekir.

Arm: AHRS: not using configured AHRS type

Otopilot ayarlı kestirim türüne henüz geçmemiş. Bu da açılıştan hemen sonra gelen ve beklemekle geçmesi gereken bir mesaj.

Kursta devamı

Yukarıdaki kod engeli görür ve sebebi söyler. Hangi PreArm mesajının hangi konnektöre karşılık geldiği, kart aileleri arasındaki farklar ve hangi mesajın beklemekle geçip hangisinin geçmeyeceği eğitimde işleniyor.

Bu yazıyı okuyanlara: Sensörlerden Uçuşa Temel İHA Eğitimi

Bu yazı işinize yaradı mı?

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