Yayın4 dk okuma
DDS: ROS2’nin Arkasındaki Güç
ROS1’den ROS2’ye geçişin en büyük nedenlerinden biri, iletişim altyapısının daha esnek ve güvenilir hale getirilmesiydi. Bu noktada devreye DDS (Data Distribution Service) giriyor.
ROS 2'de DDS (Data Distribution Service), düğümler arasında veri iletişimi için kullanılan temel protokoldür. ROS 1'deki TCP ve UDP tabanlı iletişimden farklı olarak, ROS 2, DDS’in sağladığı dağıtık ve gerçek zamanlı özelliklerden faydalanır.
DDS Nedir?
DDS, dağıtık sistemlerde veri alışverişi için bir ara katman yazılım (middleware) standardıdır. Bu standart, Object Management Group (OMG) tarafından belirlenmiştir. DDS, özellikle otonom araçlar, robotik, havacılık ve endüstriyel otomasyon gibi yüksek performans, düşük gecikme ve güvenilirlik gerektiren uygulamalar için tasarlanmıştır.
DDS’in Temel Mantığı:
DDS, yayınla-abone ol (publish-subscribe) modeline dayanır. Bir düğüm bir konuya veri yayınlarken (publisher), diğer düğümler bu konuya abone olarak (subscriber) veriyi alır. Bu model, düğümlerin birbirlerinin varlığından haberdar olmasına gerek kalmadan veri iletişimini sağlar. DDS, bu iletişimi merkezsiz bir şekilde yönetir, bu da sistemin dayanıklılığını ve ölçeklenebilirliğini artırır.
- Publisher (yayıncı): Mesaj üretir.
- Subscriber (abone): Mesajı dinler.
- Topic (konu): Ortak iletişim kanalıdır.
DDS ve ROS 2 Entegrasyonu
ROS 2, DDS’in özelliklerini kullanarak düğümlerin birbirlerini otomatik olarak keşfetmesini sağlar. Bu sayede, ROS 2 uygulamaları karmaşık ağ yapılandırmalarına ihtiyaç duymadan çalışabilir. ROS 2'de kullanılan bazı popüler DDS uygulamaları (implementasyonları) şunlardır:
- Fast DDS: eProsima tarafından geliştirilmiştir ve ROS 2'nin varsayılan DDS uygulamasıdır.
- Connext DDS: RTI tarafından geliştirilmiştir ve ticari uygulamalarda sıklıkla tercih edilir.
- OpenDDS: Açık kaynaklı bir diğer DDS uygulamasıdır.
Bu uygulamalar, ROS 2 ile uyumludur ve ROS 2'nin sunduğu DDS-agnostik API sayesinde aralarında geçiş yapmak nispeten kolaydır.
DDS (QoS — Quality of Service) Parametreleri
ROS 2'de DDS’in en önemli özelliklerinden biri, Kalite Hizmetleri (QoS) politikalarıdır. Bu politikalar, veri iletişiminin nasıl gerçekleşeceğini belirler ve ROS 2'de düğümler arası iletişimi yapılandırmak için kullanılır. Her bir QoS parametresi, farklı değerler alabilir ve bu değerler, iletişimin davranışını doğrudan etkiler.
1. Relaibility (Güvenilirlik)
Bu parametre, mesajların alıcıya ulaşıp ulaşmayacağını garanti eder.
- RELIABLE: Publisher, mesajın abone olana ulaştığından emin olur. Eğer mesaj kaybolursa, yeniden gönderilir. Bu, önemli veriler (örneğin, bir robotun komutları) için idealdir.
- BEST_EFFORT: Publisher, mesajı gönderir ancak alıcıya ulaştığını garanti etmez. Eğer mesaj kaybolursa, yeniden gönderim yapılmaz. Bu, düşük gecikme gerektiren anlık veri akışları (örneğin, kamera görüntüleri veya LiDAR verileri) için uygundur.
2. Durability (Kalıcılık)
Bu parametre, yeni bir abonenin, yayıncının daha önce gönderdiği mesajları alıp alamayacağını belirler.
- TRANSIENT_LOCAL: Bir abone bir konuya bağlandığında, o konudaki son yayınlanan mesajı alır. Bu, sistem başlatıldığında veya yeni bir düğüm eklendiğinde durum bilgisinin senkronize edilmesi için kullanışlıdır.
- VOLATILE: Yeni bir abone bağlandığında, yalnızca o andan itibaren gönderilen mesajları alır. Daha önceki mesajları kaçırır.
3. Deadline (Son Teslim Tarihi)
Mesajların belirli bir süre içinde ulaşmasını zorunlu kılan bir parametredir.
- Anlamı ve Kullanımı: Bu parametre, verinin güncel kalmasını sağlamak için kullanılır. Eğer bir yayıncı, tanımlanan deadline süresi içinde yeni bir mesaj göndermezse, alıcı (abone), bu durumun bir ihlal olduğunu anlar ve gerekli aksiyonu alabilir (örneğin, bir uyarı yayınlar veya sistemi durdurur).
- Değeri: deadline değeri genellikle milisaniye veya saniye cinsinden bir zaman aralığı olarak belirlenir. Örneğin, 500 milisaniyelik bir deadline süresi, yayıncının her yarım saniyede bir yeni mesaj göndermesi gerektiğini belirtir. Bu parametre, gerçek zamanlı sistemler için kritik öneme sahiptir. (Belirli süre içinde mesaj gelsin)
4. History (Geçmiş)
Publisher veya Subscriber’ın ne kadar mesaj saklayacağını belirler.
- KEEP_LAST: Yalnızca son N tane mesajı saklar. Bu genellikle belleği optimize etmek için kullanılır.
- KEEP_ALL: Bütün mesajları saklar. Bu, bellek tüketimini artırabileceği için dikkatli kullanılmalıdır.
5. Liveliness (Canlılık)
Bir düğümün hala aktif olup olmadığını denetler.
- AUTOMATIC: DDS, düğümün aktif olup olmadığını otomatik olarak kontrol eder.
- MANUAL_BY_TOPIC: Bir düğüm, belirli bir konu üzerinden periyodik olarak canlılık sinyali göndermek zorundadır. Eğer göndermezse, diğer düğümler tarafından "pasif" olarak kabul edilir.
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
from rclpy.qos import QoSProfile, ReliabilityPolicy, DurabilityPolicy, HistoryPolicy, DeadlinePolicy
class MinimalPublisher(Node):
def __init__(self):
super().__init__('minimal_publisher')
# QoS profilini oluşturma
qos_profile = QoSProfile(
reliability=ReliabilityPolicy.RELIABLE, # Mesajın güvenilir bir şekilde iletilmesini garantiler
durability=DurabilityPolicy.VOLATILE, # Yalnızca anlık mesajları gönderir
history=HistoryPolicy.KEEP_LAST, # Sadece son mesajı tutar
depth=10, # History derinliğini belirler
deadline=DeadlinePolicy.from_sec(1.0) # Her 1.0 saniyede bir mesaj göndermeyi zorunlu kılar
)
self.publisher_ = self.create_publisher(String, 'topic', qos_profile)
self.i = 0
timer_period = 0.5 # saniye
self.timer = self.create_timer(timer_period, self.timer_callback)
def timer_callback(self):
msg = String()
msg.data = f'Hello World: {self.i}'
self.publisher_.publish(msg)
self.get_logger().info(f'Yayınlanıyor: "{msg.data}"')
self.i += 1
def main(args=None):
rclpy.init(args=args)
minimal_publisher = MinimalPublisher()
rclpy.spin(minimal_publisher)
minimal_publisher.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
Sonuç
- DDS, ROS2’nin en büyük gücüdür.
- QoS sayesinde esnek iletişim sağlanır.
- Merkezi olmayan yapı ile daha güvenilir sistemler geliştirilir.
- ROS2’nin endüstride kullanılabilirliğini artırır.