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.
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
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.
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:
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/sHı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ı?
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