Okullar için Robotik ve Mühendislik · anaokulundan liseye

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.

/cmd_vel/cmd_vel_auto/cmd_vel_teleop/image_raw/odom/target/camera_node/ball_detector/follower/teleop/twist_mux/motor_driver
$ ros2 topic list /cmd_vel /cmd_vel_auto /cmd_vel_teleop /image_raw /odom /parameter_events /rosout /target ! /odom: yayıncı var, dinleyen yok

Ç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.

Raspberry Pi OS benzetimi. "help" yaz.

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

rclpy: hedefi izleyen düğüm
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()
systemd birimi: açılışta başla, çökerse yeniden başla
# /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ğlar

Sı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 launch dosyası 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

  1. ROS 2'de düğümler birbirine nasıl veri gönderir?

  2. Web paneli ve otomatik izleyici aynı anda sürmek isterse ne kullanılır?

  3. Yeni bir birim dosyası yazdıktan sonra ilk komut?

  4. 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.

Gerçek parçalar (Hyvex, 3B modelli)

ESOF 323, 12. hafta

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç