10. ünite / 10 · yaklaşık 6 saat
ROS 2 temelleri ve systemd ile otomatik başlatma
Düğümler, konular, mesajlar, parametreler; twist_mux; robotun açılışta kendiliğinden başlaması.
Bu ünitenin sonunda
- ROS 2'de düğüm, konu, yayıncı ve abone kavramlarını kullanmak
- rclpy ile hedef izleyen bir düğüm yazmak ve parametreyle ayarlamak
- Birden fazla hız kaynağını twist_mux ile güvenle birleştirmek
- systemd birimiyle robot yazılımını açılışta başlatmak ve günlüğünü okumak
Ders notları
Robot yazılımı büyüdükçe tek bir main.py yönetilemez olur. ROS 2, yazılımı küçük süreçlere (düğüm) böler; düğümler adlandırılmış konular üzerinden tipli mesajlarla konuşur. Kamera düğümü /image_raw yayınlar, algılayıcı onu dinleyip /target yayınlar, izleyici /cmd_vel üretir, motor düğümü onu tekerleklere çevirir. Pi 5'te Ubuntu 24.04 ile ROS 2 Jazzy ya da Raspberry Pi OS üstünde Docker kullanılır.
Komutlar
ros2 node list,ros2 topic list,ros2 topic echo /cmd_vel,ros2 topic hz /image_raw.ros2 param set /follower k_turn 0.8: kodu değiştirmeden ayar.rqt_graph: düğüm ve konu grafiği.
Birden fazla sürücü: twist_mux
Hem web paneli hem otomatik izleyici /cmd_vel'e yazarsa motor iki komut arasında titrer. twist_mux her kaynağa öncelik verir: elle sürüş otomatiği bastırır, bir kaynak susarsa diğerine geçer.
systemd
Sahadaki robotta kimse terminal açıp betik başlatmaz. /etc/systemd/system/robot.service birimi yazılır, sudo systemctl daemon-reload ile okutulur, enable ile açılışa bağlanır, start ile başlatılır. Restart=on-failure çökünce yeniden başlatır; journalctl -u robot günlüğü gösterir.
Daha geniş bir ROS 2 ve simülasyon anlatımı için ESOF 323'ün 12. haftasına bak.
Simülasyonlar
ROS 2 düğüm ve konu grafiği
Keşif robotunun düğümlerini aç/kapat; rqt_graph benzeri grafik, ros2 topic list çıktısı ve sorunlar (yayıncısız abonelik, /cmd_vel'de iki yayıncı) anında güncellenir.
Çalışan düğümler:
Raspberry Pi OS terminali (benzetim)
Küçük bir sanal dosya sistemi üzerinde gerçek komutlar: ls, cd, cat, nano, chmod, sudo, apt, systemctl, journalctl, i2cdetect. Ağ, paket kurulumu ve ssh benzetimdir; hiçbir şey indirilmez. Görev listesi durumu denetleyerek işaretlenir.
Görevler · 0/4
- /etc/systemd/system/robot.service birim dosyasını yaz (sudo nano)
- systemd'ye yeni dosyayı okut (daemon-reload)
- Servisi açılışta başlayacak şekilde etkinleştir
- Servisi şimdi başlat ve durumunu kontrol et
Hızlı komutlar (dokun, Enter'a bas):
Kendin dene
ROS grafiğinde twist_mux'u kapat: /cmd_vel'de hangi sorun çıktı? Algılayıcıyı kapatınca izleyicinin hangi konuyu bekleyip boşta kaldığına bak. Terminalde systemd görevlerini bitir: sudo nano ile birimi yaz (şablon hazır), daemon-reload, enable, start, sonra systemctl status ve journalctl -u robot.
Kod
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist, Point
class Follower(Node):
def __init__(self):
super().__init__("follower")
self.declare_parameter("k_turn", 1.2) # ros2 param set ile değişir
self.pub = self.create_publisher(Twist, "/cmd_vel_auto", 10)
self.create_subscription(Point, "/target", self.on_target, 10)
self.last = self.get_clock().now()
self.create_timer(0.1, self.guard) # 10 Hz bekçi
def on_target(self, p: Point):
self.last = self.get_clock().now()
cmd = Twist()
cmd.linear.x = 0.15 if p.z > 0 else 0.0 # z: alan > 0 ise hedef var
cmd.angular.z = -self.get_parameter("k_turn").value * p.x # x: -1 sol ... +1 sağ
self.pub.publish(cmd)
def guard(self):
if (self.get_clock().now() - self.last).nanoseconds > 5e8:
self.pub.publish(Twist()) # 0,5 s hedef yok: dur
def main():
rclpy.init(); rclpy.spin(Follower()); rclpy.shutdown()# /etc/systemd/system/robot.service
[Unit]
Description=Exploration robot
After=network-online.target # ağ hazır olunca
Wants=network-online.target
[Service]
User=pi
WorkingDirectory=/home/pi/robot
Environment=ROBOT_TOKEN=change-me # ya da EnvironmentFile=/etc/robot.env
ExecStart=/home/pi/robot/.venv/bin/python main.py
Restart=on-failure
RestartSec=2
[Install]
WantedBy=multi-user.target # enable bu hedefe bağlarSık yapılan hatalar
- İki düğümün aynı /cmd_vel'e yazması: komutlar çakışır, robot titrer.
- Birim dosyasını değiştirip daemon-reload yapmamak: systemd eski sürümü çalıştırır.
- ExecStart'ta göreli yol kullanmak: systemd çalışma dizinini bilmez; mutlak yol yaz.
- QoS uyuşmazlığı: kamera "best effort", abone "reliable" isterse hiç mesaj gelmez.
Yazılım mühendisliği bağlantısı
ROS 2 düğümlerini de saf mantık + ince sarmalayıcı olarak yaz: karar fonksiyonu rclpy'siz test edilir.
ros2 launchdosyası sistemin yapılandırmasıdır: hangi düğümler, hangi parametreler. Sürüm denetiminde tutulur.- rosbag ile kaydedilen veri, hataları sahadan masaya taşır: aynı girdiyle yeniden oynatılır.
Kendini sına
ROS 2'de düğümler birbirine nasıl veri gönderir?
Web paneli ve otomatik izleyici aynı anda sürmek isterse ne kullanılır?
Yeni bir birim dosyası yazdıktan sonra ilk komut?
Robot yazılımı çökünce kendiliğinden yeniden başlaması için birimde ne yazılır?
Bu üniteden sonra bitirme projesinde
- Sistem ve demo: ROS 2 düğümleri ya da tek süreçli sürüm, systemd birimi, 3 dakikalık demo videosu ve rapor.
