Softivation

Python deneme alanı

Bilgisayarınıza bir şey kurmadan, hesap açmadan Python çalıştırın. Kodu değiştirin, "Çalıştırın"a basın; numpy, matplotlib ve pymavlink hazır.

  • Kod sitenin geri kalanından ayrı bir alanda çalışır; hesabınıza, bu sayfaya ve internete erişemez.
  • İlk çalıştırmada Python tarayıcınıza iner (birkaç saniye), sonra hızlıdır.

Yer istasyonunun her saniye gönderdiği HEARTBEAT mesajını baytlara çevirip geri çözüyoruz. Bir baytı bozunca CRC denetimi mesajı reddeder: telemetrideki "bozuk paket" sayacı tam olarak bu.

# HEARTBEAT: yer istasyonunun (GCS) her saniye gönderdiği kalp atışı mesajı
from pymavlink.dialects.v20 import ardupilotmega as mavlink

class Tampon:
    def __init__(self):
        self.veri = b""
    def write(self, b):
        self.veri += b

t = Tampon()
gcs = mavlink.MAVLink(t, srcSystem=255, srcComponent=190)
gcs.heartbeat_send(mavlink.MAV_TYPE_GCS, mavlink.MAV_AUTOPILOT_INVALID, 0, 0, 0)
print("Baytlar :", t.veri.hex(" "))
print("Uzunluk :", len(t.veri), "bayt (başlık 10 + yük 9 + CRC 2)")

m = mavlink.MAVLink(None).parse_buffer(t.veri)[0]
print("Çözülen :", m.get_type(), "| sistem", m.get_srcSystem(), "| bileşen", m.get_srcComponent())

# Bir baytı bozun: CRC tutmaz, mesaj kabul edilmez
bozuk = bytearray(t.veri)
bozuk[12] ^= 0xFF
cozucu = mavlink.MAVLink(None)
try:
    sonuc = cozucu.parse_buffer(bytes(bozuk))
    print("Bozuk paket:", sonuc)
except mavlink.MAVError as e:
    print("Bozuk paket reddedildi:", e)

Bu konunun tamamı: Python ile Sıfırdan İHA Kontrolü

PID ile irtifa tutma

Sanal bir multikopter 10 metreye çıkıp orada kalmaya çalışıyor. Kp, Ki ve Kd ile oynayın: aşımın, salınımın ve yerleşme süresinin nasıl değiştiğini grafikte görün.

import matplotlib.pyplot as plt

kp, ki, kd = 1.2, 0.15, 0.9   # bu üç değerle oynayın
hedef = 10.0                  # metre
dt = 0.05                     # saniye

irtifa = hiz = integral = 0.0
onceki_hata = hedef
zaman, iz = [], []
for adim in range(400):
    hata = hedef - irtifa
    integral += hata * dt
    turev = (hata - onceki_hata) / dt
    onceki_hata = hata
    ivme = kp * hata + ki * integral + kd * turev
    ivme = max(-5.0, min(5.0, ivme))   # motorların sınırı: 5 m/sn2 (ivme)
    hiz = (hiz + ivme * dt) * 0.98     # hava direnci
    irtifa += hiz * dt
    zaman.append(adim * dt)
    iz.append(irtifa)

print(f"Son irtifa: {irtifa:.2f} m | en yüksek: {max(iz):.2f} m | aşım: {max(iz) - hedef:.2f} m")
plt.figure(figsize=(7, 3.2))
plt.plot(zaman, iz, label="irtifa")
plt.axhline(hedef, ls="--", c="gray", label="hedef")
plt.xlabel("zaman (sn)"); plt.ylabel("irtifa (m)"); plt.legend(); plt.title("PID ile irtifa tutma")
plt.show()

Bu konunun tamamı: Sensörlerden Uçuşa Temel İHA Eğitimi

İki GPS noktası arası mesafe ve yön

Görev sırasında bir sonraki waypoint'e ne kadar kaldığını ve hangi yöne dönüleceğini haversine formülüyle hesaplayın. Koordinatları kendi sahanızınkiyle değiştirin.

from math import radians, degrees, sin, cos, atan2, sqrt

R = 6371000  # Dünya'nın ortalama yarıçapı (m)

def mesafe_yon(enlem1, boylam1, enlem2, boylam2):
    f1, f2 = radians(enlem1), radians(enlem2)
    df, dl = radians(enlem2 - enlem1), radians(boylam2 - boylam1)
    a = sin(df / 2) ** 2 + cos(f1) * cos(f2) * sin(dl / 2) ** 2
    mesafe = 2 * R * atan2(sqrt(a), sqrt(1 - a))
    yon = degrees(atan2(sin(dl) * cos(f2), cos(f1) * sin(f2) - sin(f1) * cos(f2) * cos(dl))) % 360
    return mesafe, yon

kalkis = (40.2307, 29.0099)     # örnek: Bursa
waypoint = (40.2335, 29.0152)

d, y = mesafe_yon(*kalkis, *waypoint)
print(f"Mesafe: {d:.1f} m | yön: {y:.0f} derece")
print(f"10 m/sn hızla yaklaşık {d / 10:.0f} saniye")

Bu konunun tamamı: Sıfırdan Mission Planner Eğitimi