RViz - 3D Robot Görselleştirme

ROS (Robot Operating System) için Güçlü Görselleştirme Aracı

RViz Nedir?

RViz (ROS Visualization), ROS (Robot Operating System) ekosisteminde robot sensör verilerini, robot modellerini ve diğer robotik bilgileri 3D ortamda görselleştirmek için kullanılan açık kaynaklı bir araçtır. Robotik geliştirme sürecinde vazgeçilmez bir araçtır.

3D Görselleştirme

Gerçek zamanlı 3D render

Sensör Verileri

LaserScan, PointCloud

Robot Modeli

URDF/Xacro desteği

Navigasyon

Path, map, goals

RViz'in Temel Özellikleri:
• Çoklu display türü desteği (LaserScan, PointCloud, Camera, vb.)
• TF (Transform) ağacı görselleştirme
• Interactive marker ile kullanıcı etkileşimi
• Config dosyaları ile ayarları kaydetme
• Plugin sistemi ile genişletilebilirlik
• ROS Topic, Service ve Action entegrasyonu
RViz Versiyonları
RViz (ROS 1): Qt tabanlı, C++ ile yazılmış klasik sürüm
RViz2 (ROS 2): ROS 2 için yeniden yazılmış, modern mimari

Her iki versiyon da aktif olarak geliştirilmekte ve benzer özellikler sunmaktadır.

Kurulum ve Başlangıç

RViz, ROS dağıtımları ile birlikte gelir. Eğer ROS kuruluysa, RViz genellikle zaten yüklüdür.

ROS Noetic (Ubuntu 20.04) için:

# ROS Noetic tam kurulum (RViz dahil) sudo apt update sudo apt install ros-noetic-desktop-full # Sadece RViz kurulumu sudo apt install ros-noetic-rviz

ROS 2 Humble (Ubuntu 22.04) için:

# ROS 2 Humble tam kurulum sudo apt update sudo apt install ros-humble-desktop # Sadece RViz2 kurulumu sudo apt install ros-humble-rviz2

RViz'i Başlatma:

# ROS 1 için roscore # Başka bir terminalde rosrun rviz rviz # veya direkt rviz # ROS 2 için rviz2
İlk Çalıştırma Kontrol Listesi:
✓ ROS ortam değişkenleri yüklü mü? (source /opt/ros/noetic/setup.bash)
✓ roscore çalışıyor mu? (ROS 1 için)
✓ Grafik sürücüleri düzgün çalışıyor mu?
✓ 3D hızlandırma aktif mi?
Hızlı Başlangıç: RViz'i ilk kez açtığınızda boş bir sahne göreceksiniz. Sol panelden "Add" butonuna tıklayarak display ekleyebilirsiniz. İlk olarak "RobotModel" veya "TF" eklemek iyi bir başlangıçtır.

Arayüz ve Temel Kullanım

RViz arayüzü kullanıcı dostu ve modüler bir yapıya sahiptir. Ana bileşenler:

3D Viewport

Ana görselleştirme alanı

Displays Panel

Display listesi ve ayarları

Views Panel

Kamera kontrolleri

Time Panel

Zaman bilgisi ve kontrol

Temel Kontroller:

Mouse Kontrolleri
Sol Tıklama + Sürükle: Kamerayı döndür (Orbit)
Orta Tıklama + Sürükle: Kamerayı kaydır (Pan)
Sağ Tıklama + Sürükle: Zoom in/out
Scroll: Zoom in/out (alternatif)
Shift + Sol Tıklama: Odak noktası seç

Toolbar Araçları:

Temel Araçlar:
• Interact: Interactive markerlar ile etkileşim
• Move Camera: Kamerayı hareket ettir
• Select: Obje seçimi
• Focus Camera: Seçili objeye odaklan
• Measure: Mesafe ölçme
• Set Goal: Robot için hedef belirleme (navigasyon)
• Set Initial Pose: Robotun başlangıç pozisyonunu ayarla
• Measure: Mesafe ölçümü
• 2D Pose Estimate: Robotun başlangıç pozisyonunu ayarla
• 2D Nav Goal: Navigasyon hedefi belirle
• Publish Point: 3D nokta yayınla
İpucu: Views panelinden "Type" seçeneğini değiştirerek farklı kamera modları kullanabilirsiniz: Orbit (varsayılan), XYOrbit, TopDownOrtho, ThirdPersonFollower, FirstPersonView.

Display Türleri ve Özellikleri

RViz, farklı veri türlerini görselleştirmek için çeşitli display türleri sunar. Her display türü belirli bir ROS mesaj tipi ile çalışır.

Temel Display Türleri:

Sık Kullanılan Displayler
Axes: Koordinat eksenlerini gösterir
Grid: Referans ızgarası
RobotModel: URDF/Xacro robot modeli
TF: Transform ağacı
LaserScan: 2D lazer verisi
PointCloud2: 3D nokta bulutu
Image: Kamera görüntüsü
Camera: 3D projektif kamera
Map: OccupancyGrid haritalar
Path: Yol planları
Marker: Özel görselleştirmeler
InteractiveMarker: Etkileşimli objeler

Display Ekleme:

# Sol alttaki "Add" butonuna tıklayın # veya displays panelinde sağ tıklayıp "Add" seçin # Örnek: LaserScan ekleme 1. Add → By display type → LaserScan 2. Topic seçin: /scan 3. Size ve Color ayarlarını yapın
Display Ayarları:
Her display türünün kendi özel ayarları vardır:
• Topic: Dinlenecek ROS topic
• Enabled: Display açık/kapalı
• Alpha: Şeffaflık değeri (0-1)
• Color: Renk ayarları
• Size/Scale: Boyut ayarları
Hızlı Display Ekleme: Displays panelinde "Add" yerine "By topic" sekmesini kullanarak aktif topic'leri görebilir ve doğrudan ekleyebilirsiniz. Bu özellikle çok sayıda topic olduğunda zaman kazandırır.

TF ve Koordinat Sistemleri

TF (Transform) sistemi, ROS'un farklı koordinat sistemleri arasındaki dönüşümleri takip eden kütüphanesidir. RViz'de TF görselleştirmesi robot sistemini anlamak için kritiktir.

# TF display ekleme Add → TF # TF ağacını görmek için rosrun rqt_tf_tree rqt_tf_tree # ROS 1 ros2 run rqt_tf_tree rqt_tf_tree # ROS 2 # TF bilgilerini komut satırında görmek rosrun tf tf_echo /base_link /laser # ROS 1 ros2 run tf2_ros tf2_echo base_link laser # ROS 2
Fixed Frame Kavramı:
RViz'in en önemli ayarlarından biri "Fixed Frame"dir. Bu, tüm diğer frame'lerin referans aldığı sabit koordinat sistemidir.

Yaygın fixed frame'ler:
• map: Dünya koordinat sistemi (SLAM için)
• odom: Odometri koordinat sistemi
• base_link: Robotun merkezi (robot-centric görünüm için)
Tipik TF Ağacı
Örnek Robot TF Hiyerarşisi:

map → odom → base_footprint → base_link
    → laser_link
    → camera_link
    → imu_link
    → left_wheel_link
    → right_wheel_link

Her ok bir parent-child ilişkisini temsil eder.
TF Hataları: "Fixed Frame [map] does not exist" hatası alıyorsanız, Fixed Frame ayarını mevcut bir frame'e (örn. base_link) değiştirin veya ilgili TF publisher'ı başlatın.

TF Display Ayarları:

• Show Names: Frame isimlerini göster
• Show Axes: Her frame için eksenleri göster
• Show Arrows: Parent-child bağlantılarını göster
• Marker Scale: Frame boyutu
• Update Interval: Güncelleme sıklığı
• Frame Timeout: Frame yayınlanmadığında timeout süresi

LaserScan Görselleştirme

LaserScan display'i, 2D LiDAR veya lazer mesafe sensörlerinden gelen verileri görselleştirir. Engel tespiti ve haritalama için kritiktir.

# LaserScan display ekleme Add → LaserScan Topic: /scan Size (m): 0.05 Style: Points / Flat Squares / Spheres / Boxes # Örnek LaserScan mesajı yayınlama (test için) rostopic pub /scan sensor_msgs/LaserScan "{...}"
LaserScan Mesaj Yapısı (sensor_msgs/LaserScan):
• angle_min/max: Tarama açısı aralığı
• angle_increment: Açı adımı
• time_increment: Ölçümler arası zaman
• scan_time: Tam tarama süresi
• range_min/max: Minimum/maksimum mesafe
• ranges[]: Mesafe ölçümleri dizisi
• intensities[]: Yansıma şiddeti (opsiyonel)

Renklendirme Seçenekleri:

Color Transformer
Flat Color: Tek renk (manuel seçim)
Intensity: Yansıma şiddetine göre
Axis Color: X/Y/Z eksenine göre renklendirme

Intensity kullanımı: Farklı yüzey türlerini ayırt etmek için kullanışlıdır (metal, ahşap, kumaş vb.)
Performans İpucu: Çok yoğun LaserScan verileri performansı etkileyebilir. "Decay Time" ayarını kullanarak eski taramaları otomatik olarak silebilir veya "Selectable" seçeneğini kapatarak render performansını artırabilirsiniz.
Frame Uyuşmazlığı: LaserScan verileri doğru frame'de (genellikle laser_link veya base_scan) yayınlanmalıdır. Aksi takdirde RViz "For frame [xxx]: No transform" hatası verir.

PointCloud Verileri

PointCloud2 display'i, 3D LiDAR, depth kameralar ve stereo kameralardan gelen 3D nokta bulutu verilerini görselleştirir.

# PointCloud2 display ekleme Add → PointCloud2 Topic: /camera/depth/points Size (m): 0.01 Style: Points / Flat Squares / Spheres / Boxes Color Transformer: RGB8 / Intensity / AxisColor # PointCloud verilerini kaydetme rosrun pcl_ros pointcloud_to_pcd input:=/camera/depth/points
PointCloud2 vs PointCloud:
• PointCloud2: Yeni standart, daha esnek veri yapısı
• PointCloud: Eski format, artık önerilmiyor

PointCloud2, özel alanlar (RGB, intensity, normal, vb.) için destek sunar ve daha verimlidir.

Renklendirme Stratejileri:

Color Transformers
RGB8/RGBA8: Renk kamerası verileri için (renk bilgisi varsa)
Intensity: Yansıma şiddeti tabanlı
AxisColor: Yükseklik (Z) veya konum tabanlı
FlatColor: Tek renk

Min/Max Color/Value: Renk aralığını kontrol eder
Voxel Grid Filtering: Çok yoğun nokta bulutları için PCL'nin VoxelGrid filtresini kullanarak veri miktarını azaltabilirsiniz. Bu hem performansı artırır hem de görselleştirmeyi iyileştirir:
rosrun pcl_ros voxel_grid input:=/points output:=/points_filtered

Performans Optimizasyonu:

Büyük PointCloud'lar:
• Point size'ı küçültün (0.01 veya daha az)
• "Decay Time" kullanarak eski verileri temizleyin
• "Position Transformer" ile veri alt örnekleme
• GPU rendering'i aktif edin (Settings → Use GPU)
• Sadece gerekli alanları görselleştirin

Robot Model Görselleştirme

RobotModel display'i, URDF (Unified Robot Description Format) veya Xacro dosyalarından robotun 3D modelini görselleştirir.

# RobotModel display ekleme Add → RobotModel Robot Description: robot_description (default topic) Visual Enabled: true Collision Enabled: false Alpha: 1.0 # URDF'yi parameter server'a yükleme rosparam set robot_description -t my_robot.urdf # veya launch dosyasında <param name="robot_description" textfile="$(find my_package)/urdf/robot.urdf"/> # Xacro kullanımı <param name="robot_description" command="$(find xacro)/xacro '$(find my_package)/urdf/robot.xacro'"/>
URDF Temel Elemanları:
• <link>: Robot parçası (gövde, tekerlek, sensör vb.)
• <joint>: Linkler arası bağlantı (fixed, revolute, prismatic, vb.)
• <visual>: Görsel model (mesh, geometri)
• <collision>: Çarpışma modeli
• <inertial>: Kütle ve atalet özellikleri

Robot State Publisher:

Joint State Yayınlama
Robot eklemlerinin (joint) durumlarını güncellemek için joint_state_publisher kullanılır:

rosrun robot_state_publisher robot_state_publisher
rosrun joint_state_publisher joint_state_publisher

Joint State Publisher GUI ile eklemleri manuel kontrol edebilirsiniz:
rosrun joint_state_publisher_gui joint_state_publisher_gui
URDF Kontrolü: URDF dosyanızı yüklemeden önce syntax kontrolü yapın:
check_urdf my_robot.urdf
urdf_to_graphiz my_robot.urdf (TF ağacı grafiği oluşturur)

Görsel Ayarlar:

RobotModel Display Seçenekleri:
• Visual Enabled: Görsel mesh'leri göster
• Collision Enabled: Çarpışma geometrilerini göster
• Alpha: Model şeffaflığı
• Link Tree: Her linki ayrı ayrı açıp kapatma
• Mass Properties: Kütle merkezlerini göster

Path ve Trajectory Görselleştirme

Path display'i, robot navigasyonu için planlanan yolları, geçmiş hareketleri (odometry) ve gelecek trajectory'leri görselleştirir.

# Path display ekleme Add → Path Topic: /move_base/TrajectoryPlannerROS/global_plan Color: 25; 255; 0 (yeşil) Alpha: 1.0 Buffer Length: 1 (kaç path saklanacak) Line Width: 0.03 # Odometry path için Topic: /odom_path Color: 255; 165; 0 (turuncu)
nav_msgs/Path Mesaj Yapısı:
• header: Frame ve zaman damgası
• poses[]: PoseStamped dizisi
  - position (x, y, z)
  - orientation (quaternion)

Her pose, path üzerinde bir waypoint'i temsil eder.

Navigasyon Path'leri:

move_base Path'leri
ROS Navigation stack kullanıyorsanız, birden fazla path görselleştirilebilir:

Global Plan: /move_base/.../global_plan (A* veya Dijkstra)
Local Plan: /move_base/.../local_plan (DWA veya Trajectory Rollout)
Carrot: Local planner'ın takip ettiği hedef nokta

Farklı renkler kullanarak bunları ayırt edebilirsiniz.
Odometry Path Kaydetme: Robotun gittiği yolu kaydetmek için odom'u path'e dönüştürebilirsiniz. Hazır bir node kullanın veya basit bir Python script yazın:
rosrun hector_trajectory_server hector_trajectory_server

PoseArray Display:

PoseArray: Particle filter veya çoklu hipotezler için kullanılır (AMCL partikül görselleştirme gibi).

Add → PoseArray
Topic: /particlecloud
Shape: Arrow / Axes
Arrow Length/Width: 0.3 / 0.05

Marker ve Interactive Marker

Marker ve InteractiveMarker display'leri, özel görselleştirmeler ve kullanıcı etkileşimi için kullanılır.

Marker Display:

# Marker display ekleme Add → Marker Topic: /visualization_marker # MarkerArray için (birden fazla marker) Add → MarkerArray Topic: /visualization_marker_array
Marker Türleri (visualization_msgs/Marker):
• ARROW: Ok işareti
• CUBE: Küp
• SPHERE: Küre
• CYLINDER: Silindir
• LINE_STRIP / LINE_LIST: Çizgiler
• POINTS: Nokta seti
• TEXT_VIEW_FACING: Metin
• MESH_RESOURCE: 3D mesh (.stl, .dae)
• TRIANGLE_LIST: Özel geometri

Marker Örneği (Python):

#!/usr/bin/env python3 import rospy from visualization_msgs.msg import Marker rospy.init_node('marker_publisher') pub = rospy.Publisher('/visualization_marker', Marker, queue_size=10) rate = rospy.Rate(1) while not rospy.is_shutdown(): marker = Marker() marker.header.frame_id = "map" marker.header.stamp = rospy.Time.now() marker.ns = "basic_shapes" marker.id = 0 marker.type = Marker.SPHERE marker.action = Marker.ADD marker.pose.position.x = 1.0 marker.pose.position.y = 2.0 marker.pose.position.z = 0.5 marker.pose.orientation.w = 1.0 marker.scale.x = 0.5 marker.scale.y = 0.5 marker.scale.z = 0.5 marker.color.r = 0.0 marker.color.g = 1.0 marker.color.b = 0.0 marker.color.a = 1.0 marker.lifetime = rospy.Duration() pub.publish(marker) rate.sleep()

Interactive Marker:

Etkileşimli Kontroller
InteractiveMarker, kullanıcıların 3D objeler ile etkileşime girmesini sağlar:

• 6-DOF (Degrees of Freedom) kontrol
• Move, Rotate, Scale işlemleri
• Context menu desteği
• Feedback sistemi (kullanıcı eylemi → kod tepkisi)

Kullanım: Robot hedef pozisyonu belirleme, obje manipülasyon planlama, vb.
Interactive Marker Örneği: Basit bir etkileşimli marker oluşturmak için aşağıdaki Python kodunu kullanabilirsiniz:

#!/usr/bin/env python3 import rospy from interactive_markers.interactive_marker_server import * from visualization_msgs.msg import InteractiveMarker, InteractiveMarkerControl