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/Twisttaşı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:
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ı | Abone | Sonuç |
|---|---|---|
| RELIABLE | RELIABLE | bağlanır, kaybolan örnekleri yeniden gönderir |
| RELIABLE | BEST_EFFORT | bağlanır |
| BEST_EFFORT | RELIABLE | uyumsuz: 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
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()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_graphSı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
*_interfacespaketine koyun ve bu paketteki değişiklikleri herkese açık bir API kadar dikkatle gözden geçirin. - Entegrasyon testleri (
launch_testingile) 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
Bir kamera sürücüsü BEST_EFFORT güvenilirlikle yayın yapıyor ve aboneniz RELIABLE istiyor. Ne olur?
15 Hz'de 320 × 240 rgb8 bir görüntü konusu ne kadar bant genişliği ister?
'Mutfağa git, ilerlemeyi bildir ve iptale izin ver' için hangi ROS 2 mekanizması uygundur?
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.