Softivation

DroneKit kurulmuyor (Python 3.11 ve üzeri)

pip install dronekit geçiyor ama import dronekit patlıyor. Python 3.11 ve üzerinde sebebi ne, hangi kurulum yolu çalışıyor, pymavlink ile kalkış kodu.

Furkan IŞIKAY 8 dk okuma

DroneKit'i pip ile kuruyorsun, kurulum sorunsuz bitiyor. Sonra kodunun ilk satırında DroneKit'i içe aktarıyorsun ve program tam orada duruyor.

Yarışma hazırlığında en çok vakit yakan yerlerden biri burası. Kodunda bir yanlış yok, kurulumu da eksik yapmadın. Sorun paketin kendisinde ve yıllardır orada duruyor.

Python 3.11.15'te her kurulum yolunun nerede durduğunu aşağıda birebir hata metniyle bulacaksın.

pip neden geçiyor da import patlıyor

pip'in işi paketi indirip yerine koymak. Paketin o Python sürümünde çalışıp çalışmayacağına bakmaz. Bakması için paketin kendi bilgi kartında "ben şu sürümlerde çalışırım" yazması gerekir.

DroneKit'in kartında o satır boş. PyPI'daki son sürüm 2.9.2 ve 18 Mart 2019'da yüklenmiş. Python 3.10 bundan iki buçuk yıl sonra çıktı. Yani yayınlanmış paket, senin kullandığın Python'u hiç görmedi.

Python 3.10'da dilin içinde bir taşınma oldu: sözlük benzeri sınıfların tanımları collections altından collections.abc altına geçti. DroneKit hâlâ eski adresi kullanıyor ve o adres artık yok.

Forumdaki en yaygın tavsiye bugün işe yaramıyor

Bu hatayı aratınca çıkan ilk öneri şu: "PyPI'daki sürümü bırak, doğrudan GitHub deposundan kur, orada düzeltilmiş."

Düzeltmenin yarısı gerçekten orada. Depodaki güncel kod Python 3.10 ve üzeri için doğru adresi kullanıyor. Ama paketin ana dosyasının (dronekit/__init__.py) 51. satırında, kurulum listesinde adı hiç geçmeyen başka bir kütüphane çağrılıyor. Depodan kurduğunda o kütüphane gelmiyor ve import bu sefer daha erken duruyor.

Bu yüzden tek satırlık bir çözüm yok. DroneKit'i ayakta tutmak istiyorsan eksik kütüphaneyi elle eklemen gerekiyor; PyPI sürümünde ayrıca taşınan adresi kod içinden düzeltmen gerekiyor.

Hangi kurulum yolu nerede duruyor

Beş yolu yan yana koyunca tablo şöyle çıkıyor. İlk üç satır aynı yere varıyor: kurulum başarılı görünüyor, iş import satırında bitiyor.

Kurulum yoluSonuçEkranda gördüğün
pip install dronekitimport patlarModuleNotFoundError: No module named 'past'
pip install dronekit futureimport yine patlarAttributeError: module 'collections' has no attribute 'MutableMapping'
pip install git+.../dronekit-python.git (master dalı, forumlarda en çok önerilen)import patlarModuleNotFoundError: No module named 'past'
git sürümü + future ya da pip + future + shimimport geçerİki ek adım gerekir; paket 2019'dan beri güncellenmiyor.
pip install pymavlink (2.4.49, 1 Ağustos 2025)import geçerEk adım yok, bakımı süren paket.

İki yol var, ikisi de çalışıyor

Birincisi DroneKit'i yaşatmak: eksik kütüphaneyi kur, gerekiyorsa taşınan adresi import'tan önce elle bağla. Elindeki projeyi çalıştırmak için makul. DroneKit, Python 2.7 ortamında bu düzeltmelere gerek kalmadan çalışır; Python eğitimimiz de bu yüzden o ortamı kullanır.

İkincisi, Python 3.10 ve üzeriyle sıfırdan yeni bir projeye başlıyorsan DroneKit yerine doğrudan pymavlink kullanmak. DroneKit'in altında zaten pymavlink çalışıyor; onu doğrudan kullanınca aradaki katman ortadan kalkıyor. Aynı kalkış işi şu kadar kodla oluyor:

Python
import time
from pymavlink import mavutil

HEDEF_IRTIFA = 10.0
m = mavutil.mavlink_connection('tcp:127.0.0.1:5760', source_system=255)
m.wait_heartbeat(timeout=60)

# Bu satir olmadan GPS_RAW_INT hic gelmez, dongu sonsuza kadar bekler
m.mav.request_data_stream_send(m.target_system, m.target_component,
                               mavutil.mavlink.MAV_DATA_STREAM_ALL, 4, 1)
time.sleep(1)

# 3D fix ve en az 6 uydu beklenmeden ARM izni cikmaz
while True:
    msg = m.recv_match(type='GPS_RAW_INT', blocking=True, timeout=5)
    if msg and msg.fix_type >= 3 and msg.satellites_visible >= 6:
        print('GPS 3D fix, %d uydu' % msg.satellites_visible)
        break
time.sleep(8)

m.mav.set_mode_send(m.target_system,
    mavutil.mavlink.MAV_MODE_FLAG_CUSTOM_MODE_ENABLED, m.mode_mapping()['GUIDED'])
time.sleep(2)

# ARM ilk denemede reddedilebilir: prearm zinciri henuz gecmemis olabilir
for i in range(20):
    m.mav.command_long_send(m.target_system, m.target_component,
        mavutil.mavlink.MAV_CMD_COMPONENT_ARM_DISARM, 0, 1, 0, 0, 0, 0, 0, 0)
    ack = m.recv_match(type='COMMAND_ACK', blocking=True, timeout=3)
    if ack and ack.result == 0:
        print('ARM edildi (%d. denemede)' % (i + 1))
        break
    time.sleep(2)

m.mav.command_long_send(m.target_system, m.target_component,
    mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 0, 0, 0, 0, 0, 0, HEDEF_IRTIFA)

# ACK "komut kabul edildi" demek; irtifayi ayrica teyit et
while True:
    p = m.recv_match(type='GLOBAL_POSITION_INT', blocking=True, timeout=5)
    if p and p.relative_alt / 1000.0 >= HEDEF_IRTIFA * 0.95:
        print('irtifa: %.2f m' % (p.relative_alt / 1000.0))
        break

Bu kod tek başına çalışır, kurulumu tek satırdır ve arada eskimiş bir paket yoktur. ArduCopter 4.7.0'a bağlanıp çalıştırırsan terminalde şunu görürsün:

Kod
GPS 3D fix, 10 uydu
ARM edildi (1. denemede)
irtifa: 9.70 m

Sahada GPS'in fix vermesi ve uydu sayısının artması zaman alabilir; rüzgâr ve titreşim de kalkışın görünüşünü değiştirir. Bu çıktı kodun akışının doğru sırayla ilerlediğini gösterir.

İki tuzak

Telemetri akışını istemezsen GPS mesajı hiç gelmez. Kod GPS bekleyen döngüde sonsuza kadar takılır ve sen kodun kilitlendiğini sanırsın. Çoğu örnekte o satır yoktur.

İkincisi daha sinsi: TAKEOFF komutuna dönen onay, komutun kabul edildiğini söyler, hedefe ulaşıldığını değil. Onayı görüp bir sonraki komuta geçersen görev sırası bozulur. İrtifayı ayrıca teyit etmek zorundasın.

Şekilde kesikli dikey çizgi komutun gittiği an. İrtifa döngüsünün çıktığı kırmızı noktaya kadar yaklaşık beş saniye geçiyor; drone 10 metrede aşım yapmadan oturuyor.

TAKEOFF'tan sonra irtifanın hedefe çıkması

TAKEOFF komutu 3,75 saniyede gidiyor; irtifa hedefin yüzde 95'ini 8,75 saniyede, 9,70 metrede geçiyor ve 10 metrede aşım olmadan oturuyor.
Nereye bak: kesikli dikey çizgi ile kırmızı nokta arası. Komut gittiği anda drone daha yerde; irtifa döngüsü olmadan bu beş saniye kodunda görünmez.

Örnek: Yük bırakma görevinde kodun TAKEOFF onayını görür görmez ilk hedef noktasına gitme komutunu yolluyorsa, drone daha şekildeki eğrinin başındayken yeni komut gelir ve görev sırası bozulur. Önce irtifa döngüsünün hedefin yüzde 95'ini geçmesini bekle, hedef noktası komutunu ondan sonra gönder.

Hata Mesajları ve Anlamları

Kurulumdan kalkışa kadar ekranda görebileceğin metinler ve ne anlama geldikleri.

ModuleNotFoundError: No module named 'past'

DroneKit'in ihtiyaç duyduğu bir yardımcı kütüphane, paketin kurulum listesinde yazmadığı için gelmemiş. Elle kurman gerekiyor. Bu hatayı hem PyPI sürümünde hem de GitHub deposundan kurduğunda görürsün.

AttributeError: module 'collections' has no attribute 'MutableMapping'

Python 3.10'da taşınan adresin izi. PyPI'daki 2.9.2 sürümüne özgü; dosyanın 2689. satırında çıkar. GitHub'daki güncel kodda bu satır düzeltilmiş durumda.

PreArm: GPS 1: Bad fix

Otopilot ARM izni vermiyor çünkü GPS henüz 3B konum çözümü üretmedi. Kod ARM denemesini tekrarlıyorsa bu mesaj birkaç kez tekrar eder. Beklemek dışında yapacak bir şey yok.

PreArm: High GPS HDOP

Fix var ama uydu geometrisi zayıf. Otopilot konumun yeterince kesin olmadığını söylüyor. Açık alana çık, uydu sayısı artınca bu mesaj kaybolur.

PreArm: Need Position Estimate

Seçtiğin uçuş modu konum bilgisi istiyor ama otopilot henüz güvenilir bir konum tahmini kuramadı. GUIDED bu modlardan biri; konum tahmini oturmadan GUIDED'a geçemezsin.

PreArm: AHRS: waiting for home

Otopilot kalkış noktasını henüz kaydetmedi. Home noktası oturmadan ARM izni çıkmaz; bu da konum çözümünün oturmasına bağlıdır.

COMMAND_ACK içinde sonuç 4 görürsen: bu değer "komut çalıştırıldı ama başarısız oldu" demek. ARM komutunda bunu görüyorsan sebep prearm kontrollerinden biridir; asıl sebep ayrı bir metin mesajı olarak gelir. Kodun sadece onay koduna bakıyorsa sebebi hiç göremezsin.

Kaynaklar

Paketin son sürümü ve yükleme tarihi: PyPI · dronekit

ArduPilot'un yardımcı bilgisayar yazılımları listesi: ArduPilot · Companion Computers

Aynı soruyu soran bir forum başlığı: ArduPilot Discourse · High Level Python API for operations

Bu yazıyı okuyanlara

Buradaki kod kalkışı yaptırır. Ama görev yükleme, GUIDED ile AUTO arasındaki fark, yardımcı bilgisayardan kontrol ve araç sınıfının öznitelikleri ayrı bir sıra ister. Kursta bunlar hafta hafta ve uygulamalı ilerliyor.

Eğitimi incele: Python ile Sıfırdan İHA Kontrolü

Bu yazı işinize yaradı mı?

Ücretsiz kaynakPixhawk ve ArduPilot hata mesajları sözlüğüBu yazıdaki 4 mesaj ve benzerleri sözlükte: ne demek, neden çıkar, ilk neye bakılır.