Softivation

SITL'de kumanda kesildi, Python açıkken failsafe gelmiyor

SITL'de kumanda kesilince failsafe gelmiyor ve drone LOITER'da asılı kalıyorsa sebep Python'un yolladığı RC override paketleri olabilir. Testi böyle kur.

Furkan IŞIKAY 6 dk okuma

Kumanda kaybı provası için simülasyonda alıcıyı kapatıyorsun, drone ise eve dönmüyor. Mission Planner'da failsafe uyarısı çıkmıyor, drone olduğu yerde asılı kalıyor. Aynı anda bir Python kodu da çalışıyorsa sebep büyük ihtimalle o kod.

Kumanda kaybını gerçek drone'da denemek pahalı bir hata olabilir. Bu yüzden provayı ArduPilot'un simülatöründe, SITL'de yaparsın. Provayı doğru kurarsan failsafe bir saniyede gelir; yanlış kurarsan hiç gelmez ve sen ayarların doğru olduğunu sanırsın.

Kumandayı kesince ne olması gerekiyor

Otopilot alıcıdan yeni sinyal gelmediği her an bir sayaç işletir. Sayaç RC_FS_TIMEOUT süresini (varsayılan 1 saniye) geçince ekrana Radio Failsafe yazar ve FS_THR_ENABLE ayarına göre drone'u RTL'e ya da LAND'e alır. FS_THR_ENABLE'ın varsayılanı 1'dir, yani RTL.

SITL'de alıcıyı susturmanın yolu SIM_RC_FAIL parametresidir. 1 yaparsan alıcı hiç sinyal üretmez. 2 yaparsan bütün kanallar ortaya, gaz ise 950 µs'ye iner; bu değer FS_THR_VALUE'nun (975) altında kaldığı için failsafe yine tetiklenir.

Python kodu failsafe'i nasıl saklıyor

Otopilot, MAVLink'ten gelen RC override paketini de canlı bir kumanda sinyali gibi sayar. Her paket sayacı sıfırlar, alıcı tamamen susmuş olsa bile. Kodun gazı saniyede birkaç kez override ile gönderiyorsa sayaç bir saniyeye hiç ulaşmaz.

Alıcı aynı anda susuyor; failsafe yalnızca override yokken geliyor

Alıcı aynı anda susuyor; failsafe yalnızca override yokken geliyor
Alt şeride bak: alıcı 20 saniye sessiz, drone yine LOITER'da. Kırmızı RTL bloğu override durduktan sonra başlıyor.

Şekildeki alt şeride bak: alıcı 20 saniye boyunca sessiz, ama override paketleri sürdükçe drone LOITER'da 15 metrede bekliyor. Kırmızı RTL bloğu paketler kesildikten 0,5 saniye sonra başlıyor. Üst şeritte override yok ve failsafe tam 1,0 saniyede geliyor.

Sahadaki karşılığı: kodun kalkıştan sonra drone'u LOITER'da tutmak için gazı 1500'de override ediyor, sen de bu sırada kumanda kaybı provası yapıyorsun. Kod çalıştığı sürece otopilot kumandanın gittiğini hiç anlamıyor.

Override paketine 0 yazmak da çözmez. MAVLink belgesi 0'ı "kanalı alıcıya geri ver" diye tanımlar, ama 0'lı paket de sayacı sıfırlar. Alıcı sustuğunda otopilot onun son gördüğü değerle uçmaya devam eder; RC3 ekranda 1500'de takılı kalır.

Gazı override yerine sanal alıcıdan ver

SITL'in kendi alıcı girişi 5501 numaralı UDP portudur. Kanal değerlerini oraya yollarsan SIM_RC_FAIL alıcıyı gerçekten susturur ve failsafe beklendiği gibi gelir. Aşağıdaki kod gazı 1300'e ayarlar ve otopilotun bu değeri alıcıdan okuduğunu kontrol eder.

Python · sanal_kumanda.py
# Gazi RC override yerine SITL'in sanal alicisindan ver
import socket, struct, time
from pymavlink import mavutil

ALICI = ("127.0.0.1", 5501)                      # SITL'in sanal alici girisi
kanal = [1500, 1500, 1300, 1500, 1800, 1000, 1000, 1800]

m = mavutil.mavlink_connection("tcp:127.0.0.1:5760")
m.wait_heartbeat()
m.mav.request_data_stream_send(m.target_system, m.target_component,
                               mavutil.mavlink.MAV_DATA_STREAM_RC_CHANNELS, 5, 1)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
son = None
bitis = time.time() + 3
while time.time() < bitis:
    s.sendto(struct.pack("<8H", *kanal), ALICI)  # 8 kanal x 2 bayt, 50 Hz
    son = m.recv_match(type="RC_CHANNELS", blocking=False) or son
    time.sleep(0.02)
print("RC3 =", son.chan3_raw)

Kodu çalıştırınca terminalde şunu görürsün:

Kod
RC3 = 1300

Kod SITL'e tcp:127.0.0.1:5760 üzerinden bağlanır. SITL'i sim_vehicle.py ile açtıysan bu port MAVProxy'de olur; bağlantıyı onun udp:127.0.0.1:14550 çıkışına ver. MAVProxy'nin rc 3 1500 komutu da aynı 5501 portuna yazar, yani o komutla verdiğin gaz da testi bozmaz.

Gazı alıcıdan verip SIM_RC_FAIL'i 1 yaptığında 1,0 saniye sonra Messages sekmesinde Radio Failsafe yazar ve mod RTL olur.

Gerçek drone'da da aynı kural geçerli

Sayacı işleten kod ArduCopter'ın radio.cpp dosyasında; SITL ile Pixhawk aynı kodu çalıştırır. Yardımcı bilgisayarın override göndermeye devam ederse sahada alıcı kopsa bile otopilot bunu fark etmeyebilir.

Override'ı yalnızca gaz ya da çubuk vermen gerektiğinde gönder ve işin bitince döngüyü kapat. Drone'u otonom hareket ettirmek için GUIDED modda konum ya da hız komutu kullan; bu komutlar kumanda sayacına dokunmaz.

Hata Mesajları

Radio Failsafe

Otopilot bir saniye boyunca kumanda sinyali alamadı ya da gaz FS_THR_VALUE'nun altına düştü. FS_THR_ENABLE 1 ise drone RTL'e geçer. Provada bu satırı görmek istiyorsun; görmüyorsan önce override gönderen kodu kapat.

Radio Failsafe Cleared

Sinyal geri geldi. Override aralığın bir saniyeden uzunsa bu satır ile Radio Failsafe art arda gelip gider; paketleri daha sık gönder ya da hiç gönderme.

PreArm: Radio failsafe on

Önceki provadan kalan failsafe hâlâ açık. SIM_RC_FAIL'i 0 yap, alıcı sinyali gelsin, sonra ARM et.

PreArm: Throttle below failsafe

Gaz kanalı FS_THR_VALUE'nun altında. SIM_RC_FAIL 2'de kaldıysa gaz 950 µs'de durur; parametreyi 0'a çek.

Simülasyonu baştan sona öğren

Failsafe, geofence ve rüzgâr provalarını SITL'de adım adım kurmak için Yapay Zeka ve İHA Simülasyon eğitimine göz at. Gazebo'da kameralı drone uçurmak, sürü simülasyonu ve kameranın bulduğu nesneye drone'u yönlendirmek aynı kursta.

Yapay Zeka ve İHA Simülasyon için Sanal Makine Kopyası: ArduPilot SITL, ROS Noetic ve Gazebo 11 kurulu hazır sanal makine; kurulumla uğraşmadan provaya başlarsın.

Bu yazı işinize yaradı mı?

Ücretsiz kaynakArduPilot SITL kurulum rehberiSimülasyonu kendi bilgisayarınızda kurun: Ubuntu, Windows WSL ya da sanal makine, baştan sona.