Deteksi dan pengenalan objek dari kamera di ROS menggunakan paket find_object_2d



Salah satu manfaat Sistem Operasi Robot (ROS) adalah memiliki banyak paket yang dapat digunakan kembali dalam aplikasi kita. Dalam kasus kami, kami ingin memperkenalkan sistem pengenalan dan deteksi objek. Paket find_object_2d mengimplementasikan detektor fungsi dan deskriptor SURF, SIFT, ORB, FAST, dan BRIEF untuk mendeteksi objek . Dengan menggunakan antarmuka grafis yang disediakan oleh paket ini, kita dapat menandai objek yang ingin kita deteksi dan menyimpannya untuk deteksi di masa mendatang. Node detektor akan mendeteksi objek dalam gambar kamera dan mempublikasikan detail objek melalui subjek. Menggunakan sensor 3D, dapat mengevaluasi kedalaman dan orientasi suatu objek.

Di akhir artikel, pengujian video pada contoh algoritma ORB dan SIFT.

Pengaturan find_object_2d


Menginstal paket ini cukup sederhana. Ini adalah perintah untuk menginstalnya di Ubuntu 16.04 dan ROS Kinetic:

$ sudo apt-get install ros-kinetic-find-object-2d 

Instal dari sumber


Beralih ke ruang kerja ROS:

 $ cd ~/catkin_ws/src 

Salin kode sumber ke folder src:

 $ git clone https://github.com/introlab/find-object.git src/find_object_2d 

Buat ruang kerja:

 $ catkin_make 

Menjalankan node find_object_2d menggunakan webcam


Berikut ini adalah prosedur untuk memulai node detektor untuk webcam. Jika kita ingin mendeteksi objek menggunakan webcam, pertama-tama kita harus menginstal paket usb_cam (lihat artikel sebelumnya).

1. Luncurkan roscore:

 $ roscore 

2.1 Hubungkan kamera USB ke komputer dan jalankan driver USB_cam ROS:

 $ roslaunch usb_cam usb_cam-test.launch 

Ini akan meluncurkan driver ROS untuk webcam USB, dan Anda dapat melihat topik dalam driver ini menggunakan perintah daftar rostopic. Daftar topik dalam driver ditampilkan di sini:


Topik diterbitkan dari driver kamera

2.2 Cara alternatif untuk menyiarkan video dari kamera melalui uvc_camera:

 $ rosrun uvc_camera uvc_camera_node 

3. Dari daftar topik, kita akan menggunakan tema gambar mentah dari kamera, yang diterbitkan dalam topik / usb_cam / image_raw. Jika Anda mendapatkan topik ini, maka langkah selanjutnya adalah meluncurkan node penemuan objek. Perintah berikut akan memulai node penemuan objek:

 $ rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw 

Perintah ini akan membuka jendela deteksi objek di mana kita melihat saluran kamera dan fitur objek.

4. Jadi, bagaimana kita bisa menggunakannya untuk mendeteksi objek? Berikut ini adalah prosedur untuk melakukan penemuan dasar menggunakan alat ini:


Jendela Deteksi Cari-Objek

5. Anda dapat mengklik kanan pada panel sisi kiri (Objek) dari jendela ini, dan Anda akan mendapatkan kesempatan untuk menambahkan objek dari adegan. Jika Anda memilih opsi ini, Anda akan diminta untuk menandai objek dari adegan saat ini, dan setelah penandaan selesai, objek yang ditandai akan mulai dilacak dari adegan tersebut. Tangkapan layar sebelumnya menunjukkan langkah pertama di mana adegan dengan objek ditangkap.

6. Setelah mengarahkan objek ke kamera, klik tombol "Ambil Gambar" untuk mengklik objek:


Tambahkan Wizard Objek untuk Mengabadikan Objek

7. Jendela berikutnya adalah untuk menandai objek dari penjilidan saat ini. Gambar berikut menunjukkan ini. Kita dapat menggunakan kursor mouse untuk menandai objek. Klik tombol "Next" untuk memotong objek, dan Anda dapat melanjutkan ke langkah berikutnya:


Tambahkan Wizard Objek ke Label suatu Obyek

8. Setelah memangkas objek, itu akan menunjukkan jumlah total deskriptor fungsi untuk objek, dan Anda dapat mengklik tombol "End" untuk menambahkan templat objek untuk dideteksi. Gambar berikut menunjukkan langkah terakhir menambahkan templat objek ke aplikasi detektor ini:


Langkah terakhir dari Add Features Wizard

9. Selamat! Anda telah menambahkan objek untuk ditemukan. Sekarang Anda dapat melihat deteksi yang ditunjukkan pada bidikan berikutnya. Anda dapat melihat kotak pembatas di sekitar objek yang terdeteksi:


Menemukan-Obyek Wisaya Peluncuran Penemuan

10. Apakah ini cukup? Bagaimana dengan posisi objek? Kita bisa mendapatkannya
posisi objek menggunakan perintah berikut:

 $ rosrun find_object_2d print_objects_detected 


Detail Properti

11. Anda juga dapat memperoleh informasi lengkap tentang objek yang terdeteksi
/ Objek topik. Topik ini menerbitkan array multicast yang terdiri dari lebar dan tinggi objek dan matriks homografi untuk menghitung posisi dan orientasi objek serta skala dan nilai offsetnya. Anda bisa mendapatkan topik gema / objek seperti ini:


Nilai tema / objek

12. Kita dapat menghitung posisi dan orientasi baru dari persamaan berikut:


Persamaan untuk menghitung posisi objek

Di sini H adalah homografi dari matriks 3 Γ— 3, (x1, y1) adalah posisi objek dalam gambar yang disimpan, dan (x2, y2) adalah posisi objek yang dihitung dalam bingkai saat ini.
Anda dapat memeriksa kode sumber simpul print_objected_src untuk mendapatkan konversi menggunakan matriks homografi.

Berikut adalah kode sumber untuk simpul ini.

Pengujian video dari paket find_object_2d menggunakan contoh algoritma ORB dan SIFT



Ringkasan algoritma: ORB cepat, tetapi tidak melihat objek jarak jauh dan seringkali tidak menentukan geometri dengan benar. SIFT melihat objek jarak jauh, secara akurat menentukan geometri, kontra membutuhkan sumber daya komputasi yang besar dan dibayar untuk penggunaan komersial.

Pertanyaan yang harus dipecahkan oleh robot EduMIP :

  1. Terima dari kamera Logitech C920 di BeagleBone Blue, video yang sudah dikodekan dengan perangkat keras dan transfer dalam bentuk ini ke komputer besar di ROS.
  2. Hubungkan sensor jarak VL6180X, Vl53l0x dan bumper untuk membangun peta di ROS. (Aksesori sudah dipesan)
  3. Tulis algoritma dalam ROS yang akan memproses data peta dan objek yang terdeteksi dari kamera dan membangun rute pergerakan berdasarkan mereka.

Jika ada penggemar robotika seperti saya yang siap untuk bergabung dengan proyek ini, kemudian menulis dalam email pribadi, saya perlu bantuan tentang masalah di atas.

Source: https://habr.com/ru/post/id414991/


All Articles