Softivation

Sürü simülasyonunda ikinci SITL aracı bağlanmıyor

Sürü simülasyonunda ikinci SITL aracı bağlanmıyorsa sebep kablo değil port. Her örneğin ana kapısı 5760 + 10 × örnek numarası; ikinci aracı 5770'te ara.

Furkan IŞIKAY 7 dk okuma

Tek araçla çalışırken hiçbir sorun yok. İkinci aracı açıyorsun, yer kontrol istasyonu ya hiç bağlanmıyor ya da ekranda hâlâ birinci aracı gösteriyor. Kablo yok, telsiz yok, ikisi de aynı bilgisayarda duruyor.

Cevap neredeyse her zaman aynı yerde: ikinci araç senin bağlanmaya çalıştığın kapıda durmuyor. Başka bir kapı açmış, sen eski kapıyı çalıyorsun.

Her araç kendi kapısını açıyor

Simülasyonu başlatırken verdiğin örnek numarası, aracın ayağa kalkarken dinleyeceği kapıyı belirliyor. Birinci araç bir kapı açıyor, ikincisi ondan on adım ötede başka bir kapı açıyor.

Her aracın ana kapısı (SERIAL0) bir öncekinden on numara ileride. Yani ikinci aracı ilk aracın kapısında ya da hemen yanındaki kapıda aramak sonuç vermiyor. Aşağıdaki şekilde mavi kapıların onar onar atladığına bak.

Her örnek kendi kapısını açar: 5760 + 10 × örnek numarası

Aynı bilgisayarda dört SITL aracı -I0..-I3 ile 5760, 5770, 5780, 5790 TCP kapılarını açar; ana kapılar onar onar atlar, her aracın SERIAL1 ve SERIAL2 yan kapıları ana kapının 2 ve 3 ilerisindedir, hiçbir aracın açmadığı 5761'e bağlanma anında reddedilir
Nereye bak: koyu mavi ana kapılar onar onar atlıyor; açık mavi yan kapılar (5762, 5763 gibi) aynı aracın SERIAL1 ve SERIAL2 uçları. Hiçbir aracın açmadığı bir numaraya, örneğin 5761'e, yapılan bağlantı askıda kalmaz, hemen geri çevrilir.

Bu ayrım kâğıt üstünde küçük görünüyor, ama sürü kurarken beş aracın beşini de elle takip etmen gerekiyor. Numarayı bir kez kaçırdığında hangi aracın hangi kapıda olduğunu bulmak uzun sürüyor.

Örnek: Sürü görevine hazırlanırken üç aracı -I0, -I1 ve -I2 ile başlattın ve yer istasyonunda üçünü de görmek istiyorsun. Üç ayrı bağlantı açarsın: 5760, 5770 ve 5780. Üçüncü araç için 5780 yerine 5771 yazarsan bağlantı anında geri çevrilir; süreç listesinde üç araç da duruyorsa sorun araçta değil, adresteki numaradadır.

Aynı belirtinin iki ayrı sebebi var

"İkinci araç bağlanmıyor" cümlesi iki bambaşka durumu birden anlatıyor ve ikisinin çözümü aynı değil. Hangisinde olduğunu anlamanın en hızlı yolu süreç listesine bakmak.

Süreç ölmüşSüreç sağlıklı
Ne olduİki araç aynı kapıyı istedi, ikincisi açılır açılmaz kapandı.İki araç da ayakta, ikisine de bağlanabiliyorsun.
Nerede görürsünSüreç listesinde yok, kayıtta bağlanma hatası var.İkisi aynı kimliği gösteriyor, istasyon tek araç sanıyor.
İlk hamleKapı numarasını ayır.Kimliği tekilleştir.

Soldaki durumda arayacak bir araç bile yok, çünkü ikinci araç doğduğu anda kapanmış. Sağdaki durumda iki araç da ayakta duruyor, sorun yer kontrol istasyonunun ikisini ayırt edememesi.

Hiçbir aracın açmadığı bir numaraya yapılan bağlantı denemesi askıda kalmıyor, anında geri çevriliyor; bu yüzden ağ ya da güvenlik duvarı aramak zaman kaybı.

Kapıyı kendin doğrula

İki aracı ayağa kaldırıp hangi kapıyı açtıklarını doğrudan kendi kayıtlarından okuyabilirsin. Aşağıdaki komut ikisini de başlatıyor ve kayıt dosyalarındaki kapı satırını süzüyor.

Bash
cd ~/sitl

# Birinci arac
./arducopter -I0 --model + --speedup 5 --defaults copter.parm \
  --sysid 1 --home 37.1591,38.7969,500,0 > s0.log 2>&1 &

# Ikinci arac: yalniz -I ve --sysid degisiyor
./arducopter -I1 --model + --speedup 5 --defaults copter.parm \
  --sysid 2 --home 37.1591,38.7969,500,0 > s1.log 2>&1 &

sleep 15
grep "TCP port" s0.log s1.log

Kapı numaraları belli olunca sıra bağlanmaya geliyor. Telemetri akışını açıkça istemezsen veri gelmez; bu satır atlandığında bağlantı kurulmuş görünür ama ekran boş kalır.

Python
from pymavlink import mavutil

for port in (5760, 5770):
    arac = mavutil.mavlink_connection("tcp:127.0.0.1:%d" % port)
    kalp = arac.wait_heartbeat(timeout=20)
    if kalp is None:
        print(port, "-> heartbeat yok")
        continue
    arac.mav.request_data_stream_send(
        arac.target_system, arac.target_component,
        mavutil.mavlink.MAV_DATA_STREAM_ALL, 4, 1)
    print(port, "-> sistem kimligi", arac.target_system)

İki aracı da başlatıp bu iki kodu çalıştırırsan şunu alırsın. İki farklı kapı, iki farklı sistem kimliği:

Kod
s0.log:SERIAL0 on TCP port 5760
s1.log:SERIAL0 on TCP port 5770
5760 -> sistem kimligi 1
5770 -> sistem kimligi 2

En sık yapılan hata

İkinci aracı başlatırken örnek numarasını değiştirip bağlantı adresini eski hâlinde bırakmak. Numara değişse bile adreste sabit bir kapı yazıyorsa araç o kapıyı açmaya çalışır, birinci araç orayı zaten tuttuğu için ikinci araç açılır açılmaz kapanır.

Bu durumda ekranda "bağlanamıyorum" değil, hiçbir şey görmezsin. Süreç listesine baktığında ikinci araç orada bile değildir.

Sistem kimliği ikinci tuzak

Kapıları düzelttikten sonra ikinci bir sorun çıkabiliyor. İki araç da ayağa kalkıyor, ikisine de bağlanabiliyorsun, ama yer kontrol istasyonu ikisini tek araç sanıyor. Bu, sistem kimliğinin tekilleşmemiş olmasından kaynaklanıyor.

Kimliği belirleyen parametrenin adı firmware sürümleri arasında değişti. Yeni bir sürümden çektiğin parametre listesinde eski adı bulamayabilirsin.

Bu yüzden kimliği elle ayarlayacaksan parametre listesini ada göre değil desene göre ara. Beklediğin adı bulamazsan büyük ihtimalle parametrenin adı değişmiştir.

Hata Mesajları ve Anlamları

Aşağıdaki satırlar simülasyonun ve Python'un birebir ürettiği metinlerdir.

bind failed on port 5760 - Address already in use

İki araç aynı kapıyı açmaya çalıştı. Bu satırı yazan araç ayakta kalmaz, hemen kapanır; bu yüzden süreç listesinde göremezsin. Örnek numarasını artır ya da bağlantı adresindeki sabit kapı numarasını kaldır.

ConnectionRefusedError: [Errno 111] Connection refused

O kapıda dinleyen kimse yok. Ya numara yanlış ya da o araç hiç ayağa kalkmadı. Önce süreç listesine, sonra aracın kayıt dosyasına bak.

Waiting for connection ....

Araç sağlıklı, seni bekliyor. Bu satırda takılı kalıyorsa sorun bağlandığın kapı numarasında.

Setting MAV_SYSID=2

Bu bir hata değil, onay satırı. Başlangıçta bunu göremiyorsan verdiğin kimlik bayrağı işlenmemiş demektir.

Bu konu simülasyonda kalıyor

Buradaki her şey tek bilgisayarda çalışan simülasyon içindir. Gerçek bir sürüde araçlar aynı makinede olmadığı için kapı çakışması yaşanmaz; orada ayrım telsiz kanalı ve sistem kimliği üzerinden yapılır.

Sürü mantığını önce simülasyonda kurmanın sebebi de bu. Kimlik ve adresleme hatalarını havada değil masada bulmak istiyorsun.

Sürüyü baştan sona kurmak istersen

Simülasyon kurulumundan görüntü işlemeye ve sürü senaryolarına kadar tüm akış Yapay Zeka ve İHA Simülasyon eğitimi içinde adım adım anlatılıyor. Bu yazıdaki konunun devamı olan ders de o eğitimin içinde yer alıyor.

Yapay Zeka ve İHA Simülasyon Sanal Makinesi: ArduPilot SITL, ROS Noetic ve Gazebo 11 kurulu gelir; simülasyonu kurulumla uğraşmadan başlat.

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.