Gazebo Simülasyonu

Robot ve otonom sistemler için 3D simülasyon platformu

roslaunch gazebo_ros empty_world.launch

Gazebo Nedir?

Gazebo, robotik uygulamalar için kullanılan açık kaynak kodlu, 3D robot simülatörüdür. ROS (Robot Operating System) ile mükemmel entegrasyona sahiptir ve gerçekçi fizik simülasyonu sunar.

Gazebo'nun Temel Özellikleri:
  • • Yüksek kaliteli grafik ve render motoru (OGRE)
  • • Gerçekçi fizik simülasyonu (ODE, Bullet, Simbody, DART)
  • • Çeşitli sensör simülasyonu (LIDAR, kamera, IMU, GPS)
  • • ROS/ROS2 ile tam entegrasyon
  • • Plugin sistemi ile genişletilebilirlik
  • • Dinamik ortam simülasyonu
Tarihçe ve Gelişim
Gazebo, 2002'de USC Robotics Research Lab'da başlatıldı. 2012'de Willow Garage tarafından popülerleştirildi. Şu anda Open Robotics tarafından sürdürülmektedir.

Gazebo Classic (Gazebo 11): Geleneksel versiyon
Ignition Gazebo (Gazebo Sim): Yeni nesil, modüler mimari

Kullanım Alanları:

Otonom Araçlar: Sürücüsüz otomobil testleri
Drone Simülasyonu: UAV kontrol algoritmaları
Endüstriyel Robotlar: Manipülatör programlama
Mobil Robotlar: Navigasyon ve SLAM
İnsansı Robotlar: Yürüme ve denge kontrol
Uzay Robotları: Mars rover simülasyonu
Neden Simülasyon? Gerçek robotlarla test yapmak pahalı, tehlikeli ve zaman alıcıdır. Gazebo ile algoritmaları güvenli ortamda test edip optimize edebilirsiniz!

Kurulum ve Başlangıç

Ubuntu'da Kurulum:

# ROS Noetic ile Gazebo 11 kurulumu
sudo apt update
sudo apt install ros-noetic-gazebo-ros-pkgs
sudo apt install ros-noetic-gazebo-ros-control

# Standalone Gazebo kurulumu
sudo apt install gazebo11
sudo apt install libgazebo11-dev

Gazebo'yu Başlatma:

# Gazebo'yu tek başına çalıştır
gazebo

# ROS ile boş dünya
roslaunch gazebo_ros empty_world.launch

# GUI olmadan (headless)
roslaunch gazebo_ros empty_world.launch gui:=false

# Belirli bir world dosyası ile
roslaunch gazebo_ros willowgarage_world.launch
Gazebo Arayüz Bileşenleri:
• Scene: 3D görselleştirme alanı
• World: Üstteki menü çubuğu
• Insert: Model ekleme paneli
• Layers: Katman görünürlük kontrolü
• Timeline: Simülasyon zaman kontrolü
Temel Kısayollar
Spacebar: Simülasyonu duraklat/devam ettir
Ctrl + R: Simülasyonu sıfırla
T: Obje çevirme modu
R: Obje döndürme modu
S: Obje ölçekleme modu
Delete: Seçili objeyi sil
Performans İpuçları: Gazebo grafik yoğun bir uygulamadır. GPU sürücülerinizin güncel olduğundan emin olun. Sanal makinede çalıştırıyorsanız 3D hızlandırma açık olmalıdır!

Temel Kavramlar

World (Dünya):

World, tüm simülasyon ortamını tanımlar: modeller, fizik motorları, aydınlatma, hava durumu gibi.

World Bileşenleri:
• Physics: Fizik motoru ayarları (gravity, step size)
• Scene: Görsel ayarlar (ambient, sky, shadows)
• Models: Dünyada bulunan tüm objeler
• Lights: Işık kaynakları
• Plugins: Dünya seviyesi eklentiler

Model:

Model = Link'lerin + Joint'lerin koleksiyonu

Link: Rijit cisim (mass, inertia, collision, visual)
Joint: Link'leri birbirine bağlayan eklem
Sensor: Sensör elemanları
Plugin: Davranış tanımları
Model Hiyerarşisi
robot_model/
├── base_link (ana gövde)
│ ├── collision (çarpışma geometrisi)
│ ├── visual (görsel geometri)
│ └── inertial (kütle özellikleri)
├── wheel_left_joint
├── wheel_left_link
├── wheel_right_joint
└── wheel_right_link

Link Özellikleri:

Inertial: Kütle ve atalet tensörü
Collision: Fiziksel çarpışma için geometri
Visual: Görüntüleme için geometri (mesh/primitive)
Sensor: Link'e bağlı sensörler

Joint Tipleri:

revolute: Tek eksen döner joint (motor, tekerlek)
continuous: Limitsiz döner joint
prismatic: Doğrusal hareket (piston)
fixed: Sabit bağlantı
floating: 6 DOF serbest hareket
ball: Top joint (3 DOF rotasyon)
Collision vs Visual: Collision basit tutulmalı (performans). Visual detaylı olabilir (görsellik). Örnek: Collision için kutu, visual için detaylı mesh.

World Dosyaları Oluşturma

World dosyaları .world uzantılı XML formatında SDF (Simulation Description Format) kullanır.

Basit World Örneği:

<?xml version="1.0" ?>
<sdf version="1.6">
  <world name="my_world">
    <!-- Yer çekimi -->
    <physics type="ode">
      <gravity>0 0 -9.81</gravity>
    </physics>

    <!-- Güneş ışığı -->
    <include>
      <uri>model://sun</uri>
    </include>

    <!-- Zemin düzlemi -->
    <include>
      <uri>model://ground_plane</uri>
    </include>
  </world>
</sdf>

Fizik Motor Ayarları:

Önemli Parametreler:
• max_step_size: Simülasyon adım boyutu (default: 0.001s)
• real_time_factor: Hedef hız çarpanı (1.0 = gerçek zaman)
• real_time_update_rate: Güncelleme frekansı (Hz)
• max_contacts: Maksimum temas noktası sayısı
<physics type="ode">
  <max_step_size>0.001</max_step_size>
  <real_time_factor>1.0</real_time_factor>
  <real_time_update_rate>1000</real_time_update_rate>
  <gravity>0 0 -9.81</gravity>
</physics>
Sahne Aydınlatma
Ambient: Genel ortam ışığı
Directional: Güneş gibi yönlü ışık
Point: Ampul gibi nokta ışık
Spot: Spot ışık (koni şeklinde)

Gölgeler render performansını etkiler, gerekmedikçe kapatın!
Performans Dengesi: max_step_size küçülürse doğruluk artar ama CPU kullanımı artar. Robotik uygulamalar için 0.001s genelde yeterlidir.

Model Oluşturma

Basit Model Yapısı:

Gazebo modelleri belirli bir dizin yapısına sahiptir:

my_robot/
├── model.config # Model metadata
├── model.sdf # Model tanımı
└── meshes/ # 3D mesh dosyaları
    ├── chassis.dae
    └── wheel.dae

model.config Örneği:

<model>
  <name>My Robot</name>
  <version>1.0</version>
  <sdf version="1.6">model.sdf</sdf>
  <author>
    <name>Your Name</name>
    <email>you@email.com</email>
  </author>
  <description>
    A simple mobile robot
  </description>
</model>

Basit Kutu Model:

<model name="box">
  <static>false</static>
  <link name="link">
    <inertial>
      <mass>1.0</mass>
    </inertial>
    <collision name="collision">
      <geometry>
        <box>
          <size>1 1 1</size>
        </box>
      </geometry>
    </collision>
    <visual name="visual">
      <geometry>
        <box>
          <size>1 1 1</size>
        </box>
      </geometry>
    </visual>
  </link>
</model>
Model Yolu: Modelleri ~/.gazebo/models/ veya GAZEBO_MODEL_PATH içindeki dizinlere koyun. Gazebo otomatik bulacaktır!
Geometri Tipleri
Primitive: box, sphere, cylinder, plane
Mesh: .dae (COLLADA), .stl, .obj dosyaları
Heightmap: Arazi yüzeyler için
Polyline: Çizgi tanımları

Mesh'ler detaylı ama yavaş, primitive'ler hızlıdır!

URDF ve SDF Formatları

URDF (Unified Robot Description Format):

URDF, ROS'ta robot tanımlamak için kullanılan XML formatıdır. Gazebo URDF dosyalarını okuyabilir.

URDF vs SDF:
URDF: ROS odaklı, tree yapısı, kinematik zincirler
SDF: Gazebo native, kapalı döngüler, daha esnek

ROS projeleri genelde URDF kullanır, Gazebo otomatik SDF'ye çevirir.

Basit URDF Örneği:

<robot name="my_robot">
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.5 0.3 0.2"/>
      </geometry>
      <material name="blue">
        <color rgba="0 0 0.8 1"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <box size="0.5 0.3 0.2"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="5.0"/>
      <inertia ixx="0.1" iyy="0.1" izz="0.1"
              ixy="0" ixz="0" iyz="0"/>
    </inertial>
  </link>
</robot>

Gazebo Etiketi (URDF içinde):

<gazebo reference="base_link">
  <material>Gazebo/Blue</material>
  <mu1>0.5</mu1> <!-- Sürtünme -->
  <mu2>0.5</mu2>
</gazebo>
URDF Araçları
check_urdf: URDF sözdizimi kontrolü
urdf_to_graphiz: Robot yapısı görselleştirme
gz sdf: URDF'yi SDF'ye dönüştürme

check_urdf my_robot.urdf
gz sdf -p my_robot.urdf > my_robot.sdf
Atalet Tensörü Önemli: Yanlış atalet değerleri robotun simülasyonda anormal davranmasına yol açar. Her link için doğru hesaplayın veya CAD yazılımından alın!
Xacro Kullanın: Tekrarlayan URDF kodu için xacro (XML Macros) kullanın. Parametrik robot tanımları yapabilirsiniz!

Plugin Geliştirme

Plugin'ler, Gazebo'ya özel davranışlar ekler. C++ ile yazılır ve çalışma zamanında yüklenir.

Plugin Tipleri:

World Plugin: Dünya seviyesi davranışlar
Model Plugin: Belirli modele özel
Sensor Plugin: Sensör verileri işleme
Visual Plugin: Görsel efektler
GUI Plugin: Arayüz eklentileri
System Plugin: Gazebo çekirdeği eklentileri

Basit Model Plugin Örneği:

// simple_plugin.cpp
#include <gazebo/gazebo.hh>
#include <gazebo/physics/physics.hh>

namespace gazebo {
class SimplePlugin : public ModelPlugin {
public:
  void Load(physics::ModelPtr model,
            sdf::ElementPtr sdf) {
    this->model = model;
    gzwarn << "Plugin loaded!" << std::endl;
  }
private:
  physics::ModelPtr model;
};
GZ_REGISTER_MODEL_PLUGIN(SimplePlugin)
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)
project(simple_plugin)

find_package(gazebo REQUIRED)
include_directories(${GAZEBO_INCLUDE_DIRS})
link_directories(${GAZEBO_LIBRARY_DIRS})

add_library(simple_plugin SHARED simple_plugin.cpp)
target_link_libraries(simple_plugin ${GAZEBO_LIBRARIES})

Plugin'i Model'e Ekleme:

<model name="my_robot">
  <!-- links and joints -->
  <plugin name="simple_plugin" filename="libsimple_plugin.so">
    <!-- Plugin parametreleri -->
  </plugin>
</model>
Popüler Hazır Plugin'ler
libgazebo_ros_diff_drive.so: Diferansiyel sürüş
libgazebo_ros_camera.so: Kamera sensörü
libgazebo_ros_laser.so: LIDAR sensörü
libgazebo_ros_imu.so: IMU sensörü
libgazebo_ros_p3d.so: 3D konum ground truth
libgazebo_ros_force.so: Kuvvet uygulama
Update Callback: Plugin'inizde UpdateCallback fonksiyonu ekleyerek her simülasyon adımında kod çalıştırabilirsiniz. updateConnection ile bağlayın!

ROS Entegrasyonu

Gazebo ve ROS mükemmel entegrasyon sunar. gazebo_ros_pkgs ile robotlar ROS topic'leri üzerinden kontrol edilebilir.

ROS ile Başlatma:

# Launch dosyası: my_robot.launch
<launch>
  <!-- Gazebo'yu başlat -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find my_pkg)/worlds/my_world.world"/>
    <arg name="paused" value="false"/>
  </include>

  <!-- Robot URDF'yi yükle -->
  <param name="robot_description"
         command="$(find xacro)/xacro '$(find my_pkg)/urdf/robot.xacro'"/>

  <!-- Gazebo'ya spawn et -->
  <node name="spawn_urdf" pkg="gazebo_ros"
        type="spawn_model"
        args="-urdf -model my_robot -param robot_description"/>
</launch>

Diferansiyel Sürüş Kontrolü:

<gazebo>
  <plugin name="differential_drive_controller"
          filename="libgazebo_ros_diff_drive.so">
    <leftJoint>left_wheel_joint</leftJoint>
    <rightJoint>right_wheel_joint</rightJoint>
    <wheelSeparation>0.4</wheelSeparation>
    <wheelDiameter>0.1</wheelDiameter>
    <commandTopic>cmd_vel</commandTopic>
    <odometryTopic>odom</odometryTopic>
    <odometryFrame>odom</odometryFrame>
    <robotBaseFrame>base_link</robotBaseFrame>
  </plugin>
</gazebo>

Robot Kontrol (Python):

#!/usr/bin/env python3
import rospy
from geometry_msgs.msg import Twist

rospy.init_node('robot_controller')
pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10)
rate = rospy.Rate(10)

while not rospy.is_shutdown():
    cmd = Twist()
    cmd.linear.x = 0.5 # İleri git
    cmd.angular.z = 0.2 # Dön
    pub.publish(cmd)
    rate.sleep()
ROS Topic'leri:
• /cmd_vel: Hız komutları (Twist)
• /odom: Odometri verisi
• /joint_states: Joint pozisyonları
• /scan: LIDAR verisi
• /camera/image_raw: Kamera görüntüsü
• /imu: IMU ölçümleri
ROS Araçları
rostopic list - Tüm topic'leri listele
rostopic echo /scan - Topic verisini göster
rosrun rqt_graph rqt_graph - Node grafiği
rosrun rviz rviz - 3D görselleştirme
rosservice call /gazebo/reset_world "{}" - Dünyayı sıfırla
Gazebo + RViz: Gazebo fizik simülasyonu, RViz sensör verisi görselleştirmesi için kullanın. İkisini birlikte çalıştırarak en iyi deneyimi elde edersiniz!

Sensör Simülasyonu

LIDAR (Laser Scanner):

<gazebo reference="lidar_link">
  <sensor type="ray" name="lidar">
    <pose>0 0 0 0 0 0</pose>
    <visualize>true</visualize>
    <update_rate>10</update_rate>
    <ray>
      <scan>
        <horizontal>
          <samples>360</samples>
          <resolution>1</resolution>
          <min_angle>-3.14</min_angle>
          <max_angle>3.14</max_angle           <max_angle>3.14</max_angle>
        </horizontal>
      </scan>
      <range>
        <min>0.1</min>
        <max>10.0</max>
      </range>
    </ray>
    <plugin name="gazebo_ros_laser"
            filename="libgazebo_ros_laser.so">
      <topicName>/scan</topicName>
      <frameName>lidar_link</frameName>
    </plugin>
  </sensor>
</gazebo>

Kamera Sensörü:

<gazebo reference="camera_link">
  <sensor type="camera" name="camera1">
    <update_rate>30.0</update_rate>
    <camera name="head">
      <horizontal_fov>1.3962634</horizontal_fov>
      <image>
        <width>640</width>
        <height>480</height>
        <format>R8G8B8</format>
      </image>
      <clip>
        <near>0.02</near>
        <far>300</far>
      </clip>
    </camera>
    <plugin name="camera_controller"
            filename="libgazebo_ros_camera.so">
      <cameraName>camera</cameraName>
      <imageTopicName>image_raw</imageTopicName>
    </plugin>
  </sensor>
</gazebo>
Desteklenen Sensörler:
• Camera: RGB kamera
• Depth Camera: Derinlik kamera (Kinect benzeri)
• Ray: LIDAR/Laser scanner
• IMU: İvme ve açısal hız
• GPS: Global konum
• Contact: Temas sensörü
• Force/Torque: Kuvvet ölçümü
IMU Sensörü
IMU (Inertial Measurement Unit) robotun ivme ve dönüş hızını ölçer. SLAM ve navigasyon için kritiktir.

Plugin: libgazebo_ros_imu.so
Topic: /imu/data (sensor_msgs/Imu)
İçerik: orientation, angular_velocity, linear_acceleration
Sensör Gürültüsü: Gerçek sensörler gürültülüdür! Gazebo'da <noise> etiketi ile Gaussian gürültü ekleyin. Bu algoritmaları daha robust yapar.

Fizik Motorları

Gazebo farklı fizik motorlarını destekler. Her birinin avantajları ve dezavantajları vardır.

Mevcut Fizik Motorları:

ODE (Open Dynamics Engine): Default, hızlı, kararlı
Bullet: Oyun motoru, performanslı
Simbody: Biyomekanik simülasyon, doğru
DART: İleri dinamik, optimal kontrol

Fizik Motoru Seçimi:

<physics type="ode"> <!-- veya bullet, simbody, dart -->
  <max_step_size>0.001</max_step_size>
  <real_time_factor>1.0</real_time_factor>
  <ode>
    <solver>
      <type>quick</type> <!-- veya world -->
      <iters>50</iters>
    </solver>
  </ode>
</physics>
Motor Karşılaştırma
ODE: ✓ Hızlı ✓ Kararlı ✗ Orta doğruluk
Bullet: ✓ Çok hızlı ✓ Çoklu çarpışma ✗ Bazen kararsız
Simbody: ✓ Çok doğru ✓ Kompleks kinematik ✗ Yavaş
DART: ✓ İleri dinamik ✓ Gradyan hesaplama ✗ Karmaşık

Çarpışma Parametreleri:

<collision name="collision">
  <surface>
    <friction>
      <ode>
        <mu>1.0</mu> <!-- Sürtünme katsayısı -->
        <mu2>1.0</mu2>
      </ode>
    </friction>
    <bounce>
      <restitution_coefficient>0.5</restitution_coefficient>
    </bounce>
    <contact>
      <ode>
        <kp>1000000.0</kp> <!-- Sertlik -->
        <kd>1.0</kd> <!-- Sönümleme -->
      </ode>
    </contact>
  </surface>
</collision>
Performans vs Doğruluk: max_step_size küçülürse doğruluk artar ama FPS düşer. Karmaşık sahneler için fizik motoru ve parametreleri optimize edin!

İleri Konular

Gazebo API (C++):

Gazebo'yu programatik olarak kontrol edebilirsiniz:

#include <gazebo/transport/transport.hh>
#include <gazebo/msgs/msgs.hh>

// Gazebo node oluştur
gazebo::transport::NodePtr node(
    new gazebo::transport::Node());
node->Init();

// Publisher oluştur
gazebo::transport::PublisherPtr pub =
    node->Advertise<gazebo::msgs::Factory>(
        "~/factory");

// Model spawn et
gazebo::msgs::Factory msg;
msg.set_sdf_filename("model://box");
pub->Publish(msg);

Gazebo Services:

/gazebo/spawn_urdf_model - URDF model spawn
/gazebo/spawn_sdf_model - SDF model spawn
/gazebo/delete_model - Model sil
/gazebo/get_model_state - Model durumu al
/gazebo/set_model_state - Model durumu ayarla
/gazebo/pause_physics - Fiziği duraklat
/gazebo/unpause_physics - Fiziği devam ettir

Paralel Simülasyon:

Çoklu robotları aynı anda test etmek için paralel Gazebo instance'ları çalıştırabilirsiniz:

GAZEBO_MASTER_URI=http://localhost:11345 roslaunch ...
GAZEBO_MASTER_URI=http://localhost:11346 roslaunch ...
Gazebo Fortress (Ignition)
Yeni Nesil Gazebo: Modüler mimari, daha iyi performans
Distributed Simulation: Dağıtık simülasyon desteği
Modern Render: OGRE 2.x, PBR materyaller
Geliştirilmiş Sensörler: Thermal, segmentation camera

Yeni projeler için Ignition Gazebo kullanın!
Docker ile Gazebo: Karmaşık kurulumlardan kaçının! Docker container'ında Gazebo+ROS çalıştırın. osrf/ros:noetic-desktop-full image'ı kullanabilirsiniz.

Gazebo'da Uzmanlaşın

Gazebo, robotik geliştirme için vazgeçilmez bir araçtır. Gerçek dünya testleri öncesi güvenli ortamda iterasyon yapmanızı sağlar.

Öğrenme Yol Haritası
Başlangıç: Boş world, basit modeller ekle
Temel: URDF robot tanımla, Gazebo'ya spawn et
Orta: Sensörler ekle, ROS ile kontrol et
İleri: Plugin yaz, karmaşık ortamlar oluştur
Uzman: Multi-robot, dağıtık simülasyon, CI/CD entegrasyonu
Pratik Projeler:
• Mobil robot navigasyonu (SLAM + path planning)
• Manipülatör kontrolü (pick and place)
• Drone swarm simülasyonu
• Otonom araç sürüşü (lane following)
• İnsansı robot yürüme kontrolü
• Multi-robot koordinasyonu
Sim-to-Real Transfer: Simülasyonda başarılı algoritma gerçekte başarısız olabilir! Sensör gürültüsü, gecikme, model hataları ekleyin. Robust algoritmaları simülasyonda test edin.

simulation → reality

Robot simülasyonunun gücünü öğrendiniz!

Kaynaklar ve Topluluk
Resmi Dokümantasyon: http://gazebosim.org/tutorials
Gazebo Answers: https://answers.gazebosim.org
ROS Wiki: http://wiki.ros.org/gazebo_ros_pkgs
GitHub: https://github.com/osrf/gazebo
Community: Gazebo Slack, ROS Discourse

Model Database: https://app.gazebosim.org/fuel/models
Başarı Formülü:
• Basit başlayın, karmaşık olana ilerleyin
• Örnek projeleri inceleyin ve modifiye edin
• Fizik parametrelerini anlamaya çalışın
• ROS topluluğuna katılın ve soru sorun
• Gerçek robot varsa sim-to-real transfer pratiği yapın