SITL'de geofence ihlali RTL tetiklemiyor
SITL'de geofence tanımlı ama ihlal olmuyor, RTL_AND_LAND tetiklenmiyor. FENCE_TYPE yetmez; FENCE_ENABLE kapalıyken otopilot sınırı hiç kontrol etmiyor.
SITL'de drone'u evden kasıtlı olarak 400 metre uzaklaştırıyorsun. Ekranda geofence tanımlı görünüyor ama hiçbir şey olmuyor: ne mod değişiyor ne de bir uyarı geliyor.
Otopilot sanki hiç çit yokmuş gibi davranıyor. Çoğu zaman sorun çitin şeklinde değil, açık olup olmadığındadır.
Çit tanımlı ama kapalı olabilir
ArduPilot'ta çitin iki ayrı ayarı var. Biri hangi sınır türlerinin tanımlı olduğunu seçer: yükseklik sınırı, dairesel sınır, poligon sınırı. Öteki bunların hepsini tek başına açıp kapatan ana anahtardır.
Ana anahtar varsayılan olarak kapalıdır. Sınır türleri tanımlı görünse de anahtar kapalıyken hiçbir ihlal sayılmaz, çünkü otopilot ihlal kontrolüne hiç girmez.
Anahtar kapalıyken ve açıkken
Şekildeki iki panel aynı durumu gösteriyor: drone evden 400 metre uzakta, çit 150 metrelik bir daire. Soldakinde anahtar kapalı, sağdakinde açık.
Çit ve drone aynı yerde; değişen tek şey ana anahtar
Anahtar kapalıyken drone'u 400 metreye götürürsen hiçbir ihlal mesajı gelmez, mod GUIDED'da kalır. Aynı konumdayken anahtarı açarsan otopilot birkaç saniye içinde LAND moduna geçer ve ihlali bir MAVLink mesajıyla bildirir. RTL yerine LAND görmen normal: çitin 100 metreden fazla dışındaysan otopilot RTL'i denemeden doğrudan LAND'e geçer; 400 metrede durum budur.
Ayarların adı ve varsayılanları
Sınır türlerini FENCE_TYPE seçer, ana anahtar FENCE_ENABLE'dır. AC_Fence.cpp içindeki tanım net: FENCE_ENABLE'ın varsayılan değeri 0, yani kapalı.
Copter'da FENCE_TYPE varsayılan olarak üç biti birden taşır: ALT_MAX(1) + CIRCLE(2) + POLYGON(4) = 7. Ekranda bu 7'yi görmek çitin açık olduğu anlamına gelmez.
Örnek: Çitin yarıçapını uçuş alanına göre 150 metre yazdın, parametre listesinde FENCE_TYPE 7 görünüyor ve çiti hazır sanıyorsun. Drone alanın dışına çıktığında hiçbir şey olmaz, çünkü ana anahtar hâlâ 0 değerindedir. Listede FENCE_TYPE yerine FENCE_ENABLE satırına bak; 1 değilse çit yok demektir.
Çözüm
Dört parametreyi MAVLink üzerinden PARAM_SET ile yaz, her birini dönen PARAM_VALUE ile teyit et. Aşağıdaki kod FENCE_TYPE=2 (yalnızca daire), FENCE_RADIUS=150 ve FENCE_ACTION=1 (RTL_AND_LAND) yazar, en son FENCE_ENABLE'ı 1 yapar.
FENCE_ENABLE'ı en son yazmak önemli. Tip ve aksiyon zaten tanımlıyken anahtarı açtığın an ihlal kontrolü devreye girer. Kodu SITL açıkken çalıştır.
from pymavlink import mavutil
m = mavutil.mavlink_connection('tcp:127.0.0.1:5760')
m.wait_heartbeat()
for name, val in [('FENCE_TYPE', 2), ('FENCE_RADIUS', 150),
('FENCE_ACTION', 1), ('FENCE_ENABLE', 1)]:
m.mav.param_set_send(m.target_system, m.target_component,
name.encode(), float(val),
mavutil.mavlink.MAV_PARAM_TYPE_REAL32)
print(m.recv_match(type='PARAM_VALUE', blocking=True, timeout=5))Her satırda yazdığın parametrenin adını ve değerini taşıyan bir PARAM_VALUE görmelisin. Drone o sırada çitin dışındaysa mod değişimi hemen arkasından gelir.
Hata Mesajları
"PreArm: Vehicle breaching Circle fence"
Bu birebir mesaj, FENCE_ENABLE açıkken ve drone sınırın dışındayken geliyor. Kaynağı AC_Fence.cpp içindeki ihlal kontrolü: hal.util->snprintf(failure_msg, failure_msg_len, "Vehicle breaching %s", ...).
Kursta devamı
Bu mantığı poligon yükleme adımına, log imzalarına ve saha farklarına kadar Yapay Zeka ve İHA Simülasyon eğitiminde adım adım işliyoruz.
Yapay Zeka ve İHA Simülasyon Sanal Makinesi: ArduPilot SITL, ROS Noetic ve Gazebo 11 kurulu gelir; simülasyonu kurulumla uğraşmadan başlat.
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