Softivation

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.

Furkan IŞIKAY 5 dk okuma

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

Üstten görünüm: iki yön alanı yok sayılınca drone doğuya ilerlerken burnunu 0 dereceden 90 dereceye çeviriyor; yön hızı sıfır gönderilince burun olduğu yerde kalıyor
Nereye bak: kırmızı burun uçları. İkisi de aynı çizgide doğuya ilerliyor; üstteki sırada burun yol boyunca hareket yönüne dönüyor, alttakinde dönmüyor.

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.

Python
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 = dogu

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

Ücretsiz kaynakTEKNOFEST İHA yazılım hazırlık kontrol listesiİHA yazılımı hazırlığını aşama aşama işaretleyin; yazdırılabilir liste.