Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

8. ünite / 10

PX4 mimarisi, uçuş kipleri, MAVLink ve MAVSDK

YazılımSimülasyon

Bu ünitenin sonunda

  • PX4'ün modül yapısını ve uORB veri akışını çizmek
  • Uçuş kiplerini ve hangi sensörlere ihtiyaç duyduklarını sıralamak
  • Temel MAVLink mesajlarını ve komutlarını tanımak
  • MAVSDK-Python ile SITL'de görev yükleyip uçurmak

Ders notları

PX4, NuttX gerçek zamanlı işletim sisteminde çalışan modüllerden oluşur. Modüller birbirini doğrudan çağırmaz; uORB adlı yayınla-abone ol veri yolu üzerinden konuşur. Bu yüzden bir modül değiştirildiğinde diğerleri etkilenmez ve aynı kod SITL'de de çalışır.

sensors → ekf2 → navigator / mc_pos_control → mc_att_control → mc_rate_control → control_allocator → ESC
  • commander: ARM, uçuş kipi ve failsafe durum makinesi. navigator: görev, eve dönüş, iniş. mavlink: dış dünyayla bağlantı.
  • Uçuş kipleri: Stabilized (açı), Acro (hız), Altitude (irtifa tutma), Position (GPS ile konum tutma), Hold, Mission, Return, Land, Takeoff, Offboard (dış bilgisayar komutu), Precision Land.

MAVLink

MAVLink, uçuş kontrolcüsüyle yer istasyonu ve görev bilgisayarı arasındaki ikili mesaj protokolüdür. Her sistem saniyede bir HEARTBEAT (#0) yollar. Telemetri için ATTITUDE (#30), GLOBAL_POSITION_INT (#33), SYS_STATUS (#1); komutlar için COMMAND_LONG içinde MAV_CMD_COMPONENT_ARM_DISARM (400), MAV_CMD_NAV_TAKEOFF (22); görev için MISSION_ITEM_INT; dış denetim için SET_POSITION_TARGET_LOCAL_NED. SITL'de QGroundControl UDP 14550'yi, MAVSDK ve betikler 14540'ı kullanır.

MAVSDK, MAVLink'in üstünde Python/C++/Swift kütüphanesidir: action.arm(), mission.upload_mission() gibi çağrıları mesaj dizilerine çevirir ve onayları bekler.

Simülasyon

Quadrotor uçuş denetimi (2B)

Kaskad denetleyicili düzlemsel quadrotor: dışta konum PID, içte yönelim PD. Hedef koymak için gökyüzüne tıkla, ya da görev kipine geçip ara noktaları yerleştir ve görevi başlat.

Simülasyon görevi

ESOF 323'ün 2B quadrotor simülasyonunda önce konum tutma kipinde hedefe tıkla (Position kipine benzer), sonra görev kipine geç, ara noktaları yerleştir ve görevi başlat (Mission kipine benzer). Rüzgârı artır ve hangi döngünün zorlandığını gözle. Gazebo kurduysan MAVSDK betiğini SITL'e karşı çalıştır.

Kod

MAVSDK-Python: görev yükle, uç, izle (PX4 SITL)
# pip install "mavsdk>=2,<4"   (gRPC API'si; 1.x'te vehicle_action yok; v4 "mavsdk" adı farklı bir yerel API, aynı kod için mavsdk-grpc)
import asyncio
from mavsdk import System
from mavsdk.mission import MissionItem, MissionPlan

def wp(lat, lon, alt=15.0, speed=6.0):
    nan = float("nan")
    return MissionItem(latitude_deg=lat, longitude_deg=lon, relative_altitude_m=alt, speed_m_s=speed,
                       is_fly_through=True, gimbal_pitch_deg=nan, gimbal_yaw_deg=nan,
                       camera_action=MissionItem.CameraAction.NONE, loiter_time_s=nan,
                       camera_photo_interval_s=nan, acceptance_radius_m=1.0, yaw_deg=nan,
                       camera_photo_distance_m=nan, vehicle_action=MissionItem.VehicleAction.NONE)

async def main():
    drone = System()
    await drone.connect(system_address="udpin://0.0.0.0:14540")   # SITL offboard API portu
    async for s in drone.core.connection_state():
        if s.is_connected:
            break
    async for h in drone.telemetry.health():                        # EKF ve GPS hazır mı?
        if h.is_global_position_ok and h.is_home_position_ok:
            break
    home = await anext(drone.telemetry.home())
    d = 0.0002                                                      # ≈ 22 m kuzey / 15 m doğu
    items = [wp(home.latitude_deg + d, home.longitude_deg),
             wp(home.latitude_deg + d, home.longitude_deg + d),
             wp(home.latitude_deg, home.longitude_deg + d)]
    await drone.mission.set_return_to_launch_after_mission(True)
    await drone.mission.upload_mission(MissionPlan(items))
    await drone.action.arm()
    await drone.mission.start_mission()
    async for p in drone.mission.mission_progress():
        print(f"görev {p.current}/{p.total}")
        if p.current == p.total:
            break

asyncio.run(main())
pymavlink: HEARTBEAT, telemetri ve ARM komutu
# pip install pymavlink    (QGroundControl ya da MAVSDK aynı portu dinliyorsa kapat)
from pymavlink import mavutil

m = mavutil.mavlink_connection("udpin:0.0.0.0:14540")
m.wait_heartbeat()                                     # HEARTBEAT (#0)
print("sistem", m.target_system, "bileşen", m.target_component)

# MAV_CMD_COMPONENT_ARM_DISARM (400), param1 = 1 → ARM
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)
print("ACK:", ack)

for _ in range(20):
    msg = m.recv_match(type=["ATTITUDE", "GLOBAL_POSITION_INT", "SYS_STATUS"], blocking=True)
    if msg.get_type() == "ATTITUDE":                   # #30, radyan
        print(f"roll {msg.roll:.3f} pitch {msg.pitch:.3f}")
    elif msg.get_type() == "GLOBAL_POSITION_INT":      # #33, derece × 1e7, mm
        print(msg.lat / 1e7, msg.lon / 1e7, msg.relative_alt / 1000, "m")
    else:                                              # #1
        print("batarya", msg.voltage_battery / 1000, "V", msg.battery_remaining, "%")

Sık yapılan hatalar

  • EKF ve GPS hazır olmadan görev başlatmaya çalışmak: PX4 ARM'ı reddeder, betik beklemeli.
  • QGroundControl, MAVSDK ve pymavlink'i aynı UDP portunda dinletmek.
  • Komut onayını (COMMAND_ACK) kontrol etmemek: komut reddedilmiş olabilir.
  • MAVSDK sürümleri arasındaki API farklarını göz ardı etmek (ör. MissionItem alanları).

Yazılım mühendisliği bağlantısı

PX4, gevşek bağlı bir mimarinin ders kitabı örneğidir: modüller yalnız uORB mesaj sözleşmeleriyle konuşur.

  • Kendi görev yazılımını da böyle kur: algılama, karar ve denetim ayrı süreçler (ya da ROS 2 düğümleri), aralarında tanımlı mesajlar.
  • Mesaj tanımlarını (MAVLink XML, px4_msgs) sürümlü bir sözleşme olarak gör; değiştirmek tüm istemcileri etkiler.

Kendini sına

  1. PX4 modülleri arasında veri hangi mekanizmayla akar?

  2. Yer istasyonu bir aracın varlığını ve kimliğini hangi MAVLink mesajından öğrenir?

  3. Position kipinde kumanda çubukları bırakılınca drone ne yapar?

  4. PX4 SITL'de MAVSDK betikleri varsayılan olarak hangi UDP portuna bağlanır?

Bu üniteden sonra bitirme projesinde

  • Ara kontrol: görev: Mimari belgesi (düğümler, konular, durum makinesi); MAVSDK ya da offboard ile SITL'de dört ara noktalı görev; kayıt ve harita görüntüsü.

Bu ünitenin parçaları

3B modelli gerçek Hyvex parçaları:

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç