Softivation

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.

Furkan IŞIKAY 6 dk okuma

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

GUIDED isteği dört yoldan döner: zaten GUIDED'daysa kontrolsüz ACCEPTED, giriş kapalıysa FAILED, ARM'lıyken bir kontrol reddederse FAILED, kontroller geçerse ACCEPTED ve HEARTBEAT yeni modu taşır
Nereye bak: 1. satır. ACK orada da ACCEPTED ama hiçbir kontrol çalışmadı. Modun gerçekten değiştiğini yalnızca sağdaki HEARTBEAT sütunu söyler.

Ş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.

Kod
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:

Kod
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ı?

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