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.
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
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.
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:
$ 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ı?
Bu konuyu baştan sona öğrenin
Sezon: altı eğitimin hepsi 9 ay, ayda ₺790. Lise ve üniversite öğrencisine ayda ₺390, üye kodunuzla ilk ay ₺351. İstediğiniz ay bırakırsınız. Sezon'a başlayın · Öğrenciyim