─░├žeri─če ge├ž

ROS (Robot ─░┼čletim Sistemi) h─▒zl─▒ ba┼člang─▒├ž k─▒lavuzu

ROS Giri┼č (altyaz─▒l─▒) itibaren Open Robotics on Vimeo.

ROS nedir?

Robot ─░┼čletim Sistemi (ROS), robotik ara┼čt─▒rma ve end├╝stride yayg─▒n olarak kullan─▒lan a├ž─▒k kaynakl─▒ bir ├žer├ževedir. ROS, geli┼čtiricilerin robot uygulamalar─▒ olu┼čturmas─▒na yard─▒mc─▒ olacak bir kitapl─▒k ve ara├ž koleksiyonu sa─člar. ROS, ├že┼čitli robotik platformlarla ├žal─▒┼čmak ├╝zere tasarlanm─▒┼čt─▒r, bu da onu robotik├žiler i├žin esnek ve g├╝├žl├╝ bir ara├ž haline getirir.

ROS'un Temel ├ľzellikleri

  1. Mod├╝ler Mimari: ROS, geli┼čtiricilerin d├╝─č├╝m ad─▒ verilen daha k├╝├ž├╝k, yeniden kullan─▒labilir bile┼čenleri birle┼čtirerek karma┼č─▒k sistemler olu┼čturmas─▒na olanak tan─▒yan mod├╝ler bir mimariye sahiptir. Her d├╝─č├╝m tipik olarak belirli bir i┼člevi yerine getirir ve d├╝─č├╝mler, konular veya hizmetler ├╝zerinden mesajlar kullanarak birbirleriyle ileti┼čim kurar.

  2. ─░leti┼čim Ara Yaz─▒l─▒m─▒: ROS, s├╝re├žler aras─▒ ileti┼čimi ve da─č─▒t─▒lm─▒┼č hesaplamay─▒ destekleyen sa─člam bir ileti┼čim altyap─▒s─▒ sunar. Bu, veri ak─▒┼člar─▒ (konular) i├žin bir yay─▒mlama-abone olma modeli ve hizmet ├ža─čr─▒lar─▒ i├žin bir istek-yan─▒t modeli arac─▒l─▒─č─▒yla elde edilir.

  3. Donan─▒m Soyutlamas─▒: ROS, donan─▒m ├╝zerinde bir soyutlama katman─▒ sa─člayarak geli┼čtiricilerin cihazdan ba─č─▒ms─▒z kod yazmas─▒na olanak tan─▒r. Bu, ayn─▒ kodun farkl─▒ donan─▒m kurulumlar─▒yla kullan─▒lmas─▒na izin vererek daha kolay entegrasyon ve denemeyi kolayla┼čt─▒r─▒r.

  4. Ara├žlar ve Yard─▒mc─▒ Programlar: ROS, g├Ârselle┼čtirme, hata ay─▒klama ve sim├╝lasyon i├žin zengin bir ara├ž ve yard─▒mc─▒ program seti ile birlikte gelir. ├ľrne─čin, RViz, sens├Âr verilerini ve robot durum bilgilerini g├Ârselle┼čtirmek i├žin kullan─▒l─▒rken, Gazebo, algoritmalar─▒ ve robot tasar─▒mlar─▒n─▒ test etmek i├žin g├╝├žl├╝ bir sim├╝lasyon ortam─▒ sa─člar.

  5. Kapsaml─▒ Ekosistem: ROS ekosistemi, navigasyon, manip├╝lasyon, alg─▒lama ve daha fazlas─▒ dahil olmak ├╝zere farkl─▒ robotik uygulamalar i├žin ├žok say─▒da paketle ├žok geni┼čtir ve s├╝rekli b├╝y├╝mektedir. Topluluk, bu paketlerin geli┼čtirilmesine ve s├╝rd├╝r├╝lmesine aktif olarak katk─▒da bulunur.

ROS S├╝r├╝mlerinin Evrimi

2007'deki geli┼čtirilmesinden bu yana ROS, robotik toplulu─čunun artan ihtiya├žlar─▒n─▒ kar┼č─▒lamak i├žin her biri yeni ├Âzellikler ve iyile┼čtirmeler sunan birden fazla s├╝r├╝mle geli┼čti. ROS'un geli┼čimi iki ana seriye ayr─▒labilir: ROS 1 ve ROS 2. Bu k─▒lavuz, ROS Noetic Ninjemys olarak bilinen ROS 1'in Uzun S├╝reli Destek (LTS) s├╝r├╝m├╝ne odaklan─▒r, kod ├Ânceki s├╝r├╝mlerle de ├žal─▒┼čmal─▒d─▒r.

ROS 1 ve ROS 2

ROS 1, robotik geli┼čtirme i├žin sa─člam bir temel sa─člarken, ROS 2 a┼ča─č─▒dakileri sunarak eksikliklerini giderir:

  • Ger├žek Zamanl─▒ Performans: Ger├žek zamanl─▒ sistemler ve deterministik davran─▒┼člar i├žin geli┼čtirilmi┼č destek.
  • G├╝venlik: ├çe┼čitli ortamlarda g├╝venli ve g├╝venilir ├žal─▒┼čma i├žin geli┼čmi┼č g├╝venlik ├Âzellikleri.
  • ├ľl├žeklenebilirlik: ├çok robotlu sistemler ve b├╝y├╝k ├Âl├žekli da─č─▒t─▒mlar i├žin daha iyi destek.
  • ├çapraz Platform Deste─či: Windows ve macOS dahil olmak ├╝zere Linux'un ├Âtesindeki ├že┼čitli i┼čletim sistemleriyle geni┼čletilmi┼č uyumluluk.
  • Esnek ─░leti┼čim: S├╝re├žler aras─▒ daha esnek ve verimli ileti┼čim i├žin DDS kullan─▒m─▒.

ROS Mesajlar─▒ ve Konular─▒

ROS'ta d├╝─č├╝mler aras─▒ndaki ileti┼čim, mesajlar ve konular arac─▒l─▒─č─▒yla kolayla┼čt─▒r─▒l─▒r. Mesaj, d├╝─č├╝mler aras─▒nda de─či┼č toku┼č edilen bilgileri tan─▒mlayan bir veri yap─▒s─▒d─▒r, konu ise mesajlar─▒n g├Ânderildi─či ve al─▒nd─▒─č─▒ adland─▒r─▒lm─▒┼č bir kanald─▒r. D├╝─č├╝mler, bir konuya mesaj yay─▒nlayabilir veya bir konudaki mesajlara abone olarak birbirleriyle ileti┼čim kurmalar─▒n─▒ sa─člayabilir. Bu yay─▒mlama-abone olma modeli, d├╝─č├╝mler aras─▒nda zaman uyumsuz ileti┼čime ve ayr─▒┼čt─▒rmaya olanak tan─▒r. Bir robotik sistemdeki her sens├Âr veya akt├╝at├Âr tipik olarak bir konuya veri yay─▒nlar ve bu veriler daha sonra i┼čleme veya kontrol i├žin di─čer d├╝─č├╝mler taraf─▒ndan t├╝ketilebilir. Bu k─▒lavuzun amac─▒ do─črultusunda, G├Âr├╝nt├╝, Derinlik ve PointCloud mesajlar─▒ ve kamera konular─▒na odaklanaca─č─▒z.

Ayarlama Ultralytics YOLO ROS ile

Bu k─▒lavuz, ROSbot ROS deposunun bir ├žatal─▒ olan bu ROS ortam─▒ kullan─▒larak test edilmi┼čtir. Bu ortam ┼čunlar─▒ i├žerir:Ultralytics YOLO paketi, kolay kurulum i├žin bir Docker konteyneri, kapsaml─▒ ROS paketleri ve h─▒zl─▒ test i├žin Gazebo d├╝nyalar─▒. Husarion ROSbot 2 PRO ile ├žal─▒┼čmak ├╝zere tasarlanm─▒┼čt─▒r. Sa─članan kod ├Ârnekleri, hem sim├╝lasyon hem de ger├žek d├╝nya dahil olmak ├╝zere herhangi bir ROS Noetic/Melodic ortam─▒nda ├žal─▒┼čacakt─▒r.

Husarion ROSbot 2 PRO

Ba─č─▒ml─▒l─▒klar Y├╝kleme

ROS ortam─▒n─▒n yan─▒ s─▒ra, a┼ča─č─▒daki ba─č─▒ml─▒l─▒klar─▒ y├╝klemeniz gerekir:

  • ROS Numpy paketi: Bu, ROS G├Âr├╝nt├╝ mesajlar─▒ ve numpy dizileri aras─▒nda h─▒zl─▒ d├Ân├╝┼č├╝m i├žin gereklidir.

    pip install ros_numpy
    
  • Ultralytics Paketi:

    pip install ultralytics
    

Kullanmak Ultralytics ROS ile sensor_msgs/Image

Bu sensor_msgs/Image Mesaj T├╝r├╝ g├Âr├╝nt├╝ verilerini temsil etmek i├žin ROS'ta yayg─▒n olarak kullan─▒l─▒r. Kodlama, y├╝kseklik, geni┼člik ve piksel verileri i├žin alanlar i├žerir, bu da onu kameralar veya di─čer sens├Ârler taraf─▒ndan yakalanan g├Âr├╝nt├╝leri iletmek i├žin uygun hale getirir. G├Âr├╝nt├╝l├╝ mesajlar, robotik uygulamalarda g├Ârsel alg─▒lama, nesne alg─▒lama ve gezinme gibi g├Ârevler i├žin yayg─▒n olarak kullan─▒lmaktad─▒r.

ROS Gazebo'da Alg─▒lama ve Segmentasyon

G├Ârselin Ad─▒m Ad─▒m Kullan─▒m─▒

A┼ča─č─▒daki kod par├žac─▒─č─▒, Ultralytics YOLO ROS ile paket. Bu ├Ârnekte, bir kamera konusuna abone oluyoruz, gelen g├Âr├╝nt├╝y├╝ kullanarak i┼čliyoruz. YOLOt─▒klat─▒n ve alg─▒lanan nesneleri alg─▒lama ve segmentasyon i├žin yeni konulara yay─▒mlay─▒n.

─░lk olarak, gerekli kitapl─▒klar─▒ i├že aktar─▒n ve iki model olu┼čturun: biri Segmentasyon ve bir tane Alg─▒lama. Bir ROS d├╝─č├╝m├╝ ba┼člat─▒n (ad─▒yla ultralytics) ROS master ile ileti┼čimi etkinle┼čtirmek i├žin. ─░stikrarl─▒ bir ba─člant─▒ sa─člamak i├žin, d├╝─č├╝me devam etmeden ├Ânce ba─člant─▒y─▒ kurmas─▒ i├žin yeterli zaman veren k─▒sa bir duraklama ekliyoruz.

import time

import rospy

from ultralytics import YOLO

detection_model = YOLO("yolov8m.pt")
segmentation_model = YOLO("yolov8m-seg.pt")
rospy.init_node("ultralytics")
time.sleep(1)

─░ki ROS konusu ba┼člat─▒n: biri Alg─▒lama ve bir tane Segmentasyon. Bu konular, a├ž─▒klamal─▒ g├Âr├╝nt├╝leri yay─▒nlamak i├žin kullan─▒lacak ve daha sonraki i┼člemler i├žin eri┼čilebilir hale getirilecektir. D├╝─č├╝mler aras─▒ndaki ileti┼čim kullan─▒larak kolayla┼čt─▒r─▒l─▒r. sensor_msgs/Image Ileti.

from sensor_msgs.msg import Image

det_image_pub = rospy.Publisher("/ultralytics/detection/image", Image, queue_size=5)
seg_image_pub = rospy.Publisher("/ultralytics/segmentation/image", Image, queue_size=5)

Son olarak, ekrandaki mesajlar─▒ dinleyen bir abone olu┼čturun. /camera/color/image_raw konu ve her yeni mesaj i├žin bir geri arama i┼člevi ├ža─č─▒r─▒r. Bu geri ├ža─č─▒rma i┼člevi, ┼ču t├╝rdeki iletileri al─▒r sensor_msgs/Image, kullanarak bunlar─▒ bir numpy dizisine d├Ân├╝┼čt├╝r├╝r ros_numpy, g├Âr├╝nt├╝leri daha ├Ânce ba┼člat─▒lan g├Âr├╝nt├╝lerle i┼čler YOLO modeller, g├Âr├╝nt├╝lere a├ž─▒klama ekler ve ard─▒ndan bunlar─▒ ilgili konulara geri yay─▒nlar: /ultralytics/detection/image alg─▒lama ve /ultralytics/segmentation/image segmentasyon i├žin.

import ros_numpy


def callback(data):
    """Callback function to process image and publish annotated images."""
    array = ros_numpy.numpify(data)
    if det_image_pub.get_num_connections():
        det_result = detection_model(array)
        det_annotated = det_result[0].plot(show=False)
        det_image_pub.publish(ros_numpy.msgify(Image, det_annotated, encoding="rgb8"))

    if seg_image_pub.get_num_connections():
        seg_result = segmentation_model(array)
        seg_annotated = seg_result[0].plot(show=False)
        seg_image_pub.publish(ros_numpy.msgify(Image, seg_annotated, encoding="rgb8"))


rospy.Subscriber("/camera/color/image_raw", Image, callback)

while True:
    rospy.spin()
Kodu tamamla
import time

import ros_numpy
import rospy
from sensor_msgs.msg import Image

from ultralytics import YOLO

detection_model = YOLO("yolov8m.pt")
segmentation_model = YOLO("yolov8m-seg.pt")
rospy.init_node("ultralytics")
time.sleep(1)

det_image_pub = rospy.Publisher("/ultralytics/detection/image", Image, queue_size=5)
seg_image_pub = rospy.Publisher("/ultralytics/segmentation/image", Image, queue_size=5)


def callback(data):
    """Callback function to process image and publish annotated images."""
    array = ros_numpy.numpify(data)
    if det_image_pub.get_num_connections():
        det_result = detection_model(array)
        det_annotated = det_result[0].plot(show=False)
        det_image_pub.publish(ros_numpy.msgify(Image, det_annotated, encoding="rgb8"))

    if seg_image_pub.get_num_connections():
        seg_result = segmentation_model(array)
        seg_annotated = seg_result[0].plot(show=False)
        seg_image_pub.publish(ros_numpy.msgify(Image, seg_annotated, encoding="rgb8"))


rospy.Subscriber("/camera/color/image_raw", Image, callback)

while True:
    rospy.spin()
Hata ay─▒klama

ROS (Robot ─░┼čletim Sistemi) d├╝─č├╝mlerinde hata ay─▒klamak, sistemin da─č─▒t─▒lm─▒┼č yap─▒s─▒ nedeniyle zor olabilir. Bu s├╝re├žte birka├ž ara├ž yard─▒mc─▒ olabilir:

  1. rostopic echo <TOPIC-NAME> : Bu komut, belirli bir konuda yay─▒nlanan mesajlar─▒ g├Âr├╝nt├╝lemenizi sa─člayarak veri ak─▒┼č─▒n─▒ incelemenize yard─▒mc─▒ olur.
  2. rostopic list: ROS sistemindeki mevcut t├╝m konular─▒ listelemek i├žin bu komutu kullan─▒n ve size aktif veri ak─▒┼člar─▒na genel bir bak─▒┼č sa─člay─▒n.
  3. rqt_graph: Bu g├Ârselle┼čtirme arac─▒, d├╝─č├╝mler aras─▒ndaki ileti┼čim grafi─čini g├Âr├╝nt├╝leyerek d├╝─č├╝mlerin birbirine nas─▒l ba─čland─▒─č─▒na ve nas─▒l etkile┼čime girdi─čine dair i├žg├Âr├╝ler sa─člar.
  4. 3B g├Âsterimler gibi daha karma┼č─▒k g├Ârselle┼čtirmeler i├žin ┼čunlar─▒ kullanabilirsiniz: RViz (Karavan). RViz (ROS G├Ârselle┼čtirme), ROS i├žin g├╝├žl├╝ bir 3D g├Ârselle┼čtirme arac─▒d─▒r. Robotunuzun ve ├ževresinin durumunu ger├žek zamanl─▒ olarak g├Ârselle┼čtirmenizi sa─člar. RViz ile sens├Âr verilerini g├Âr├╝nt├╝leyebilirsiniz (├Ârn. sensors_msgs/Image), robot modeli durumlar─▒ ve di─čer ├že┼čitli bilgi t├╝rleri, hata ay─▒klamay─▒ ve robotik sisteminizin davran─▒┼č─▒n─▒ anlamay─▒ kolayla┼čt─▒r─▒r.

Alg─▒lanan S─▒n─▒flar─▒ Yay─▒mla std_msgs/String

Standart ROS mesajlar─▒ ayr─▒ca ┼čunlar─▒ i├žerir std_msgs/String Ileti. Bir├žok uygulamada, a├ž─▒klamal─▒ g├Âr├╝nt├╝n├╝n tamam─▒n─▒ yeniden yay─▒nlamak gerekli de─čildir; bunun yerine, yaln─▒zca robotun g├Âr├╝n├╝m├╝nde bulunan s─▒n─▒flara ihtiya├ž vard─▒r. A┼ča─č─▒daki ├Ârnekte nas─▒l kullan─▒laca─č─▒ g├Âsterilmektedir std_msgs/String Ileti Alg─▒lanan s─▒n─▒flar─▒ yeniden yay─▒mlamak i├žin /ultralytics/detection/classes konu. Bu mesajlar daha hafiftir ve temel bilgileri sa─člayarak onlar─▒ ├že┼čitli uygulamalar i├žin de─čerli k─▒lar.

├ľrnek Kullan─▒m Durumu

Kamera ve nesne ile donat─▒lm─▒┼č bir depo robotu d├╝┼č├╝n├╝n Alg─▒lama modeli. Robot, a─č ├╝zerinden b├╝y├╝k a├ž─▒klamal─▒ g├Âr├╝nt├╝ler g├Ândermek yerine, alg─▒lanan s─▒n─▒flar─▒n bir listesini ┼ču ┼čekilde yay─▒nlayabilir: std_msgs/String Ileti. ├ľrne─čin, robot "kutu", "palet" ve "forklift" gibi nesneleri alg─▒lad─▒─č─▒nda bu s─▒n─▒flar─▒ /ultralytics/detection/classes konu. Bu bilgiler daha sonra envanteri ger├žek zamanl─▒ olarak izlemek, engellerden ka├ž─▒nmak i├žin robotun yol planlamas─▒n─▒ optimize etmek veya alg─▒lanan bir kutuyu almak gibi belirli eylemleri tetiklemek i├žin merkezi bir izleme sistemi taraf─▒ndan kullan─▒labilir. Bu yakla┼č─▒m, ileti┼čim i├žin gereken bant geni┼čli─čini azalt─▒r ve kritik verilerin iletilmesine odaklan─▒r.

Dize ad─▒m ad─▒m kullan─▒m─▒

Bu ├Ârnekte nas─▒l kullan─▒laca─č─▒ g├Âsterilmektedir. Ultralytics YOLO ROS ile paket. Bu ├Ârnekte, bir kamera konusuna abone oluyoruz, gelen g├Âr├╝nt├╝y├╝ kullanarak i┼čliyoruz. YOLOt─▒klat─▒n ve alg─▒lanan nesneleri yeni konuya yay─▒mlay─▒n /ultralytics/detection/classes Kullan -arak std_msgs/String Ileti. bu ros_numpy paketi, ROS G├Âr├╝nt├╝ mesaj─▒n─▒ ile i┼členmek ├╝zere bir numpy dizisine d├Ân├╝┼čt├╝rmek i├žin kullan─▒l─▒r. YOLO.

import time

import ros_numpy
import rospy
from sensor_msgs.msg import Image
from std_msgs.msg import String

from ultralytics import YOLO

detection_model = YOLO("yolov8m.pt")
rospy.init_node("ultralytics")
time.sleep(1)
classes_pub = rospy.Publisher("/ultralytics/detection/classes", String, queue_size=5)


def callback(data):
    """Callback function to process image and publish detected classes."""
    array = ros_numpy.numpify(data)
    if classes_pub.get_num_connections():
        det_result = detection_model(array)
        classes = det_result[0].boxes.cls.cpu().numpy().astype(int)
        names = [det_result[0].names[i] for i in classes]
        classes_pub.publish(String(data=str(names)))


rospy.Subscriber("/camera/color/image_raw", Image, callback)
while True:
    rospy.spin()

Kullanmak Ultralytics ROS Derinlik G├Âr├╝nt├╝leri ile

RGB g├Âr├╝nt├╝lere ek olarak, ROS, nesnelerin kameradan uzakl─▒─č─▒ hakk─▒nda bilgi sa─člayan derinlik g├Âr├╝nt├╝lerini destekler. Derinlik g├Âr├╝nt├╝leri, engellerden ka├ž─▒nma, 3D haritalama ve yerelle┼čtirme gibi robotik uygulamalar i├žin ├žok ├Ânemlidir.

Derinlik g├Âr├╝nt├╝s├╝, her pikselin kameradan bir nesneye olan mesafeyi temsil etti─či bir g├Âr├╝nt├╝d├╝r. Renkleri yakalayan RGB g├Âr├╝nt├╝lerin aksine, derinlik g├Âr├╝nt├╝leri uzamsal bilgileri yakalayarak robotlar─▒n ├ževrelerinin 3B yap─▒s─▒n─▒ alg─▒lamas─▒n─▒ sa─člar.

Derinlik G├Âr├╝nt├╝lerinin Elde Edilmesi

Derinlik g├Âr├╝nt├╝leri ├že┼čitli sens├Ârler kullan─▒larak elde edilebilir:

  1. Stereo Kameralar: G├Âr├╝nt├╝ e┼čitsizli─čine g├Âre derinli─či hesaplamak i├žin iki kamera kullan─▒n.
  2. U├žu┼č S├╝resi (ToF) Kameralar─▒: I┼č─▒─č─▒n bir nesneden d├Ânmesi i├žin ge├žen s├╝reyi ├Âl├ž├╝n.
  3. Yap─▒land─▒r─▒lm─▒┼č I┼č─▒k Sens├Ârleri: Bir desen yans─▒t─▒n ve y├╝zeylerdeki deformasyonunu ├Âl├ž├╝n.

Kullan -arak YOLO Derinlik G├Âr├╝nt├╝leri ile

ROS'ta derinlik g├Âr├╝nt├╝leri sensor_msgs/Image Kodlama, y├╝kseklik, geni┼člik ve piksel verileri i├žin alanlar─▒ i├žeren mesaj t├╝r├╝. Derinlik g├Âr├╝nt├╝leri i├žin kodlama alan─▒ genellikle "16UC1" gibi bir bi├žim kullan─▒r ve piksel ba┼č─▒na 16 bitlik i┼čaretsiz bir tamsay─▒y─▒ belirtir ve burada her de─čer nesneye olan mesafeyi temsil eder. Derinlik g├Âr├╝nt├╝leri, ortam─▒n daha kapsaml─▒ bir g├Âr├╝n├╝m├╝n├╝ sa─člamak i├žin genellikle RGB g├Âr├╝nt├╝lerle birlikte kullan─▒l─▒r.

Kullan -arak YOLO, hem RGB hem de derinlik g├Âr├╝nt├╝lerinden bilgi ├ž─▒karmak ve birle┼čtirmek m├╝mk├╝nd├╝r. ├ľrne─čin YOLO bir RGB g├Âr├╝nt├╝s├╝ndeki nesneleri alg─▒layabilir ve bu alg─▒lama, derinlik g├Âr├╝nt├╝s├╝ndeki kar┼č─▒l─▒k gelen b├Âlgeleri tam olarak belirlemek i├žin kullan─▒labilir. Bu, alg─▒lanan nesneler i├žin kesin derinlik bilgilerinin ├ž─▒kar─▒lmas─▒na olanak tan─▒yarak robotun ├ževresini ├╝├ž boyutlu olarak anlama yetene─čini geli┼čtirir.

RGB-D Foto─čraf Makineleri

Derinlik g├Âr├╝nt├╝leriyle ├žal─▒┼č─▒rken, RGB ve derinlik g├Âr├╝nt├╝lerinin do─čru ┼čekilde hizaland─▒─č─▒ndan emin olmak ├žok ├Ânemlidir. Intel RealSense serisi gibi RGB-D kameralar, senkronize RGB ve derinlik g├Âr├╝nt├╝leri sa─člayarak her iki kaynaktan gelen bilgilerin birle┼čtirilmesini kolayla┼čt─▒r─▒r. Ayr─▒ RGB ve derinlik kameralar─▒ kullan─▒l─▒yorsa, do─čru hizalamay─▒ sa─člamak i├žin bunlar─▒ kalibre etmek ├žok ├Ânemlidir.

Derinlik Ad─▒m Ad─▒m Kullan─▒m

Bu ├Ârnekte ┼čunu kullan─▒r─▒z: YOLO t─▒klayarak bir g├Âr├╝nt├╝y├╝ par├žalara ay─▒r─▒n ve nesneyi derinlik g├Âr├╝nt├╝s├╝nde par├žalara ay─▒rmak i├žin ay─▒klanan maskeyi uygulay─▒n. Bu, ilgilenilen nesnenin her pikselinin kameran─▒n odak merkezinden uzakl─▒─č─▒n─▒ belirlememizi sa─člar. Bu mesafe bilgisini elde ederek kamera ile sahnedeki belirli nesne aras─▒ndaki mesafeyi hesaplayabiliriz. Gerekli kitapl─▒klar─▒ i├že aktararak, bir ROS d├╝─č├╝m├╝ olu┼čturarak ve bir segmentasyon modeli ve bir ROS konusu ├Ârne─či olu┼čturarak ba┼člay─▒n.

import time

import rospy
from std_msgs.msg import String

from ultralytics import YOLO

rospy.init_node("ultralytics")
time.sleep(1)

segmentation_model = YOLO("yolov8m-seg.pt")

classes_pub = rospy.Publisher("/ultralytics/detection/distance", String, queue_size=5)

Ard─▒ndan, gelen derinlik g├Âr├╝nt├╝s├╝ mesaj─▒n─▒ i┼čleyen bir geri ├ža─č─▒rma i┼člevi tan─▒mlay─▒n. ─░┼člev, derinlik g├Âr├╝nt├╝s├╝ ve RGB g├Âr├╝nt├╝ mesajlar─▒n─▒ bekler, bunlar─▒ numpy dizilerine d├Ân├╝┼čt├╝r├╝r ve segmentasyon modelini RGB g├Âr├╝nt├╝s├╝ne uygular. Daha sonra alg─▒lanan her nesne i├žin segmentasyon maskesini ├ž─▒kar─▒r ve derinlik g├Âr├╝nt├╝s├╝n├╝ kullanarak nesnenin kameradan ortalama mesafesini hesaplar. ├ço─ču sens├Âr, klip mesafesi olarak bilinen ve de─čerlerin inf (np.inf). ─░┼člemeden ├Ânce, bu null de─čerleri filtrelemek ve bunlara bir de─čer atamak ├Ânemlidir. 0. Son olarak, alg─▒lanan nesneleri, ortalama mesafeleriyle birlikte yay─▒nlar. /ultralytics/detection/distance konu.

import numpy as np
import ros_numpy
from sensor_msgs.msg import Image


def callback(data):
    """Callback function to process depth image and RGB image."""
    image = rospy.wait_for_message("/camera/color/image_raw", Image)
    image = ros_numpy.numpify(image)
    depth = ros_numpy.numpify(data)
    result = segmentation_model(image)

    for index, cls in enumerate(result[0].boxes.cls):
        class_index = int(cls.cpu().numpy())
        name = result[0].names[class_index]
        mask = result[0].masks.data.cpu().numpy()[index, :, :].astype(int)
        obj = depth[mask == 1]
        obj = obj[~np.isnan(obj)]
        avg_distance = np.mean(obj) if len(obj) else np.inf

    classes_pub.publish(String(data=str(all_objects)))


rospy.Subscriber("/camera/depth/image_raw", Image, callback)

while True:
    rospy.spin()
Kodu tamamla
import time

import numpy as np
import ros_numpy
import rospy
from sensor_msgs.msg import Image
from std_msgs.msg import String

from ultralytics import YOLO

rospy.init_node("ultralytics")
time.sleep(1)

segmentation_model = YOLO("yolov8m-seg.pt")

classes_pub = rospy.Publisher("/ultralytics/detection/distance", String, queue_size=5)


def callback(data):
    """Callback function to process depth image and RGB image."""
    image = rospy.wait_for_message("/camera/color/image_raw", Image)
    image = ros_numpy.numpify(image)
    depth = ros_numpy.numpify(data)
    result = segmentation_model(image)

    for index, cls in enumerate(result[0].boxes.cls):
        class_index = int(cls.cpu().numpy())
        name = result[0].names[class_index]
        mask = result[0].masks.data.cpu().numpy()[index, :, :].astype(int)
        obj = depth[mask == 1]
        obj = obj[~np.isnan(obj)]
        avg_distance = np.mean(obj) if len(obj) else np.inf

    classes_pub.publish(String(data=str(all_objects)))


rospy.Subscriber("/camera/depth/image_raw", Image, callback)

while True:
    rospy.spin()

Kullanmak Ultralytics ROS ile sensor_msgs/PointCloud2

ROS Gazebo'da Alg─▒lama ve Segmentasyon

Bu sensor_msgs/PointCloud2 Mesaj T├╝r├╝ ROS'ta 3B nokta bulutu verilerini temsil etmek i├žin kullan─▒lan bir veri yap─▒s─▒d─▒r. Bu mesaj t├╝r├╝, robotik uygulamalar─▒n ayr─▒lmaz bir par├žas─▒d─▒r ve 3B haritalama, nesne tan─▒ma ve yerelle┼čtirme gibi g├Ârevleri etkinle┼čtirir.

Nokta bulutu, ├╝├ž boyutlu bir koordinat sistemi i├žinde tan─▒mlanan veri noktalar─▒n─▒n bir koleksiyonudur. Bu veri noktalar─▒, 3D tarama teknolojileri arac─▒l─▒─č─▒yla yakalanan bir nesnenin veya sahnenin d─▒┼č y├╝zeyini temsil eder. Buluttaki her nokta X, Yve Z uzaydaki konumuna kar┼č─▒l─▒k gelen koordinatlar ve ayr─▒ca renk ve yo─čunluk gibi ek bilgileri de i├žerebilir.

Referans ├žer├ževesi

Birlikte ├žal─▒┼č─▒rken sensor_msgs/PointCloud2, nokta bulutu verilerinin al─▒nd─▒─č─▒ sens├Âr├╝n referans ├žer├ževesini dikkate almak ├Ânemlidir. Nokta bulutu ba┼člang─▒├žta sens├Âr├╝n referans ├žer├ževesinde yakalan─▒r. Bu referans ├žer├ževesini dinleyerek belirleyebilirsiniz. /tf_static konu. Ancak, ├Âzel uygulama gereksinimlerinize ba─čl─▒ olarak, nokta bulutunu ba┼čka bir referans ├žer├ževesine d├Ân├╝┼čt├╝rmeniz gerekebilir. Bu d├Ân├╝┼č├╝m, tf2_ros paketi, koordinat ├žer├ževelerini y├Ânetmek ve bunlar aras─▒nda verileri d├Ân├╝┼čt├╝rmek i├žin ara├žlar sa─člar.

Nokta bulutlar─▒n─▒ elde etme

Nokta Bulutlar─▒ ├že┼čitli sens├Ârler kullan─▒larak elde edilebilir:

  1. LIDAR (I┼č─▒k Alg─▒lama ve Menzil): Nesnelere olan mesafeleri ├Âl├žmek ve y├╝ksek hassasiyetli 3D haritalar olu┼čturmak i├žin lazer darbeleri kullan─▒r.
  2. Derinlik Kameralar─▒: Her piksel i├žin derinlik bilgilerini yakalayarak sahnenin 3D yeniden yap─▒land─▒r─▒lmas─▒na olanak tan─▒r.
  3. Stereo Kameralar: Nirengi yoluyla derinlik bilgisi elde etmek i├žin iki veya daha fazla kamera kullan─▒n.
  4. Yap─▒land─▒r─▒lm─▒┼č I┼č─▒k Taray─▒c─▒lar─▒: Bilinen bir deseni bir y├╝zeye yans─▒t─▒n ve derinli─či hesaplamak i├žin deformasyonu ├Âl├ž├╝n.

Kullan -arak YOLO Nokta Bulutlar─▒ ile

Entegrasyon i├žin YOLO ile sensor_msgs/PointCloud2 Mesaj yaz─▒n, derinlik haritalar─▒ i├žin kullan─▒lana benzer bir y├Ântem kullanabiliriz. Nokta bulutuna g├Âm├╝l├╝ renk bilgilerinden yararlanarak, bir 2D g├Âr├╝nt├╝ ├ž─▒karabilir, bu g├Âr├╝nt├╝ ├╝zerinde segmentasyon ger├žekle┼čtirebiliriz. YOLOt─▒klat─▒n ve sonra elde edilen maskeyi ├╝├ž boyutlu noktalara uygulayarak ilgilenilen 3B nesneyi yal─▒t─▒n.

Nokta bulutlar─▒n─▒ i┼člemek i├žin Open3D (pip install open3d), kullan─▒c─▒ dostu bir Python k├╝t├╝phane. Open3D, nokta bulutu veri yap─▒lar─▒n─▒ y├Ânetmek, g├Ârselle┼čtirmek ve karma┼č─▒k i┼člemleri sorunsuz bir ┼čekilde y├╝r├╝tmek i├žin sa─člam ara├žlar sa─člar. Bu kitapl─▒k, s├╝reci ├Ânemli ├Âl├ž├╝de basitle┼čtirebilir ve nokta bulutlar─▒n─▒ a┼ča─č─▒dakilerle birlikte manip├╝le etme ve analiz etme yetene─čimizi geli┼čtirebilir: YOLO-tabanl─▒ segmentasyon.

Nokta Bulutlar─▒ Ad─▒m Ad─▒m Kullan─▒m─▒

Gerekli kitapl─▒klar─▒ i├že aktar─▒n ve YOLO segmentasyon modeli.

import time

import rospy

from ultralytics import YOLO

rospy.init_node("ultralytics")
time.sleep(1)
segmentation_model = YOLO("yolov8m-seg.pt")

─░┼člev olu┼čturma pointcloud2_to_array, bu da bir sensor_msgs/PointCloud2 mesaj─▒n─▒ iki numpy dizisine d├Ân├╝┼čt├╝r├╝n. bu sensor_msgs/PointCloud2 Mesajlar ┼čunlar─▒ i├žerir: n puanlara g├Âre width ve height elde edilen g├Âr├╝nt├╝n├╝n. ├ľrne─čin, bir 480 x 640 G├Âr├╝nt├╝de olacak 307,200 nokta. Her nokta ├╝├ž uzamsal koordinat i├žerir (xyz) ve kar┼č─▒l─▒k gelen renk RGB bi├žim. Bunlar iki ayr─▒ bilgi kanal─▒ olarak d├╝┼č├╝n├╝lebilir.

─░┼člev ┼čunu d├Ând├╝r├╝r: xyz koordinatlar ve RGB orijinal kamera ├ž├Âz├╝n├╝rl├╝─č├╝ bi├žimindeki de─čerler (width x height). ├ço─ču sens├Âr, klip mesafesi olarak bilinen ve de─čerlerin inf (np.inf). ─░┼člemeden ├Ânce, bu null de─čerleri filtrelemek ve bunlara bir de─čer atamak ├Ânemlidir. 0.

import numpy as np
import ros_numpy


def pointcloud2_to_array(pointcloud2: PointCloud2) -> tuple:
    """
    Convert a ROS PointCloud2 message to a numpy array.

    Args:
        pointcloud2 (PointCloud2): the PointCloud2 message

    Returns:
        (tuple): tuple containing (xyz, rgb)
    """
    pc_array = ros_numpy.point_cloud2.pointcloud2_to_array(pointcloud2)
    split = ros_numpy.point_cloud2.split_rgb_field(pc_array)
    rgb = np.stack([split["b"], split["g"], split["r"]], axis=2)
    xyz = ros_numpy.point_cloud2.get_xyz_points(pc_array, remove_nans=False)
    xyz = np.array(xyz).reshape((pointcloud2.height, pointcloud2.width, 3))
    nan_rows = np.isnan(xyz).all(axis=2)
    xyz[nan_rows] = [0, 0, 0]
    rgb[nan_rows] = [0, 0, 0]
    return xyz, rgb

Ard─▒ndan, abone olun /camera/depth/points Nokta bulutu mesaj─▒n─▒ almak ve sensor_msgs/PointCloud2 XYZ koordinatlar─▒n─▒ ve RGB de─čerlerini i├žeren numpy dizilerine mesaj g├Ânderin ( pointcloud2_to_array i┼člevi). kullanarak RGB g├Âr├╝nt├╝s├╝n├╝ i┼čleyin YOLO Par├žal─▒ nesneleri ay─▒klamak i├žin model. Alg─▒lanan her nesne i├žin, segmentasyon maskesini ├ž─▒kar─▒n ve nesneyi 3B alanda izole etmek i├žin hem RGB g├Âr├╝nt├╝s├╝ne hem de XYZ koordinatlar─▒na uygulay─▒n.

Maskenin i┼členmesi, ikili de─čerlerden olu┼čtu─ču i├žin basittir. 1 nesnenin varl─▒─č─▒n─▒ g├Âsteren ve 0 yoklu─ču g├Âsterir. Maskeyi uygulamak i├žin orijinal kanallar─▒ maske ile ├žarpman─▒z yeterlidir. Bu i┼člem, ilgilenilen nesneyi g├Âr├╝nt├╝ i├žinde etkili bir ┼čekilde izole eder. Son olarak, bir Open3D nokta bulutu nesnesi olu┼čturun ve par├žalanm─▒┼č nesneyi ili┼čkili renklerle 3B alanda g├Ârselle┼čtirin.

import sys

import open3d as o3d

ros_cloud = rospy.wait_for_message("/camera/depth/points", PointCloud2)
xyz, rgb = pointcloud2_to_array(ros_cloud)
result = segmentation_model(rgb)

if not len(result[0].boxes.cls):
    print("No objects detected")
    sys.exit()

classes = result[0].boxes.cls.cpu().numpy().astype(int)
for index, class_id in enumerate(classes):
    mask = result[0].masks.data.cpu().numpy()[index, :, :].astype(int)
    mask_expanded = np.stack([mask, mask, mask], axis=2)

    obj_rgb = rgb * mask_expanded
    obj_xyz = xyz * mask_expanded

    pcd = o3d.geometry.PointCloud()
    pcd.points = o3d.utility.Vector3dVector(obj_xyz.reshape((ros_cloud.height * ros_cloud.width, 3)))
    pcd.colors = o3d.utility.Vector3dVector(obj_rgb.reshape((ros_cloud.height * ros_cloud.width, 3)) / 255)
    o3d.visualization.draw_geometries([pcd])
Kodu tamamla
import sys
import time

import numpy as np
import open3d as o3d
import ros_numpy
import rospy

from ultralytics import YOLO

rospy.init_node("ultralytics")
time.sleep(1)
segmentation_model = YOLO("yolov8m-seg.pt")


def pointcloud2_to_array(pointcloud2: PointCloud2) -> tuple:
    """
    Convert a ROS PointCloud2 message to a numpy array.

    Args:
        pointcloud2 (PointCloud2): the PointCloud2 message

    Returns:
        (tuple): tuple containing (xyz, rgb)
    """
    pc_array = ros_numpy.point_cloud2.pointcloud2_to_array(pointcloud2)
    split = ros_numpy.point_cloud2.split_rgb_field(pc_array)
    rgb = np.stack([split["b"], split["g"], split["r"]], axis=2)
    xyz = ros_numpy.point_cloud2.get_xyz_points(pc_array, remove_nans=False)
    xyz = np.array(xyz).reshape((pointcloud2.height, pointcloud2.width, 3))
    nan_rows = np.isnan(xyz).all(axis=2)
    xyz[nan_rows] = [0, 0, 0]
    rgb[nan_rows] = [0, 0, 0]
    return xyz, rgb


ros_cloud = rospy.wait_for_message("/camera/depth/points", PointCloud2)
xyz, rgb = pointcloud2_to_array(ros_cloud)
result = segmentation_model(rgb)

if not len(result[0].boxes.cls):
    print("No objects detected")
    sys.exit()

classes = result[0].boxes.cls.cpu().numpy().astype(int)
for index, class_id in enumerate(classes):
    mask = result[0].masks.data.cpu().numpy()[index, :, :].astype(int)
    mask_expanded = np.stack([mask, mask, mask], axis=2)

    obj_rgb = rgb * mask_expanded
    obj_xyz = xyz * mask_expanded

    pcd = o3d.geometry.PointCloud()
    pcd.points = o3d.utility.Vector3dVector(obj_xyz.reshape((ros_cloud.height * ros_cloud.width, 3)))
    pcd.colors = o3d.utility.Vector3dVector(obj_rgb.reshape((ros_cloud.height * ros_cloud.width, 3)) / 255)
    o3d.visualization.draw_geometries([pcd])

Nokta Bulutu Segmentasyonu Ultralytics

SSS

Robot ─░┼čletim Sistemi (ROS) nedir?

Robot ─░┼čletim Sistemi (ROS), geli┼čtiricilerin sa─člam robot uygulamalar─▒ olu┼čturmalar─▒na yard─▒mc─▒ olmak i├žin robotikte yayg─▒n olarak kullan─▒lan a├ž─▒k kaynakl─▒ bir ├žer├ževedir. Robotik sistemler olu┼čturmak ve bunlarla aray├╝z olu┼čturmak i├žin bir k├╝t├╝phaneler ve ara├žlar koleksiyonu sa─člayarak karma┼č─▒k uygulamalar─▒n daha kolay geli┼čtirilmesini sa─člar. ROS, konular veya hizmetler ├╝zerinden mesajlar kullanarak d├╝─č├╝mler aras─▒ndaki ileti┼čimi destekler.

Ger├žek zamanl─▒ nesne alg─▒lama i├žin Ultralytics YOLO adresini ROS ile nas─▒l entegre edebilirim?

Ultralytics YOLO adresini ROS ile entegre etmek, bir ROS ortam─▒ kurmay─▒ ve sens├Âr verilerini i┼člemek i├žin YOLO adresini kullanmay─▒ i├žerir. A┼ča─č─▒daki gibi gerekli ba─č─▒ml─▒l─▒klar─▒ y├╝kleyerek ba┼člay─▒n ros_numpy ve Ultralytics YOLO :

pip install ros_numpy ultralytics

Ard─▒ndan, bir ROS d├╝─č├╝m├╝ olu┼čturun ve gelen verileri i┼člemek i├žin bir g├Âr├╝nt├╝ konusuna abone olun. ─░┼čte minimal bir ├Ârnek:

import ros_numpy
import rospy
from sensor_msgs.msg import Image

from ultralytics import YOLO

detection_model = YOLO("yolov8m.pt")
rospy.init_node("ultralytics")
det_image_pub = rospy.Publisher("/ultralytics/detection/image", Image, queue_size=5)


def callback(data):
    array = ros_numpy.numpify(data)
    det_result = detection_model(array)
    det_annotated = det_result[0].plot(show=False)
    det_image_pub.publish(ros_numpy.msgify(Image, det_annotated, encoding="rgb8"))


rospy.Subscriber("/camera/color/image_raw", Image, callback)
rospy.spin()

ROS konular─▒ nelerdir ve Ultralytics YOLO adresinde nas─▒l kullan─▒l─▒rlar?

ROS konular─▒, bir yay─▒nla-abone ol modelini kullanarak bir ROS a─č─▒ndaki d├╝─č├╝mler aras─▒ndaki ileti┼čimi kolayla┼čt─▒r─▒r. Bir konu, d├╝─č├╝mlerin e┼čzamans─▒z olarak mesaj g├Ândermek ve almak i├žin kulland─▒─č─▒ adland─▒r─▒lm─▒┼č bir kanald─▒r. Ultralytics YOLO ba─člam─▒nda, bir d├╝─č├╝m├╝ bir g├Âr├╝nt├╝ konusuna abone yapabilir, alg─▒lama veya segmentasyon gibi g├Ârevler i├žin YOLO kullanarak g├Âr├╝nt├╝leri i┼čleyebilir ve sonu├žlar─▒ yeni konulara yay─▒nlayabilirsiniz.

├ľrne─čin, bir kamera konusuna abone olun ve gelen g├Âr├╝nt├╝y├╝ alg─▒lama i├žin i┼čleyin:

rospy.Subscriber("/camera/color/image_raw", Image, callback)

Neden ROS'ta Ultralytics YOLO ile derinlik g├Âr├╝nt├╝leri kullan─▒lmal─▒?

ile temsil edilen ROS'taki derinlik g├Âr├╝nt├╝leri sensor_msgs/Imageengellerden ka├ž─▒nma, 3B haritalama ve yerelle┼čtirme gibi g├Ârevler i├žin ├žok ├Ânemli olan nesnelerin kameradan uzakl─▒─č─▒n─▒ sa─člar. Taraf─▒ndan derinlik bilgisini kullanma RGB g├Âr├╝nt├╝lerle birlikte robotlar 3D ortamlar─▒n─▒ daha iyi anlayabilir.

YOLO ile RGB g├Âr├╝nt├╝lerden segmentasyon maskeleri ├ž─▒karabilir ve bu maskeleri derinlik g├Âr├╝nt├╝lerine uygulayarak hassas 3D nesne bilgileri elde edebilir, robotun gezinme ve ├ževresiyle etkile┼čim kurma becerisini geli┼čtirebilirsiniz.

ROS'ta YOLO ile 3B nokta bulutlar─▒n─▒ nas─▒l g├Ârselle┼čtirebilirim?

ROS'ta 3D nokta bulutlar─▒n─▒ YOLO ile g├Ârselle┼čtirmek i├žin:

  1. D├Ân├╝┼čt├╝r sensor_msgs/PointCloud2 mesajlar─▒n─▒ numpy dizilerine d├Ân├╝┼čt├╝r├╝r.
  2. RGB g├Âr├╝nt├╝leri b├Âl├╝mlere ay─▒rmak i├žin YOLO adresini kullan─▒n.
  3. Segmentasyon maskesini nokta bulutuna uygulay─▒n.

─░┼čte g├Ârselle┼čtirme i├žin Open3D kullanan bir ├Ârnek:

import sys

import open3d as o3d
import ros_numpy
import rospy
from sensor_msgs.msg import PointCloud2

from ultralytics import YOLO

rospy.init_node("ultralytics")
segmentation_model = YOLO("yolov8m-seg.pt")


def pointcloud2_to_array(pointcloud2):
    pc_array = ros_numpy.point_cloud2.pointcloud2_to_array(pointcloud2)
    split = ros_numpy.point_cloud2.split_rgb_field(pc_array)
    rgb = np.stack([split["b"], split["g"], split["r"]], axis=2)
    xyz = ros_numpy.point_cloud2.get_xyz_points(pc_array, remove_nans=False)
    xyz = np.array(xyz).reshape((pointcloud2.height, pointcloud2.width, 3))
    return xyz, rgb


ros_cloud = rospy.wait_for_message("/camera/depth/points", PointCloud2)
xyz, rgb = pointcloud2_to_array(ros_cloud)
result = segmentation_model(rgb)

if not len(result[0].boxes.cls):
    print("No objects detected")
    sys.exit()

classes = result[0].boxes.cls.cpu().numpy().astype(int)
for index, class_id in enumerate(classes):
    mask = result[0].masks.data.cpu().numpy()[index, :, :].astype(int)
    mask_expanded = np.stack([mask, mask, mask], axis=2)

    obj_rgb = rgb * mask_expanded
    obj_xyz = xyz * mask_expanded

    pcd = o3d.geometry.PointCloud()
    pcd.points = o3d.utility.Vector3dVector(obj_xyz.reshape((-1, 3)))
    pcd.colors = o3d.utility.Vector3dVector(obj_rgb.reshape((-1, 3)) / 255)
    o3d.visualization.draw_geometries([pcd])

Bu yakla┼č─▒m, navigasyon ve manip├╝lasyon gibi g├Ârevler i├žin yararl─▒ olan b├Âl├╝mlere ayr─▒lm─▒┼č nesnelerin 3D g├Ârselle┼čtirmesini sa─člar.



Olu┼čturma 2024-06-19, G├╝ncelleme 2024-07-05
Yazarlar: glenn-jocher (2), RizwanMunawar (1), ambitious-octopus (3)

Yorumlar