Python İle “pymavlink” Kütüphanesi

Küçük Bir Not: Bu yazıda anlatılanları ve kodları rahatça takip edebilmeniz için temel düzeyde Python bilgisine sahip olmanız yeterlidir.
İHA’lar (İnsansız Hava Araçları) havada uçarken yerdeki istasyonla ve kendi içindeki sensörlerle sürekli bir veri alışverişi yapmak zorunda. İşte bu veri alışverişinin arkasındaki MAVLINK adında özel bir haberleşme dili var.
pymavlink kütüphanesi de Python ile bu dilde konuşmamızı, yani drone’a şuraya git, şu sensörden gelen veriyi oku veya motora şu komutu ver dememizi sağlayan en pratik araç. Kod tarafında işler tam olarak bu köprüyü kurmakla dönüyor.
Bu yazıda ise projemizde de aktif olarak kullandığımız pymavlink kütüphanesinin detaylarına ve işin pratikine yakından bakacağız.
Kurulum Aşaması
Windows için:
1-Öncelikle bilgisiyarımızda python kurulumu onu kontrol ediyoruz , bunun için bilgisiyarımızda aynı anda win+r tuşuna basıyoruz , ardından açılan run penceresine cmd yazıp enter tuşuna basıyoruz

2-Açılan komut istemi sayfasına python3 --version yazıyoruz Eğer karşımıza Python x.x.x gibi bir yazı çıkarsa sistemimizde Python’ın başarıyla kurulu olduğunu ve terminal üzerinden sorunsuz çalıştırılabildiğini anlarız.Çıkmadığı taktirde lütfen tıklayınız.
3-python3 -m venv venv kodu ile sanal alan oluşturun ve source venv/bin/active ile oluşturduğunuz alana girin.
4-Komut istemi sayfasına pip install pymavlink kodunu yazınız. Hata alan olursa yorumlarda belirtsin, beraber çözeriz.
Linux için:
1-Klavyenizden ctrl+alt+t tuşlarına basarak terminalinizi açınız .

2-açılan sekmede python3 --version kodu ile python kurulumu kontrol ediniz .Eğer karşımıza Python x.x.x gibi bir yazı çıkarsa sistemimizde Python’ın başarıyla kurulu olduğunu ve terminal üzerinden sorunsuz çalıştırılabildiğini anlarız.Çıkmadığı taktirde lütfen tıklayınız.
3-python3 -m venv venv kodu ile sanal alan oluşturun ve source venv/bin/active ile oluşturduğunuz alana girin.
4-son olarak terminal ekranına pip install pymavlink kodunu yazınız. Hata alırsanız yorumlarda belirtin, beraber çözeriz.
Kurulumdan Sonra
Sırada, kütüphaneyi kurduktan sonra işin asıl keyifli kısmı olan Python ile ilk bağlantıyı kurma ve telemetri verilerini okuma aşaması var.
Bağlantıyı kurabilmek için önce elinizdeki uçuş kontrol kartını bilgisayara bağlamanız gerekiyor. Ben bu yazıda gerçek bir kart yerine simülasyon ortamı kullanacağım, bilgisayar olarak ise kendi dizüstü bilgisayarımı tercih ediyorum.
Bilgisiyarınızda herhangibi bir kod editörü açarak uçuş kontrolcüsüne(Fly Controller) bağlanmak için kütüphanemizi dahil ediyoruz .
from pymavlink import mavutil

ardından uçuş kontrol kartına bağlantımızı gerçekleştiriyoruz , bağlantı adresini nasıl bulacağınızı bilmiyorsanız tıklayınız
master = mavutil.mavlink_connection('bağlantı adresi')
Bağlantıyı yaptıktan sonra, drone ile haberleşmenin kesilmemesi ve kartın aktif kalmasını sağlamak için sürekli bir kalp atışı (heartbeat) sinyali göndermemiz gerekir. Bunun için Python’ın threading kütüphanesini kullanarak arka planda sürekli kalp atışı yayan bir fonksiyon yazıyoruz:
print("Drona bağlanılıyor ...")
master.wait_heartbeat()
print("Dron AKTİF ")
def kalpAtisi(yol):
while True:
yol.mav.heartbeat_send(
0,
0,
0,
0,
0,
0
)
threading.Thread(target=kalpAtisi , args=(master,) , daemon=True).start()
print("Kalp atışı başladı",)
time.sleep(1)
Buraya kadar yaptıklarımızla, ister simülasyon ortamında ister gerçek bir uçuş kontrol kartında olun, sistemle güvenli bir bağlantı kurmayı ve MAVLink protokolünün en temel kuralı olan “kalp atışı” (heartbeat) sinyaliyle bağlantının kopmasını engellemeyi başardık.
Artık kartımızla sürekli iletişim halinde olduğumuza göre, bir sonraki adımda bu bağlantı üzerinden anlık telemetri verilerini okumayı ve drone’umuzu yönetmeyi öğreneceğiz.
Şimdi MAVlink protokolünü bir ana yol gibi düşünün a noktasından b noktasına giden bir anayol bu anayolda tırların olduğunu ve tıralarıdna paketler taşıdığını düşünün .Bu tırlardan bizim işimize yarayan tırı alıyoruz örnek verecek olursak GLOBAL_POSITION_INT tırı ve bu tırın içindeki bir paketi yani relative_alt paketini alıyoruz , bu kod üzerinde gösterecek olursak.
pos = master.recv_match(type='GLOBAL_POSITION_INT', blocking=True)
if pos:
yerden_yukseklik = pos.relative_alt / 1000.0
print(f"Yerden Yükseklik: {yerden_yukseklik} metre")Kodun bu son kısmında iki önemli olay gerçekleşiyor. İlk olarak recv_match ve type mantığı sayesinde, uçuş kontrol kartından veya simülatörden akan veri akışını dinliyoruz. İçine yazdığımız type='GLOBAL_POSITION_INT' parametresi, o kalabalık veri akışı içerisinden sadece bizim o an ilgilendiğimiz, yani anlık konum ve yükseklik bilgilerini barındıran veri paketini filtreleyip çekmemize yarıyor. blocking=True kısmı ise o paket gelene kadar kodun durup beklemesini, veri gelmeden alt satırlara geçmemesini sağlıyor. İkinci olarak tır ve paket benzetmesini ele alırsak; MAVLink protokolünü A noktasından B noktasına giden büyük bir otoyol gibi düşünebilirsiniz. Bu otoyol üzerinde sürekli veri taşıyan “tırlar” yani mesaj paketleri geçer. Biz type='GLOBAL_POSITION_INT' diyerek o otoyoldan tam olarak işimize yarayan o tırı seçiyoruz. Tırın içine baktığımızda ise bizi relative_alt gibi değişkenler yani tırın taşıdığı paketler bekliyor. Kod içerisindeki pos.relative_alt ifadesi de o tırın kasasındaki paketi açıp içindeki yerden yükseklik verisini alıp milimetreden metreye çevirmemizi sağlıyor. İhtiyacınız olan tüm bu mesaj türlerine ve detaylı protokol yapılarına MAVLink resmi web sitesinden ulaşabilirsiniz.