ROBOVİSİONTECH

Projeler

RoboVisionTech'de teknoloji, robotik ve elektronik alanlarında çeşitli projeler bulabilirsiniz. Her proje detaylı açıklamalar, kod örnekleri ve uygulama adımları içerir.

Proje Geliştirme Kaynakları

🤖 Robotik Projeler

ROS, Arduino, Raspberry Pi ve diğer platformlar kullanarak geliştirilebilecek robotik projeler ve kod örnekleri.

1. ROS ile Basit Publisher/Subscriber

ROS'ta temel mesajlaşma sistemi ile basit bir publisher ve subscriber node'u oluşturma.

Publisher Node (Python)

#!/usr/bin/env python3
import rospy
from std_msgs.msg import String

def talker():
    # ROS node'u başlatma
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10Hz
    
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

Subscriber Node (Python)

#!/usr/bin/env python3
import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)

def listener():
    rospy.init_node('listener', anonymous=True)
    rospy.Subscriber("chatter", String, callback)
    
    # Node'u çalışır durumda tutma
    rospy.spin()

if __name__ == '__main__':
    listener()

2. URDF ile Basit Araç

URDF (Unified Robot Description Format) kullanarak 4 tekerlekli Mars rover robotu tanımlama ve simülasyon.

URDF Robot Tanımı

<?xml version="1.0"?>
<robot name="simple_car">
  <!-- Materials -->
  <material name="CarRed">
    <color rgba="0.8 0.1 0.1 1.0"/>
  </material>
  <material name="WheelBlack">
    <color rgba="0.05 0.05 0.05 1.0"/>
  </material>
  <material name="Glass">
    <color rgba="0.6 0.8 1.0 0.8"/>
  </material>

  <!-- Chassis -->
  <link name="base_link">
    <inertial>
      <origin xyz="0 0 0"/>
      <mass value="12.0"/>
      <!-- Approx inertia for 1.0 x 0.5 x 0.2 m box -->
      <inertia ixx="0.29" ixy="0.0" ixz="0.0" iyy="1.04" iyz="0.0" izz="1.25"/>
    </inertial>
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="1.0 0.5 0.2"/>
      </geometry>
      <material name="CarRed"/>
    </visual>
    <!-- Cabin / windshield -->
    <visual>
      <origin xyz="0.05 0 0.2" rpy="0 0 0"/>
      <geometry>
        <box size="0.5 0.45 0.2"/>
      </geometry>
      <material name="Glass"/>
    </visual>
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="1.0 0.5 0.2"/>
      </geometry>
    </collision>
  </link>

  <!-- Front Left Wheel -->
  <link name="front_left_wheel">
    <inertial>
      <origin xyz="0 0 0"/>
      <mass value="2.0"/>
      <inertia ixx="0.0123" ixy="0" ixz="0" iyy="0.0225" iyz="0" izz="0.0123"/>
    </inertial>
    <visual>
      <!-- Rotate cylinder so its axis aligns with Y -->
      <origin xyz="0 0 0" rpy="1.5708 0 0"/>
      <geometry>
        <cylinder radius="0.15" length="0.08"/>
      </geometry>
      <material name="WheelBlack"/>
    </visual>
    <collision>
      <origin xyz="0 0 0" rpy="1.5708 0 0"/>
      <geometry>
        <cylinder radius="0.15" length="0.08"/>
      </geometry>
    </collision>
  </link>
  <joint name="front_left_wheel_joint" type="continuous">
    <origin xyz="0.35 0.30 -0.15" rpy="0 0 0"/>
    <parent link="base_link"/>
    <child link="front_left_wheel"/>
    <axis xyz="0 1 0"/>
  </joint>

  <!-- Front Right Wheel -->
  <link name="front_right_wheel">
    <inertial>
      <origin xyz="0 0 0"/>
      <mass value="2.0"/>
      <inertia ixx="0.0123" ixy="0" ixz="0" iyy="0.0225" iyz="0" izz="0.0123"/>
    </inertial>
    <visual>
      <origin xyz="0 0 0" rpy="1.5708 0 0"/>
      <geometry>
        <cylinder radius="0.15" length="0.08"/>
      </geometry>
      <material name="WheelBlack"/>
    </visual>
    <collision>
      <origin xyz="0 0 0" rpy="1.5708 0 0"/>
      <geometry>
        <cylinder radius="0.15" length="0.08"/>
      </geometry>
    </collision>
  </link>
  <joint name="front_right_wheel_joint" type="continuous">
    <origin xyz="0.35 -0.30 -0.15" rpy="0 0 0"/>
    <parent link="base_link"/>
    <child link="front_right_wheel"/>
    <axis xyz="0 1 0"/>
  </joint>

  <!-- Rear Left Wheel -->
  <link name="rear_left_wheel">
    <inertial>
      <origin xyz="0 0 0"/>
      <mass value="2.0"/>
      <inertia ixx="0.0123" ixy="0" ixz="0" iyy="0.0225" iyz="0" izz="0.0123"/>
    </inertial>
    <visual>
      <origin xyz="0 0 0" rpy="1.5708 0 0"/>
      <geometry>
        <cylinder radius="0.15" length="0.08"/>
      </geometry>
      <material name="WheelBlack"/>
    </visual>
    <collision>
      <origin xyz="0 0 0" rpy="1.5708 0 0"/>
      <geometry>
        <cylinder radius="0.15" length="0.08"/>
      </geometry>
    </collision>
  </link>
  <joint name="rear_left_wheel_joint" type="continuous">
    <origin xyz="-0.35 0.30 -0.15" rpy="0 0 0"/>
    <parent link="base_link"/>
    <child link="rear_left_wheel"/>
    <axis xyz="0 1 0"/>
  </joint>

  <!-- Rear Right Wheel -->
  <link name="rear_right_wheel">
    <inertial>
      <origin xyz="0 0 0"/>
      <mass value="2.0"/>
      <inertia ixx="0.0123" ixy="0" ixz="0" iyy="0.0225" iyz="0" izz="0.0123"/>
    </inertial>
    <visual>
      <origin xyz="0 0 0" rpy="1.5708 0 0"/>
      <geometry>
        <cylinder radius="0.15" length="0.08"/>
      </geometry>
      <material name="WheelBlack"/>
    </visual>
    <collision>
      <origin xyz="0 0 0" rpy="1.5708 0 0"/>
      <geometry>
        <cylinder radius="0.15" length="0.08"/>
      </geometry>
    </collision>
  </link>
  <joint name="rear_right_wheel_joint" type="continuous">
    <origin xyz="-0.35 -0.30 -0.15" rpy="0 0 0"/>
    <parent link="base_link"/>
    <child link="rear_right_wheel"/>
    <axis xyz="0 1 0"/>
  </joint>

</robot>
URDF araba görseli (simple_car)
URDF Robot Tanımı sonrası önizleme (simple_car)

🖼️ Görüntü İşleme Projeleri

OpenCV, TensorFlow, PyTorch ve diğer kütüphaneler kullanarak geliştirilebilecek görüntü işleme projeleri ve kod örnekleri.

URDF Araçta Renk Algılama — Kısa Blog

Geçenlerde URDF ile modellediğimiz basit aracı yeniden açtık ve şunu denedik: ‘Aracın rengini otomatik çıkarabilir miyiz?’ OpenCV ile küçük bir deneme yaptık; BGR’den HSV’ye geçip kırmızı/yeşil/mavi aralıklarını maskeledik, gürültüyü temizledik ve sonuçları kontur çizimleriyle vurguladık. Kısacası, aracın rengini (ve gövde üzerindeki belirgin renk bölgelerini) kolayca ortaya çıkaran hafif bir işleme hattı kurduk.

Aşağıdaki ‘Renk Tespiti (Resim Üzerinden)’ kodu bu yaklaşımın kalbi. Işık koşulları değiştiğinde yalnızca HSV eşiklerini ve küçük alan filtresini ayarlayarak sağlam sonuçlar almak mümkün. Sonraki adımda bunu gerçek zamanlı akışa bağlayıp aracın rengini anlık olarak takip etmeyi planlıyoruz.

1. Renk Tespiti (Resim Üzerinden)

HSV renk uzayı ile kırmızı, yeşil ve mavi gibi renkleri tespit ederek maskeleme ve kontur çizimi yapma.

Python Kodu

import cv2
import numpy as np

# Görüntüyü yükle (aynı klasörde 'image.jpg' olmalı)
image = cv2.imread('image.jpg')
if image is None:
    raise FileNotFoundError('image.jpg bulunamadı')

# BGR'den HSV'ye dönüştür
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# Renk aralıkları (HSV)
color_ranges = {
    'Kirmizi': [(np.array([0, 120, 70]),  np.array([10, 255, 255])),
                (np.array([170, 120, 70]), np.array([180, 255, 255]))],  # iki aralık
    'Yesil':   [(np.array([35,  80, 70]),  np.array([85,  255, 255]))],
    'Mavi':    [(np.array([95,  80, 70]),  np.array([130, 255, 255]))]
}

output = image.copy()

for name, ranges in color_ranges.items():
    # Renk için maskeyi oluştur (kırmızı 2 aralıklı)
    mask = None
    for low, high in ranges:
        part = cv2.inRange(hsv, low, high)
        mask = part if mask is None else cv2.bitwise_or(mask, part)

    # Gürültüyü azalt (aç-kapa morfoloji)
    kernel = np.ones((5, 5), np.uint8)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

    # Konturları bul ve kontur çiz
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area < 500:  # küçük gürültüleri ele
            continue
        # Konturu çiz
        cv2.drawContours(output, [cnt], -1, (0, 255, 0), 2)
        # Etiketi kontur merkezine yakın yaz
        M = cv2.moments(cnt)
        if M.get('m00', 0) != 0:
            cx = int(M['m10'] / M['m00'])
            cy = int(M['m01'] / M['m00'])

# Sonuçları göster
cv2.imshow('Orjinal', image)
cv2.imshow('Renk Tespiti', output)
cv2.waitKey(0)
cv2.destroyAllWindows()
URDF araç üzerinde renk tespiti önizleme
URDF araç modeli üzerinde renk tespiti önizleme

2. OpenCV Temelleri (Hızlı Özet)

OpenCV kullanarak görüntü okuma, gri tonlama, blur ve kenar tespiti işlemlerinin kısa özeti.

Python Kodu

import cv2
import numpy as np

# Görüntü okuma
image = cv2.imread('image.jpg')

# Gri tonlama dönüşümü
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Gaussian blur uygulama
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

# Canny kenar tespiti
edges = cv2.Canny(blurred, 50, 150)

# Sonuçları görüntüleme
cv2.imshow('Original', image)
cv2.imshow('Grayscale', gray)
cv2.imshow('Blurred', blurred)
cv2.imshow('Edges', edges)

cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV işlem adımları: Original, Grayscale, Blurred, Edges
OpenCV temel işleme adımları: Original, Grayscale, Blurred, Edges