GUIDED modda hız komutuyla drone dönmeye başlıyor
GUIDED modda yalnızca hız komutu gönderince ArduCopter neden yön değiştiriyor? type_mask ile burnu sabit tutmanın ve istediğin yöne çevirmenin yolu burada.
Python'dan pymavlink ile drone'a hız komutu gönderiyorsun, yaw'a hiç dokunmuyorsun. Yine de drone ilerlerken aynı anda dönmeye başlıyor, sanki kendi kararını veriyor.
GUIDED modda tek başına hız gönderen herkes er ya da geç bu davranışla karşılaşır. Sebebi, hız komutuyla birlikte yolladığın ve hangi alanların yok sayılacağını söyleyen tek bir sayı.
Drone neden kendi kendine dönüyor
Akla yatan varsayım şu: yön alanlarını yok sayarsan otopilot yöne dokunmaz. ArduCopter tam tersini yapar.
Yön açısı da yön hızı da yok sayılınca otopilot mevcut yön hedefini korumaz. Kendi varsayılan yönlendirme davranışına döner ve drone hareket yönüne doğru dönmeye başlar.
Aşağıdaki şekilde aynı doğu yönlü hız komutunun iki hâlini görüyorsun. Üst sırada iki yön alanı da yok sayılıyor ve burun yol boyunca hareket yönüne dönüyor; alt sırada yön hızı alanına 0 yazılıyor ve burun dönmüyor.
Aynı hız komutu, burnun iki farklı yolu
Doğuya 3 m/s hız gönderirsen üst sıradaki durumda yaw 0 derece civarından başlar, 95 dereceye kadar çıkar ve 90 derece civarında, yani hareket yönünde oturur.
Ne zaman görülüyor
SET_POSITION_TARGET_LOCAL_NED ile yalnızca hız (vx, vy, vz) gönderirken tip maskesinde hem yaw hem yaw_rate alanını "ignore" işaretlersen ortaya çıkar.
Topluluk kayıtlarına göre ArduCopter 4.1 ve sonraki sürümlerde görülüyor, 4.0.7'de bildirilmemiş.
Üç maske, aynı hız komutu
Aşağıdaki üç çağrı aynı hız komutunu gönderiyor; fark type_mask değerinde, üçüncüsü yaw alanına bir de açı yazıyor. 3527 yaw ve yaw_rate alanlarının ikisini de yok sayar. 1479 yalnızca yaw alanını yok sayar ve yaw_rate alanına 0 yazar. 2503 ise tersini yapar: yaw_rate alanını yok sayar, yaw alanını kullanır.
from pymavlink import mavutil
def send_velocity(m, vy, mask, yaw=0.0):
m.mav.set_position_target_local_ned_send(
0, m.target_system, m.target_component,
mavutil.mavlink.MAV_FRAME_LOCAL_NED,
mask,
0, 0, 0, # x,y,z (ignore)
0.0, vy, 0.0, # vx,vy,vz
0, 0, 0, # ax,ay,az (ignore)
yaw, 0.0) # yaw (radyan), yaw_rate
# YANLIS: yaw VE yaw_rate ignore -> ArduCopter hareket yonune doner
send_velocity(m, vy=3.0, mask=3527)
# DOGRU: yaw ignore, yaw_rate = 0 -> burun oldugu yerde kalir
send_velocity(m, vy=3.0, mask=1479)
# Belirli bir yone bakarak ilerle: yaw_rate ignore, yaw alani kullanilir
# (yaw=0.0 kuzey demektir; 2503'u yaw=0.0 ile gonderirsen drone kuzeye doner)
send_velocity(m, vy=3.0, mask=2503, yaw=1.5708) # 90 derece = doguBurnun olduğu yerde kalmasını istiyorsan 1479 kullan: dönüş hızı 0 olduğu için drone hangi yöne bakıyorsa o yöne bakarak ilerler. 2503 ise burnu yaw alanına yazdığın açıya çevirir. Bu alan radyan cinsinden ve 0 kuzey demek; yaw alanını 0.0 bırakıp 2503 gönderirsen drone ilerlemeden önce kuzeye döner. Belirli bir yöne bakarak ilerlemek istiyorsan 2503 ile o açıyı yaw alanına yaz.
Örnek: Sürü uçuşunda formasyondaki yerini korumak için drone'u doğuya kaydırıyorsun, burundaki kameranın da hedefe bakmaya devam etmesi gerekiyor. 3527 ile hız gönderirsen drone kayarken burnunu hareket yönüne çevirir ve kamera hedefi kaybeder. 1479 gönderirsen burun olduğu yerde kalır, drone yan yan kayar ve kamera baktığı yönü korur.
Hata Mesajları ve Anlamları
Bu davranış bir konsol hatası basmıyor, sessizce oluyor. Aşağıdaki, ArduPilot forumunda kullanıcıların bu davranışı tarif ederken kullandığı birebir ifade.
the drone starts rotating if the y velocity component, v_y, is non-zero
Sebep: yaw ve yaw_rate alanları birlikte yok sayılırken vy sıfırdan farklı olunca ArduCopter varsayılan yön davranışına geçer ve hareket yönüne döner. Çözüm: iki alanı birden yok sayma. Mevcut yönü korumak için type_mask 1479 gönder; belirli bir açıya bakmak için 2503 gönderip açıyı yaw alanına yaz.
Bu konuyu derste daha derine indiriyoruz
type_mask'in bit bazında neden bu şekilde davrandığını, kaynak koddaki ModeGuided::set_yaw_state_rad fonksiyonunu ve kart bazlı farkları Python ile Sıfırdan İHA Kontrolü eğitiminde satır satır işliyoruz.
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