ArduPilot GUIDED'e geçti diyor, ekrandaki modu doğrula
ArduPilot GUIDED komutuna ACK ile kabul diyebilir, bu modun değiştiğini kanıtlamaz. ACK'in neyi gösterdiğini ve modu HEARTBEAT'ten doğrulamayı burada gör.
pymavlink ile GUIDED moduna geçiş komutu gönderiyorsun, otopilot ACK ile “kabul ettim” diyor, ama kodunda ya da yer istasyonunda mod hâlâ eskisi gibi görünüyor. Kodunu satır satır kontrol ediyorsun, hata yok gibi. Sorun kodda değil, ACK'in gerçekte ne söylediğinde.
Aşağıda ACK'in arkasında çalışan kontrolü, ACK'in ne zaman hiçbir şey kanıtlamadığını ve moda gerçekten geçip geçmediğini nasıl anlayacağını ArduCopter kaynak kodu üzerinden bulacaksın.
ACK aslında neyi kabul ediyor
Mod değiştirme komutu da, eski mod mesajı da otopilotta aynı fonksiyona düşer. Bu fonksiyon modu gerçekten değiştirmeyi dener ve ACK o denemenin sonucunu taşır: deneme başarılıysa “kabul edildi”, değilse “başarısız”.
Yani ACK, mesajın biçiminin ötesinde gerçek denemenin sonucunu taşır. Ama bir durumda fonksiyon hiçbir şey denemeden döner.
Aynı GUIDED isteği dört farklı yoldan döner
Şekildeki dört satırı yukarıdan aşağı oku, otopilot koşullara bu sırayla bakar. ACK'in gelmesi yetmez; otopilotun onu hangi satırdan geçerek ürettiğine bak.
Aynı moddaysan komut hiçbir şey kanıtlamaz
En can alıcı ayrıntı şekildeki ilk satır. İstenen mod aracın mevcut moduyla aynıysa fonksiyon hiçbir kontrolü çalıştırmadan doğrudan “başarılı” döner.
Kodun zaten GUIDED'dayken tekrar GUIDED isterse ACK her zaman “kabul edildi” gelir. Bu, GPS'in, EKF'in ya da konum durumun hakkında hiçbir şey söylemez.
Örnek: Drone'u Mission Planner'dan elle GUIDED'a aldın, sonra Python kodunu başlattın. Kod GUIDED isteyip ACK'e bakarak "hazır" diyor; oysa araç zaten o modda olduğu için bu ACK hiçbir kontrolü çalıştırmadan geldi, aradan geçen sürede GPS fix'in bozulmuş olsa bile. Aynı kod kararı HEARTBEAT'teki moda bağlarsa en azından neye güvendiğini bilirsin.
En sık yapılan hata: mod değişmedi diye komutu döngüde tekrar tekrar göndermek. Zaten o moddaysan her tekrar “başarılı” görünür, asıl sorunu gizler.
Kararı ACK'e değil, otopilotun yayınladığı moda bağla
Güvenilir tek doğrulama, HEARTBEAT akışındaki mod alanını okumak. Komutu gönder, ACK'i logla ama karar verme; birkaç HEARTBEAT paketi boyunca modun gerçekten değiştiğini gör.
mode_id = master.mode_mapping()['GUIDED']
master.mav.command_long_send(
master.target_system, master.target_component,
mavutil.mavlink.MAV_CMD_DO_SET_MODE, 0,
mavutil.mavlink.MAV_MODE_FLAG_CUSTOM_MODE_ENABLED, mode_id, 0, 0, 0, 0, 0)
ack = master.recv_match(type='COMMAND_ACK', blocking=True, timeout=5)
# ACK'e degil, HEARTBEAT'e guven
for _ in range(20):
hb = master.recv_match(type='HEARTBEAT', blocking=True, timeout=1)
if hb and mavutil.mode_string_v10(hb) == 'GUIDED':
print('mod gercekten degisti')
break
Sahada ayrıca bak
Forumda paylaşılan bir vakada LOITER'dan GUIDED istendiğinde bazı kurulumlarda drone GCS failsafe yüzünden RTL'e geçiyor. Bu, donanım ve telemetri kurulumuna bağlı ayrı bir davranış; mod komutunun kendisiyle karıştırma.
Hata Mesajları ve Anlamları
Mode change to GUIDED failed: requires position
GUIDED, requires_position() ile pozisyon kontrolü isteyen modlardan biri; otopilot EKF'ten geçerli bir mutlak ya da göreli pozisyon alamıyorsa, armed durumdayken bu modu reddeder.
PreArm: GPS 1: Bad fix
Bu satır mod değişimiyle ilgili değil, ayrı bir prearm denetim döngüsünden gelir. GPS fix vermezken GUIDED istediğinde mesaj akışında ikisini yan yana görebilirsin:
COMMAND_ACK {command : 176, result : 0, ...}
STATUSTEXT: PreArm: GPS 1: Bad fix
ACK kabul edilmiş, PreArm satırı yine de akıyor. İkisini aynı hata saymak yanlış teşhise götürür.
Mode change to GUIDED failed: GCS entry disabled (FLTMODE_GCSBLOCK)
FLTMODE_GCSBLOCK parametresi yer istasyonundan belirli modlara girişi bit maskesiyle engelliyor; bu mesajı görüyorsan sorun GPS ya da EKF değil, bu parametrenin değeri.
Bu konu hangi eğitimde var
Mod geçişlerini, ACK/HEARTBEAT ayrımını ve pymavlink ile GUIDED/AUTO komutlarını baştan sona kurduğumuz kurs: Python ile Sıfırdan İHA Kontrolü.
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