Pixhawk home Python'dan değişmiyor, RTL eski yere dönüyor
Pixhawk home Python'dan değişmiyor ve RTL eski yere dönüyorsa komut GPS'ten önce gitmiş ya da irtifası yanlış yazılmıştır. Doğru kod ve kontrol adımları.
Raspberry Pi'deki Python kodun açılışta home noktasını iniş bölgesine taşıyor. Komut gidiyor, kod hata vermiyor, ama drone RTL'e geçince yine kalkış yerine dönüyor. Bazen de home yerini buluyor, bu kez Mission Planner yerde duran drone'un irtifasını 500 metre gösteriyor.
Sahadan bir örnek: drone'u hazırlık masasının yanında ARM ediyorsun, RTL'de ise 100 m kuzeydeki iniş bölgesine dönmesini istiyorsun. Kod home'u o noktaya çekiyor, Mission Planner'daki H işareti ise hâlâ masanın yanında duruyor.
Home komutu neden tutmuyor
Otopilot home'u ancak kendi konumunu bildiği zaman kabul eder. Pi, Pixhawk'tan hızlı açılır; kod çalıştığında GPS çoğu zaman 3D fix almamış, otopilotun konum başlangıcı (EKF origin) henüz kurulmamıştır.
Bu anda gelen home komutu FAILED cevabıyla geri döner. Kod cevaba bakmıyorsa hiçbir şey fark etmezsin: GPS kilitlenince otopilot home'u kendisi o anki yere koyar, ARM anında da bu home'u kalkış noktasıyla yeniler.
İkinci tuzak komutun ilk alanında. param1'e 1 yazarsan ya da enlem ve boylamı 0 bırakırsan otopilot verdiğin noktayı okumaz, drone'un durduğu yeri home yapar. Cevap ACCEPTED gelir, home yine yerinden kıpırdamaz.
DroneKit'te vehicle.home_location'a yazdığın değer, komut gitmeden kütüphanenin içinde saklanır. Otopilot komutu reddetse bile geri okuduğun değer senin yazdığın olur.
Mission Planner irtifayı neden 500 metre gösteriyor
Home komutu COMMAND_LONG ile gidiyorsa son alan (param7) deniz seviyesinden irtifadır, home'a göre yükseklik değil. Saha 500 m rakımdaysa ve oraya 0 yazdıysan otopilot home'u deniz seviyesine indirir. Yerdeki drone'un göreceli irtifası bir anda 500 m olur.
Bundan sonra göreceli irtifayla verdiğin her hedefi otopilot home'un üstüne ekler. Şekilde sağ sütuna bak: 520 m'de uçan drone'a "20 m'ye git" dediğinde hedef deniz seviyesinden 20 m'ye, yani zeminin 480 m altına düşer.
Göreceli 20 m hedef, home irtifasına eklenir
Drone o hedefe doğru alçalır ve yere değene kadar durmaz. Yerdeyken aynı hata kalkışı engeller: otopilot kendini home'un 500 m üstünde sandığı için 20 m'lik takeoff komutunu aşağı doğru bir kalkış sayar ve FAILED döner.
En sık yapılan hata: param7'yi home'a göre yükseklik sanıp 0 yazmak. COMMAND_LONG'da bu alan deniz seviyesinden irtifadır; ya sahanın rakımını yaz ya da COMMAND_INT ile home'a göre çerçeve kullan.
Home'u doğru gönderen Python kodu
Kod üç iş yapar: EKF origin kurulana kadar bekler, home'u COMMAND_INT ile gönderir, sonra otopilotun kaydettiği home'u geri okur. COMMAND_INT'te enlem ve boylam tam sayı gider, kod irtifa için home'a göre çerçeveyi seçer.
from pymavlink import mavutil
import time
BAGLANTI = "tcp:127.0.0.1:5760" # Pi: "/dev/serial0" (baud= ile hız ver)
YENI_LAT, YENI_LON = 37.1600, 38.7969 # yeni home noktası
IRTIFA_FARKI = 0.0 # yeni home, eski home'dan kaç m yukarıda
m = mavutil.mavlink_connection(BAGLANTI)
m.wait_heartbeat()
def mesaj_iste(msg_id, tip, sure=3):
m.mav.command_long_send(m.target_system, m.target_component,
mavutil.mavlink.MAV_CMD_REQUEST_MESSAGE, 0, msg_id, 0, 0, 0, 0, 0, 0)
return m.recv_match(type=tip, blocking=True, timeout=sure)
# 1) EKF origin oluşmadan gelen home komutu reddedilir: önce bekle
while mesaj_iste(49, "GPS_GLOBAL_ORIGIN") is None:
print("EKF origin yok, bekleniyor...")
time.sleep(2)
# 2) COMMAND_INT: koordinat derece x 1e7 tam sayı, irtifa home'a göre
m.mav.command_int_send(m.target_system, m.target_component,
mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT,
mavutil.mavlink.MAV_CMD_DO_SET_HOME, 0, 0,
0, 0, 0, 0, # param1=0: verdiğim konumu kullan
int(YENI_LAT * 1e7), int(YENI_LON * 1e7), IRTIFA_FARKI)
ack = m.recv_match(type="COMMAND_ACK", blocking=True, timeout=3,
condition="COMMAND_ACK.command==179")
print("ACK:", mavutil.mavlink.enums["MAV_RESULT"][ack.result].name)
# 3) Otopilotun kaydettiği home'u geri oku
h = mesaj_iste(242, "HOME_POSITION")
print(f"home: {h.latitude/1e7:.7f} {h.longitude/1e7:.7f} "
f"{h.altitude/1000:.1f} m (deniz seviyesinden)")BAGLANTI satırını kendi hattına göre değiştir. Yeni nokta tepede ya da çukurdaysa IRTIFA_FARKI'na iki nokta arasındaki yükseklik farkını metre olarak yaz; düz sahada 0 kalabilir.
Ekranda ne görmelisin
Kodu GPS kilitlenmeden çalıştırırsan önce bekleme satırını, origin kurulunca ACK'i ve geri okunan home'u görürsün:
EKF origin yok, bekleniyor...
ACK: MAV_RESULT_ACCEPTED
home: 37.1599999 38.7969000 500.1 m (deniz seviyesinden)- Gir: param1 = 0 ve IRTIFA_FARKI = 0. Gör: ACK satırında MAV_RESULT_ACCEPTED, home satırında sahanın rakımı. Değilse: home satırındaki enlem ve boylamı kendi değerlerinle karşılaştır.
- Gir: drone yerdeyken Mission Planner'da göreceli irtifaya bak. Gör: 0 m civarı. Değilse: home irtifası yanlış gitmiştir; komutu doğru irtifayla yeniden gönder.
- Gir: RTL'e geç. Gör: drone yeni H işaretine dönüyor. Değilse: araçta rally noktası var mı bak; RTL home yerine daha yakındaki rally noktasını seçebilir.
Hata Mesajları
MAV_RESULT_FAILED
Home komutu için en sık sebep EKF origin'in henüz kurulmamış olmasıdır. param1'e 0 ya da 1 dışında bir değer yazmak ve geçersiz enlem ya da boylam da aynı cevabı verir.
MAV_RESULT_DENIED
Otopilot komutun çerçevesini tanımadı ya da irtifa alanı boş veya sınır dışında. COMMAND_INT'te frame alanına MAV_FRAME_GLOBAL ya da MAV_FRAME_GLOBAL_RELATIVE_ALT yaz.
PreArm: Need Position Estimate
Otopilotun konum tahmini hazır değil. Bu mesaj kaybolmadan home komutu göndermek yerine kodun bekleme döngüsünün origin'i görmesini bekle.
EKF3 IMU0 origin set
Bilgi mesajıdır: otopilot konum başlangıcını kurdu ve home komutunu bu satırdan sonra kabul eder.
Devamı
Python ile Sıfırdan İHA Kontrolü eğitiminin sorun giderme bölümünde otopilotun bu komutu hangi sırayla elediği, ARM anında home'a ne olduğu ve rally noktalarıyla ilişkisi kaynak koduyla anlatılıyor.
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