ROS2
- ROS (Robot Operating System): Robot uygulamaları geliştirmek için sunduğu mesajlaşma altyapısı ve araç setiyle, farklı yazılım bileşenlerinin (düğüm, node) birbirleriyle kolayca iletişim kurmasını sağlar.
| Özellik | ROS 1 | ROS 2 |
|---|---|---|
| Mimari | Merkezi (master node) | Merkeziyetsiz (no master) |
| Gerçek Zaman Desteği | Sınırlı | DDS tabanlı, gerçek zaman yetenekli |
| Çoklu Dil Desteği | C++, Python | C++, Python, Java, Rust, … |
| Ağ Desteği | Aynı ağda (multicast) | Farklı ağlarda firewall dostu |
| Güvenlik | Ek eklentiler gerekir | DDS Security eklentisi |
- Yeni bir paket oluşturduğunuzda,
src/altında dil fark etmeksizin (C++, Python vb.)ros2 pkg createile paket iskeletleri oluşturulur. - Bir ROS/ROS 2 çalışma alanı (workspace), genellikle şu dizinleri içerir:
<workspace>/
├─ src/ # Paket kaynak kodları
├─ build/ # Derleme dosyaları
├─ install/ # Kurulum (derlenmiş paketler)
└─ log/ # Derleyici ve runtime logları
- RCL: “ROS Client Library”
- RCLCPP / RCLPY: C++ ve Python için üst katman kütüphaneleri.
-
Mesajlaşma, parametre, zamanlayıcı, servis ve aksiyon gibi temel API’leri sunar.
-
RQT: Qt tabanlı GUI panelleri; topic’ler, parametreler, servislere erişim ve grafik çizimler yapar.
- ros2 doctor --report: Sistem yapılandırmanızı analiz eder, eksik bağımlılıkları ve uyumsuzlukları raporlar.
Logging (Günlükleme)
- Log seviyeleri:
DEBUG, INFO, WARN, ERROR, FATAL.
ros2 run <pkg> <exe> --ros-args --log-level debug
ros2 run <pkg> <exe> --ros-args --log-level <node_name>:=warn
- Log dosyaları
~/.ros/log/altında saklanırrqt_loggingile de izleyebilirsiniz.
DDS ve DOMAIN ID
- ROS 2, DDS (Data Distribution Service) protokolünü kullanır.
-
Domain ID: Aynı DDS domain’inde olan düğümler birbirini görür.
- Varsayılan:
0 - Güvenli aralık:
0–101(Linux port çakışmalarından kaçınmak için). - DD S UDP port aralığı:
0–65535→ Domain ID0–232önerilir.
- Varsayılan:
-
export ROS_LOCALHOST_ONLY=1Düğümler yalnızca localhost üzerinden iletişim kurar; diğer cihazlardan erişim engellenir.
Derleme Zamanında Hata Ayıklama
colcon build --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo- RelWithDebInfo: Optimize edilmiş kodda hata ayıklama sembollerini tutar.
-
ros2 run --prefix "gdbserver localhost:3000" <pkg_name> <node_executable>- gdbserver: Kodunuzu dinleyen bir sunucu gibi çalışır.
- localhost:3000: VS Code veya başka bir istemci bu port üzerinden hata ayıklamayı üstlenir.
-
vs code launch.json dosyası:
-
program: Hata ayıklamak istediğiniz executable’ın tam yolu (colcon install sonrası).
- miDebuggerServerAddress: gdbserver’ın dinlediği adres ve port.
-
Diğer ayarlar (stopAtEntry, environment) tercihinize göre düzenlenebilir.
-
VS Code’da
Run & Debugpanelinden bu konfigürasyonu seçip başlatın. Kod, gdbserver üzerinden bağlanacak ve breakpoint’lerinizde duracaktır. -
Menüden Terminal → Run Build Task ya da
Ctrl+Shift+P
DDS Katmanını Seçme
Paket Oluşturma ve Çalıştırma
-
Ortamı Hazırlama (Setup):
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc.bashrc# ROS 2 dağıtımını yükle source /opt/ros/humble/setup.bash # Colcon argcomplete ile otomatik tamamlama (tab ile paket/komut önerisi) source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bashNot
colcon buildkomutunu sisteme “eklemek” zorunlu değil; ancak argcomplete sayesinde paket adları ve düğüm isimleri tab tuşuyla tamamlanır. -
Bağımlılıkları Kurma (rosdep): Çalışma alanınızdaki paketlerin sistemdeki eksik kütüphane ve bağımlılıklarını otomatik kurmak için
--from-paths src→ yalnızca sizin src/ içindeki paketleri tarar.--ignore-src→ kaynak kodu değil, sistem paketlerini yükler.
-
Paket Oluşturma:
Not
Eğer
--node-nameparametresi verilmezse, sadece paket klasörü ve temel dosyalar (package.xml, CMakeLists.txt veya setup.py) oluşturulur.Lisans ve Diğer Optiyonlarros2 pkg create --build-type ament_cmake --node-name dstar_node --license Apache-2.0 --dependencies rclcpp std_msgs dstar_package--license→ otomatik olarak package.xml içine lisans etiketi ekler.--dependencies→ package.xml ve (C++) CMakeLists.txt dosyasına gerekli kütüphane tanımlamalarını ekler.
-
Derleme ve Paket Seçimi:
-
Çalışma Alanını Aktif Etme:
-
Düğümleri Çalıştırma ve Remap:
# Basit Çalıştırma ros2 run my_cpp_pkg my_node_executable ros2 run my_py_pkg my_python_node # Launch Dosyaları ros2 launch my_cpp_pkg my_launch_file.launch.py # Remapping (Yeniden Adlandırma) Node adını değiştirme: ros2 run demo_nodes_cpp talker --ros-args -r __node:=new_talker # Topic/Service adını değiştirme: ros2 run my_pkg talker --ros-args -r /old_topic:=/new_topic -r /old_service:=/my_serviceNot
-r kısa adıyla da kullanılabilir. Remap, aynı paketi birden çok kez farklı isimlerle çalıştırmanızı sağlar. -
Görselleştirme: RQT
Node
Her biri tek bir görevi (sensör okuma, kontrol komutu üretme, görüntü işleme vb.) yerine getiren bağımsız yürütülebilir bileşenlerdir. Dilediğiniz programlama dilinde (C++, Python, Rust…) yazabilirsiniz; ROS 2, bu düğümlerin haberleşmesini sağlar.
ros2 node list # Aktif tüm node'ları listeler
ros2 node info /[node_name] # Tek bir node hakkında ayrıntılı bilgi verir
Topic
Publish/Subscribe modeline dayalı, asenkron veri akış kanalıdır. Birden fazla publisher ve subscriber olabilir; gönderici beklemeksizin mesajını yayınlar.
| Mesaj Yayınlama (Publisher) | |
|---|---|
| Mesaj Türü İnceleme | |
|---|---|
Service (Hizmet)
Request–Response modeliyle çalışır: client, service’e istek (request) gönderir; server işlem yapıp cevap (response) döner. Senkron iletişim gerektiren durumlar için idealdir.
| Listeleme ve Tür | |
|---|---|
| Servis Çağrısı (Client) | |
|---|---|
| Servis Mesaj Şeması | |
|---|---|
Not
Çıktıda --- ile ayrılmış bölüm, request ve response alanlarını gösterir.
Action
Goal–Feedback–Result modeline sahip, uzun süreli işlemleri kontrol etmek için tasarlanmıştır. İptal edilebilir ve ara aşama bilgilerini (feedback) alabilirsiniz.
| Listeleme ve Bilgi | |
|---|---|
| Action Kullanımı | |
|---|---|
send_goalile istek gönderdikten sonra:- feedback ve result çıktıları otomatik gösterilir.
- İsterseniz
--feedbackve--resultbayraklarıyla ekstra kontroller yapabilirsiniz.
Launch
Birden fazla düğümü tek komutla başlatmanızı sağlayan Python tabanlı betiklerdir (.launch.py). Parametre aktarımı, remap, ns (namespace) oluşturma, koşullu başlatma gibi ileri düzey senaryoları destekler.
remappingsile topic veya node isimlerini çalışma zamanında değiştirebilirsiniz.parameterslistesiyle YAML yerine doğrudan Python dict kullanabilirsiniz.output='screen'veyaoutput='log'ile çıktının yönünü belirleyin.respawn=Trueparametresi ile node’un çöktüğünde otomatik yeniden başlatılmasını sağlayabilirsiniz.
Mesaj (.msg) ve Servis (.srv) Dosyaları
- İsimlendirme Kuralları: Dosya adı boşluk içermez; kelime ayrımı için PascalCase (her kelime büyük harfle başlar) tercih edilir
Position2D.msg, ComputePath.srv - Paket içindeki referanslarda alt çizgi (_) kullanılır
my_robot_interfaces/msg/Position2D.msg, my_robot_interfaces/srv/ComputePath.srv
Not
--- satırı, request ile response bölümlerini ayırır. Action dosyalarında --- ayracı iki kez kullanılır: Goal ile Result arası, Result ile Feedback arası
- Yeni Dosya Ekledikten Sonra
ros2 interface list # Tüm msg/srv/—action arayüzlerini listeler
ros2 interface packages # Arayüz tanımlı paketleri listeler
ros2 interface package my_pkg # Paketin içerdiği msg/srv/action dosyalarını gösterir
ros2 interface show my_robot_interfaces/Position2D # Belirli bir mesajın içeriğini gösterir
Parametreler
- Parametreler, bir node’un çalışma zamanındaki yapılandırma değerleridir (ör. hız sınırları, PID katsayıları, yol planlama seçenekleri).
- Türü: int, float, bool, string, list vb.
- Kod yeniden derlenmeden de runtime’da güncellenebilir.
| Temel Komutlar | |
|---|---|
my_node:
ros__parameters:
max_speed: 3.0
enabled: true
waypoints: [ [0,0], [1,1], [2,2] ]
# Aktif parametreleri dosyaya kaydet
ros2 param dump /my_node > params.yaml
# Dosyadan parametreleri yükle
ros2 param load /my_node params.yaml
Kayıt & Yeniden Oynatma (ros2 bag)
# Belirli bir topic’i kaydet
ros2 bag record /cmd_vel
# Tüm aktif topic’leri kaydet
ros2 bag record -a
# Belirli topic’lerin alt kümesini kaydet, dosya adı “subset” olsun
ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose
- Kayıt dosyaları:
YYYY_MM_DD_HH_MM_SSformatında klasör olarak oluşturulur. -o <isim>ile klasör adını belirleyebilirsiniz.
Ek İpuçları
export GZ_VERSION=garden
export GZ_SIM_RESOURCE_PATH=~/models:~/other_models
export GZ_SIM_SYSTEM_PLUGIN_PATH=~/build/plugins