Softivation

İrtifa kayıyor, barometre normal görünüyor

Mission Planner sabit irtifa gösterirken drone alçalıyorsa barometre kaymıştır. İrtifa kaymasının üç kök nedenini logdan ayırmayı adım adım anlatıyoruz.

Furkan IŞIKAY 9 dk okuma

Drone havada duruyor, kumandaya dokunmuyorsun. Mission Planner ekranında irtifa 20 metrede sabit. Ama gözünle bakınca drone yavaş yavaş alçalıyor. Bir süre sonra ağaç hizasına iniyor, ekran hâlâ 20 metre diyor.

Bu durumda ilk akla gelen şey barometrenin bozulduğu oluyor. Çoğu zaman bozulmuş değil. Barometre kendi ölçtüğü şeyi doğru söylüyor; sorun o ölçümün artık gerçek yüksekliğe karşılık gelmemesi.

Ekrandaki irtifa nereden geliyor

Otopilot yüksekliği doğrudan ölçmez. Hava basıncını ölçer ve basınçtan yüksekliğe geçer. Yukarı çıktıkça basınç düşer, aşağı indikçe artar. Kalkıştan önce okunan basınç sıfır kabul edilir, sonrasındaki her değişim yükseklik farkı olarak yorumlanır.

Bu yüzden ölçülen basınç gerçekten yükseklik değiştiği için değil de başka bir sebeple değişirse, otopilot bunu tırmanış ya da alçalış sanır. İrtifa döngüsü de bu sahte hareketi bastırmak için drone'u ters yönde hareket ettirir. Ekranda hedeflenen yükseklik korunmuş görünür, gerçekte korunmaz.

Aşağıdaki grafikte barometre irtifası saniyede 5 santimetre kaymaya başladığında iki eğrinin nasıl ayrıldığına bak.

Ekran 20 m diyor, drone alçalıyor

Barometre saniyede 5 cm kaydığında Mission Planner irtifası 20 m'de sabit kalırken drone'un gerçek yüksekliği 20 m'den 1,5 m'ye iner
Nereye bak: kesikli çizgiden sonra iki eğrinin ayrıldığı yer. Mavi eğri hiç oynamıyor; kayma durduğunda kırmızı eğri de durur ama yükselmez.

Kayma başladıktan sonra ekrandaki değer 20 metrede kalır, gerçek yükseklik 20 metreden 1,5 metreye iner. Aradaki fark 18,6 metreyi bulur ve alçalma hızı kaymanın hızıyla neredeyse aynıdır.

Kayma durduğunda alçalma da durur, ama kaybedilen yükseklik geri gelmez.

Ekrandaki sayı bir ölçüm değil, bir yorumdur. Barometrenin okuduğu basıncın yüksekliğe çevrilmiş hâlidir. Basınç yalan söylerse, ekran da aynı yalanı tutarlı biçimde gösterir.

Basıncı bozan üç şey

Aynı belirtiyi üreten üç ayrı sebep var ve hangisi olduğunu ne zaman ortaya çıktığına bakarak ayırıyorsun. Aşağıdaki şekilde her birinin logdaki izini karşılaştır.

  • Sıcaklık: otopilot kartı çalışırken ısınır, barometre ısındıkça basıncı kaydırarak okur. Bu, drone hiç havalanmadan masada dururken bile birikir.
  • Gövde içi hava akımı: barometre kabinin içindeki basıncı ölçer. Üst ve alt havalandırma delikleri dengesizse ileri uçuşta kabin içinde basınç farkı oluşur, manevra bitince birden kaybolur.
  • Havanın kendisi: uzun uçuşlarda atmosfer basıncı zaten değişir. Aynı rotayı iki kez uçtuğunda yükseklikler tutmuyorsa sebep genelde budur.

Aynı belirti, logda üç ayrı iz

Üç kaynağın logdaki izi: ısınmada barometre irtifası sıcaklıkla birlikte yükselir, gövde içi akımda kayma yalnızca manevrada olur, hava basıncında barometre ile GPS farkı uçuş boyunca büyür
Nereye bak: kaymanın ne zaman başladığı. Yerde birikiyorsa ısınma, manevrayla gelip gidiyorsa gövde, uçuş boyunca büyüyorsa hava. Eğriler şematiktir.

Doğrudan güneş ışığının barometrenin üstüne düşmesi de ani sapmalara yol açar. Barometrenin üstündeki süngerin görevi ışığı ve hava akımını kesmek, havayı ise geçirmektir. Sünger zamanla büzüşüp yerinden kayarsa koruma biter.

Örnek: Sıra sana gelince drone'u açar açmaz kalkıyorsun ve kart ilk dakikalarını havada ısınarak geçiriyor. Ekran 20 metre derken drone gözle görülür biçimde alçalıyorsa ilk bakacağın yer logdaki BARO[0].Temp ile BARO[0].Alt eğrilerinin birlikte yükselip yükselmediği. Aynı drone öğle güneşinde gölgeden açık alana geçince irtifası birden sıçrıyorsa, bu kez süngerin yerinde olup olmadığına bak.

Kendi logunda neye bakacaksın

Parametre değiştirmeden önce hangi katmanın yanlış olduğunu bulman gerekiyor. Uçuş logunu indir ve şu sırayı takip et.

  1. Logda CTUN.BAlt ile CTUN.Alt'ı üst üste çiz. İkisi de aynı yönde kayıyorsa sorun tahminde değil, barometrenin okuduğu basınçta.
  2. BARO[0].Temp ile BARO[0].Alt'ı aynı grafiğe koy. Sıcaklık yükselirken irtifa da yükseliyorsa termal kayma; kart ısınırken yerde dururken bile olur.
  3. BARO.Alt ile GPS.Alt farkını zamana karşı çiz. Fark uçuş boyunca büyüyorsa hava basıncı değişiyor, kısa süreli rüzgâr etkisi değil.
  4. Kaymanın yalnızca manevrada olup olmadığına bak. İleri uçuşta ya da yana kayışta düşüyorsa gövde içi basınca ve pervane rüzgârına bakılır.
  5. İki barometre varsa BARO[0].Alt ile BARO[1].Alt'ı karşılaştır. Yalnızca biri kayıyorsa donanım, ikisi birden kayıyorsa gövde ya da hava.

Bu eğrilerin hepsi ArduPilot'un kendi log mesajlarında var. Alan adlarının resmî açıklamalarını log mesajları listesinde bulabilirsin.

Kendi kartında canlı izleme

Log indirmeden önce hızlı bir fikir edinmek istersen, kartına bağlanıp bildirilen irtifa ile GPS yüksekliği arasındaki farkın zamanla büyüyüp büyümediğine bakabilirsin. Aşağıdaki kod bağlandığı andaki farkı sıfır kabul eder ve sonrasındaki değişimi yazar.

Python
# Barometre irtifasi ile GPS irtifasini yan yana izler.
# Kendi kartina baglaniyorsan baglanti adresini degistir:
#   USB    -> 'com3'  ya da  '/dev/ttyACM0'
#   telem  -> '/dev/ttyUSB0', baud=57600
import time
from pymavlink import mavutil

BAGLANTI = 'tcp:127.0.0.1:5760'      # kendi kartin icin degistir
SURE_SN  = 60                        # kac saniye izlenecek

arac = mavutil.mavlink_connection(BAGLANTI)
arac.wait_heartbeat()
print('baglandi, sysid', arac.target_system)

for msg_id in (mavutil.mavlink.MAVLINK_MSG_ID_GLOBAL_POSITION_INT,
               mavutil.mavlink.MAVLINK_MSG_ID_SCALED_PRESSURE,
               mavutil.mavlink.MAVLINK_MSG_ID_GPS_RAW_INT):
    arac.mav.command_long_send(
        arac.target_system, arac.target_component,
        mavutil.mavlink.MAV_CMD_SET_MESSAGE_INTERVAL, 0,
        msg_id, 500000, 0, 0, 0, 0, 0)

ekran = gps = basinc = sicaklik = None
fix_var = False
t0 = time.time()
ilk_fark = None
print(' sure   ekran_m   gps_m    fark_m   basinc_hPa  baro_C')
while time.time() - t0 < SURE_SN:
    m = arac.recv_match(blocking=True, timeout=2)
    if m is None:
        continue
    tip = m.get_type()
    if tip == 'GLOBAL_POSITION_INT':
        ekran = m.relative_alt / 1000.0
    elif tip == 'GPS_RAW_INT':
        fix_var = m.fix_type >= 3          # fix yoksa GPS irtifasi anlamsiz
        gps = m.alt / 1000.0
    elif tip == 'SCALED_PRESSURE':
        basinc = m.press_abs
        sicaklik = m.temperature / 100.0
        if fix_var and None not in (ekran, gps):
            fark = ekran - gps
            if ilk_fark is None:
                ilk_fark = fark
            print('%5.0f  %8.2f %8.2f %8.2f %11.2f %7.2f'
                  % (time.time() - t0, ekran, gps, fark - ilk_fark, basinc, sicaklik))

Kart yeni açıldıysa ilk dakikalarda barometre sıcaklığının yükseldiğini, fark sütununun da onunla birlikte kaydığını görürsün. Kod çalışırken ekrana şöyle bir tablo düşer:

Kod
baglandi, sysid 1
 sure   ekran_m   gps_m    fark_m   basinc_hPa  baro_C
   10      0.00   500.10     0.00      954.60   26.98
   10      0.00   500.10     0.00      954.60   27.06
   11      0.00   500.10     0.00      954.60   27.13
   11      0.00   500.10     0.00      954.60   27.21
   12      0.00   500.10     0.00      954.60   27.28
   12      0.00   500.10     0.00      954.60   27.36
   13      0.00   500.10     0.00      954.60   27.43

Fark sütunu düzenli olarak tek yöne büyüyorsa kayma var demektir. Sıcaklık sütunuyla birlikte büyüyorsa ısınma kaynaklıdır.

Hata Mesajları ve Anlamları

Barometre ve irtifa ile ilgili kalkış öncesi mesajların hepsi ArduPilot kaynak kodunda birebir şu şekilde geçer.

PreArm: Baro: not healthy

Otopilot barometreden geçerli veri alamıyor. Sensör cevap vermiyor ya da okunan değerler sağlık kontrolünden geçmiyor. Kablo, lehim ve varsa ikinci barometrenin durumu bakılır.

PreArm: Baro: GPS alt error 5811m (see BARO_ALTERR_MAX)

GPS yüksekliği ile basınçtan hesaplanan yükseklik arasındaki fark kabul edilen sınırı aşmış. Sınırı BARO_ALTERR_MAX belirler ve varsayılanı 2000 metredir. Bu kadar büyük bir fark genelde sensörün yanlış modelle okunmasından gelir, birkaç metrelik kaymadan değil.

PreArm: Altitude disparity

Barometreden gelen yükseklik ile atalet çözümünün yüksekliği birbirinden ayrılmış. Bu kontrolün eşiği kaynak kodda 1.0 metre olarak tanımlıdır. Kalkış öncesi görülen en dar irtifa kontrolü budur.

PreArm: Need Alt Estimate

Otopilotun elinde henüz güvenilir bir yükseklik tahmini yok. Filtre oturmamış ya da barometre verisi kesik. Aynı gerekçe uçuş sırasında mod değiştirmeye çalışırken de karşına çıkabilir.

PreArm: EKF height variance

Yükseklik tahmininin belirsizliği kabul edilen bandın dışında. Titreşim ve barometre gürültüsü birlikte bu mesajı üretir; tek başına barometreyi suçlamadan önce titreşim seviyelerine de bakılır.

Kaynağı kendi kartında ölç

Bu davranışın büyük kısmı gerçek donanıma bağlı: kartın ısınması, gövdenin delik düzeni, güneş ve pervane rüzgârı. Bu yüzden kaynağı masada ve kısa bir uçuşta ölçerek bulursun.

Bunun için üç şey yeterli: kartı çalıştırıp hiç havalandırmadan yirmi dakika bekleyip bildirilen irtifanın kaç metre kaydığına bak, aynı sırada barometre sıcaklığını kaydet, sonra kısa bir uçuşta ileri gidip durarak irtifanın manevrayla oynayıp oynamadığını gör. Bu üç ölçüm, üç kök nedenden hangisiyle uğraştığını söyler.

Kursta devamı

Bu konunun dersi Sensörlerden Uçuşa Temel İHA eğitiminde var. Derste kaymanın kaynak koddaki karar sırasını, parametrelerin gerçek varsayılan değerlerini, log imzası tablolarını ve sahadan gelen vakaları bulacaksın.

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.