Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

12. hafta / 14

ROS 2 ve simülasyon

Araçlar: ROS 2 Jazzy (Docker ya da Ubuntu 24.04), turtlesim, Gazebo, bu platform

Bu haftanın sonunda

  • Düğümleri (nodes), konuları (topics), servisleri ve eylemleri (actions) açıklamak
  • Python'da bir yayıncı (publisher) ve bir abone (subscriber) yazmak
  • Çalışan bir sistemi incelemek için ROS 2 komut satırı araçlarını kullanmak

Ders notları

ROS 2 (Robot Operating System) bir işletim sistemi değildir: çok sayıda küçük programın birlikte çalışmasını sağlayan bir ara katman yazılımı (middleware) ile araç ve kütüphanelerden oluşur. Neredeyse tüm araştırma robotları ve pek çok endüstriyel robot onu kullanır.

Temel kavramlar

  • Düğüm (node): tek bir işi olan tek bir süreç (bir kamera sürücüsü, bir planlayıcı).
  • Konu (topic): tiplendirilmiş mesajlardan oluşan, adlandırılmış bir akış. Çok sayıda yayıncı, çok sayıda abone, doğrudan bağımlılık yok. Örnek: /cmd_vel, geometry_msgs/Twist taşır.
  • Servis (service): hızlı çağrılar için istek ve yanıt ("haritayı sıfırla").
  • Eylem (action): geri bildirim ve iptal olanağı sunan uzun süreli hedefler ("mutfağa git").
  • Parametreler ve başlatma dosyaları (launch files) çok sayıda düğümü birlikte yapılandırır ve başlatır.

Arka planda ROS 2, keşif ve iletim için DDS kullanır; Hizmet Kalitesi (Quality of Service) ayarlarıyla birlikte (güvenilir veya en iyi çaba, geçmiş derinliği).

Dersin parçalarını birleştirmek

Kurduğumuz her şey ROS 2 paketlerine karşılık gelir: sensör sürücüleri /scan ve /image_raw yayınlar; slam_toolbox 9. haftanın işini yapar; Nav2 9. haftanın yol planlamasını yapar ve /cmd_vel çıktısı verir; bir motor denetleyicisi 7. haftanın ters kinematiğini ve 6. haftanın PID'ini uygular. Dronlar için hem PX4 hem de ArduPilot'un ROS 2 arayüzleri vardır.

Kurulum yapmadan başlamak

Resmi ROS 2 Docker imajlarını veya The Construct gibi tarayıcı tabanlı bir ortamı kullanın. turtlesim ile başlayın, ardından Gazebo'da TurtleBot3'e geçin.

Derinlemesine

Çözümlü örnek: ağdan geçer mi?

rgb8 biçiminde 640 × 480'lik bir sensor_msgs/Image mesajı 640 × 480 × 3 = 921 600 bayt taşır. 30 Hz'de:

921 600 B × 30 Hz ≈ 27.6 MB/s ≈ 221 Mbit/s

Bir robot ile dizüstü bilgisayar arasındaki gerçek Wi-Fi verimi tipik olarak birkaç on Mbit/s'dir; bu yüzden Wi-Fi üzerinden RViz'de /image_raw konusuna abone olmak her şeyi kilitler. Seçenekler: image_transport'un compressed konusuna abone olmak (JPEG genellikle yaklaşık on kat küçüktür), çözünürlüğü veya hızı düşürmek ya da görüntüyü robotta işleyip yalnızca sonuçları göndermek. float32 türünde 360 mesafe ve 360 yoğunluk değeri içeren bir LaserScan yaklaşık 2,9 KB'tır, yani 10 Hz yalnızca 29 KB/s tutar. Tek bir süreç içinde, süreç içi iletişimli (intra-process) birleştirilebilir düğümler 921 600 baytı kopyalamak yerine işaretçi geçirir.

QoS uyuşmalıdır

YayıncıAboneSonuç
RELIABLERELIABLEbağlanır, kaybolan örnekleri yeniden gönderir
RELIABLEBEST_EFFORTbağlanır
BEST_EFFORTRELIABLEuyumsuz: veri yok, yalnızca bir uyarı

Sensör sürücüleri genellikle en iyi çaba (best effort) temelli "sensor data" profiliyle yayın yapar; bu yüzden varsayılan (güvenilir) ayarlarla oluşturulmuş bir abone sessizce hiçbir şey almaz. ros2 topic info -v her uç noktanın QoS'unu yazdırır. Kalıcılık (durability) da önemlidir: /map ve /robot_description, sonradan başlatılan bir düğümün de son mesajı alması için TRANSIENT_LOCAL kullanır.

TF ağacı

Standart zincir map → odom → base_link → laser şeklindedir. Odometri odom → base_link dönüşümünü yayınlar: düzgün ama kayan. Konum belirleme (AMCL veya slam_toolbox) map → odom dönüşümünü yayınlar: kaymayı gideren ve sıçrayabilen düzeltme. base_link → laser gibi sabit çerçeveler robot_state_publisher aracılığıyla URDF'ten gelir. Denetleyiciler düzgün yerel hareket için odom, planlayıcılar map çerçevesinde çalışır. Gazebo veya Webots ile her düğümde use_sim_time:=true ayarlayın; aksi hâlde duvar saati ile simülasyon zamanı farklı olduğu için dönüşüm sorguları dışdeğerleme (extrapolation) hatalarıyla başarısız olur.

Yürütücüler ve geri çağırmalar

Tek iş parçacıklı bir yürütücü (executor) aynı anda tek bir geri çağırma (callback) çalıştırır. Bir görüntü geri çağırması 200 ms sürerse aynı düğümdeki 50 Hz'lik bir kontrol zamanlayıcısı on periyot kaçırır. Yavaş işi kendi düğümüne taşıyın ya da çok iş parçacıklı bir yürütücüyle ayrı geri çağırma grupları kullanın.

Mikrodenetleyiciye kadar

micro-ROS bir ESP32 veya STM32 üzerinde çalışır ve seri port ya da Wi-Fi üzerinden Raspberry Pi 4B veya Jetson'daki bir micro-ROS ajanıyla konuşur; böylece 3. ile 6. haftaların enkoder ve motor döngüsü doğrudan /odom yayınlayıp /cmd_vel konusuna abone olabilir. Linux tarafında ros2_control, tekerlekler ve kol eklemleri için standart donanım arayüzünü sağlar.

Simülasyon

ROS 2 hesaplama grafiği

Düğümler konulara (topic) mesaj yayınlar, diğer düğümler bunlara abone olur. Bir düğümü durdurmak ya da başlatmak için tıkla ve sistemin hangi kısımlarının sustuğunu gör.

Kod

Python (rclpy): 10 Hz'te hız komutları yayınlama
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist

class CircleDriver(Node):
    def __init__(self):
        super().__init__('circle_driver')
        self.pub = self.create_publisher(Twist, '/turtle1/cmd_vel', 10)
        self.create_timer(0.1, self.tick)          # 10 Hz

    def tick(self):
        msg = Twist()
        msg.linear.x = 1.0
        msg.angular.z = 0.8
        self.pub.publish(msg)

def main():
    rclpy.init()
    rclpy.spin(CircleDriver())

if __name__ == '__main__':
    main()
Komut satırı araçları
ros2 run turtlesim turtlesim_node
ros2 node list
ros2 topic list
ros2 topic echo /turtle1/pose
ros2 topic hz /turtle1/pose
ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 1.0}, angular: {z: 0.5}}"
ros2 node info /turtlesim
rqt_graph

Sık yapılan hatalar

  • Yeni bir terminalde install/setup.bash dosyasını source etmeyi unutmak; paketiniz veya mesaj türünüz bulunamaz.
  • En iyi çaba ile yayınlanan bir sensör konusuna güvenilir QoS profiliyle abone olup hiçbir hata almadan hiçbir şey almamak.
  • Gazebo veya Webots çalışırken use_sim_time değerini false bırakmak; TF dışdeğerleme hatalarına yol açar.
  • Tek iş parçacıklı bir yürütücüde bir geri çağırmanın içinde yavaş iş yapmak; aynı düğümdeki zamanlayıcılar zamanında tetiklenmez.
  • Sıkıştırılmış aktarım yerine Wi-Fi üzerinden RViz'e ham görüntü akıtmak.
  • Laboratuvar ağındaki diğer tüm takımlarla varsayılan ROS_DOMAIN_ID'yi paylaşmak; düğümler birbirlerinin konularını görür.

Yazılım mühendisliği bağlantısı

ROS 2, olay güdümlü, yayınla/abone ol (publish/subscribe) mimarisidir: düğümler gevşek bağlı servislerdir ve mesaj tanımları onların arayüz sözleşmeleridir. Bir .msg dosyası bir API şemasının rolünü oynar: onu özensizce değiştirirseniz tüm tüketiciler bozulur.

  • Özel mesajları kendi *_interfaces paketine koyun ve bu paketteki değişiklikleri herkese açık bir API kadar dikkatle gözden geçirin.
  • Entegrasyon testleri (launch_testing ile) birkaç düğüm başlatır, girdiler yayınlar ve çıktılar üzerinde doğrulama yapar; örneğin "/goal_pose üzerindeki bir hedef 2 s içinde sıfır olmayan bir /cmd_vel üretir".
  • Kaydet ve yeniden oynat: iyi bir çalışmanın rosbag2 kaydı, algılama ve konum belirleme düğümleri için bir regresyon testi girdisidir.
  • Sabitlenmiş bir ROS 2 dağıtımına sahip bir Docker imajı, "benim makinemde çalışıyor" durumunu her takım üyesi ve CI için yeniden üretilebilir kılar.

Dönem projesi uygulaması: yığınınızı simülasyonda arayüzsüz (headless) başlatan, bir hedef gönderen ve robotun ona bir tolerans ve süre sınırı içinde ulaştığını kontrol eden bir launch_testing testi ekleyin.

Laboratuvar görevi

turtlesim'i başlatın ve çember sürücüsünü çalıştırın. Sistemi ros2 topic ve rqt_graph ile inceleyin. Çizge simülatöründe /lidar_driver düğümünü durdurun ve hangi düğümlerin çıktı üretmeyi bıraktığını ve nedenini açıklayın.

Kendini sına

  1. Bir kamera sürücüsü BEST_EFFORT güvenilirlikle yayın yapıyor ve aboneniz RELIABLE istiyor. Ne olur?

  2. 15 Hz'de 320 × 240 rgb8 bir görüntü konusu ne kadar bant genişliği ister?

  3. 'Mutfağa git, ilerlemeyi bildir ve iptale izin ver' için hangi ROS 2 mekanizması uygundur?

  4. map → odom dönüşümünü normalde hangi düğüm yayınlar?

Bu hafta dönem projesinde

  • Otonom kara aracı: Mimari: ROS 2 ya da modüller. Algılama, denetim ve davranış ayrı düğümler (ROS 2) ya da ayrı modüller; arayüzleri belgelendi.
  • Otonom drone görevi: Görsel servo. Offboard kipinde hız komutlarıyla işaretçi üzerine hizalanma; ROS 2 ya da MAVSDK mimarisi belgelendi.
  • Görsel kılavuzlu robot kol: Mimari ve hata durumları. Durum makinesi, erişilemez hedef ve düşen küp durumları; ROS 2 ya da modül mimarisi.

Ödev

turtlesim için hedefe giden (go-to-goal) bir düğüm yazın: /turtle1/pose konusuna abone olun, /turtle1/cmd_vel konusuna yayın yapın ve yönelim ile mesafe için 6. haftadaki PID sınıfını kullanın.

Bu haftanın donanımı (Hyvex)

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • TestlerimMini testler ve puanlarSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç