Softivation

Drone GUIDED modda duruyor, ArduPilot zaman aşımına bak

GUIDED modda hız komutu gönderiyorsun, drone birkaç saniye gidip havada duruyor. ArduPilot komutu üç saniye sonra düşürüyor; nedeni ve tek satırlık çözüm.

Furkan IŞIKAY 7 dk okuma

Kodu çalıştırıyorsun, drone iki üç saniye ilerliyor, sonra havada asılı kalıyor. Bağlantı kopmuş değil, uçuş modu GUIDED'da duruyor, kod hâlâ dönüyor. Ekranda seni uyaran tek bir satır bile yok.

Aynı kodu tekrar çalıştırınca aynı şey oluyor: kısa bir hareket, sonra duruş. Bu yazı o duruşun nereden geldiğini ve kodun hangi tek satırla düzeldiğini anlatıyor.

Kod çalışıyor, araç duruyor

Otopilot burada tasarlandığı gibi davranıyor. Senin gönderdiğin hız komutunu kalıcı bir emir saymıyor; üzerinden belli bir süre geçer ve yeni komut gelmezse hedefi kendiliğinden sıfırlıyor.

Gerekçesi güvenlik. Yardımcı bilgisayar çökerse, kod hata verip kapanırsa ya da kablo yerinden oynarsa, araç son duyduğu hızla ufka doğru gitmeye devam etmemeli. Otopilot sessizce yavaşlayıp bekliyor.

Sayaç her yeni komutta başa döner, yani komut akışı sürdüğü müddetçe araç gitmeye devam eder. Akış kesilip sayaç dolduğunda otopilot hız hedefini sıfırlar, araç yavaşlar ve havada asılı kalır.

Bu sırada uçuş modu GUIDED kalır ve ekrana uyarı basılmaz. Kodun hâlâ çalışıyor olması bir şey değiştirmez; önemli olan son komutun ne zaman geldiği.

Otopilot komutu ne kadar süre tutuyor

Bu süre sabit değil, bir parametreye bağlı. ArduCopter 4.7 üzerinde varsayılanı 3 saniye; ayarlanabilir aralığı 0.1 ile 5 saniye arası.

Aynı hız komutunu bir kez yollayıp bırakmakla yarım saniyede bir tazelemek arasındaki farkı şekilde gör. Üst şeritte komutların ne zaman gittiğine, alttaki eğrilerde hızın ne yaptığına bak.

Aynı hız komutu: bir kez gönderilince ve tazelenince

Üstte komut gönderim zamanları: tazelemede her yarım saniyede bir, tek komutta yalnızca sıfırıncı saniyede. Altta yatay hız: tazelenen komutta hız 5 m/s civarında kalır, tek komutta 3. saniyede tepe yapıp sıfıra iner.
Nereye bak: üst şeritte kırmızı komutun ardından gelen boşluk ve 3. saniyedeki kesik çizgi. Hedef 5 m/s kuzey.

Kırmızı eğride araç hedef hıza neredeyse ulaşıyor, sonra ivme sınırı içinde sıfıra iniyor. Düşüş ani değil, çünkü otopilot hedefi sıfırlarken aracı fren yapar gibi durduruyor.

ArduCopter 4.7'de 5 m/s kuzey hedefiyle tek komut, 3,26. saniyede 4,79 m/s ile tepe yapar ve sıfıra iner. Mavi eğride ise hız dokuz saniye boyunca yerinde kalır.

Komutu döngüye al

Çözüm, komutu bir kez göndermek yerine hareket sürdüğü sürece yenilemek. Gönderim aralığını GUID_TIMEOUT değerinin belirgin altında tut; yarım saniye rahat bir seçim ve telemetri hattını da yormaz.

Aşağıdaki kod SITL'e bağlanır, on iki saniye boyunca yarım saniyede bir aynı hız komutunu gönderir ve o sırada ölçtüğü yatay hızı ekrana yazar. Araç GUIDED modda ve havadayken çalıştır.

Python
from pymavlink import mavutil
import time

TAZELEME = 0.5      # saniye · GUID_TIMEOUT'un altında kalmalı
HEDEF_HIZ = 5.0     # m/s · kuzey yönünde
SURE = 12           # saniye · komut akışının süresi

baglanti = mavutil.mavlink_connection("tcp:127.0.0.1:5760")
baglanti.wait_heartbeat()
baglanti.mav.request_data_stream_send(
    baglanti.target_system, baglanti.target_component,
    mavutil.mavlink.MAV_DATA_STREAM_POSITION, 10, 1)

TYPE_MASK_HIZ = 0b0000111111000111   # yalnız hız alanları geçerli

def hiz_gonder(kuzey, dogu, asagi):
    baglanti.mav.set_position_target_local_ned_send(
        0, baglanti.target_system, baglanti.target_component,
        mavutil.mavlink.MAV_FRAME_LOCAL_NED, TYPE_MASK_HIZ,
        0, 0, 0, kuzey, dogu, asagi, 0, 0, 0, 0, 0)

baslangic = time.time()
son_gonderim = 0.0
while time.time() - baslangic < SURE:
    simdi = time.time()
    if simdi - son_gonderim >= TAZELEME:
        hiz_gonder(HEDEF_HIZ, 0.0, 0.0)
        son_gonderim = simdi
    p = baglanti.recv_match(type="LOCAL_POSITION_NED", blocking=True, timeout=1)
    if p:
        hiz = (p.vx ** 2 + p.vy ** 2) ** 0.5
        print(f"t+{simdi - baslangic:4.1f} s   yatay hız {hiz:5.2f} m/s")

Çalıştırdığında şuna benzer bir çıktı alırsın. İlk saniyeler hızlanmayı, gerisi sabit hızı gösterir:

Kod
t+ 0.0 s   yatay hız  0.00 m/s
t+ 1.0 s   yatay hız  1.96 m/s
t+ 2.0 s   yatay hız  4.32 m/s
t+ 3.0 s   yatay hız  4.83 m/s
t+ 4.0 s   yatay hız  5.02 m/s
t+ 5.0 s   yatay hız  5.09 m/s
t+ 6.0 s   yatay hız  5.06 m/s
t+ 7.0 s   yatay hız  5.02 m/s
t+ 8.0 s   yatay hız  5.01 m/s
t+ 9.0 s   yatay hız  5.02 m/s
t+10.0 s   yatay hız  5.02 m/s
t+11.0 s   yatay hız  4.99 m/s
t+12.0 s   yatay hız  4.99 m/s

Hız üçüncü saniyeden sonra da yerinde kaldıysa tazeleme çalışıyor demektir. Aynı kodu tazeleme satırı olmadan çalıştırırsan kırmızı eğriyi kendi ekranında görürsün.

Örnek: Savaşan İHA döner kanat kategorisinde kilitlenme görevi için yardımcı bilgisayardaki görüntü işleme kodu hedefi bulduğunda bir kez hız komutu yolluyor ve sonraki kareleri işlemeye dönüyor. Araç hedefe doğru üç saniye gider, sonra asılı kalır ve kilitlenme süresi dolmadan bozulur. Görüntü işleme döngüsünün her turunda, hedef aynı yerde olsa bile komutu yeniden gönder; hedefi kaybettiğinde ise göndermeyi kes, otopilot üç saniye sonra aracı kendiliğinden durdurur.

Hata Mesajları ve Anlamları

Bu konuyu ararken karşına çıkan üç satır ve gerçekte ne anlattıkları.

Mode change to GUIDED failed: requires position

GUIDED moda geçiş reddedildi. Otopilotun güvendiği bir konum kestirimi yok; GPS fix'i ya da EKF durumu henüz yerine gelmemiş. Kodun hız komutuna sıra bile gelmiyor. Önce konum kestiriminin oturmasını bekle.

PreArm: Need Position Estimate

Bir öncekinin ARM adımındaki karşılığı. Otopilot konumunu bilmeden ARM izni vermiyor. GUIDED modda çalışacaksan bu satır geçmeden hiçbir hareket komutu sonuç vermez.

target not received last 3.0 secs, stopping

Bu uyarıyı ArduPilot'un Rover yazılımı basar ve tam olarak burada anlatılan duruşu bildirir. Copter tarafında aynı durumda hiçbir metin gönderilmez, araç sessizce durur. Aynı kodu Rover'da denediğinde uyarıyı görüp Copter'da görmemenin sebebi bu.

Bu konu hangi kursta işleniyor

Yardımcı bilgisayardan otonom uçuş yazarken bu tür tuzaklar tek tek karşına çıkar. Komut tazeleme, GUIDED mod komutları, görev yükleme ve MAVLink tarafını sırayla işlediğimiz eğitim Python ile Sıfırdan İHA Kontrolü sayfasında duruyor.

Aynı konunun ders sürümünde otopilotun karar sırasını kaynak kod üzerinden takip ediyor, log imzalarını çıkarıyor ve kart bazlı farkları ele alıyoruz.

Bu yazı işinize yaradı mı?

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