SITL çalışıyor, Mission Planner bağlanmıyor
Mission Planner SITL'e bağlanmıyor, soket açılıyor ama tek bayt gelmiyor. Sebep tek istemcili TCP kapısı. SITL'in üç portu var; boşta olanı kısa kodla bul.
Terminalde SITL dönüyor, araç ayakta. Mission Planner'da TCP'yi seçiyorsun, adres 127.0.0.1, port 5760, Connect. Bir süre bekliyor, sonra vazgeçip heartbeat gelmediğini söyleyen uyarıyı veriyor.
Ortada kablo da radyo da yok; bozulacak bir şey kalmamış gibi duruyor. Çoğu kişi bu noktada baud hızıyla, güvenlik duvarıyla, hatta Mission Planner sürümüyle oynamaya başlıyor.
Ayıklanacak tek bir soru var oysa: soket açılmıyor mu, yoksa açılıyor da içinden bayt mı geçmiyor. Bunlar bambaşka iki arıza.
Bağlandı diyor, tek bayt yok
SITL açılışta bağlantı beklediğini söyleyen tek bir satır basar. İlk istemci gelince satır değişir ve akış başlar. Buraya kadar normal.
İkinci istemcide iş değişiyor. Python kodun 5760'ta duruyorken Mission Planner'ı da aynı porta yolluyorsan, Mission Planner'ın bağlantı çağrısı başarıyla dönüyor, çünkü TCP el sıkışmasını işletim sisteminin çekirdeği tamamlıyor.
SITL o soketi hiç teslim almıyor. Ekranda bağlantı kurulmuş gibi duruyor, saniyeler geçiyor, heartbeat gelmiyor.
Bir SITL, üç ayrı TCP kapısı; her kapı tek istemci alır
Şekilde soldaki kırmızı oka bak: bağlantı kapıya varıyor ama içinden veri dönmüyor. Sağdaki çizim çözümü gösteriyor.
Aynı SITL'in üç kapısı var
Tek bir arducopter örneği üç ayrı TCP portu açar: 5760 SERIAL0, 5762 SERIAL1, 5763 SERIAL2. Üçü de bağımsız birer MAVLink uç noktası ve her biri kendi tek istemcisini kabul ediyor.
Kodu 5760'ta bırakıp Mission Planner'ı 5762'ye bağlayabilirsin. İkinci bir yer kontrol istasyonu için MAVProxy kurmak zorunda değilsin.
Bir ayrıntı daha: bu portlar 0.0.0.0 üzerinde dinleniyor, yalnızca 127.0.0.1'de değil. SITL sanal makinede, Mission Planner ana makinedeyse ve ağ köprü modundaysa doğrudan sanal makinenin adresine TCP açabilirsin.
Aynı anda ikinci bir örnek başlattıysan taban port kayar. -I 1 bütün port numaralarına 10 ekliyor, yani o örnekte SERIAL0 5770 oluyor.
Örnek: Takım arkadaşın görev kodunu geliştirirken SITL'e 5760 üzerinden bağlı, sen aynı makinede Mission Planner'dan uçuşu izlemek istiyorsun. Onun kodu kapanmadan 5760'a bağlanırsan Mission Planner heartbeat bekleyip vazgeçer. Port kutusuna 5762 yazarsan ikiniz de aynı aracı aynı anda görürsünüz; arkadaşının akışı hiç kesilmez.
Neden böyle davranıyor
SITL'in seri port sürücüsü aynı anda tek bağlantı tutar. Kaynak koddaki karşılığı libraries/AP_HAL_SITL/UARTDriver.cpp içindeki _check_connection fonksiyonu; bağlantı zaten varsa accept çağrılmadan geri dönülüyor ve hemen üstünde "we only want 1 connection at a time" yorumu duruyor.
Bekleyen ikinci istemci dinleme kuyruğunda kalıyor. Kuyruk taşmadığı için istemciye hata da dönmüyor; hat sessiz kalıyor.
En sık yapılan hata, bağlantı kurulmuş göründüğü için ayarlarla oynamaya başlamak. Bakılacak tek şey var: o soketten kaç bayt geldi.
Kapıyı ölçen küçük kod
Tahmin etmek yerine ölç. Şu kod tek bir porta bağlanıyor, altı saniye dinliyor ve üç sonuçtan birini söylüyor: kapı dolu, yanlış port ya da akış sağlıklı.
# SITL'e giden TCP kapısı gerçekten veri veriyor mu
# Kullanım: python3 sitl_kisa.py <adres> <port>
import socket, sys, time
adres = sys.argv[1] if len(sys.argv) > 1 else "127.0.0.1"
port = int(sys.argv[2]) if len(sys.argv) > 2 else 5760
s = socket.socket()
s.settimeout(5)
try:
s.connect((adres, port))
except Exception as hata:
print("connect : olmadı ->", hata)
raise SystemExit(1)
print("connect : tamam")
s.settimeout(1.0)
tampon = b""
bitis = time.time() + 6
while time.time() < bitis:
try:
tampon += s.recv(4096)
except socket.timeout:
pass
s.close()
kalp = sum(1 for i in range(len(tampon) - 10)
if tampon[i] == 0xFD and tampon[i+7:i+10] == b"\x00\x00\x00")
print("alınan : %d bayt, %d heartbeat" % (len(tampon), kalp))
print("teşhis :", "soket açık, tek bayt yok -> kapı dolu" if not tampon else
("bayt var, heartbeat yok -> yanlış port" if not kalp else "akış sağlıklı"))Kodu dört farklı durumda çalıştırırsan şunları alırsın:
$ python3 sitl_kisa.py 127.0.0.1 5760 # tek istemci varken
connect : tamam
alınan : 116546 bayt, 36 heartbeat
teşhis : akış sağlıklı
$ python3 sitl_kisa.py 127.0.0.1 5760 # kod zaten bağlıyken
connect : tamam
alınan : 0 bayt, 0 heartbeat
teşhis : soket açık, tek bayt yok -> kapı dolu
$ python3 sitl_kisa.py 127.0.0.1 5762 # aynı anda ikinci kapı
connect : tamam
alınan : 776 bayt, 32 heartbeat
teşhis : akış sağlıklı
$ python3 sitl_kisa.py 127.0.0.1 5799 # hiç açılmamış port
connect : olmadı -> [Errno 111] Connection refusedİkinci durumda connect başarıyla dönüyor ama tek bayt gelmiyor. Aynı anda 5762 sorunsuz veri veriyor.
İkinci istemci beklerken ne olur
İki istemciyi aynı kapıya sırayla bağlarsan zaman içinde şunu görürsün: ikinci istemci 10. saniyede bağlanıyor, 25. saniyeye kadar tek bayt almıyor, ilk istemci kapanır kapanmaz akış ona geçiyor.
İkinci istemci aynı kapıya bağlanınca
Şekilde 10 ile 25. saniye arasındaki kesikli kutuya bak. Bağlantı kurulu görünen ama hiç veri almayan istemci, Mission Planner'ın heartbeat bekleyip vazgeçtiği durumun ta kendisi.
Hata Mesajları ve Anlamları
No Heartbeat Packets Received
Mission Planner porta bağlandı ama geçerli heartbeat okuyamadı. Kaynak koddaki metin bunu açıkça söylüyor: bağlanmadan önce iki geçerli heartbeat bekleniyor. Yani bu mesaj, kurulmuş bağlantının içinden veri geçmediğini anlatır.
[Errno 111] Connection refused
Bu farklı bir arıza. O adreste dinleyen kimse yok: SITL kapalı, port yanlış ya da sanal makinenin adresi başka. Yukarıdaki kod bunu ilk saniyede ayırt ediyor.
Waiting for connection ....
SITL kendi çıktısına basar. Anlamı, SERIAL0'ın boş olduğu ve ilk istemcinin beklendiğidir. Bu satır ekranda duruyorken bağlanamıyorsan sorun ağ tarafındadır, SITL tarafında değil.
Closed connection on SERIAL0
Bağlıydın, düştün. Kodun kapandıysa ya da Mission Planner'da Disconnect'e bastıysan normal. Kendiliğinden çıkıyorsa iki istemcinin sırayla aynı kapıya girdiğine bak.
Simülasyonu derinleştirmek istersen
Buradaki teşhis, SITL ve Gazebo tarafında karşına çıkacak ağ sorunlarının yalnızca ilki. Kurulumdan kamera görüntüsüne, oradan sürü senaryolarına kadar olan yolu Yapay Zeka ve İHA Simülasyon eğitimi boyunca adım adım kuruyoruz.
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ı?
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