Python'dan parametre yazıyorum, Pixhawk değeri almıyor
Raspberry Pi'deki Python kodun Pixhawk'a görev hızını ya da eve dönüş yüksekliğini yazıyor ve program hatasız bitiyor. Mission Planner'ı bağlayıp parametreye bakıyorsun: ya eski değer duruyor ya da hiç girmediğin bir sayı var.
Kodun bir şey göndermiş olması otopilotun onu aldığını göstermez. Otopilot ya paketi duymamıştır, ya adı tanımamıştır, ya da sayıyı kendi tipine göre değiştirip öyle kaydetmiştir; hangisi olduğunu her seferinde verdiği cevaptan anlarsın.
Otopilot yazma isteğine ne cevap veriyor
Parametre yazma paketi otopilota ulaşınca sırayla üç kontrolden geçer. Aşağıdaki şekilde soldan sağa ilerle: önce paketin bu araca gelip gelmediği, sonra adın listede olup olmadığı, en son parametrenin tipi.
Gri dal en zor fark edilenidir. Paketteki hedef sistem numarası aracınkiyle tutmuyorsa otopilot paketi yok sayar ve hiçbir şey göndermez; araç numarasını değiştirdiysen ya da aynı hatta iki araç varsa ilk buna bak.
Kırmızı dalda ad listede yoktur. ArduCopter 4.7 bu durumda PARAM_ERROR paketiyle cevap verir, 4.6 ve öncesi hiç ses çıkarmaz ve kodun cevap beklerken zaman aşımına düşer.
Mavi dalda değer kaydedilir ama tam sayı tutan bir parametreye ondalık ya da sınır dışı bir sayı yazdıysan geri dönen değer farklıdır. Sağ alttaki kutuya da bak: ondalık parametrelerde yazma anında aralık denetimi yok, ne gönderirsen o kaydedilir.
Copter 4.7'ye geçtiysen eski adlar reddediliyor
ArduCopter 4.7 bir grup parametrenin hem adını hem birimini değiştirdi. WPNAV_SPEED (cm/s) yerine WP_SPD (m/s), RTL_ALT (cm) yerine RTL_ALT_M (m), SYSID_THISMAV yerine MAV_SYSID geldi.
Otopilot güncellemeden sonraki ilk açılışta kayıtlı değerleri yeni adlara kendisi taşır ve birimini çevirir. Python kodundaki adlara ise dokunamaz; eski adla gönderdiğin her yazmayı otopilot reddeder. Mission Planner'da yeni adı bulmak için WPNAV_SPEED neden Mission Planner'da çıkmıyor yazısına bak.
Birim de değişti. Eski alışkanlıkla WP_SPD'ye 500 yazarsan otopilot itiraz etmez ve 500 m/s kaydeder; parametre listesinde aralık 0.10 ile 20 m/s arası yazsa da otopilot yazma sırasında bu aralığa bakmaz.
Tam sayı parametreye ondalık yazınca ne oluyor
FS_THR_ENABLE gibi seçenek parametreleri tam sayı tutar. Bu parametre INT8 tipindedir ve −128 ile 127 arasını alır: 1.6 gönderirsen 1, 300 gönderirsen 127 kaydedilir.
Bazı kütüphaneler tam sayıyı ondalık alanın baytlarına olduğu gibi kopyalar, ArduPilot ise alanı sayı olarak okur; tam sayı 1'i bayt olarak kopyalarsan otopilot 0 kaydeder. FS_THR_ENABLE için 0, gaz failsafe'inin kapalı olması demek.
Örnek: yarışma sabahı Pi'den parametre yüklemek
Takımın geçen sezon yazdığı bir kod var: kalkıştan önce Pi'den görev hızını 8 m/s, eve dönüş yüksekliğini 30 m yapıyor. Kodda değerler eski adlarla duruyor: WPNAV_SPEED 800, RTL_ALT 3000.
Pixhawk'ı 4.7'ye güncelledin. Kod iki yazmayı da gönderir, ekrana "gönderildi" basar ve biter; otopilot iki adı da reddettiği için drone güncellemeden önceki kayıtlı değerlerle uçar. Cevabı okuyan bir kod aynı iki reddi kalkıştan önce terminale yazar.
Yazdığını cevapla doğrulayan kod
Aşağıdaki fonksiyon parametreyi gönderir, aynı ada gelen PARAM_VALUE ya da PARAM_ERROR paketini bekler ve dönen değeri istediğinle karşılaştırır. Bağlantı satırını kendi hattına göre değiştir: Pi'nin seri portu için mavutil.mavlink_connection('/dev/serial0', baud=57600) gibi, baud değeri Pixhawk'taki seri port ayarıyla aynı olmalı.
Kodu çalıştırırsan üç satır görürsün:
WPNAV_SPEED: otopilot reddetti, hata kodu 1
WP_SPD = 5.0 kaydedildi
FS_THR_ENABLE: 1.6 yazdın, otopilot 1.0 kaydettiİlk satır kırmızı daldır: hata kodu 1, adın bu firmware'de olmadığını söyler, adı yeni karşılığı ve birimiyle değiştir. İkinci satırda değer olduğu gibi kaydedilmiş. Üçüncü satır mavi daldır: parametrenin tipine listeden bak ve tam sayı gönder.
Üç satırın yerinde yalnızca "cevap gelmedi" görüyorsan hedef numarasına bak. Kod bu numarayı ilk gelen HEARTBEAT paketinden alır; hatta başka bir araç da varsa m.target_system değerini ekrana bas ve aracın MAV_SYSID değeriyle karşılaştır.
Cevap doğru, drone yine eski ayarla uçuyorsa
Bazı parametreler ancak otopilot yeniden açılınca devreye girer. Parametre listesinde bunların altında "Reboot required after change" notu durur, FRAME_CLASS bu gruptadır; değer kaydedilmiştir ama otopilotu yeniden başlatana kadar eski ayar çalışır.
Değer kart kapanıp açılınca kayboluyorsa sorun saklamada olabilir. Otopilot kalıcı kaydı arka planda yapar ve PARAM_VALUE'yu bu kayıttan sonra gönderir, o yüzden cevap gelmeden gücü kesme.
Hata Mesajları
MAV_PARAM_ERROR_DOES_NOT_EXIST
Gönderdiğin ad bu firmware'de yok. Adı parametre listesinde ara; 4.7'ye geçtiysen yeni adına ve birimine bak.
Param write denied
Parametre salt okunur ya da dahili kullanıma kilitli. Otopilot bu yazının yanında eski değeri tekrar gönderir ve değer değişmez.
MAV_PARAM_ERROR_VALUE_OUT_OF_RANGE
Gönderdiğin değer NaN ya da sonsuz. Kodda boş bir okumanın ya da sıfıra bölmenin sonucu yazmaya gidiyordur.
Bu konu hangi eğitimde var
Yardımcı bilgisayardan Pixhawk'a komut ve parametre göndermeyi, cevabını okumayı baştan öğrenmek istiyorsan Python ile Sıfırdan İHA Kontrolü eğitimine bak. Ders sürümünde eski adları birimiyle çeviren kod, uçuş kaydında yazmanın izi ve PX4 farkı var.
İNDİRİM KUPONU
Kupon kodu: SOFTIVATION15
Eğitimi alırken ödeme ekranındaki "Kupon kodu" kutusuna bu kodu yaz, %15 iner.




Yorumlar