Pixhawk takeoff komutunu reddediyor, önce ARM ve moda bak
Python ile gönderdiğin takeoff komutu reddedilirse drone kalkmıyor. ACK sonucuna, ARM'a, GUIDED moduna ve hedef yüksekliğe bak, çalışan kod da burada.
Python'dan takeoff komutu gönderiyorsun, kod hatasız bitiyor, drone yerinde duruyor. Motorlar dönmüyor, ekranda da hata yok.
Otopilot komutu alıyor, bir kontrol listesinden geçiriyor ve kontrollerden biri tutmazsa reddediyor. Reddettiğini sana bir cevapla bildiriyor, çoğu kod o cevabı hiç okumuyor.
Drone takeoff komutunu neden sessizce yok sayıyor
ArduPilot takeoff komutunu alınca dört şeye bakar: motorlar ARM edilmiş mi, drone yerde mi, seçili mod kalkışı destekliyor mu ve hedef yükseklik mevcut yükseklikten büyük mü. İlk tutmayan kontrol komutu reddeder.
Reddedilen komutun cevabında sonuç olarak 4 yazar, kabul edilen komutun cevabında 0 yazar. Kod bu sayıya bakmıyorsa "komutu gönderdim" ile "drone kalktı" birbirine karışır.
Aşağıdaki şekilde dört kontrolün sırasına ve hepsinin aynı kırmızı banda çıktığına bak.
Takeoff komutu dört kontrolden sırayla geçer
Hangi modda takeoff komutu işe yarar
Takeoff komutunu GUIDED modunda gönder. Kaynak kodda LOITER, POSHOLD ve ZIGZAG modları da komutun mod kontrolünü geçiyor. STABILIZE modunda komut reddedilir, AUTO modu için kaynak kodda kalkış desteği tanımlı değildir.
ALT_HOLD, FLOWHOLD ve SPORT modlarında komut yalnızca üçüncü parametreye yatay konumun gerekmediğini söyleyen bayrak verilirse kabul edilir. Varsayılan gönderimde bu bayrak yoktur, o yüzden bu üç modda da komut reddedilir.
Sıra ArduCopter kaynak kodundaki sıradır. Kontroller takeoff.cpp dosyasında, hangi modun kalkışı desteklediği ise mode.h içindeki has_user_takeoff fonksiyonunda tanımlıdır.
ARM ettikten sonra neden hemen takeoff göndermelisin
Yerde ARM edilmiş ve gazı sıfır olan drone için ArduCopter varsayılan olarak 10 saniye sonra motorları kendisi DISARM eder. Süre DISARM_DELAY parametresinde tutulur, varsayılanı config.h içinde 10 olarak tanımlıdır.
Kodunu ARM sonucunu bekleyip hemen ardından takeoff gönderecek biçimde yaz. Araya kullanıcı girdisi ya da uzun bir hesap girerse drone takeoff gelmeden DISARM olur ve komut reddedilir; şekildeki iki şeridi karşılaştır.
ARM ile takeoff arasındaki süre penceresi
Örnek: Teknofest pistinde yer istasyonundaki arkadaşın ARM tuşuna basıyor, sonra hakemin kalkış işaretini bekliyor. İşaret 10 saniyeden geç gelirse drone çoktan DISARM olmuştur ve ardından yolladığın takeoff komutunun cevabında 4 yazar. ARM ile takeoff'u aynı akışa koy, ikisini de hakem işaretinden sonra başlat.
Önce cevaba bak, sonra kodu düzelt
Aşağıdaki kod GPS 3D fix'i bekliyor, modu GUIDED'a alıyor, ARM edilene kadar deniyor, takeoff komutunu gönderiyor ve cevabın sonucunu okuyor. Sonuç 0 değilse hata fırlatıyor, böylece reddedilen komut sessiz kalmıyor.
from pymavlink import mavutil
import time
mv = mavutil.mavlink
m = mavutil.mavlink_connection('tcp:127.0.0.1:5760')
m.wait_heartbeat()
m.mav.request_data_stream_send(m.target_system, m.target_component,
mv.MAV_DATA_STREAM_ALL, 10, 1)
GUIDED = 4 # ArduCopter GUIDED mod numarasi
def gps_bekle():
while True:
g = m.recv_match(type='GPS_RAW_INT', blocking=True, timeout=5)
if g and g.fix_type >= 3 and g.satellites_visible >= 6:
return
def mod_degistir(mod):
m.mav.command_long_send(m.target_system, m.target_component,
mv.MAV_CMD_DO_SET_MODE, 0, 1, mod, 0, 0, 0, 0, 0)
bitis = time.time() + 5
while time.time() < bitis:
h = m.recv_match(type='HEARTBEAT', blocking=True, timeout=1)
if h and h.custom_mode == mod:
return True
return False
def arm_et():
for deneme in range(10):
m.mav.command_long_send(m.target_system, m.target_component,
mv.MAV_CMD_COMPONENT_ARM_DISARM, 0, 1, 0, 0, 0, 0, 0, 0)
bitis = time.time() + 1.5
while time.time() < bitis:
h = m.recv_match(type='HEARTBEAT', blocking=True, timeout=0.5)
if h and h.base_mode & mv.MAV_MODE_FLAG_SAFETY_ARMED:
return True
return False
def takeoff(yukseklik):
m.mav.command_long_send(m.target_system, m.target_component,
mv.MAV_CMD_NAV_TAKEOFF, 0, 0, 0, 0, 0, 0, 0, yukseklik)
ack = None
bitis = time.time() + 5
while time.time() < bitis:
a = m.recv_match(type='COMMAND_ACK', blocking=True, timeout=1)
if a and a.command == mv.MAV_CMD_NAV_TAKEOFF:
ack = a
break
if ack is None:
raise RuntimeError('takeoff icin ACK gelmedi')
if ack.result != mv.MAV_RESULT_ACCEPTED:
raise RuntimeError('takeoff reddedildi, sonuc=%d' % ack.result)
gps_bekle()
if not mod_degistir(GUIDED):
raise RuntimeError('GUIDED moduna gecilemedi')
if not arm_et():
raise RuntimeError('ARM edilemedi')
takeoff(10)
while True:
p = m.recv_match(type='GLOBAL_POSITION_INT', blocking=True, timeout=5)
if p and p.relative_alt / 1000.0 >= 9.5:
print('yukseklik: %.1f m' % (p.relative_alt / 1000.0))
break
Komut reddedilirse program "takeoff reddedildi, sonuc=4" hatasıyla durur. ARM edilmemiş drone'a ya da STABILIZE modunda ARM edilmiş drone'a takeoff yollarsan bu sonucu alırsın.
GUIDED modunda ARM edilmiş drone'a 10 metrelik komutu yollarsan cevap 0 gelir, drone 9,5 metreyi geçince program yüksekliği yazıp biter. Yükselme süresi drone'un kütlesine ve itkisine bağlıdır, kendi drone'unda logdan ölç.
Cevabı okurken komut numarasına bak.
ARM komutunun cevabı da aynı hattan gelir. ack.command değeri 22 değilse o cevap takeoff'a ait değildir.
Kartta ARM iznine ayrıca bak
Gerçek Pixhawk'ta ARM izni GPS 3D fix'e, uydu sayısına ve EKF durumuna bağlıdır. ARM gelmiyorsa takeoff'a hiç sıra gelmez; Mission Planner'ın mesaj ekranındaki PreArm satırlarını oku.
Hata Mesajları
Konsolda ya da Mission Planner'ın mesaj ekranında şu satırlarla karşılaşabilirsin.
Got COMMAND_ACK: NAV_TAKEOFF: FAILED
MAVProxy konsolunda görülen satırdır, forumda bir kullanıcı bildirdi. Otopilot takeoff komutunu reddetti. ARM'ı, modu ve hedef yüksekliği sırayla kontrol et.
PreArm: Need Position Estimate
ARM komutu geldiğinde otopilot konum kestirimini henüz bulamadıysa bu satır düşer. GPS 3D fix gelene ve EKF GPS'i kullanmaya başlayana kadar bekle, sonra ARM'ı yeniden dene.
Auto: Missing Takeoff Cmd
AUTO moda geçerken motorlar ARM edilmiş, drone yerde ve görevin ilk komutu takeoff değilse bu satır düşer, metin mode_auto.cpp içinde geçer. Önce GUIDED'da kalk, sonra AUTO'ya geç ya da görevi takeoff komutuyla başlat.
Karar zincirini satır satır görmek istersen
Takeoff komutunun kaynak kodda hangi sırayla elendiğini ve forumdaki vakaları Python ile Sıfırdan İHA Kontrolü kursunda ders olarak anlatı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