{"id":33269,"date":"2025-10-31T22:02:20","date_gmt":"2025-10-31T19:02:20","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/"},"modified":"2025-10-31T22:02:20","modified_gmt":"2025-10-31T19:02:20","slug":"ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/","title":{"rendered":"ROS2 Yay\u0131nc\u0131 D\u00fc\u011f\u00fcm\u00fc: Temeller ve \u0130leri Uygulamalar"},"content":{"rendered":"<p><body><\/p>\n<p>Robotik sistemlerin karma\u015f\u0131k d\u00fcnyas\u0131nda veri ileti\u015fimi hayati \u00f6neme sahiptir. Peki, otonom bir arac\u0131n sens\u00f6r verilerini nas\u0131l payla\u015f\u0131r\u0131z ya da bir robot kolunun anl\u0131k konumunu di\u011fer bile\u015fenlere nas\u0131l duyururuz? \u0130\u015fte tam da bu noktada, ROS2 (Robot Operating System 2) yay\u0131nc\u0131 d\u00fc\u011f\u00fcmleri devreye giriyor. Bu kapsaml\u0131 makale ile ROS2&#8217;de nas\u0131l veri yay\u0131nlayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.<\/p>\n<p>ROS2 ekosisteminde, bir &#8220;d\u00fc\u011f\u00fcm&#8221; (node) belirli bir i\u015flevi yerine getiren ba\u011f\u0131ms\u0131z bir program birimidir. \u00d6rne\u011fin, bir kamera s\u00fcr\u00fcc\u00fcs\u00fc, bir konum tahmini algoritmas\u0131 veya bir motor kontrolc\u00fcs\u00fc ayr\u0131 birer d\u00fc\u011f\u00fcm olabilir. Bu d\u00fc\u011f\u00fcmlerin birbirleriyle ileti\u015fim kurmas\u0131, robotik sistemlerin sorunsuz \u00e7al\u0131\u015fmas\u0131 i\u00e7in esast\u0131r. \u0130\u015fte bu ileti\u015fimin en temel ve yayg\u0131n yollar\u0131ndan biri de &#8220;yay\u0131nc\u0131 d\u00fc\u011f\u00fcmler&#8221; arac\u0131l\u0131\u011f\u0131ylad\u0131r.<\/p>\n<p>Bir ROS2 yay\u0131nc\u0131 d\u00fc\u011f\u00fcm\u00fc, belirli bir &#8220;konu&#8221; (topic) \u00fczerinden s\u00fcrekli olarak veya gerekti\u011finde veri &#8220;mesajlar\u0131&#8221; yay\u0131nlayan bir yaz\u0131l\u0131m bile\u015fenidir. Bu mesajlar, sens\u00f6r okumalar\u0131ndan (Lidar mesafeleri, kamera g\u00f6r\u00fcnt\u00fcleri), motor komutlar\u0131ndan, robotun anl\u0131k durum bilgilerinden veya herhangi bir yap\u0131land\u0131r\u0131lm\u0131\u015f veriden olu\u015fabilir. Yay\u0131nc\u0131, belirli bir konuya bir mesaj g\u00f6nderdi\u011finde, bu konuya abone olan t\u00fcm di\u011fer d\u00fc\u011f\u00fcmler bu mesaj\u0131 al\u0131r ve i\u015fler. Bu model, tek y\u00f6nl\u00fc bir bilgi ak\u0131\u015f\u0131n\u0131 temsil eder ve bir\u00e7ok karma\u015f\u0131k sistemde oldu\u011fu gibi, robotun farkl\u0131 par\u00e7alar\u0131n\u0131n birbirinden haberdar olmas\u0131n\u0131 sa\u011flar. Bu sayede, sens\u00f6r d\u00fc\u011f\u00fcmleri ortam\u0131 alg\u0131lar, kontrol d\u00fc\u011f\u00fcmleri planlama yapar ve akt\u00fcat\u00f6r d\u00fc\u011f\u00fcmleri fiziksel eylemleri ger\u00e7ekle\u015ftirir, hepsi de yay\u0131nc\u0131-abone mekanizmas\u0131yla birbirine ba\u011fl\u0131d\u0131r.<\/p>\n<p>Yay\u0131nc\u0131 d\u00fc\u011f\u00fcmlerinin robotikteki hayati rol\u00fc, bir\u00e7ok ger\u00e7ek d\u00fcnya senaryosunda a\u00e7\u0131k\u00e7a g\u00f6r\u00fclmektedir. \u00d6rne\u011fin, bir otonom mobil robot d\u00fc\u015f\u00fcn\u00fcn. Bu robotun \u00e7evresini alg\u0131lamas\u0131 i\u00e7in birden fazla sens\u00f6re ihtiyac\u0131 vard\u0131r: bir Lidar sens\u00f6r\u00fc mesafeleri yay\u0131nlarken, bir kamera g\u00f6r\u00fcnt\u00fcleri yay\u0131nlayabilir ve bir IMU (Atalet \u00d6l\u00e7\u00fcm Birimi) robotun a\u00e7\u0131sal h\u0131z\u0131n\u0131 ve ivmesini yay\u0131nlar. Her bir sens\u00f6r, kendi \u00f6zel veri tipini belirli bir konu \u00fczerinde yay\u0131nlayan ayr\u0131 bir ROS2 yay\u0131nc\u0131 d\u00fc\u011f\u00fcm\u00fc olarak i\u015flev g\u00f6r\u00fcr. Robotun navigasyon sistemi, bu farkl\u0131 sens\u00f6r verilerini toplayan bir abone d\u00fc\u011f\u00fcm\u00fc olabilir. Ald\u0131\u011f\u0131 verileri birle\u015ftirerek robotun haritas\u0131n\u0131 g\u00fcnceller ve g\u00fcvenli bir rota planlar. Benzer \u015fekilde, bir robot kolunun eklem pozisyonlar\u0131n\u0131 s\u00fcrekli olarak yay\u0131nlayan bir d\u00fc\u011f\u00fcm, bir g\u00f6rselle\u015ftirme arac\u0131 veya ba\u015fka bir kontrol algoritmas\u0131 taraf\u0131ndan kullan\u0131labilir.<\/p>\n<p>ROS2&#8217;nin temelinde yatan ve bu yay\u0131nc\u0131-abone modelini g\u00fc\u00e7lendiren teknoloji, Veri Da\u011f\u0131t\u0131m Hizmeti (DDS &#8211; Data Distribution Service) standard\u0131d\u0131r. DDS, ROS2&#8217;ye ger\u00e7ek zamanl\u0131, g\u00fcvenilir ve da\u011f\u0131t\u0131lm\u0131\u015f bir ileti\u015fim altyap\u0131s\u0131 sa\u011flar. Bu, yay\u0131nc\u0131 d\u00fc\u011f\u00fcmlerinin performans\u0131n\u0131 ve \u00f6l\u00e7eklenebilirli\u011fini art\u0131r\u0131r. ROS1&#8217;in aksine, ROS2&#8217;de merkezi bir &#8220;roscore&#8221; bulunmaz; d\u00fc\u011f\u00fcmler do\u011frudan DDS arac\u0131l\u0131\u011f\u0131yla birbirleriyle ke\u015fif yapar ve ileti\u015fim kurar. Bu da\u011f\u0131t\u0131lm\u0131\u015f mimari, sistemin daha sa\u011flam, hataya dayan\u0131kl\u0131 ve mod\u00fcler olmas\u0131n\u0131 sa\u011flar, bu da yay\u0131nc\u0131 d\u00fc\u011f\u00fcmlerini modern robotik uygulamalar\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131 haline getirir.<\/p>\n<h2>ROS2 \u0130leti\u015fim Mimarisi: Yay\u0131nc\u0131lar Nereye Oturur?<\/h2>\n<p>ROS2, mod\u00fcler ve da\u011f\u0131t\u0131k bir yap\u0131ya sahiptir ve bu yap\u0131n\u0131n temelini ileti\u015fim mekanizmalar\u0131 olu\u015fturur. Bir ROS2 sistemini bir \u015fehrin altyap\u0131s\u0131 gibi d\u00fc\u015f\u00fcnebiliriz: d\u00fc\u011f\u00fcmler binalard\u0131r, konular caddelerdir ve mesajlar bu caddelerden ge\u00e7en ara\u00e7lard\u0131r. Yay\u0131nc\u0131lar ise bu ara\u00e7lar\u0131 caddelere \u00e7\u0131karan g\u00f6ndericilerdir.<\/p>\n<p>ROS2&#8217;de temel ileti\u015fim birimleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>D\u00fc\u011f\u00fcm (Node):<\/strong> Tek bir mant\u0131ksal i\u015flev birimini temsil eden y\u00fcr\u00fct\u00fclebilir programlard\u0131r. \u00d6rne\u011fin, bir Lidar d\u00fc\u011f\u00fcm\u00fc Lidar verisi okur, bir motor kontrol d\u00fc\u011f\u00fcm\u00fc motorlar\u0131 s\u00fcrer. Bir yay\u0131nc\u0131 veya abone, hatta hem yay\u0131nc\u0131 hem de abone olabilen i\u015flevleri bar\u0131nd\u0131rabilir.<\/li>\n<li><strong>Konu (Topic):<\/strong> D\u00fc\u011f\u00fcmlerin birbirleriyle mesaj al\u0131\u015fveri\u015fi yapt\u0131\u011f\u0131 adland\u0131r\u0131lm\u0131\u015f veri yollar\u0131d\u0131r. Bir yay\u0131nc\u0131 belirli bir konuya mesaj g\u00f6nderir, bu konuya abone olan t\u00fcm d\u00fc\u011f\u00fcmler o mesaj\u0131 al\u0131r. Konular, sistemdeki farkl\u0131 veri ak\u0131\u015flar\u0131n\u0131 izole eder ve y\u00f6netir. \u00d6rne\u011fin, <code>\/scan<\/code> Lidar verisi i\u00e7in, <code>\/camera\/image_raw<\/code> ham kamera g\u00f6r\u00fcnt\u00fcs\u00fc i\u00e7in bir konu olabilir.<\/li>\n<li><strong>Mesaj (Message):<\/strong> Konular \u00fczerinden iletilen yap\u0131land\u0131r\u0131lm\u0131\u015f veri paketleridir. ROS2, <code>std_msgs<\/code> gibi standart mesaj paketleri sunar (\u00f6rne\u011fin <code>std_msgs\/String<\/code> metin mesajlar\u0131 i\u00e7in, <code>std_msgs\/Int32<\/code> tam say\u0131lar i\u00e7in) ve kullan\u0131c\u0131lar\u0131n kendi \u00f6zel mesaj tiplerini (<code>.msg<\/code> dosyalar\u0131 arac\u0131l\u0131\u011f\u0131yla) tan\u0131mlamas\u0131na izin verir. Bir mesaj, bir veya daha fazla alan (field) i\u00e7erebilir, her alan\u0131n belirli bir tipi (\u00f6rne\u011fin, int, float, string, veya ba\u015fka bir mesaj tipi) vard\u0131r.<\/li>\n<li><strong>Yay\u0131nc\u0131 (Publisher):<\/strong> Belirli bir konuya belirli bir mesaj tipinde veri yay\u0131nlayan bir d\u00fc\u011f\u00fcm i\u00e7indeki bile\u015fendir. Bir yay\u0131nc\u0131, veriyi s\u00fcrekli olarak belirli bir frekansta veya bir olay tetiklendi\u011finde g\u00f6nderebilir. \u00d6rne\u011fin, bir sens\u00f6r d\u00fc\u011f\u00fcm\u00fc her 10 milisaniyede bir yeni sens\u00f6r okumas\u0131 yay\u0131nlayabilir.<\/li>\n<li><strong>Abone (Subscriber):<\/strong> Belirli bir konuyu dinleyen ve o konu \u00fczerinden yay\u0131nlanan mesajlar\u0131 alan bir d\u00fc\u011f\u00fcm i\u00e7indeki bile\u015fendir. Abone, bir mesaj ald\u0131\u011f\u0131nda belirli bir geri arama (callback) fonksiyonunu tetikler ve gelen veriyi i\u015fler. \u00d6rne\u011fin, bir navigasyon d\u00fc\u011f\u00fcm\u00fc <code>\/scan<\/code> konusuna abone olarak Lidar verilerini al\u0131r ve haritalama i\u00e7in kullan\u0131r.<\/li>\n<\/ul>\n<p>Bu yay\u0131nc\u0131-abone modeli, gev\u015fek ba\u011fl\u0131 bir ileti\u015fim sa\u011flar; yani yay\u0131nc\u0131 ve abone d\u00fc\u011f\u00fcmleri birbirlerinin do\u011frudan varl\u0131\u011f\u0131ndan haberdar olmak zorunda de\u011fildir. Yay\u0131nc\u0131 sadece mesajlar\u0131 yay\u0131nlar, abone ise ilgilendi\u011fi konulara abone olur. Bu, sistemin mod\u00fclerli\u011fini art\u0131r\u0131r ve d\u00fc\u011f\u00fcmlerin ba\u011f\u0131ms\u0131z olarak geli\u015ftirilip test edilmesine olanak tan\u0131r. Ayr\u0131ca, tek bir yay\u0131nc\u0131ya birden fazla abone ba\u011flanabilir veya bir abone birden fazla konuya abone olabilir, bu da veri da\u011f\u0131t\u0131m\u0131nda b\u00fcy\u00fck bir esneklik sa\u011flar.<\/p>\n<p>ROS2&#8217;nin bu ileti\u015fim modelinin temelinde yatan DDS (Data Distribution Service), bir middleware (ara yaz\u0131l\u0131m) katman\u0131 olarak g\u00f6rev yapar. DDS, d\u00fc\u011f\u00fcmler aras\u0131ndaki ke\u015ffi, veri iletimini ve Quality of Service (QoS) politikalar\u0131n\u0131n uygulanmas\u0131n\u0131 y\u00f6netir. QoS, mesajlar\u0131n g\u00fcvenilirli\u011fi, gecikmesi, ya\u015fam s\u00fcresi ve ge\u00e7mi\u015fi gibi ileti\u015fim \u00f6zelliklerini tan\u0131mlaman\u0131za olanak tan\u0131r. Bu sayede, farkl\u0131 uygulamalar\u0131n farkl\u0131 ileti\u015fim ihtiya\u00e7lar\u0131na (\u00f6rne\u011fin, acil durum mesajlar\u0131 i\u00e7in y\u00fcksek g\u00fcvenilirlik, kamera g\u00f6r\u00fcnt\u00fcleri i\u00e7in d\u00fc\u015f\u00fck gecikme ama potansiyel veri kayb\u0131na tolerans) uyum sa\u011flanabilir.<\/p>\n<p>\u00d6zetle, ROS2 ileti\u015fim mimarisinde yay\u0131nc\u0131lar, veri \u00fcreticisi d\u00fc\u011f\u00fcmlerin sistemin geri kalan\u0131yla bilgi payla\u015f\u0131m\u0131n\u0131n temel mekanizmas\u0131n\u0131 olu\u015fturur. Bu g\u00fc\u00e7l\u00fc ve esnek yap\u0131, robotik uygulamalar\u0131n karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 y\u00f6netmek ve da\u011f\u0131t\u0131k sistemleri etkin bir \u015fekilde in\u015fa etmek i\u00e7in kritik bir temel sa\u011flar.<\/p>\n<h2>\u0130lk ROS2 Yay\u0131nc\u0131 D\u00fc\u011f\u00fcm\u00fcn\u00fcz\u00fc Ad\u0131m Ad\u0131m Nas\u0131l Olu\u015fturursunuz? (Python \u00d6rne\u011fi)<\/h2>\n<p>ROS2&#8217;de bir yay\u0131nc\u0131 d\u00fc\u011f\u00fcm\u00fc olu\u015fturmak, Python ile olduk\u00e7a kolayd\u0131r. Bu b\u00f6l\u00fcmde, basit bir &#8220;Merhaba ROS2 d\u00fcnyas\u0131!&#8221; mesaj\u0131 yay\u0131nlayan bir d\u00fc\u011f\u00fcm\u00fcn nas\u0131l yaz\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m g\u00f6rece\u011fiz. Bu \u00f6rnek, ROS2&#8217;nin temel <code>rclpy<\/code> (ROS Client Library for Python) k\u00fct\u00fcphanesini kullanacak ve <code>std_msgs\/String<\/code> mesaj tipini yay\u0131nlayacakt\u0131r. Ba\u015flamadan \u00f6nce, \u00e7al\u0131\u015fan bir ROS2 kurulumunuzun ve <code>colcon<\/code> gibi paket y\u00f6netim ara\u00e7lar\u0131n\u0131n haz\u0131r oldu\u011funu varsay\u0131yoruz.<\/p>\n<ol>\n<li>\n<h3>\u00c7al\u0131\u015fma Alan\u0131 (Workspace) Olu\u015fturma (E\u011fer yoksa)<\/h3>\n<p>T\u00fcm ROS2 paketlerinizi d\u00fczenli tutmak i\u00e7in bir \u00e7al\u0131\u015fma alan\u0131 olu\u015fturmak iyi bir uygulamad\u0131r:<\/p>\n<pre><code>\nmkdir -p ~\/ros2_ws\/src\ncd ~\/ros2_ws\/src\n            <\/pre>\n<p><\/code>\n        <\/li>\n<li>\n<h3>Yeni Bir ROS2 Paketi Olu\u015fturma<\/h3>\n<p>Yeni bir yay\u0131nc\u0131 d\u00fc\u011f\u00fcm\u00fc i\u00e7in bir ROS2 paketi olu\u015ftural\u0131m. <code>my_publisher_package<\/code> ad\u0131n\u0131 kullanaca\u011f\u0131z:<\/p>\n<pre><code>\ncd ~\/ros2_ws\/src\nros2 pkg create --build-type ament_python my_publisher_package --dependencies rclpy std_msgs\n            <\/pre>\n<p><\/code><\/p>\n<p>Burada <code>rclpy<\/code> ve <code>std_msgs<\/code> ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 belirtiyoruz, \u00e7\u00fcnk\u00fc kodumuz bunlar\u0131 kullanacak.<\/p>\n<\/li>\n<li>\n<h3>Yay\u0131nc\u0131 D\u00fc\u011f\u00fcm Kodu Yazma<\/h3>\n<p><code>~\/ros2_ws\/src\/my_publisher_package\/my_publisher_package<\/code> dizini alt\u0131na <code>simple_publisher.py<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve a\u015fa\u011f\u0131daki kodu i\u00e7ine yap\u0131\u015ft\u0131ral\u0131m:<\/p>\n<pre><code>\nimport rclpy\nfrom rclpy.node import Node\nfrom std_msgs.msg import String\n\nclass SimplePublisher(Node):\n    def __init__(self):\n        super().__init__('simple_publisher_node')\n        # Bir yay\u0131nc\u0131 olu\u015ftur. Konu ad\u0131: 'my_topic', Mesaj tipi: String, QoS derinli\u011fi: 10\n        self.publisher_ = self.create_publisher(String, 'my_topic', 10)\n        timer_period = 0.5  # saniyede bir yay\u0131n yap\n        # Bir zamanlay\u0131c\u0131 olu\u015ftur. Belirlenen periyotta timer_callback fonksiyonunu \u00e7a\u011f\u0131r\u0131r.\n        self.timer = self.create_timer(timer_period, self.timer_callback)\n        self.i = 0 # Yay\u0131nlanan mesaj sayac\u0131n\u0131 tutar\n\n    def timer_callback(self):\n        msg = String() # Yeni bir String mesaj\u0131 olu\u015ftur\n        msg.data = f'Merhaba ROS2 d\u00fcnyas\u0131: {self.i}' # Mesaj\u0131n i\u00e7eri\u011fini doldur\n        self.publisher_.publish(msg) # Mesaj\u0131 yay\u0131nla\n        self.get_logger().info(f'Yay\u0131nlan\u0131yor: \"{msg.data}\"') # Konsola log mesaj\u0131 yazd\u0131r\n        self.i += 1 # Sayac\u0131 art\u0131r\n\ndef main(args=None):\n    rclpy.init(args=args) # ROS2 Python istemci k\u00fct\u00fcphanesini ba\u015flat\n    simple_publisher = SimplePublisher() # D\u00fc\u011f\u00fcm \u00f6rne\u011fini olu\u015ftur\n    rclpy.spin(simple_publisher) # D\u00fc\u011f\u00fcm\u00fc \u00e7al\u0131\u015ft\u0131r (geri arama fonksiyonlar\u0131n\u0131 dinle)\n    simple_publisher.destroy_node() # D\u00fc\u011f\u00fcm\u00fc temizle\n    rclpy.shutdown() # ROS2 Python istemci k\u00fct\u00fcphanesini kapat\n\nif __name__ == '__main__':\n    main()\n            <\/pre>\n<p><\/code><\/p>\n<p>Bu kodda:<\/p>\n<ul>\n<li><code>rclpy.init(args=args)<\/code> ve <code>rclpy.shutdown()<\/code> ROS2 sistemini ba\u015flat\u0131r ve kapat\u0131r.<\/li>\n<li><code>super().__init__('simple_publisher_node')<\/code> d\u00fc\u011f\u00fcm\u00fcm\u00fcz\u00fc <code>simple_publisher_node<\/code> ad\u0131yla ba\u015flat\u0131r.<\/li>\n<li><code>self.create_publisher(String, 'my_topic', 10)<\/code> bir yay\u0131nc\u0131 olu\u015fturur. \u0130lk arg\u00fcman mesaj tipi (<code>std_msgs.msg.String<\/code>), ikincisi konunun ad\u0131 (<code>my_topic<\/code>), \u00fc\u00e7\u00fcnc\u00fcs\u00fc ise QoS (Quality of Service) derinli\u011fidir. Bu, abone hen\u00fcz haz\u0131r de\u011filse ne kadar mesaj\u0131n saklanaca\u011f\u0131n\u0131 belirtir.<\/li>\n<li><code>self.create_timer(timer_period, self.timer_callback)<\/code>, belirli bir periyotla (<code>timer_period<\/code>) \u00e7al\u0131\u015fan bir geri arama (<code>timer_callback<\/code>) fonksiyonu tan\u0131mlar.<\/li>\n<li><code>self.publisher_.publish(msg)<\/code> haz\u0131rlanan mesaj\u0131 <code>my_topic<\/code> konusuna yay\u0131nlar.<\/li>\n<\/ul>\n<\/li>\n<li>\n<h3><code>setup.py<\/code> ve <code>package.xml<\/code> Dosyalar\u0131n\u0131 D\u00fczenleme<\/h3>\n<p>Paketinizin kurulumunu ve y\u00fcr\u00fct\u00fclebilir dosyas\u0131n\u0131 belirtmeniz gerekir. <code>~\/ros2_ws\/src\/my_publisher_package\/setup.py<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve <code>entry_points<\/code> k\u0131sm\u0131na a\u015fa\u011f\u0131daki sat\u0131r\u0131 ekleyin (genellikle <code>console_scripts<\/code> alt\u0131nda):<\/p>\n<pre><code>\n# ... di\u011fer importlar ...\nfrom setuptools import setup\n\npackage_name = 'my_publisher_package'\n\nsetup(\n    name=package_name,\n    version='0.0.0',\n    packages=[package_name],\n    data_files=[\n        ('share\/' + package_name, ['package.xml']),\n        ('share\/' + package_name + '\/resource', ['setup.py']),\n    ],\n    install_requires=['setuptools'],\n    zip_safe=True,\n    maintainer='Your Name',\n    maintainer_email='your.email@example.com',\n    description='TODO: Package description',\n    license='TODO: License declaration',\n    tests_require=['pytest'],\n    entry_points={\n        'console_scripts': [\n            'simple_publisher = my_publisher_package.simple_publisher:main', # Bu sat\u0131r\u0131 ekleyin\n        ],\n    },\n)\n            <\/pre>\n<p><\/code><\/p>\n<p><code>package.xml<\/code> dosyas\u0131nda <code>rclpy<\/code> ve <code>std_msgs<\/code> ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n oldu\u011fundan emin olun. Genellikle <code>ros2 pkg create<\/code> komutu bunu otomatik yapar.<\/p>\n<\/li>\n<li>\n<h3>Paketi Derleme ve \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>\u00c7al\u0131\u015fma alan\u0131n\u0131z\u0131n k\u00f6k dizininde (<code>~\/ros2_ws<\/code>) paketinizi derleyin:<\/p>\n<pre><code>\ncd ~\/ros2_ws\ncolcon build --packages-select my_publisher_package\n            <\/pre>\n<p><\/code><\/p>\n<p>Derleme ba\u015far\u0131l\u0131 olduktan sonra, ROS2 ortam\u0131n\u0131z\u0131 kaynak olarak g\u00f6stermeniz gerekir:<\/p>\n<pre><code>\nsource install\/setup.bash\n            <\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi yay\u0131nc\u0131 d\u00fc\u011f\u00fcm\u00fcn\u00fcz\u00fc \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code>\nros2 run my_publisher_package simple_publisher\n            <\/pre>\n<p><\/code><\/p>\n<p>Ayr\u0131 bir terminal a\u00e7arak yay\u0131nlanan mesajlar\u0131 dinlemek i\u00e7in bir abone d\u00fc\u011f\u00fcm\u00fc \u00e7al\u0131\u015ft\u0131rabilirsiniz (\u00f6nce ortam\u0131 kaynak g\u00f6stermeyi unutmay\u0131n):<\/p>\n<pre><code>\nsource install\/setup.bash\nros2 topic echo \/my_topic\n            <\/pre>\n<p><\/code><\/p>\n<p>\u0130lk terminalde <code>Yay\u0131nlan\u0131yor: \"Merhaba ROS2 d\u00fcnyas\u0131: X\"<\/code> mesajlar\u0131n\u0131, ikinci terminalde ise <code>\/my_topic<\/code> \u00fczerinden gelen mesajlar\u0131 g\u00f6rmelisiniz. Bu, ilk ROS2 yay\u0131nc\u0131 d\u00fc\u011f\u00fcm\u00fcn\u00fcz\u00fc ba\u015far\u0131yla kurup \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131z anlam\u0131na gelir.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131nda ROS2 Yay\u0131nc\u0131lar\u0131: Bir Vaka Analizi<\/h2>\n<p>ROS2 yay\u0131nc\u0131 d\u00fc\u011f\u00fcmleri, otonom sistemlerin sens\u00f6r verilerini i\u015fleyip d\u00fcnyaya duyurdu\u011fu, kontrol sistemlerinin eylemleri bildirdi\u011fi veya durum g\u00fcncellemelerinin yay\u0131ld\u0131\u011f\u0131 temel mekanizmalard\u0131r. Gelin, otonom bir mobil robotun sens\u00f6r verilerini nas\u0131l yay\u0131nlad\u0131\u011f\u0131n\u0131 g\u00f6steren ger\u00e7ek\u00e7i bir vaka analizi yapal\u0131m.<\/p>\n<p>Bir lojistik deposunda \u00e7al\u0131\u015fan mobil bir robotu hayal edin. Bu robotun \u00e7evresini alg\u0131lamas\u0131, engellerden ka\u00e7\u0131nmas\u0131 ve navigasyon yapmas\u0131 gerekiyor. Bu g\u00f6revler i\u00e7in bir Lidar sens\u00f6r\u00fc, derinlik kameras\u0131 ve IMU (Atalet \u00d6l\u00e7\u00fcm Birimi) gibi sens\u00f6rlere sahip. Her bir sens\u00f6r, kendi verilerini ROS2 konular\u0131 \u00fczerinden yay\u0131nlayan ayr\u0131 bir yay\u0131nc\u0131 d\u00fc\u011f\u00fcm\u00fcne sahiptir.<\/p>\n<p><strong>Lidar Sens\u00f6r\u00fc Verileri:<\/strong> Lidar, robotun \u00e7evresindeki mesafeleri \u00f6l\u00e7erek bir nokta bulutu veya menzil taramas\u0131 (LaserScan) olu\u015fturur. Bu veriler, robotun anl\u0131k ortam haritas\u0131n\u0131 \u00e7\u0131karmak ve engelleri tespit etmek i\u00e7in hayati \u00f6neme sahiptir. Lidar verileri genellikle <code>sensor_msgs\/LaserScan<\/code> mesaj tipi kullan\u0131larak <code>\/scan<\/code> konusu \u00fczerinden yay\u0131nlan\u0131r. Lidar sens\u00f6rleri genellikle y\u00fcksek frekanslarda (\u00f6rne\u011fin 10-30 Hz) veri \u00fcretir, bu da performans ve QoS ayarlar\u0131n\u0131n kritik olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>A\u015fa\u011f\u0131da, basit bir Lidar sens\u00f6r\u00fc verisi yay\u0131nlayan bir ROS2 yay\u0131nc\u0131 d\u00fc\u011f\u00fcm\u00fc \u00f6rne\u011fi (<code>lidar_publisher.py<\/code>) bulunmaktad\u0131r:<\/p>\n<pre><code>\nimport rclpy\nfrom rclpy.node import Node\nfrom sensor_msgs.msg import LaserScan\nfrom std_msgs.msg import Header # Header mesajlar\u0131 i\u00e7in\nfrom rclpy.qos import QoSProfile, ReliabilityPolicy, HistoryPolicy, DurabilityPolicy\n\nclass LidarPublisher(Node):\n    def __init__(self):\n        super().__init__('lidar_publisher_node')\n        # QoS profilini yap\u0131land\u0131rma: Y\u00fcksek frekansl\u0131 sens\u00f6r verileri i\u00e7in genellikle BEST_EFFORT tercih edilir.\n        # Bu, baz\u0131 mesajlar\u0131n kaybolabilece\u011fi ancak d\u00fc\u015f\u00fck gecikmenin \u00f6nemli oldu\u011fu durumlarda uygundur.\n        qos_profile = QoSProfile(\n            reliability=ReliabilityPolicy.BEST_EFFORT, # En iyi \u00e7aba: h\u0131zl\u0131 ama g\u00fcvenilir de\u011fil\n            history=HistoryPolicy.KEEP_LAST, # Sadece son mesaj\u0131 sakla\n            depth=1, # Saklanacak mesaj say\u0131s\u0131\n            durability=DurabilityPolicy.VOLATILE # Ge\u00e7ici: yeni abone eski mesajlar\u0131 almaz\n        )\n        self.publisher_ = self.create_publisher(LaserScan, 'lidar_scan', qos_profile)\n        # 10 Hz (saniyede 10 kez) veri yay\u0131nlayacak bir zamanlay\u0131c\u0131 olu\u015ftur\n        self.timer = self.create_timer(0.1, self.publish_lidar_data)\n        self.scan_count = 0\n\n    def publish_lidar_data(self):\n        msg = LaserScan()\n        msg.header = Header()\n        msg.header.stamp = self.get_clock().now().to_msg() # Mesaj\u0131n zaman damgas\u0131\n        msg.header.frame_id = 'laser_frame' # Sens\u00f6r\u00fcn koordinat \u00e7er\u00e7evesi\n        \n        msg.angle_min = -1.57 # -90 derece (radyan)\n        msg.angle_max = 1.57  # +90 derece (radyan)\n        msg.angle_increment = 0.01 # Radyan cinsinden a\u00e7\u0131 art\u0131\u015f\u0131\n        msg.time_increment = 0.001 # Her bir a\u00e7\u0131 art\u0131\u015f\u0131 i\u00e7in zaman art\u0131\u015f\u0131\n        msg.range_min = 0.1 # Minimum alg\u0131lama mesafesi\n        msg.range_max = 10.0 # Maksimum alg\u0131lama mesafesi\n\n        # \u00d6rnek menzil verileri: 314 adet (1.57 - (-1.57)) \/ 0.01 = 314\n        # Basitlik ad\u0131na rastgele veya statik verilerle doldurulmu\u015ftur.\n        msg.ranges = [float(self.scan_count % 10 + (i % 5)) for i in range(int((msg.angle_max - msg.angle_min) \/ msg.angle_increment))]\n        msg.intensities = [] # Yo\u011funluk verileri de eklenebilir\n\n        self.publisher_.publish(msg)\n        self.get_logger().info(f'Lidar verisi yay\u0131nland\u0131. Say\u0131: {self.scan_count}')\n        self.scan_count += 1\n\ndef main(args=None):\n    rclpy.init(args=args)\n    lidar_publisher = LidarPublisher()\n    rclpy.spin(lidar_publisher)\n    lidar_publisher.destroy_node()\n    rclpy.shutdown()\n\nif __name__ == '__main__':\n    main()\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte dikkat edilmesi gereken en \u00f6nemli nokta, <code>QoSProfile<\/code> ayarlar\u0131d\u0131r. Lidar gibi y\u00fcksek frekansl\u0131 sens\u00f6rlerden gelen verilerde, her paketin %100 g\u00fcvenilir bir \u015fekilde ula\u015fmas\u0131 her zaman m\u00fcmk\u00fcn veya gerekli olmayabilir. Bu gibi durumlarda, <code>ReliabilityPolicy.BEST_EFFORT<\/code> (en iyi \u00e7aba) politikas\u0131, gecikmeyi azaltarak veri ak\u0131\u015f\u0131n\u0131 h\u0131zland\u0131r\u0131r, ancak baz\u0131 mesajlar\u0131n kaybolmas\u0131na izin verir. <code>HistoryPolicy.KEEP_LAST<\/code> ve <code>depth=1<\/code> ise, abonenin yaln\u0131zca en son yay\u0131nlanan mesaj\u0131 almas\u0131n\u0131 sa\u011flar. Bu, eski sens\u00f6r verilerinin h\u0131zla g\u00fcncelli\u011fini yitirdi\u011fi durumlarda enerji ve bant geni\u015fli\u011fi tasarrufu sa\u011flar.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Yay\u0131nc\u0131 d\u00fc\u011f\u00fcmlerinizin performans\u0131n\u0131 art\u0131rmak i\u00e7in <code>rclpy.qos<\/code> mod\u00fcl\u00fcndeki <code>QoSProfile<\/code> ayarlar\u0131n\u0131 do\u011fru yap\u0131land\u0131rmak kritik \u00f6neme sahiptir. \u00d6zellikle y\u00fcksek frekansl\u0131 sens\u00f6r verileri i\u00e7in <code>ReliabilityPolicy.BEST_EFFORT<\/code> ve d\u00fc\u015f\u00fck <code>depth<\/code> de\u011ferleri tercih edilebilir. G\u00fcvenilirlik kritik olan kontrol komutlar\u0131 gibi durumlarda ise <code>ReliabilityPolicy.RELIABLE<\/code> kullan\u0131lmal\u0131d\u0131r.\n    <\/div>\n<p>Bu vaka analizinde g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, ROS2 yay\u0131nc\u0131lar\u0131, karma\u015f\u0131k robotik sistemlerin farkl\u0131 bile\u015fenleri aras\u0131nda veri ak\u0131\u015f\u0131n\u0131 y\u00f6neterek, robotun \u00e7evresini alg\u0131lamas\u0131na, kararlar almas\u0131na ve fiziksel eylemler ger\u00e7ekle\u015ftirmesine olanak tan\u0131r. Do\u011fru mesaj tiplerini se\u00e7mek ve QoS ayarlar\u0131n\u0131 optimize etmek, sistemin genel performans\u0131 ve g\u00fcvenilirli\u011fi a\u00e7\u0131s\u0131ndan belirleyici olacakt\u0131r.<\/p>\n<h2>ROS2 Yay\u0131nc\u0131lar\u0131n\u0131 \u00d6zelle\u015ftirme ve \u0130leri D\u00fczey Kullan\u0131m \u0130pu\u00e7lar\u0131<\/h2>\n<p>ROS2 yay\u0131nc\u0131 d\u00fc\u011f\u00fcmleriyle \u00e7al\u0131\u015f\u0131rken, standart kullan\u0131m\u0131n \u00f6tesine ge\u00e7mek ve d\u00fc\u011f\u00fcmlerinizi \u00f6zel ihtiya\u00e7lar\u0131n\u0131za g\u00f6re uyarlamak isteyebilirsiniz. Bu b\u00f6l\u00fcm, yay\u0131nc\u0131lar\u0131n\u0131z\u0131 daha esnek, g\u00fc\u00e7l\u00fc ve verimli hale getirecek ileri d\u00fczey ipu\u00e7lar\u0131n\u0131 ve \u00f6zelle\u015ftirme tekniklerini ele alacakt\u0131r.<\/p>\n<h3>\u00d6zel Mesaj Tipleriyle \u00c7al\u0131\u015fmak M\u00fcmk\u00fcn m\u00fc?<\/h3>\n<p>Kesinlikle! ROS2, <code>std_msgs<\/code> gibi standart mesaj paketlerinin yan\u0131 s\u0131ra kendi \u00f6zel mesaj tiplerinizi olu\u015fturman\u0131za ve kullanman\u0131za olanak tan\u0131r. Bu, robotunuzun benzersiz veri yap\u0131lar\u0131n\u0131 (\u00f6rne\u011fin, \u00f6zel bir sens\u00f6r\u00fcn \u00e7\u0131kt\u0131s\u0131 veya karma\u015f\u0131k bir durum vekt\u00f6r\u00fc) etkin bir \u015fekilde iletmek i\u00e7in \u00e7ok \u00f6nemlidir. \u00d6zel mesaj tipleri, <code>.msg<\/code> uzant\u0131l\u0131 basit metin dosyalar\u0131 olarak tan\u0131mlan\u0131r.<\/p>\n<p><strong>Ad\u0131m 1: \u00d6zel Mesaj Tan\u0131mlama<\/strong><\/p>\n<p>\u00d6ncelikle, yeni bir paket olu\u015fturmal\u0131 veya mevcut bir paketin i\u00e7ine <code>msg<\/code> klas\u00f6r\u00fc eklemelisiniz. \u00d6rne\u011fin, <code>custom_interfaces<\/code> ad\u0131nda bir paket olu\u015ftural\u0131m ve i\u00e7inde <code>MyCustomMessage.msg<\/code> ad\u0131nda bir dosya tan\u0131mlayal\u0131m:<\/p>\n<pre><code>\n# ~\/ros2_ws\/src\/custom_interfaces\/msg\/MyCustomMessage.msg\nstring header\nfloat32 value\nbool is_valid\nfloat64[3] vector_data # Sabit boyutlu dizi\n    <\/pre>\n<p><\/code><\/p>\n<p><strong>Ad\u0131m 2: <code>package.xml<\/code> ve <code>CMakeLists.txt<\/code> Dosyalar\u0131n\u0131 D\u00fczenleme<\/strong><\/p>\n<p>Bu mesaj\u0131 ROS2'nin tan\u0131mas\u0131 i\u00e7in <code>custom_interfaces<\/code> paketinin <code>package.xml<\/code> dosyas\u0131na <code>build_depend<\/code> ve <code>exec_depend<\/code> olarak <code>rosidl_default_generators<\/code> ve <code>rosidl_default_runtime<\/code> eklemeniz gerekir. <code>CMakeLists.txt<\/code> dosyas\u0131nda da <code>find_package<\/code> ile <code>rosidl_default_generators<\/code>'\u0131 bulup <code>add_message_files<\/code> ve <code>rosidl_generate_interfaces<\/code> komutlar\u0131n\u0131 kullanarak mesaj\u0131 derlemeniz gerekir.<\/p>\n<p><strong>Ad\u0131m 3: \u00d6zel Mesaj Yay\u0131nc\u0131s\u0131 Olu\u015fturma<\/strong><\/p>\n<p>Mesaj\u0131n\u0131z derlendikten sonra, Python kodunuzda bunu kolayca kullanabilirsiniz. \u00d6rne\u011fin, \u00f6nceki yay\u0131nc\u0131 \u00f6rne\u011fimizi bu \u00f6zel mesaj tipini kullanacak \u015fekilde uyarlayal\u0131m:<\/p>\n<pre><code>\nimport rclpy\nfrom rclpy.node import Node\n# Olu\u015fturdu\u011funuz \u00f6zel mesaj tipini import edin\nfrom custom_interfaces.msg import MyCustomMessage \nfrom std_msgs.msg import Header # Zaman damgas\u0131 i\u00e7in Header kullanabiliriz\n\nclass CustomMessagePublisher(Node):\n    def __init__(self):\n        super().__init__('custom_message_publisher_node')\n        # \u00d6zel mesaj tipiyle yay\u0131nc\u0131 olu\u015ftur\n        self.publisher_ = self.create_publisher(MyCustomMessage, 'custom_data_topic', 10)\n        self.timer = self.create_timer(1.0, self.publish_custom_data) # Her saniye yay\u0131n yap\n        self.counter = 0\n\n    def publish_custom_data(self):\n        msg = MyCustomMessage() # Yeni bir \u00f6zel mesaj nesnesi olu\u015ftur\n        msg.header = f'Veri Paketi {self.counter}' # Header alan\u0131n\u0131 doldur\n        msg.value = float(self.counter * 10.5) # Value alan\u0131n\u0131 doldur\n        msg.is_valid = (self.counter % 2 == 0) # is_valid alan\u0131n\u0131 doldur\n        msg.vector_data = [float(self.counter), float(self.counter * 0.5), float(self.counter * 0.25)]\n\n        self.publisher_.publish(msg) # Mesaj\u0131 yay\u0131nla\n        self.get_logger().info(f'\u00d6zel mesaj yay\u0131nland\u0131: Ba\u015fl\u0131k=\"{msg.header}\", De\u011fer={msg.value}, Ge\u00e7erli: {msg.is_valid}')\n        self.counter += 1\n\ndef main(args=None):\n    rclpy.init(args=args)\n    custom_publisher = CustomMessagePublisher()\n    rclpy.spin(custom_publisher)\n    custom_publisher.destroy_node()\n    rclpy.shutdown()\n\nif __name__ == '__main__':\n    main()\n            <\/pre>\n<p><\/code><\/p>\n<p>Bu \u015fekilde, sisteminizdeki benzersiz veri yap\u0131lar\u0131n\u0131 kolayca tan\u0131mlayabilir ve ROS2 a\u011f\u0131 \u00fczerinden yay\u0131nlayabilirsiniz.<\/p>\n<h3>\u00c7oklu Yay\u0131nc\u0131lar ve Dinamik Yay\u0131n Frekans\u0131<\/h3>\n<p>Bir ROS2 d\u00fc\u011f\u00fcm\u00fc, ayn\u0131 anda birden fazla konuya yay\u0131n yapabilir. Bu, bir d\u00fc\u011f\u00fcm\u00fcn farkl\u0131 sens\u00f6rlerden gelen verileri veya farkl\u0131 t\u00fcrdeki kontrol komutlar\u0131n\u0131 tek bir mant\u0131ksal birim i\u00e7inde y\u00f6netmesi gerekti\u011finde kullan\u0131\u015fl\u0131d\u0131r. Birden fazla yay\u0131nc\u0131 olu\u015fturmak i\u00e7in <code>create_publisher<\/code> fonksiyonunu birden \u00e7ok kez \u00e7a\u011f\u0131rman\u0131z yeterlidir.<\/p>\n<p>Yay\u0131n frekans\u0131n\u0131 dinamik olarak ayarlamak da m\u00fcmk\u00fcnd\u00fcr. <code>create_timer<\/code> ile olu\u015fturulan zamanlay\u0131c\u0131lar i\u00e7in do\u011frudan bir frekans ayarlama mekanizmas\u0131 olmasa da, zamanlay\u0131c\u0131 callback'ini durdurup yeni bir periyotla ba\u015fka bir zamanlay\u0131c\u0131 olu\u015fturarak bu etkiyi elde edebilirsiniz.<\/p>\n<pre><code>\n# ... (\u00f6nceki importlar) ...\n\nclass DynamicPublisher(Node):\n    def __init__(self):\n        super().__init__('dynamic_publisher_node')\n        self.publisher1 = self.create_publisher(String, 'topic1', 10)\n        self.publisher2 = self.create_publisher(Int32, 'topic2', 10) # \u0130kinci yay\u0131nc\u0131\n        \n        self.frequency = 1.0 # Ba\u015flang\u0131\u00e7 frekans\u0131 1 Hz\n        self.timer = self.create_timer(1.0 \/ self.frequency, self.timer_callback)\n        self.msg_count = 0\n\n    def timer_callback(self):\n        # topic1'e string yay\u0131nla\n        msg1 = String(data=f'Mesaj {self.msg_count} from topic1')\n        self.publisher1.publish(msg1)\n        self.get_logger().info(f'Yay\u0131nland\u0131 topic1: {msg1.data}')\n\n        # topic2'ye int32 yay\u0131nla\n        msg2 = Int32(data=self.msg_count * 10)\n        self.publisher2.publish(msg2)\n        self.get_logger().info(f'Yay\u0131nland\u0131 topic2: {msg2.data}')\n\n        self.msg_count += 1\n        \n        # Frekans\u0131 dinamik olarak de\u011fi\u015ftirebiliriz (\u00f6rne\u011fin her 10 mesajda bir)\n        if self.msg_count % 10 == 0:\n            new_freq = 0.5 if self.frequency == 1.0 else 1.0\n            if new_freq != self.frequency:\n                self.get_logger().warn(f'Yay\u0131n frekans\u0131 {self.frequency} Hz\\'den {new_freq} Hz\\'e de\u011fi\u015fiyor.')\n                self.timer.cancel() # Mevcut zamanlay\u0131c\u0131y\u0131 iptal et\n                self.frequency = new_freq\n                self.timer = self.create_timer(1.0 \/ self.frequency, self.timer_callback) # Yeni zamanlay\u0131c\u0131 olu\u015ftur\n# ... (main fonksiyonu) ...\n    <\/pre>\n<p><\/code><\/p>\n<h3>QoS (Quality of Service) Politikalar\u0131n\u0131n Derinlemesine \u0130ncelenmesi<\/h3>\n<p>QoS ayarlar\u0131, ROS2 ileti\u015fiminin davran\u0131\u015f\u0131n\u0131 ince ayar yapman\u0131z\u0131 sa\u011flar. Bu ayarlar, \u00f6zellikle sens\u00f6r verileri, kontrol komutlar\u0131 veya durum g\u00fcncellemeleri gibi farkl\u0131 veri t\u00fcrleri i\u00e7in \u00e7ok \u00f6nemlidir. Ba\u015fl\u0131ca QoS politikalar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Reliability (G\u00fcvenilirlik):<\/strong> Mesajlar\u0131n hedefe ula\u015f\u0131p ula\u015fmad\u0131\u011f\u0131n\u0131 garanti eder.\n<ul>\n<li><code>BEST_EFFORT<\/code>: En iyi \u00e7aba. Mesajlar h\u0131zl\u0131 g\u00f6nderilir ancak kaybolabilir. Y\u00fcksek frekansl\u0131 sens\u00f6r verileri i\u00e7in idealdir.<\/li>\n<li><code>RELIABLE<\/code>: G\u00fcvenilir. Her mesaj\u0131n hedefe ula\u015fmas\u0131 garantilenir. Kontrol komutlar\u0131 veya \u00f6nemli durum g\u00fcncellemeleri i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Durability (Kal\u0131c\u0131l\u0131k):<\/strong> Yeni bir abonenin bir yay\u0131ndan \u00f6nceki mesajlar\u0131 al\u0131p almayaca\u011f\u0131n\u0131 belirler.\n<ul>\n<li><code>VOLATILE<\/code>: Ge\u00e7ici. Abone ba\u011fland\u0131\u011f\u0131nda sadece o andan itibaren yay\u0131nlanan mesajlar\u0131 al\u0131r.<\/li>\n<li><code>TRANSIENT_LOCAL<\/code>: Ge\u00e7ici Yerel. Abone ba\u011fland\u0131\u011f\u0131nda, yay\u0131nc\u0131n\u0131n belle\u011finde tutulan son mesaj\u0131 veya mesajlar\u0131 al\u0131r. Robotun ba\u015flang\u0131\u00e7 pozisyonu gibi tek seferlik ama \u00f6nemli bilgiler i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong>History (Ge\u00e7mi\u015f):<\/strong> Bir yay\u0131n\u0131n ne kadar mesaj ge\u00e7mi\u015fini saklayaca\u011f\u0131n\u0131 belirler.\n<ul>\n<li><code>KEEP_LAST<\/code>: Sadece en son <code>depth<\/code> kadar mesaj\u0131 saklar.<\/li>\n<li><code>KEEP_ALL<\/code>: T\u00fcm mesajlar\u0131 saklar (bellek k\u0131s\u0131tlamalar\u0131na dikkat).<\/li>\n<\/ul>\n<\/li>\n<li><strong>Depth (Derinlik):<\/strong> <code>KEEP_LAST<\/code> politikas\u0131yla birlikte kullan\u0131l\u0131r. Ka\u00e7 tane mesaj\u0131n ge\u00e7mi\u015fte tutulaca\u011f\u0131n\u0131 belirtir.<\/li>\n<\/ul>\n<p>Do\u011fru QoS profilini se\u00e7mek, uygulaman\u0131z\u0131n performans\u0131n\u0131, g\u00fcvenilirli\u011fini ve bellek kullan\u0131m\u0131n\u0131 do\u011frudan etkiler. \u00d6rne\u011fin, bir acil durdurma d\u00fc\u011fmesi i\u00e7in <code>RELIABLE<\/code> ve <code>TRANSIENT_LOCAL<\/code> politikalar\u0131yla d\u00fc\u015f\u00fck derinlik (\u00f6rne\u011fin 1) kullanmak ak\u0131ll\u0131ca olacakt\u0131r, b\u00f6ylece sinyalin ula\u015fmas\u0131 garantilenir ve ge\u00e7 ba\u011flanacak bir bile\u015fen bile en son acil durum bilgisini al\u0131r.<\/p>\n<p>Bu ileri d\u00fczey teknikler ve QoS \u00f6zelle\u015ftirmeleri, ROS2 yay\u0131nc\u0131 d\u00fc\u011f\u00fcmlerinizi sadece veri ileticiler olmaktan \u00e7\u0131kar\u0131p, robotik sistemlerinizin karma\u015f\u0131k gereksinimlerine g\u00f6re adapte edebilece\u011finiz g\u00fc\u00e7l\u00fc ve esnek ara\u00e7lar haline getirir. Do\u011fru konfig\u00fcrasyonlarla, sisteminizin performans\u0131n\u0131 ve kararl\u0131l\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirsiniz.<\/p>\n<h2>ROS2 Yay\u0131nc\u0131lar\u0131 i\u00e7in Performans Optimizasyonu ve En \u0130yi Uygulamalar<\/h2>\n<p>Robotik sistemler genellikle k\u0131s\u0131tl\u0131 i\u015flem g\u00fcc\u00fc, bellek ve a\u011f bant geni\u015fli\u011fi gibi kaynaklarla \u00e7al\u0131\u015f\u0131r. Bu nedenle, ROS2 yay\u0131nc\u0131 d\u00fc\u011f\u00fcmlerinin performans\u0131n\u0131 optimize etmek ve en iyi uygulamalar\u0131 takip etmek, sistemin genel verimlili\u011fi ve kararl\u0131l\u0131\u011f\u0131 i\u00e7in kritik \u00f6neme sahiptir. Yanl\u0131\u015f yap\u0131land\u0131r\u0131lm\u0131\u015f bir yay\u0131nc\u0131 d\u00fc\u011f\u00fcm\u00fc, t\u00fcm sistemin performans\u0131n\u0131 olumsuz etkileyebilir.<\/p>\n<ul>\n<li>\n<h3>QoS Politikalar\u0131n\u0131n Ak\u0131ll\u0131ca Kullan\u0131m\u0131<\/h3>\n<p>Daha \u00f6nce de bahsetti\u011fimiz gibi, QoS (Quality of Service) ayarlar\u0131 performans optimizasyonunun temelini olu\u015fturur. Her veri ak\u0131\u015f\u0131 i\u00e7in uygun <code>ReliabilityPolicy<\/code>, <code>DurabilityPolicy<\/code>, <code>HistoryPolicy<\/code> ve <code>Depth<\/code> de\u011ferlerini se\u00e7mek \u00e7ok \u00f6nemlidir.<\/p>\n<ul>\n<li><strong>Y\u00fcksek Frekansl\u0131 Sens\u00f6r Verileri (Lidar, Kamera):<\/strong> Bu t\u00fcr veriler genellikle \u00e7ok say\u0131da ve s\u0131k mesajlar \u00fcretir. Burada <code>ReliabilityPolicy.BEST_EFFORT<\/code> ve <code>HistoryPolicy.KEEP_LAST<\/code> ile d\u00fc\u015f\u00fck <code>depth<\/code> (\u00f6rne\u011fin 1) tercih edilmelidir. Bu, mesajlar\u0131n kaybolmas\u0131na izin verir ancak gecikmeyi minimize eder ve bant geni\u015fli\u011fi kullan\u0131m\u0131n\u0131 optimize eder. Gecikmi\u015f veri, do\u011fru veriden daha k\u00f6t\u00fc olabilir.<\/li>\n<li><strong>Kontrol Komutlar\u0131 (Motor Komutlar\u0131, Durum De\u011fi\u015fiklikleri):<\/strong> Bu mesajlar\u0131n g\u00fcvenilir bir \u015fekilde ula\u015fmas\u0131 zorunludur. Aksi takdirde robot \u00f6ng\u00f6r\u00fclemeyen davran\u0131\u015flar sergileyebilir. Bu senaryolar i\u00e7in <code>ReliabilityPolicy.RELIABLE<\/code> kullan\u0131lmal\u0131d\u0131r. <code>DurabilityPolicy.TRANSIENT_LOCAL<\/code> de, komut ge\u00e7mi\u015fini yeni aboneler i\u00e7in saklayarak sistemi daha sa\u011flam hale getirebilir.<\/li>\n<\/ul>\n<p>Unutmay\u0131n ki <code>RELIABLE<\/code> politikas\u0131, mesajlar\u0131n teslimini garanti etmek i\u00e7in ek a\u011f trafi\u011fi (onay mesajlar\u0131) ve gecikme anlam\u0131na gelir. Bu nedenle sadece ger\u00e7ekten gerekti\u011finde kullan\u0131lmal\u0131d\u0131r.<\/p>\n<\/li>\n<li>\n<h3>Mesaj Boyutu Optimizasyonu<\/h3>\n<p>Yay\u0131nlanan mesajlar\u0131n boyutu, a\u011f bant geni\u015fli\u011fi t\u00fcketimi ve i\u015flem y\u00fck\u00fc \u00fczerinde do\u011frudan bir etkiye sahiptir. M\u00fcmk\u00fcn oldu\u011funca k\u00fc\u00e7\u00fck ve verimli mesajlar kullanmaya \u00f6zen g\u00f6sterin.<\/p>\n<ul>\n<li><strong>Gereksiz Verilerden Ka\u00e7\u0131n\u0131n:<\/strong> Mesaj\u0131n\u0131za yaln\u0131zca ger\u00e7ekten gerekli olan verileri dahil edin. \u00d6rne\u011fin, bir kamera g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn tamam\u0131 yerine, bazen sadece ilgi alan\u0131n\u0131n koordinatlar\u0131 yeterli olabilir.<\/li>\n<li><strong>Verimli Mesaj Tipleri:<\/strong> <code>Float32<\/code> yerine <code>Int16<\/code> veya <code>Int8<\/code> kullanabiliyorsan\u0131z kullan\u0131n. B\u00fcy\u00fck metin alanlar\u0131ndan veya karma\u015f\u0131k i\u00e7 i\u00e7e ge\u00e7mi\u015f yap\u0131lardan m\u00fcmk\u00fcn oldu\u011funca ka\u00e7\u0131n\u0131n.<\/li>\n<li><strong>S\u0131k\u0131\u015ft\u0131rma:<\/strong> \u00d6zellikle kamera g\u00f6r\u00fcnt\u00fcleri gibi b\u00fcy\u00fck veriler i\u00e7in <code>sensor_msgs\/CompressedImage<\/code> gibi s\u0131k\u0131\u015ft\u0131r\u0131lm\u0131\u015f mesaj tiplerini kullanmay\u0131 de\u011ferlendirin. Ancak s\u0131k\u0131\u015ft\u0131rma ve a\u00e7ma i\u015flemleri ek i\u015flemci y\u00fck\u00fc getirece\u011fini unutmay\u0131n.<\/li>\n<\/ul>\n<\/li>\n<li>\n<h3>Yay\u0131n Frekans\u0131n\u0131n Ayarlanmas\u0131<\/h3>\n<p>Her bir yay\u0131nc\u0131n\u0131n veri yay\u0131nlama frekans\u0131, performans \u00fczerinde b\u00fcy\u00fck bir etkiye sahiptir. Gere\u011finden y\u00fcksek frekans, gereksiz i\u015flemci d\u00f6ng\u00fcleri ve a\u011f trafi\u011fi yarat\u0131rken, \u00e7ok d\u00fc\u015f\u00fck frekans sistemin tepki s\u00fcresini olumsuz etkileyebilir.<\/p>\n<ul>\n<li><strong>Minimum Gerekli Frekans:<\/strong> Uygulaman\u0131z i\u00e7in gerekli olan minimum frekans\u0131 belirleyin. \u00d6rne\u011fin, bir tekerlek odometresi 50 Hz'de g\u00fcncellenirken, bir genel durum yay\u0131n\u0131 1 Hz'de yeterli olabilir.<\/li>\n<li><strong>Dinamik Frekans Ayar\u0131:<\/strong> Baz\u0131 durumlarda, sistemin \u00e7al\u0131\u015fma moduna (\u00f6rne\u011fin, \"seyahat\" vs \"park etme\") ba\u011fl\u0131 olarak yay\u0131n frekans\u0131n\u0131 dinamik olarak ayarlamak faydal\u0131 olabilir.<\/li>\n<\/ul>\n<\/li>\n<li>\n<h3>\u00c7oklu \u0130\u015f Par\u00e7ac\u0131\u011f\u0131 (Multithreading) ve Executor'lar<\/h3>\n<p>Varsay\u0131lan olarak, <code>rclpy.spin()<\/code> tek bir i\u015f par\u00e7ac\u0131\u011f\u0131nda \u00e7al\u0131\u015f\u0131r ve t\u00fcm geri aramalar\u0131 (callback'ler) s\u0131rayla i\u015fler. Ancak, bir d\u00fc\u011f\u00fcm\u00fcn\u00fcz\u00fcn e\u015fzamanl\u0131 olarak birden fazla g\u00f6revi (\u00f6rne\u011fin, bir sens\u00f6r verisi okuma ve bir kontrol komutu i\u015fleme) yerine getirmesi gerekiyorsa, \u00e7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 kullanmak performans\u0131 art\u0131rabilir.<\/p>\n<p>ROS2 Python'da <code>rclpy.executors<\/code> mod\u00fcl\u00fc, <code>SingleThreadedExecutor<\/code> (varsay\u0131lan) ve <code>MultiThreadedExecutor<\/code> sa\u011flar. <code>MultiThreadedExecutor<\/code> kullanarak, ayn\u0131 d\u00fc\u011f\u00fcmdeki farkl\u0131 yay\u0131nc\u0131lar\u0131n veya abonelerin callback'leri paralel olarak \u00e7al\u0131\u015fabilir.<\/p>\n<pre><code>\n# ... (\u00f6nceki importlar) ...\nfrom rclpy.executors import MultiThreadedExecutor\n\nclass MultiThreadedNode(Node):\n    def __init__(self):\n        super().__init__('multi_threaded_node')\n        self.publisher1 = self.create_publisher(String, 'topic1', 10)\n        self.publisher2 = self.create_publisher(String, 'topic2', 10)\n        \n        self.timer1 = self.create_timer(0.1, self.publish_topic1) # 10 Hz\n        self.timer2 = self.create_timer(1.0, self.publish_topic2) # 1 Hz\n        \n        self.count1 = 0\n        self.count2 = 0\n\n    def publish_topic1(self):\n        msg = String(data=f'H\u0131zl\u0131 veri: {self.count1}')\n        self.publisher1.publish(msg)\n        self.get_logger().info(f'Yay\u0131nland\u0131 topic1: {msg.data}')\n        self.count1 += 1\n\n    def publish_topic2(self):\n        # Bu callback biraz daha uzun s\u00fcrebilir, ancak di\u011ferini engellemez\n        # time.sleep(0.05) # Sim\u00fcle edilmi\u015f uzun s\u00fcreli i\u015flem\n        msg = String(data=f'Yava\u015f veri: {self.count2}')\n        self.publisher2.publish(msg)\n        self.get_logger().info(f'Yay\u0131nland\u0131 topic2: {msg.data}')\n        self.count2 += 1\n\ndef main(args=None):\n    rclpy.init(args=args)\n    node = MultiThreadedNode()\n    \n    executor = MultiThreadedExecutor()\n    executor.add_node(node)\n    \n    try:\n        executor.spin()\n    except KeyboardInterrupt:\n        pass\n    finally:\n        executor.shutdown()\n        node.destroy_node()\n        rclpy.shutdown()\n\nif __name__ == '__main__':\n    main()\n            <\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, d\u00fc\u011f\u00fcm i\u00e7inde ba\u011f\u0131ms\u0131z i\u015f par\u00e7ac\u0131klar\u0131n\u0131n paralel \u00e7al\u0131\u015fmas\u0131na izin vererek daha iyi tepki s\u00fcresi ve genel performans sa\u011flar.<\/p>\n<\/li>\n<li>\n<h3>C++ Kullan\u0131m\u0131 (rclcpp)<\/h3>\n<p>Python (rclpy) genellikle geli\u015ftirme h\u0131z\u0131 ve kolayl\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan tercih edilirken, performans kritik uygulamalarda C++ (rclcpp) daha iyi sonu\u00e7lar verebilir. C++'\u0131n d\u00fc\u015f\u00fck seviye bellek y\u00f6netimi ve derlenmi\u015f kodun h\u0131z\u0131, \u00f6zellikle y\u00fcksek frekansl\u0131 sens\u00f6r i\u015fleme veya karma\u015f\u0131k kontrol algoritmalar\u0131 i\u00e7in Python'dan daha avantajl\u0131 olabilir. E\u011fer Python ile performans darbo\u011fazlar\u0131 ya\u015f\u0131yorsan\u0131z, baz\u0131 d\u00fc\u011f\u00fcmleri C++'a ge\u00e7irmeyi d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<\/li>\n<li>\n<h3>Sistem Kaynaklar\u0131n\u0131n \u0130zlenmesi<\/h3>\n<p>Yay\u0131nc\u0131 d\u00fc\u011f\u00fcmlerinizin ve genel ROS2 sisteminizin CPU, bellek ve a\u011f kullan\u0131m\u0131n\u0131 d\u00fczenli olarak izlemek, potansiyel performans sorunlar\u0131n\u0131 erken tespit etmenizi sa\u011flar. <code>htop<\/code>, <code>ros2 top<\/code>, <code>rqt_plot<\/code> gibi ara\u00e7lar bu izleme i\u00e7in faydal\u0131d\u0131r.<\/p>\n<\/li>\n<\/ul>\n<p>Bu optimizasyon tekniklerini ve en iyi uygulamalar\u0131 benimseyerek, ROS2 yay\u0131nc\u0131 d\u00fc\u011f\u00fcmlerinizin robotik sistemlerinizde en verimli \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabilir ve kaynaklar\u0131 daha ak\u0131ll\u0131ca kullanabilirsiniz. Her uygulaman\u0131n benzersiz ihtiya\u00e7lar\u0131 oldu\u011funu unutmay\u0131n, bu y\u00fczden en iyi konfig\u00fcrasyonu bulmak i\u00e7in test ve deneme yapmaktan \u00e7ekinmeyin.<\/p>\n<h2>Sonu\u00e7: ROS2 Yay\u0131nc\u0131 D\u00fc\u011f\u00fcmlerinin G\u00fcc\u00fc ve Gelece\u011fi<\/h2>\n<p>Bu kapsaml\u0131 makale boyunca, ROS2 yay\u0131nc\u0131 d\u00fc\u011f\u00fcmlerinin robotik sistemlerdeki merkezi rol\u00fcn\u00fc derinlemesine inceledik. Yay\u0131nc\u0131 d\u00fc\u011f\u00fcmlerinin ne oldu\u011fundan, ROS2'nin genel ileti\u015fim mimarisindeki yerlerine, Python ile ad\u0131m ad\u0131m nas\u0131l olu\u015fturulduklar\u0131na, ger\u00e7ek d\u00fcnya senaryolar\u0131ndaki uygulamalar\u0131na ve ileri d\u00fczey \u00f6zelle\u015ftirme ile performans optimizasyonu tekniklerine kadar bir\u00e7ok konuya de\u011findik.<\/p>\n<p>ROS2 yay\u0131nc\u0131lar\u0131, sens\u00f6r verilerinden kontrol komutlar\u0131na, durum g\u00fcncellemelerinden hata bildirimlerine kadar her t\u00fcrl\u00fc bilginin robotik ekosistem i\u00e7inde etkin ve g\u00fcvenilir bir \u015fekilde akmas\u0131n\u0131 sa\u011flayan temel yap\u0131 ta\u015flar\u0131d\u0131r. DDS tabanl\u0131 da\u011f\u0131t\u0131k mimarisi sayesinde, ROS2 yay\u0131nc\u0131lar\u0131 daha \u00f6nce ROS1'in kar\u015f\u0131la\u015ft\u0131\u011f\u0131 bir\u00e7ok k\u0131s\u0131tlamay\u0131 a\u015farak, daha \u00f6l\u00e7eklenebilir, g\u00fcvenilir ve ger\u00e7ek zamanl\u0131 sistemler in\u015fa etme olana\u011f\u0131 sunar. QoS politikalar\u0131, \u00f6zel mesaj tipleri ve \u00e7oklu i\u015f par\u00e7ac\u0131\u011f\u0131 kullan\u0131m\u0131 gibi \u00f6zellikler, geli\u015ftiricilere sistemlerini benzersiz ihtiya\u00e7lar\u0131na g\u00f6re hassas bir \u015fekilde ayarlama g\u00fcc\u00fc verir.<\/p>\n<p>Gelecekte, robotik uygulamalar\u0131n karma\u015f\u0131kl\u0131\u011f\u0131 ve otonomi seviyesi artt\u0131k\u00e7a, ROS2 yay\u0131nc\u0131 d\u00fc\u011f\u00fcmlerinin \u00f6nemi daha da artacakt\u0131r. \u00d6zellikle makine \u00f6\u011frenimi modellerinin sens\u00f6r verilerini yorumlay\u0131p eylem kararlar\u0131 yay\u0131nlad\u0131\u011f\u0131, birden fazla robotun koordineli \u00e7al\u0131\u015ft\u0131\u011f\u0131 ve karma\u015f\u0131k insan-robot etkile\u015fimlerinin ya\u015fand\u0131\u011f\u0131 senaryolarda, sa\u011flam ve optimize edilmi\u015f veri ak\u0131\u015f\u0131 kritik bir ba\u015far\u0131 fakt\u00f6r\u00fc olacakt\u0131r. ROS2, bu gelece\u011fe haz\u0131r bir platform sunarak robotik geli\u015fimine y\u00f6n vermeye devam edecektir.<\/p>\n<p>Bu makalede edindi\u011finiz bilgilerle, kendi ROS2 tabanl\u0131 robotik projelerinizde yay\u0131nc\u0131 d\u00fc\u011f\u00fcmlerini etkin bir \u015fekilde kullanmaya ba\u015flayabilir, robotlar\u0131n\u0131z\u0131n veri ileti\u015fimini g\u00fc\u00e7lendirebilir ve yenilik\u00e7i \u00e7\u00f6z\u00fcmler geli\u015ftirebilirsiniz. Unutmay\u0131n, pratik yapmak ve farkl\u0131 senaryolar\u0131 denemek, bu alandaki yetkinli\u011finizi art\u0131rman\u0131n en iyi yoludur. Robotik d\u00fcnyas\u0131na ho\u015f geldiniz!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<dl>\n<dt>1. ROS1 ve ROS2 yay\u0131nc\u0131 d\u00fc\u011f\u00fcmleri aras\u0131ndaki temel fark nedir?<\/dt>\n<dd>En temel fark, ROS1'in ba\u011f\u0131ml\u0131 oldu\u011fu Master d\u00fc\u011f\u00fcm\u00fc (roscore) konseptinin ROS2'de olmamas\u0131d\u0131r. ROS2, DDS (Data Distribution Service) standard\u0131n\u0131 kullanarak da\u011f\u0131t\u0131lm\u0131\u015f bir mimari sunar, bu da daha iyi ger\u00e7ek zamanl\u0131 performans, g\u00fcvenilirlik ve \u00f6l\u00e7eklenebilirlik sa\u011flar. Ayr\u0131ca ROS2, C++ ve Python i\u00e7in daha modern ve zengin API'ler sunar, \u00f6zellikle QoS (Quality of Service) ayarlar\u0131 ile ileti\u015fimin davran\u0131\u015f\u0131n\u0131 daha detayl\u0131 kontrol etme imkan\u0131 verir.<\/dd>\n<dt>2. Bir yay\u0131nc\u0131 d\u00fc\u011f\u00fcm\u00fc birden fazla konuya yay\u0131n yapabilir mi?<\/dt>\n<dd>Evet, kesinlikle. Bir ROS2 d\u00fc\u011f\u00fcm\u00fc, ayn\u0131 anda birden fazla konuya (topic) veri yay\u0131nlayabilir. Her bir konu i\u00e7in ayr\u0131 bir <code>self.create_publisher()<\/code> \u00e7a\u011fr\u0131s\u0131 yapman\u0131z yeterlidir. Bu, robotunuzun farkl\u0131 sens\u00f6rlerden veya alt sistemlerden gelen verileri tek bir merkezden y\u00f6netmesini veya farkl\u0131 tipte komutlar\u0131 tek bir kontrolc\u00fcdenden g\u00f6ndermesini sa\u011flar, b\u00f6ylece kodun mod\u00fclerli\u011fi artar.<\/dd>\n<dt>3. QoS (Quality of Service) ayarlar\u0131 neden \u00f6nemlidir ve nas\u0131l se\u00e7ilmelidir?<\/dt>\n<dd>QoS ayarlar\u0131, ROS2 ileti\u015fiminin davran\u0131\u015f\u0131n\u0131 belirleyen kritik parametrelerdir. Veri paketlerinin g\u00fcvenilirli\u011fi (Reliability), ya\u015fam s\u00fcresi (Durability), ge\u00e7mi\u015fi (History) ve derinli\u011fi (Depth) gibi \u00f6zellikleri kontrol eder. \u00d6nemi, farkl\u0131 veri t\u00fcrlerinin farkl\u0131 ileti\u015fim gereksinimlerine sahip olmas\u0131ndan kaynaklan\u0131r. \u00d6rne\u011fin, bir acil durdurma sinyali i\u00e7in <code>ReliabilityPolicy.RELIABLE<\/code> ve <code>DurabilityPolicy.TRANSIENT_LOCAL<\/code> tercih edilirken (\u00e7\u00fcnk\u00fc g\u00fcvenilir ve ge\u00e7 ba\u011flanacak bir abonenin bile son mesaj\u0131 almas\u0131 \u00f6nemlidir), y\u00fcksek frekansl\u0131 kamera g\u00f6r\u00fcnt\u00fcs\u00fc ak\u0131\u015f\u0131 i\u00e7in <code>ReliabilityPolicy.BEST_EFFORT<\/code> daha uygun olabilir (\u00e7\u00fcnk\u00fc her kare kritik de\u011fildir ve gecikmeyi minimumda tutmak \u00f6nceliklidir). Se\u00e7im, uygulaman\u0131n veri kayb\u0131na tolerans\u0131, gecikme hassasiyeti ve sistem kaynaklar\u0131 (bant geni\u015fli\u011fi, CPU) gibi gereksinimlerine ba\u011fl\u0131d\u0131r.<\/dd>\n<dt>4. Yay\u0131nc\u0131n\u0131n yay\u0131nlamas\u0131 gereken mesaj tipi \u00f6nceden tan\u0131mlanm\u0131\u015f m\u0131d\u0131r?<\/dt>\n<dd>Evet, her ROS2 konusunun belirli bir mesaj tipiyle ili\u015fkilendirilmesi gerekir. Yay\u0131nc\u0131 d\u00fc\u011f\u00fcm\u00fc olu\u015fturulurken bu mesaj tipinin (\u00f6rne\u011fin <code>std_msgs\/String<\/code>, <code>sensor_msgs\/LaserScan<\/code> veya sizin \u00f6zel olarak tan\u0131mlad\u0131\u011f\u0131n\u0131z bir mesaj tipi) belirtilmesi zorunludur. Abone d\u00fc\u011f\u00fcmlerinin de ayn\u0131 mesaj tipini beklemesi gerekir, aksi takdirde ileti\u015fim kuramazlar. Bu tip kontrol\u00fc, sistemin tutarl\u0131l\u0131\u011f\u0131n\u0131 ve hata ay\u0131klamas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/dd>\n<\/dl>\n<style>\n        body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.7; color: #333; background-color: #f9f9f9; margin: 0; padding: 0;}\n        .container { width: 90%; max-width: 1000px; margin: 30px auto; padding: 25px; background-color: #ffffff; border-radius: 8px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); }\n        h2 { color: #2c3e50; font-size: 1.8em; border-bottom: 2px solid #eceff1; padding-bottom: 10px; margin-top: 30px; }\n        h3 { color: #34495e; font-size: 1.4em; margin-top: 25px; }\n        p { margin-bottom: 15px; text-align: justify; }\n        ul, ol { margin-bottom: 15px; padding-left: 25px; }\n        li { margin-bottom: 8px; }\n        pre { background: #ecf0f1; padding: 18px; border-radius: 6px; overflow-x: auto; font-size: 0.88em; line-height: 1.4; color: #2d3436; margin: 20px 0; border: 1px solid #dde1e6; }\n        code { font-family: 'Fira Code', 'Courier New', Courier, monospace; background-color: #e0e6ea; padding: 3px 6px; border-radius: 4px; font-size: 0.9em; }\n        .expert-tip {\n            background-color: #e8f5e9; \/* Light green *\/\n            border-left: 5px solid #4CAF50; \/* Green border *\/\n            margin: 25px 0;\n            padding: 15px 25px;\n            color: #2e7d32; \/* Dark green text *\/\n            border-radius: 6px;\n            font-style: italic;\n            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n        }\n        dl { margin-top: 25px; }\n        dl dt { font-weight: bold; margin-top: 15px; color: #2c3e50; }\n        dl dd { margin-bottom: 10px; padding-left: 15px; border-left: 2px solid #cfd8dc; padding-top: 5px; padding-bottom: 5px;}<\/p>\n<p>        \/* Mobil uyumluluk *\/\n        @media screen and (max-width: 768px) {\n            .container {\n                width: 95%;\n                padding: 15px;\n                margin: 20px auto;\n            }\n            h2 {\n                font-size: 1.6em;\n            }\n            h3 {\n                font-size: 1.3em;\n            }\n            pre {\n                font-size: 0.8em;\n                word-wrap: break-word; \/* uzun kod sat\u0131rlar\u0131n\u0131 k\u0131rar *\/\n                white-space: pre-wrap; \/* Sat\u0131rlar\u0131 otomatik olarak sarar *\/\n            }\n            body {\n                font-size: 0.95em;\n            }\n        }<\/p>\n<p>        @media screen and (max-width: 480px) {\n            .container {\n                padding: 10px;\n            }\n            h2 {\n                font-size: 1.4em;\n            }\n            h3 {\n                font-size: 1.1em;\n            }\n            pre {\n                font-size: 0.75em;\n            }\n            body {\n                font-size: 0.9em;\n            }\n        }\n    <\/style>\n<div class=\"container\">\n        <!-- T\u00fcm makale i\u00e7eri\u011fi burada yer alacak. -->\n    <\/div>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Robotik sistemlerin karma\u015f\u0131k d\u00fcnyas\u0131nda veri ileti\u015fimi hayati \u00f6neme sahiptir. Peki, otonom bir arac\u0131n sens\u00f6r verilerini nas\u0131l payla\u015f\u0131r\u0131z ya&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-33269","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ROS2 Yay\u0131nc\u0131 D\u00fc\u011f\u00fcm\u00fc: Temeller ve \u0130leri Uygulamalar<\/title>\n<meta name=\"description\" content=\"Robotik sistemlerin karma\u015f\u0131k d\u00fcnyas\u0131nda veri ileti\u015fimi hayati \u00f6neme sahiptir. Peki, otonom bir arac\u0131n sens\u00f6r verilerini nas\u0131l payla\u015f\u0131r\u0131z ya da bir robot kolunun anl\u0131k konumunu di\u011fer bile\u015fenlere nas\u0131l duyururuz? \u0130\u015fte tam da bu noktada, ROS2 (Robot Operating System 2) yay\u0131nc\u0131 d\u00fc\u011f\u00fcmleri devreye giriyor. Bu kapsaml\u0131 makale ile ROS2&#039;de nas\u0131l veri yay\u0131nlayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ROS2 Yay\u0131nc\u0131 D\u00fc\u011f\u00fcm\u00fc: Temeller ve \u0130leri Uygulamalar\" \/>\n<meta property=\"og:description\" content=\"Robotik sistemlerin karma\u015f\u0131k d\u00fcnyas\u0131nda veri ileti\u015fimi hayati \u00f6neme sahiptir. Peki, otonom bir arac\u0131n sens\u00f6r verilerini nas\u0131l payla\u015f\u0131r\u0131z ya da bir robot kolunun anl\u0131k konumunu di\u011fer bile\u015fenlere nas\u0131l duyururuz? \u0130\u015fte tam da bu noktada, ROS2 (Robot Operating System 2) yay\u0131nc\u0131 d\u00fc\u011f\u00fcmleri devreye giriyor. Bu kapsaml\u0131 makale ile ROS2&#039;de nas\u0131l veri yay\u0131nlayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-31T19:02:20+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"ROS2 Yay\u0131nc\u0131 D\u00fc\u011f\u00fcm\u00fc: Temeller ve \u0130leri Uygulamalar\",\"datePublished\":\"2025-10-31T19:02:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/\"},\"wordCount\":4373,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/\",\"name\":\"ROS2 Yay\u0131nc\u0131 D\u00fc\u011f\u00fcm\u00fc: Temeller ve \u0130leri Uygulamalar\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-31T19:02:20+00:00\",\"description\":\"Robotik sistemlerin karma\u015f\u0131k d\u00fcnyas\u0131nda veri ileti\u015fimi hayati \u00f6neme sahiptir. Peki, otonom bir arac\u0131n sens\u00f6r verilerini nas\u0131l payla\u015f\u0131r\u0131z ya da bir robot kolunun anl\u0131k konumunu di\u011fer bile\u015fenlere nas\u0131l duyururuz? \u0130\u015fte tam da bu noktada, ROS2 (Robot Operating System 2) yay\u0131nc\u0131 d\u00fc\u011f\u00fcmleri devreye giriyor. Bu kapsaml\u0131 makale ile ROS2'de nas\u0131l veri yay\u0131nlayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ROS2 Yay\u0131nc\u0131 D\u00fc\u011f\u00fcm\u00fc: Temeller ve \u0130leri Uygulamalar\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"ROS2 Yay\u0131nc\u0131 D\u00fc\u011f\u00fcm\u00fc: Temeller ve \u0130leri Uygulamalar","description":"Robotik sistemlerin karma\u015f\u0131k d\u00fcnyas\u0131nda veri ileti\u015fimi hayati \u00f6neme sahiptir. Peki, otonom bir arac\u0131n sens\u00f6r verilerini nas\u0131l payla\u015f\u0131r\u0131z ya da bir robot kolunun anl\u0131k konumunu di\u011fer bile\u015fenlere nas\u0131l duyururuz? \u0130\u015fte tam da bu noktada, ROS2 (Robot Operating System 2) yay\u0131nc\u0131 d\u00fc\u011f\u00fcmleri devreye giriyor. Bu kapsaml\u0131 makale ile ROS2'de nas\u0131l veri yay\u0131nlayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/","og_locale":"tr_TR","og_type":"article","og_title":"ROS2 Yay\u0131nc\u0131 D\u00fc\u011f\u00fcm\u00fc: Temeller ve \u0130leri Uygulamalar","og_description":"Robotik sistemlerin karma\u015f\u0131k d\u00fcnyas\u0131nda veri ileti\u015fimi hayati \u00f6neme sahiptir. Peki, otonom bir arac\u0131n sens\u00f6r verilerini nas\u0131l payla\u015f\u0131r\u0131z ya da bir robot kolunun anl\u0131k konumunu di\u011fer bile\u015fenlere nas\u0131l duyururuz? \u0130\u015fte tam da bu noktada, ROS2 (Robot Operating System 2) yay\u0131nc\u0131 d\u00fc\u011f\u00fcmleri devreye giriyor. Bu kapsaml\u0131 makale ile ROS2'de nas\u0131l veri yay\u0131nlayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.","og_url":"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-31T19:02:20+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"ROS2 Yay\u0131nc\u0131 D\u00fc\u011f\u00fcm\u00fc: Temeller ve \u0130leri Uygulamalar","datePublished":"2025-10-31T19:02:20+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/"},"wordCount":4373,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/","url":"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/","name":"ROS2 Yay\u0131nc\u0131 D\u00fc\u011f\u00fcm\u00fc: Temeller ve \u0130leri Uygulamalar","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-31T19:02:20+00:00","description":"Robotik sistemlerin karma\u015f\u0131k d\u00fcnyas\u0131nda veri ileti\u015fimi hayati \u00f6neme sahiptir. Peki, otonom bir arac\u0131n sens\u00f6r verilerini nas\u0131l payla\u015f\u0131r\u0131z ya da bir robot kolunun anl\u0131k konumunu di\u011fer bile\u015fenlere nas\u0131l duyururuz? \u0130\u015fte tam da bu noktada, ROS2 (Robot Operating System 2) yay\u0131nc\u0131 d\u00fc\u011f\u00fcmleri devreye giriyor. Bu kapsaml\u0131 makale ile ROS2'de nas\u0131l veri yay\u0131nlayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ros2-yayinci-dugumu-temeller-ve-ileri-uygulamalar\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"ROS2 Yay\u0131nc\u0131 D\u00fc\u011f\u00fcm\u00fc: Temeller ve \u0130leri Uygulamalar"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33269","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33269"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33269\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33269"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33269"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33269"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}