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.
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
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.
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/sProfili 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.
# 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:
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 dereceOn 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ı?
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