📌 Hızlı Özet & Temel Çıkarım:
İnsansız Deniz Araçlarında (USV) ROS 2 Humble mimarisi, sensör verilerinin deterministik olarak işlenmesi, itki sistemlerinin gerçek zamanlı denetimi ve zorlu deniz koşullarında düğümler arası kesintisiz telemetri akışı için endüstri standardı bir omurgadır. ROS 2’nin sunduğu Veri Dağıtım Hizmeti (DDS) Katmanı ve özel Hizmet Kalitesi (QoS) profilleri sayesinde, paket kaybının yüksek olduğu kablosuz deniz ortamlarında bile güvenli seyrüsefer komutları kayıpsız iletilir.


1. Deniz Ortamında Otonom Sistemlerin Temel Zorlukları

Otonom kara veya hava araçlarıyla karşılaştırıldığında insansız deniz araçları (Unmanned Surface Vehicles - USV), çok daha dinamik ve öngörülemez bir ortamda görev icra eder. Dalga hareketleri, akıntılar, rüzgar sürüklenmesi ve tuzlu suyun sebep olduğu radyo frekansı sönümlemeleri, yazılım katmanında son derece esnek bir mimari gerektirir.

Pusula USV gibi yarışma ve saha araçlarında ana hedefimiz; gövde üzerindeki LiDAR, GPS, IMU ve kameralardan gelen yüksek frekanslı ham veriyi minimal gecikmeyle işlemek, rota planlama algoritmalarına beslemek ve motor sürücülerine hassas PWM komutları göndermektir.

Geleneksel ROS 1 mimarisi tek bir merkezi roscore ustasına (master) bağımlı olduğu için, ağ bağlantısının anlık koptuğu deniz operasyonlarında tüm sistemin kilitlenmesine yol açabiliyordu. ROS 2, merkezsiz DDS (Data Distribution Service) altyapısıyla bu tek arıza noktasını (single point of failure) tamamen ortadan kaldırmıştır.


2. Düğümler Arası Mimari ve QoS (Quality of Service) Profilleri

ROS 2’de her donanım bileşeni izole bir Node olarak çalışır. Ancak her sensörün veri tipi ve ağ gereksinimi aynı değildir:

  1. Sensör Verileri (IMU, Odometri): Sürekli yüksek frekansta (50-100 Hz) akar. Tek bir paketin kaybolması kritik değildir, önemli olan en güncel verinin hemen ulaşmasıdır (Best Effort QoS).
  2. Kritik Kontrol Komutları (E-Stop, Rota Değişimi): Mutlaka yerine ulaşmalı ve onaylanmalıdır (Reliable QoS).
  3. Harita ve Durum Bilgileri: Yeni bağlanan bir düğüme sistemin son durumunu aktarmalıdır (Transient Local Durability).

Aşağıdaki C++ kod örneği, USV itki motorlarına komut gönderen güvenilir bir ROS 2 Lifecycle düğümünü göstermektedir:

#include "rclcpp/rclcpp.hpp"
#include "rclcpp_lifecycle/lifecycle_node.hpp"
#include "geometry_msgs/msg/twist.hpp"

class ThrusterControllerNode : public rclcpp_lifecycle::LifecycleNode {
public:
  explicit ThrusterControllerNode(const rclcpp::NodeOptions & options)
  : LifecycleNode("thruster_controller", options) {}

  rclcpp_lifecycle::node_interfaces::LifeCycleNodeInterface::CallbackReturn
  on_configure(const rclcpp_lifecycle::State &) override {
    // Güvenilir iletim için özel QoS profili:
    rclcpp::QoS qos_profile(rclcpp::KeepLast(10));
    qos_profile.reliable();
    qos_profile.durability_volatile();

    cmd_sub_ = this->create_subscription<geometry_msgs::msg::Twist>(
      "/usv/cmd_vel", qos_profile,
      [this](geometry_msgs::msg::Twist::UniquePtr msg) {
        process_thrust_command(msg->linear.x, msg->angular.z);
      });

    RCLCPP_INFO(get_logger(), "Motor kontrol duzeyi basariyla yapilandirildi.");
    return rclcpp_lifecycle::node_interfaces::LifeCycleNodeInterface::CallbackReturn::SUCCESS;
  }

private:
  void process_thrust_command(double linear_x, double angular_z) {
    // Diferansiyel itki hesaplama algoritmasi:
    double left_motor = linear_x - (angular_z * 0.5);
    double right_motor = linear_x + (angular_z * 0.5);
    // Donanim surucusune CAN bus veya seri port uzerinden gonderim...
  }

  rclcpp::Subscription<geometry_msgs::msg::Twist>::SharedPtr cmd_sub_;
};

Bu yapı sayesinde düğümün yaşam döngüsü (unconfigured, inactive, active, finalized) işletim sistemi tarafından tam kontrol altında tutulur. Donanım başlatılmadan motorlara sinyal gitmesi engellenir.


3. Mikrodenetleyici ve Donanım Katmanı: Micro-ROS

Gemi gövdesindeki motor sürücüler, batarya yönetim sistemleri (BMS) ve röle modülleri genellikle STM32 veya Teensy gibi gerçek zamanlı mikrodenetleyiciler tarafından yönetilir. ROS 2 dünyasında bu donanımlarla konuşmanın en modern yolu Micro-ROS kullanmaktır.

Geleneksel rosserial’in aksine micro-ROS, doğrudan FreeRTOS veya Zephyr üzerinde çalışır ve XRCE-DDS istemcisi vasıtasıyla ana işlemciye (örneğin NVIDIA Jetson Orin veya Raspberry Pi) UDP ya da yüksek hızlı UART üzerinden bağlanır. Böylece mikrodenetleyici de ROS 2 grafında tam yetkili bir düğüm olarak görünür.


4. Gerçek Zamanlı Linux Çekirdeği (PREEMPT_RT) Optimizasyonu

Deniz taşıtlarında PID veya Model Predictive Control (MPC) döngülerinin tam zamanında (jitter olmadan) çalışması gerekir. Standart bir Linux çekirdeğinde arka plan işlemleri motor kontrol döngüsünü 5-10 milisaniye geciktirebilir; bu da aracın dalgalı denizde rotasından sapmasına sebep olur.

Bu sorunu çözmek için Ubuntu LTS dağıtımına PREEMPT_RT çekirdek yaması uygulanmalıdır. Çekirdeğin gerçek zamanlı hale getirilmesiyle birlikte döngü gecikmeleri 50 mikrosaniyenin altına düşer.


5. İlgili Konular ve İç Bağlantılar


6. Sıkça Sorulan Sorular

ROS 2 Humble sürümü neden deniz robotik projelerinde tercih ediliyor?

ROS 2 Humble Hawksbill, Mayıs 2027’ye kadar Uzun Vadeli Destek (LTS) alan en kararlı sürümdür. Ubuntu 22.04 LTS ile yerel uyumu ve endüstriyel DDS sağlayıcıları (CycloneDDS, FastDDS) üzerindeki test derinliği, yarışma ve saha araçları için en güvenilir zemini sunar.

USV’de Wi-Fi menzili bittiğinde telemetri nasıl korunur?

Ana telemetri hattı koptuğunda sistem RF LoRa veya 4G/LTE hücresel modeme dinamik olarak geçer. Düğümler transient local tamponlaması sayesinde bağlantı tekrar sağlandığında kaçırılan son kritik durumları ana yer istasyonuna iletir.

7. Pusula USV Teknofest & Njord Saha Deneyimleri ve Kritik Hata Senaryoları

Teknofest ve uluslararası Njord Challenge yarışmalarında otonom deniz araçlarının karşılaştığı en sinsi problem, yüksek güçlü fırçasız itki motorlarının (brushless thrusters) yaydığı elektromanyetik parazitlerdir (EMI). Motor kabloları üzerinden geçen 60-80 Amperlik anlık akım dalgalanmaları, motor sürücü sinyal hatlarını ve ana gövdeye yakın monte edilmiş manyetik pusulaları bozar.

Bu problem sahada şu üç kritik mühendislik önlemiyle çözülmüştür:

  1. Optik İzolasyon ve Diferansiyel İletişim: Ana Jetson bilgisayarı ile motor sürücüleri arasına optokuplörlü izolatör kartları yerleştirilmiş, standart tek uçlu UART hatları yerine gürültüye dayanıklı RS-485 veya CAN Bus diferansiyel sinyalleşme protokolü devreye alınmıştır.
  2. Yazılımsal CAN Bus İskeleti (SocketCAN): Linux çekirdeğinin SocketCAN sürücüsü ile ROS 2 ros2_control yığını entegre edilmiştir. Aşağıdaki C++ kod parçacığı, motor sürücülerine doğrudan mikrosaniye hassasiyetinde CAN çerçevesi gönderen gerçek zamanlı döngüyü temsil eder:
#include <linux/can.h>
#include <linux/can/raw.h>
#include <sys/socket.h>

int init_can_interface(const char* ifname) {
    int s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
    struct ifreq ifr;
    strcpy(ifr.ifr_name, ifname);
    ioctl(s, SIOCGIFINDEX, &ifr);

    struct sockaddr_can addr;
    memset(&addr, 0, sizeof(addr));
    addr.can_family = AF_CAN;
    addr.can_ifindex = ifr.ifr_ifindex;
    bind(s, (struct sockaddr *)&addr, sizeof(addr));
    return s;
}

void send_thruster_speed(int socket_fd, uint32_t motor_id, int16_t rpm) {
    struct can_frame frame;
    frame.can_id = motor_id;
    frame.can_dlc = 2;
    frame.data[0] = static_cast<uint8_t>(rpm & 0xFF);
    frame.data[1] = static_cast<uint8_t>((rpm >> 8) & 0xFF);
    write(socket_fd, &frame, sizeof(struct can_frame));
}
  1. DDS Bellek Havuzlarının Statik Tahsisi: Linux dinamik bellek yöneticisi (malloc) çalışma anında sayfa kilitlemesi yaşayabilir. CycloneDDS yapılandırmasında ZeroCopy ve shm (paylaşımlı bellek) mekanizmaları aktif edilerek, 100 Hz’lik sensör akışının CPU’yu ısıtmadan düğümler arasında doğrudan RAM üzerinden paylaşılması sağlanmıştır.