Bu rehber, ROS1 (Noetic) kullanan mobil robot sisteminizi ROS2 (Humble)'a geçirmenize yardımcı olmak için hazırlandı. Rehberimiz, LIDAR ve derinlik kamerası bulunan LIMCOBOT isimli mobil robot üzerinde yoğunlaşmaktadır ve Python ile C++ dillerini temel alır. Ayrıca, robotun simülasyonu Gazebo ortamında gerçekleştirilerek gerçek donanım öncesi testler yapılacaktır.
Bu rehber, ROS1 konusunda orta seviye bilgiye sahip kullanıcılar için hazırlanmıştır ve pratik, örnek tabanlı bir geçiş süreci sunar.
- 🔁 ROS1 ve ROS2 arasındaki temel farklar (Noetic → Humble)
- 🛠️
colconkullanarak ROS2 paket yapısı ve workspace oluşturma - 🚀
.launch(XML) → Python tabanlı launch dosyası dönüşümü - ⚙️ Parametre yönetimi ve dinamik yapılandırma
- 🔄 TF ve TF2 dönüşümleri
- 📡 Navigasyon, haritalama ve MoveIt geçişi
- 🧪 ROS1 ve ROS2 versiyonları ile örnek kodlar
- 🧭 Gazebo simülasyonu: ROS1 vs ROS2 ile simülasyon yapısı
- 🔗
ros1_bridgeile hibrit ortam geçişi
- Ubuntu 22.04 (Jammy)
- ROS1 Noetic (karşılaştırma için)
- ROS2 Humble
- VSCode (önerilen)
- colcon, rosdep, vcs vb. araçlar
- Gazebo (Classic ve Ignition/GZ destekli)
docs/: Teknik dokümantasyon ve geçiş adımlarıexamples/: ROS1 ve ROS2 versiyonlarını gösteren örnek kodlarimages/: Diyagramlar ve ekran görüntüleri
- Bu repoyu klonlayın.
docs/klasöründeki adımları takip edin.- Örneklerle kendi kod geçişinizi test edin.
Topluluk katkılarını memnuniyetle karşılıyoruz! Forklayın, geliştirmelerle veya düzeltmelerle pull request gönderin.
ROS sisteminizi modernleştirmeye birlikte başlayalım 🧠🤖
Bu bölümde, ROS1 ve ROS2 arasındaki temel mimari farkları, yeni özellikleri ve neden ROS2'ye geçiş yapılması gerektiğini detaylı bir şekilde inceleyeceğiz.
ROS1, uzun yıllar boyunca robotik alanında standart bir platform haline gelmiştir. Ancak zamanla aşağıdaki eksiklikleri nedeniyle daha sürdürülebilir, güvenli ve modüler bir altyapıya ihtiyaç duyulmuştur:
- Gerçek zamanlılık desteği eksikliği
- Güvenlik önlemlerinin olmaması
- Çok robotlu sistemlerde sınırlı performans
- Dağıtık sistemlerde esneklik eksikliği
ROS2, bu eksiklikleri gidermek için sıfırdan tasarlanmıştır. Özellikle DDS (Data Distribution Service) altyapısı sayesinde daha esnek, güvenli ve özelleştirilebilir bir iletişim yapısı sunar.
| Özellik | ROS1 | ROS2 (Humble) |
|---|---|---|
| Protokol | TCPROS / UDPROS | DDS tabanlı (FastDDS, CycloneDDS vb.) |
| QoS Desteği | Yok | Var (reliability, durability, history vs.) |
| Multicast | Yok | Var |
| Güvenlik | Harici çözümler gerekir | SROS2 ile entegre |
| Discovery | Manuel veya topic bazlı | Otomatik discovery |
ROS2’de workspace yapısı modernleştirilmiştir. colcon aracı, bağımsız paketlerin paralel derlenmesini ve yönetimini sağlar.
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_makemkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon buildROS2 ile birlikte komut satırı araçları büyük ölçüde yeniden yapılandırılmış ve alt komutlara bölünerek daha modüler hale getirilmiştir. Bu sayede her kaynak türü için (topic, service, param, bag, dll.) ayrı araçlar kullanılır.
| İşlem | ROS1 Komutu | ROS2 Komutu |
|---|---|---|
| Paket listeleme | rospack list |
ros2 pkg list |
| Paket yolu bulma | rospack find <pkg> |
ros2 pkg prefix <pkg> |
| Node çalıştırma | rosrun <pkg> <node> |
ros2 run <pkg> <node> |
| Launch dosyası çalıştırma | roslaunch <pkg> <file> |
ros2 launch <pkg> <file> |
| İşlem | ROS1 | ROS2 |
|---|---|---|
| Listeleme | rostopic list |
ros2 topic list |
| Yayınlanan veri izleme | rostopic echo /topic |
ros2 topic echo /topic |
| Bilgi görüntüleme | rostopic info /topic |
ros2 topic info /topic |
| Yayın yapma (manuel) | rostopic pub |
ros2 topic pub |
| Test mesaj gönderme | rostopic pub -1 |
ros2 topic pub --once |
| İşlem | ROS1 | ROS2 |
|---|---|---|
| Listeleme | rosservice list |
ros2 service list |
| Bilgi görüntüleme | rosservice info |
ros2 service info |
| Hizmet çağırma | rosservice call |
ros2 service call |
| Hizmet tipi sorgulama | rosservice type |
ros2 service type |
| İşlem | ROS1 | ROS2 |
|---|---|---|
| Param listeleme | rosparam list |
ros2 param list |
| Param değeri alma | rosparam get /param |
ros2 param get <node> <param> |
| Param değeri ayarlama | rosparam set /param val |
ros2 param set <node> <param> val |
| Param dosyasından yükleme | rosparam load file.yaml |
ros2 launch ile YAML geçilir |
| İşlem | ROS1 | ROS2 |
|---|---|---|
| Kayıt başlatma | rosbag record -a |
ros2 bag record -a |
| Kaydı oynatma | rosbag play file.bag |
ros2 bag play file |
| İçerik görüntüleme | rosbag info file.bag |
ros2 bag info file |
| İşlem | ROS1 | ROS2 |
|---|---|---|
| Mesaj tipi listeleme | rosmsg list |
ros2 interface list |
| Mesaj tipini inceleme | rosmsg show <type> |
ros2 interface show <type> |
| Hizmet tipi listeleme | rossrv list |
ros2 interface list (aynı komut) |
| Hizmet tipi gösterme | rossrv show <type> |
ros2 interface show <type> |
ROS1 ve ROS2 arasında node başlatma ve launch sistemleri anlamında önemli farklar vardır. ROS2, node başlatmayı daha modüler ve programlanabilir hale getirmiştir.
- ROS1:
.launchuzantılı XML dosyaları ile çalışır. - ROS2: Python tabanlı
.launch.pydosyaları kullanılır. Bu sayede koşullu işlemler, döngüler ve parametre yönetimi daha dinamik hale gelir.
Örnek ROS1 launch dosyası (start_robot.launch):
<launch>
<node pkg="my_robot" type="robot_node.py" name="robot_node" output="screen" />
</launch>Aynı yapı ROS2'de Python ile (start_robot.launch.py):
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='my_robot',
executable='robot_node',
name='robot_node',
output='screen'
)
])#!/usr/bin/env python
import rospy
def main():
rospy.init_node('simple_node')
rospy.loginfo("Merhaba ROS1!")
if __name__ == '__main__':
main()import rclpy
from rclpy.node import Node
class SimpleNode(Node):
def __init__(self):
super().__init__('simple_node')
self.get_logger().info("Merhaba ROS2!")
def main():
rclpy.init()
node = SimpleNode()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()ROS1’de node yapısı basit ve fonksiyon temellidir. rospy ile bir node başlatılır ve spin() ile çalıştırılır. Modülerlik düşüktür, genellikle küçük projelerde yeterlidir.
ROS2’de ise node yapısı nesne yönelimlidir (OOP). Her node, Node sınıfından türetilir. Bu sayede:
- Kod daha okunabilir ve modüler olur.
- Parametre, publisher, subscriber gibi bileşenler sınıf içinde düzenlenir.
- Test edilebilirlik artar.
- Lifecycle, QoS, callback yönetimi gibi gelişmiş özellikler entegre edilir.
| Özellik | ROS1 | ROS2 |
|---|---|---|
| Yapı | Fonksiyon temelli | Sınıf tabanlı (OOP) |
| Giriş noktası | rospy.init_node() |
rclpy.init() |
| Logger | rospy.loginfo() |
self.get_logger().info() |
| Modülerlik | Düşük | Yüksek |
| Kaynak yönetimi | Otomatik | destroy_node(), shutdown() |
| Gelişmiş node özellikleri | Yok | Var (Lifecycle, Component vs.) |
ROS2, daha büyük ve karmaşık sistemler için daha sürdürülebilir bir node yapısı sunar.
ROS2, sadece mimari olarak değil, sunduğu gelişmiş özelliklerle de ROS1'e kıyasla çok daha güçlü bir altyapı sunar. Bu özellikler özellikle endüstriyel ve büyük ölçekli uygulamalar için tasarlanmıştır.
ROS2, node'ların durum yönetimini standart hale getirmek için lifecycle node yapısını sunar. Bu yapıda bir node, belirli durumlar arasında kontrollü olarak geçiş yapar:
unconfiguredinactiveactivefinalized
Bu sayede:
- Node'lar sistem hazır olduğunda aktifleştirilir.
- Hatalı durumlarda node pasifleştirilip tekrar başlatılabilir.
- Sistem kontrolü daha güvenli ve yapılandırılabilir hale gelir.
Component node özelliği sayesinde aynı proseste birden fazla node çalıştırmak mümkündür. Bu yapı:
- Bellek kullanımını azaltır
- Başlatma süresini kısaltır
- Aynı uygulama içinde dinamik olarak node eklemeyi mümkün kılar
Özellikle embedded sistemler ve çok modüllü robotik yazılımlar için oldukça faydalıdır.
ROS2, veri iletişiminde hassas ayarlar yapılabilmesi için QoS profilleri sunar. Bu profiller, her topic veya servis için farklı iletim politikaları tanımlamanıza imkân tanır.
Örneğin:
- reliability:
reliable(güvenilir) vsbest_effort(kayıp olabilir) - durability:
volatile(sadece aktif abone varsa) vstransient_local(önceki veriler tutulur) - history:
keep_last,keep_all
Bu sayede her kullanım senaryosuna özel iletişim şekli tanımlanabilir.
ROS2, DDS altyapısını kullanarak güvenli iletişim (Security ROS 2 - SROS2) imkânı sağlar. Özellikler şunlardır:
- Veri şifreleme (encryption)
- Kimlik doğrulama (authentication)
- Yetkilendirme (authorization)
Bu yapı özellikle ağ üzerinden çalışan robotlar, bulut entegrasyonları ve savunma sanayi gibi kritik alanlarda büyük önem taşır.
ROS2’nin bu gelişmiş özellikleri sayesinde daha modüler, esnek, güvenli ve performanslı robot sistemleri geliştirmek mümkün hale gelir.
Robot uygulamalarında parametre kullanımı, node'ların davranışını yapılandırmak ve çalışma zamanında ayarlamalar yapabilmek açısından kritik öneme sahiptir. ROS1 ve ROS2 bu konuda oldukça farklı yaklaşımlar benimser.
ROS1'de parametreler, merkezi bir parametre sunucusu (parameter server) üzerinde tutulur. Bu yapı:
- Tüm node'lar tarafından ortak olarak erişilebilir.
- Parametreler, genellikle
rosparamkomutu veya launch dosyalarıyla tanımlanır. - Parametreler
.yamldosyalarından yüklenebilir.
Örnek:
rosparam set /robot_speed 1.0
rosparam get /robot_speed<param name="robot_speed" value="1.0" />
<rosparam file="$(find my_pkg)/config/settings.yaml" />Ancak ROS1’de parametre değişikliği genellikle node yeniden başlatılmadan etkili olmaz. Gerçek zamanlı yapılandırma için dynamic_reconfigure paketi kullanılır.
ROS2’de parametre yönetimi her node için ayrı ayrı yapılır. Global bir parametre sunucusu yerine, her node kendi parametre alanına sahiptir.
Parametreler:
- Node oluşturulurken
declare_parameter()ile tanımlanır. ros2 paramaracıyla çalışma zamanında okunabilir veya güncellenebilir.- YAML dosyaları launch dosyalarına entegre edilir.
Örnek:
ros2 param set /my_node robot_speed 1.0
ros2 param get /my_node robot_speedLaunch dosyası ile YAML parametre aktarımı:
Node(
package='my_pkg',
executable='robot_node',
name='robot_node',
parameters=['config/settings.yaml']
)ROS1’de dynamic_reconfigure paketi ile GUI veya terminal üzerinden parametreler anlık olarak değiştirilebilir. Bu, özellikle PID ayarı gibi runtime konfigürasyonlar için kullanışlıdır.
ROS2’de dynamic_reconfigure bulunmaz, bunun yerine her node kendi içinde parametre güncellemelerini dinlemek için callback fonksiyonları tanımlar:
self.add_on_set_parameters_callback(self.param_callback)Bu yöntemle parametreler anlık olarak algılanabilir ve node davranışı güncellenebilir.
📊 Karşılaştırmalı Özellik Tablosu
| Özellik | ROS1 | ROS2 |
|---|---|---|
| Parametre alanı | Global parametre sunucusu | Node'a özel parametreler |
| YAML dosya entegrasyonu | <rosparam> veya rosparam load |
Python launch dosyasında parameters alanı |
| Çalışma zamanı değişim | Yeniden başlatma gerekebilir | Dinamik olarak desteklenir |
| Dinamik yapılandırma | dynamic_reconfigure |
set_parameters_callback() fonksiyonu |
| Param aracı | rosparam |
ros2 param |
ROS2'nin parametre yapısı daha güvenli, izole ve modülerdir. Node’lar birbirlerinin parametrelerine doğrudan erişemez, bu da hata riskini azaltır ve çoklu robot sistemlerinde parametre karışıklığını önler.
Mobil robot sistemlerinde yer bulma, haritalama, rota planlama ve robot kol kontrolü gibi temel işlevler ROS1'de move_base, gmapping, amcl, moveit gibi paketlerle sağlanıyordu. ROS2 ile birlikte bu paketlerin çoğu tamamen yeniden yazılmış ve daha modüler hale getirilmiştir.
ROS1:
move_base tüm navigasyon bileşenlerini tek bir node içinde sunar. Geliştirilebilir ancak monolitik bir yapıya sahiptir.
ROS2:
nav2 (Navigation2) modüler, lifecycle node tabanlı ve behavior tree destekli bir sistemdir. Her bileşen bağımsız node olarak yapılandırılır.
| Özellik | ROS1 (move_base) |
ROS2 (nav2) |
|---|---|---|
| Yapı | Tek node, monolitik | Modüler, lifecycle node’lar |
| Path planner | Plugin tabanlı | Plugin + behavior tree |
| Recovery davranışları | Statik | BT ile esnek |
| Parametre yönetimi | Sabit yapı | Dinamik lifecycle + YAML |
| TF2 entegrasyonu | Kısmi | Tam TF2 |
nav2_amcl: Yerelleştirme (ROS1amclkarşılığı)nav2_costmap_2d: Engel haritalama (ROS1costmap_2d)nav2_map_server: Harita yükleyici ve yayınlayıcı (ROS1map_server)nav2_bt_navigator: Görev kontrolü için behavior tree sisteminav2_lifecycle_manager: Tüm bileşenleri yaşam döngüsüyle yönetirnav2_smoother: Yol yumuşatma (ROS1’de genellikle özel eklentiler gerektirirdi)
| Özellik | ROS1 (gmapping) |
ROS2 (slam_toolbox) |
|---|---|---|
| Gerçek zamanlı SLAM | Var | Var |
| Harita düzenleme | Sınırlı | Dinamik |
| Hizmet destekli kontrol | Yok | Var (pause, save_map, vb.) |
| Performans | Düşük (tek çekirdekli) | Yüksek (çok çekirdekli destek) |
ROS2’de SLAM için slam_toolbox, çevrim içi ve çevrim dışı haritalama, hizmet ile harita kontrolü gibi gelişmiş özelliklerle donatılmıştır.
| Özellik | ROS1 (moveit) |
ROS2 (moveit2) |
|---|---|---|
| Planlama altyapısı | OMPL, plugin tabanlı | Aynı |
| RViz entegrasyonu | rviz |
rviz2 |
| Gerçek zamanlı kontrol | Kısıtlı | moveit_servo ile daha güçlü |
| ROS2 uyumu | Yok | Tam uyum + QoS desteği |
| Görev planlama | moveit_task_constructor |
ROS2 sürümü mevcut |
| Amaç | ROS1 Paketi | ROS2 Karşılığı |
|---|---|---|
| Yerelleştirme | amcl |
nav2_amcl |
| Engel haritası | costmap_2d |
nav2_costmap_2d |
| Harita yükleyici | map_server |
nav2_map_server |
| Yol yumuşatma | Genelde özel çözüm | nav2_smoother |
| Görev yönetimi | Yok | nav2_bt_navigator (BT tabanlı) |
| Planlama görselleştirme | moveit_visual_tools |
moveit_visual_tools (uyumlu) |
| Servo kontrol | Kısıtlı | moveit_servo |
move_basekullanıyorsanıznav2_bringupile başlamak iyi bir adımdır.- SLAM için
slam_toolbox, hem performans hem kontrol kolaylığı açısından daha gelişmiştir. - MoveIt entegrasyonları için
moveit2vemoveit_setup_assistantROS2 sürümleri mevcuttur. - Bileşenler artık lifecycle node olduğu için başlatma/yönetme yapınız değişmelidir.
- Behavior Tree yapısını öğrenmek, Navigation2 sistemini tam kullanabilmek için kritiktir.
ROS2'nin navigasyon, haritalama ve kol kontrol sistemleri; daha esnek, modüler ve yüksek performanslı bir yapıya geçiş anlamına gelir. Bu sistemleri doğru konfigüre etmek, robotunuzun tüm potansiyelini açığa çıkarmanıza yardımcı olacaktır.
Gazebo, robotların sanal ortamlarda test edilmesini sağlayan güçlü bir fizik motorudur. Hem ROS1 hem de ROS2 ile entegre çalışabilir, ancak entegrasyon yapısı ve kullanılan araçlar zamanla değişmiştir. ROS2 ile birlikte Gazebo Classic (eski adıyla Gazebo) yanında Ignition (GZ) Gazebo sistemleri de desteklenmeye başlamıştır.
| Özellik | ROS1 (Noetic) | ROS2 (Humble) |
|---|---|---|
| Entegre simülasyon aracı | gazebo_ros |
gazebo_ros_pkgs, gz_ros2_control, ros_ign |
| Desteklenen Gazebo sürümü | Gazebo Classic | Gazebo Classic + Ignition (GZ) |
| Kontrol altyapısı | ros_control + gazebo_ros_control |
ros2_control + gz_ros2_control |
| Robot dosyaları | .urdf, .xacro |
Aynı, ancak ros2_control ile daha entegre |
| Sensor plugin yapısı | XML + .gazebo tag’leri |
Aynı mantıkta, ama ROS2 API ile uyumlu |
ROS1'de tipik bir simülasyon sistemi şu parçaları içerir:
gazebo_rospaketi.worlddosyaları (ortamlar).urdfveya.xacroile tanımlanmış robotros_controlile donanım arayüzü- Sensor plugin’leri (örneğin:
gazebo_ros_camera,gazebo_ros_laser)
Launch dosyası örneği (ROS1):
<launch>
<include file="$(find gazebo_ros)/launch/empty_world.launch"/>
<param name="robot_description" command="$(find xacro)/xacro $(find my_robot)/urdf/my_robot.urdf.xacro" />
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model my_robot" />
</launch>ROS2’de yapı daha modüler ve standart hale gelmiştir. gazebo_ros_pkgs ROS2 için portlanmıştır, ayrıca gz_ros2_control paketi sayesinde robot kontrolü çok daha entegre çalışır.
ROS2'nin desteklediği başlıca simülasyon yapı taşları:
- gazebo_ros: Temel Gazebo-ROS bağlantısı
- ros2_control: ROS2 tabanlı donanım arayüzü
- gz_ros2_control: Gazebo ile ros2_control arasında bağlantı sağlar
- ros_ign: GZ (Ignition) simülasyon sistemleri için ROS arayüzü
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from ament_index_python.packages import get_package_share_directory
def generate_launch_description():
return LaunchDescription([
IncludeLaunchDescription(
PythonLaunchDescriptionSource([
get_package_share_directory('gazebo_ros'), '/launch/gazebo.launch.py']),
),
])| Özellik | ROS1 | ROS2 |
|---|---|---|
| LIDAR | gazebo_ros_laser plugin |
Aynı XML formatı, ROS2’ye uyumlu hale getirildi |
| Kamera | gazebo_ros_camera |
gazebo_ros_camera (ROS2 portu) |
| Donanım kontrolü | ros_control + effort/joint |
ros2_control + gz_ros2_control |
| Plugin yükleme | URDF içinde <gazebo> tag’leri |
Aynı yöntemle çalışır |
- Gazebo Classic kullanıyorsan, ROS1’deki yapı doğrudan ROS2’ye portlanabilir.
- Yeni sistemler için
ros2_control + gz_ros2_controlkullanmak daha performanslı ve sürdürülebilirdir. - Sensor plugin’leri için ROS2 uyumlu versiyonlar (aynı isimle) kullanılmalı.
xacroverobot_state_publisheryapısı ROS2'de aynı kalır, sadece launch sistemi Python’a geçmiştir.
| Özellik | ROS1 (Noetic) | ROS2 (Humble) |
|---|---|---|
| Simülasyon altyapısı | gazebo_ros |
gazebo_ros_pkgs, gz_ros2_control |
| Kontrol sistemi | ros_control |
ros2_control |
| Sensör eklentileri | Plugin tabanlı | Aynı, ROS2 uyumlu versiyonları |
| Launch formatı | XML (.launch) |
Python (.launch.py) |
| Robot tanımı | .urdf, .xacro |
Aynı |
| GZ (Ignition) desteği | Yok | Var (ros_ign, gz_ros2_bridge) |
ROS2’de simülasyon sistemi sadece port edilmekle kalmamış, aynı zamanda donanım kontrolü, parametrik yönetim ve launch altyapısı açısından daha esnek ve güçlü hale getirilmiştir. Gerçek robottan önce güvenli test ortamı sağlamak için Gazebo entegrasyonu hâlâ vazgeçilmezdir.
Robot sistemlerinde sensör verilerini, robot parçalarının konumlarını ve hareketli nesneleri doğru şekilde ilişkilendirmek için TF (Transform) sistemine ihtiyaç duyulur. TF, farklı koordinat sistemleri (örneğin: base_link, laser, odom, map) arasında dönüşüm sağlar. ROS1 ve ROS2'de bu sistemin yapısı farklıdır.
ROS1’de hem tf hem de tf2 kütüphaneleri kullanılabilir:
tfeski sistem, basit ama sınırlıtf2daha modern ve önerilen sistemdir- Her iki sistem de uzun süre birlikte kullanılmıştır
Yaygın kullanım:
tf::TransformListener,tf::TransformBroadcaster(tf)tf2_ros::Buffer,tf2_ros::TransformListener(tf2)
ROS2 ile birlikte TF sistemi tamamen tf2 üzerine inşa edilmiştir:
tfartık desteklenmez- Tüm broadcast ve lookup işlemleri
tf2_rosüzerinden yapılır - Static ve dynamic transform yayıncıları lifecycle uyumludur
| İşlem | ROS1 | ROS2 |
|---|---|---|
| Static transform yayma | static_transform_publisher CLI veya node |
ros2 run tf2_ros static_transform_publisher |
| Dinamik transform yayma | tf::TransformBroadcaster |
tf2_ros.TransformBroadcaster |
| Dönüşüm dinleme | tf::TransformListener |
tf2_ros.TransformListener |
| TF2 desteği | Opsiyonel | Varsayılan ve zorunlu |
| Mesaj türü | tf/tfMessage |
geometry_msgs/msg/TransformStamped |
ROS1:
rosrun tf static_transform_publisher x y z qx qy qz qw frame_id child_frame_id period_in_msROS2:
ros2 run tf2_ros static_transform_publisher x y z roll pitch yaw frame_id child_frame_id-
ROS2’de dönüşümler quaternion yerine roll, pitch, yaw olarak girilir
-
ROS2 komutu daha basit, otomatik frekansla çalışır
🧩 TF2 Kullanım Örnekleri (Kod Mantığı) ROS1:
-
Dinleyici:
tf::TransformListener listener;
-
Yayıncı:
tf::TransformBroadcaster br;
ROS2:
-
Dinleyici:
tf_buffer = Buffer(),listener = TransformListener(buffer, node)
-
Yayıncı:
StaticTransformBroadcaster,TransformBroadcaster
ROS2’de tüm bu sınıflar tf2_ros paketinde yer alır ve QoS ayarlarıyla birlikte çalıştırılır.
🗺️ RViz ve TF2
-
ROS1 ve ROS2’de RViz (ve 'rviz2') içindeki TF görselleştirme sistemi aynıdır
-
TF ağaçlarının doğru yayınlandığını test etmek için:
rosrun tf view_frames→ ROS1ros2 run tf2_tools view_frames→ ROS2 (PDF olarak çıkarır)
✅ Geçiş Önerileri
-
tf::içeren tüm kodlartf2_rosyapısına geçirilmelidir -
Transform mesaj türü
geometry_msgs/msg/TransformStampedolmalıdır -
Eğer ROS1 kodlarınızda
tfkullanıyorsanız ROS2’de bu doğrudan çalışmaz -
Statik dönüşümler için CLI komutlarının ROS2 sürümü kullanılmalı
-
tf2_ros.Bufferyapısına alışmak uzun vadede daha güçlü yapı sağlar
ROS2’de transform sisteminin tamamen tf2 üzerine kurulmuş olması sayesinde; daha tutarlı, esnek ve DDS uyumlu bir yapı sağlanmıştır. Doğru TF yapısı, navigasyon, SLAM, robot kolu gibi tüm sistemlerin güvenilir çalışması için temel şarttır.
Tüm sistemi doğrudan ROS2’ye geçirmek her zaman mümkün olmayabilir. Bazı bileşenlerin geçici olarak ROS1'de kalması gerekiyorsa, aşağıdaki araçlar bu süreçte size yardımcı olabilir.
ros1_bridge, ROS1 ve ROS2 sistemleri arasında mesaj ve servis alışverişi yapmanızı sağlayan bir köprü katmanıdır. Geçici çözümler veya kademeli geçiş senaryolarında oldukça kullanışlıdır.
Ne zaman kullanılır?
- Bazı sürücüler veya node'lar henüz ROS2’ye port edilmemişse
- ROS2’de yeni geliştirilen sistemlerin ROS1 verisiyle test edilmesi gerekiyorsa
Temel Özellikleri:
- ROS1 ve ROS2’de aynı tanımlanmış mesajlar arasında otomatik köprü
- Topic, service ve (kısıtlı olarak) action desteği
- Kaynak koddan derleme gerekir, özel mesajlarda ekstra yapılandırma gerekebilir
Resmi proje sayfası:
👉 https://github.com/ros2/ros1_bridge