İHA AUTO modda ilk waypoint'e gitmiyor
- Furkan IŞIKAY

- 28 Tem
- 2 dakikada okunur
Güncelleme tarihi: 29 Tem
Görevi yükledin. MISSION_ACK geldi, type=0, yani ACCEPTED. Kod hatasız bitti.
Sonra AUTO'ya alıyorsun ve araç hiçbir yere gitmiyor. Ya da daha kötüsü: bir önceki uçuşun görevini uçuruyor.
Bu yazıda pymavlink ile MAVLink görev yüklemenin el sıkışmasını kuruyoruz ve "ACK geldi ama görev yüklenmedi" tuzağını gerçek bir ArduCopter SITL oturumunda ölçerek gösteriyoruz.
1. İki Dakikada SITL
Aşağıdaki komutlar ArduCopter SITL'i indirip Şanlıurfa koordinatlarında başlatır. Ayrı bir terminalde açık bırakın; Python kodu buna TCP 5760'tan bağlanacak.
2. Tuzak: Yanlış ACK'i Yakalamak
Çoğu örnek kodda akış şöyle: eski görevi sil, sonra MISSION_COUNT gönder, sonra gelen ilk MISSION_ACK'i yakala.
Sorun şu: MISSION_CLEAR_ALL komutunun KENDİ MISSION_ACK'i vardır. Onu tüketmezsen, döngün daha otopilot tek bir waypoint bile istemeden o ACK'i görür, type=0 okur ve "yüklendi" diye çıkar.
İlk denememizde SITL'de tam olarak bu oldu:
HEARTBEAT sys=1 comp=0
GPS OK fix=6 sat=10
ACK: MISSION_ACK {target_system : 255, target_component : 0, type : 0, mission_type : 0}
UPLOAD OK, servis edilen seq: []
Traceback (most recent call last):
File "mission_test.py", line 78, in <module>
print("READBACK count =", cnt.count)
AttributeError: 'NoneType' object has no attribute 'count'Servis edilen seq listesi BOŞ. Otopilot hiçbir item istemedi, ama elimizde type=0 bir ACK var. Kod "başarılı" dedi, araçta görev yok.
Ders: MISSION_ACK tek başına yüklemenin kanıtı değildir. Kanıt, otopilotun her seq için MISSION_REQUEST göndermiş olmasıdır.
3. Minimal Doğru Kod
Aşağıdaki kod üç şeyi doğru yapar: CLEAR_ALL'in ACK'ini tüketir, MISSION_REQUEST ve MISSION_REQUEST_INT'in ikisini de dinler, ve sonunda istenen seq sayısını kontrol eder.
4. SITL Kanıtı
Yukarıdaki kod, sıfırdan başlatılmış bir ArduCopter SITL oturumunda aynen çalıştırıldı. Çıktı:
Istenen seq listesi : [0, 1, 2, 3]
MISSION_ACK type : 0
SONUC: gorev yuklendi ve el sikismasi teyit edildi.Dikkat: 3 waypoint gönderdik ama istenen seq listesi 4 eleman. Çünkü seq 0 HOME'dur ve sayıma dahildir. Bunu atlarsan son waypoint'in sessizce kaybolur.
5. Yarışma Koşullarında Bu Kod Yetmez
Savaşan İHA sahasında bu minimal kodun açıkta bıraktığı noktalar var:
Geri okuma yok: Otopilot ACK verdi diye koordinatlar doğru yazıldı demek değil. MISSION_REQUEST_LIST ile geri okuyup metre cinsinden karşılaştırmak gerekir.
AUTO'da varış teyidi yok: Görev yüklenmesi ile görevin uçulması ayrı şeyler. MISSION_ITEM_REACHED dinlenmeden "waypoint'e gitti" denemez.
Telemetri kaybı senaryosu yok: Gerçek linkte MISSION_REQUEST paketi düşerse otopilot tekrar ister; kodun bunu yeniden gönderecek şekilde kurgulanmış olmalı.
Kart bazlı seri port farkları: Pixhawk TELEM2, Cube ve Matek kartlarında SERIALx_PROTOCOL ve baud ayarları farklıdır; yanlış ayarda hiç MISSION_REQUEST gelmez.
Bu yazıyı okuyanlara: Python ile Sıfırdan İHA Kontrolü Eğitimi — indirim kodu SOFTIVATION15 ile %15 indirimli. Görev yükleme, geri okuma, AUTO'da varış teyidi ve kart bazlı seri port ayarlarının tamamı kurstaki SITL doğrulamalı derste adım adım işleniyor.



Yorumlar