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.
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 yolu | Sonuç | Ekranda gördüğün |
|---|---|---|
| pip install dronekit | import patlar | ModuleNotFoundError: No module named 'past' |
| pip install dronekit future | import yine patlar | AttributeError: module 'collections' has no attribute 'MutableMapping' |
| pip install git+.../dronekit-python.git (master dalı, forumlarda en çok önerilen) | import patlar | ModuleNotFoundError: No module named 'past' |
| git sürümü + future ya da pip + future + shim | import 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çer | Ek 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:
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))
breakBu 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:
GPS 3D fix, 10 uydu
ARM edildi (1. denemede)
irtifa: 9.70 mSahada 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ı
Ö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.
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