Softivation

SITL rüzgârı drone'u kaydırmıyor

SITL rüzgâr simülasyonunda SIM_WIND_SPD değerini yazdın, drone yerinden oynamıyor. Rüzgâr esiyor; gövdeye gelen hız 10 metrede yalnızca 4,08 m/s oluyor.

Furkan IŞIKAY 7 dk okuma

Simülasyonda rüzgâr hızını 10 yaptın. Haritadaki araç aynı noktada duruyor, hız göstergeleri sıfır, ekranda kıpırdayan hiçbir şey yok. Rüzgârın hiç uygulanmadığını düşünmek bu noktada gayet mantıklı.

Oysa rüzgâr uygulanıyor. Etkiyi gözden saklayan iki ayrı sebep var ve ikisi aynı anda çalışıyor.

Drone rüzgârı karşılıyor, o yüzden yerinde duruyor

GUIDED, LOITER ve AUTO modlarında pozisyon kontrolcüsü devrede. Rüzgâr aracı ittiği anda konum hatası büyümeye başlıyor. Kontrolcü bu hatayı bir ivme isteğine çeviriyor, ivme isteği de motorlara yatış açısı olarak gidiyor.

Bu yüzden rüzgârın izi konumda değil, yatış açısında kalıyor. Bakman gereken yer de orası: aracın ne kadar yattığı.

Gövdeye gelen hız irtifaya bağlı

SITL rüzgârı irtifaya göre ölçekliyor. Varsayılan profil kare kök: rüzgâr yerden belli bir irtifaya kadar büyüyor ve tam güce ancak orada ulaşıyor. Şekildeki mavi eğri bu profil, kırmızı noktalar da drone'u alçakta tutarken gövdeye gerçekten ulaşan hız.

SIM_WIND_SPD = 10 iken irtifaya göre gerçekten esen rüzgâr

Varsayılan kare kök profilinde rüzgâr 60 metreye kadar büyür; 10 metrede 4,08 m/s, 2 metrede 1,8 m/s. SIM_WIND_T 1 iken her irtifada 10 m/s.
Nereye bak: kırmızı noktalar. Drone'u 10 metrede tutuyorsan yazdığın hızın yarısından azı gövdeye ulaşır; mavi eğri ancak kesikli dikey çizgide 10'a değer. Kaynak: libraries/AP_HAL/SIMState.cpp.

O irtifayı SIM_WIND_T_ALT belirliyor ve varsayılanı 60 metre. On metrede çarpan 10/60 sayısının karekökü, yani 0,41. SIM_WIND_SPD 10 iken gövdeye gelen rüzgâr 4,08 m/s.

Kod
SIM_WIND_T      0     kare kok profili, 1 sinirsiz, 2 dogrusal
SIM_WIND_T_ALT  60    tam guce ulasilan irtifa, metre
SIM_WIND_SPD    10    tam gucteki hiz, m/s

Profili kapatmak istersen SIM_WIND_T değerini 1 yap. O zaman irtifa ne olursa olsun yazdığın hız eser.

Örnek: Yarışma öncesi görev kodunu rüzgârda sınamak için SIM_WIND_SPD değerini 10 yapıp drone'u 2 metrede LOITER'da tuttun; harita kıpırdamaz, çünkü gövdeye yalnızca 1,8 m/s ulaşır ve kontrolcü onu küçük bir yatışla karşılar. Aynı denemeyi 60 metrede yaparsan ya da SIM_WIND_T değerini 1 yaparsan yazdığın 10 m/s'nin tamamı eser ve farkı yatış açısında görürsün.

Yatış açısını kendin oku

Rüzgârın etkisini görmek için ATTITUDE mesajındaki roll ve pitch alanlarına bak. Aşağıdaki kod bağlanır, rüzgârı önce sıfırlar, dört saniye sonra 10'a çıkarır ve ardından saniyede bir yatış açısını yazar.

Python
# ruzgar_etkisi.py - SITL'de esen ruzgari yatis acisindan okur
import math, time
from pymavlink import mavutil

m = mavutil.mavlink_connection('tcp:127.0.0.1:5760')
m.wait_heartbeat()
m.mav.request_data_stream_send(m.target_system, m.target_component,
                               mavutil.mavlink.MAV_DATA_STREAM_ALL, 10, 1)

def param_yaz(ad, deger):
    for _ in range(10):
        m.mav.param_set_send(m.target_system, m.target_component, ad.encode(),
                             float(deger), mavutil.mavlink.MAV_PARAM_TYPE_REAL32)
        pv = m.recv_match(type='PARAM_VALUE', blocking=True, timeout=3)
        if pv and pv.param_id.strip('\x00') == ad:
            return pv.param_value
    raise RuntimeError(ad + ' yazilamadi')

def son_durum():
    # tamponu bosalt, en taze mesaji al; yoksa gecikmis veri okursun
    att = pos = None
    while True:
        msg = m.recv_match(type=['ATTITUDE', 'GLOBAL_POSITION_INT'], blocking=False)
        if msg is None:
            break
        if msg.get_type() == 'ATTITUDE':
            att = msg
        else:
            pos = msg
    return att, pos

param_yaz('SIM_WIND_SPD', 0)
param_yaz('SIM_WIND_DIR', 180)
time.sleep(4)
param_yaz('SIM_WIND_SPD', 10)

for _ in range(12):
    time.sleep(1)
    att, pos = son_durum()
    if att is None or pos is None:
        continue
    yatis = math.degrees(math.acos(math.cos(att.roll) * math.cos(att.pitch)))
    print('irtifa %5.1f m   yatis %5.2f derece' % (pos.relative_alt / 1000.0, yatis))

Kod tamponu her turda boşaltıyor. Boşaltmazsan gecikmiş telemetriyi okur ve rüzgârın yavaş yavaş kurulduğunu sanırsın. Drone 10 metrede dururken çalıştırırsan şunu görürsün:

Kod
irtifa  10.0 m   yatis  8.84 derece
irtifa  10.0 m   yatis  8.96 derece
irtifa  10.0 m   yatis  8.89 derece
irtifa  10.0 m   yatis  8.90 derece
irtifa  10.0 m   yatis  8.90 derece
irtifa  10.0 m   yatis  8.94 derece
irtifa  10.0 m   yatis  8.93 derece
irtifa  10.0 m   yatis  8.92 derece

On metrede yerleşen değer 8,9 derece civarında. Konum ise oynamıyor, çünkü kontrolcü rüzgârı yatarak yutuyor.

Aynı irtifada SIM_WIND_T'yi 1 yaparsan yatış 9,03 dereceden 29,26 dereceye çıkar. Aradaki farkın tamamı irtifa ölçeklemesinden gelir.

Kendi kurulumunda sırayla şuna bak

  • Fizik modelin hangisi. Dahili çokrotor modelinde update_wind çağrılıyor; Gazebo ve JSON kaynak dosyalarında bu çağrı bulunmuyor.
  • Parametreyi yazdıktan sonra birkaç saniye bekle. Simülasyon rüzgârı ilk beş saniye boyunca sıfır tutuyor.
  • İrtifanı SIM_WIND_T_ALT ile karşılaştır. Altındaysan yazdığın hızı zaten göremezsin.
  • Yatış açısına bak. Pozisyon tutan modlarda konum nasılsa oynamayacak.

En sık yapılan hata, rüzgârı iki metre irtifada denemek. Orada çarpan 0,18 kalıyor ve SIM_WIND_SPD 10 gövdeye 1,8 m/s olarak ulaşıyor.

Hata Mesajları ve Anlamları

Unable to find parameter 'SIM_WIND_SPD'

MAVProxy parametreyi kendi listesinde bulamadı. Ya gerçek bir uçuş kartına bağlısın ya da parametre listesi henüz inmedi. İndirme bittikten sonra komutu tekrarla.

Unknown parameter SIM_WIND_SPD

pymavlink içindeki mavparm modülü, dosyadan parametre yüklerken tanımadığı satırlar için bunu basıyor. SIM_ ile başlayan satırlar simülasyon dışı bir araca gönderildiğinde hepsi bu uyarıyı verir.

timeout setting SIM_WIND_SPD to 10.000000

Değer gönderildi ama onay dönmedi. Çoğunlukla sebep ikinci bir istemcidir; SITL tek TCP bağlantısı kabul ediyor, sonradan bağlanan sessizce aç kalıyor.

Rüzgârı senaryo kurmak için kullan

Rüzgâr, sürü ve senaryo simülasyonunu baştan kuran ders akışı Yapay Zeka ve İHA Simülasyon eğitimi içinde duruyor. Gazebo ve ROS kurulumundan kameradan tespite kadar giden bölümler var.

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

Ücretsiz kaynakArduPilot SITL kurulum rehberiSimülasyonu kendi bilgisayarınızda kurun: Ubuntu, Windows WSL ya da sanal makine, baştan sona.