Tambahkan mata ke robot

Terkadang robot perlu mengambil sesuatu. Robot itu tanpa mata seolah tanpa tangan. Dalam arti harfiah. Lagi pula, tidak tahu di mana yummy berada, robot tidak akan bisa mencapainya dengan lengan robotnya. Atau manipulator lainnya.

Pada artikel ini kita akan mencari cara untuk mengkalibrasi robot agar dapat beralih antara Sistem Koordinat Robot dan kamera 3D SK.



Langkah 1. Ambil robot

Kami akan memiliki item pemindah Dobot Magician. Tonton bagaimana ia akan memindahkan objek - Intel Realsense D435. Dan objek kalibrasi harus berupa bola merah.

Ini adalah bagaimana mereka terlihat bersama.



Bola merah dipilih bukan hanya bahwa seseorang harus menghiasi pohon Natal . Merah - sehingga dapat dengan mudah ditemukan pada gambar (tanpa mempelajari jaringan lain). Ball - untuk menghitung pusatnya secara lebih akurat dalam gambar. Tapi kita akan kembali lagi nanti.

Langkah 2. Di mana robot menggerakkan bola

Algoritma kalibrasi dapat digambarkan sebagai berikut:

  1. Hasilkan daftar posisi di ruang angkasa
  2. Robot menggerakkan bola melewati daftar, mengambil gambar dengannya.
  3. Untuk setiap gambar kami menemukan koordinat bola
  4. Kami menghitung konversi koordinat kamera ke koordinat robot

Posisi harus dipilih untuk mencakup sebanyak mungkin ruang yang tersedia. Lebih baik tidak mengambil bola kecil, ini akan mengurangi akurasi kalibrasi.

Kami tidak akan memberikan di sini kode untuk merekam kalibrasi, karena terlalu bergantung pada robot itu sendiri, kamera, lingkungan di mana semuanya dijalankan (misalnya, kami melakukannya di ROS). Yang penting adalah bahwa untuk kalibrasi lebih lanjut, Anda dapat mengambil foto bahkan dalam mode manual, mengirim langkah-langkah untuk mengirim robot ke posisi dan menyimpan foto.

Satu-satunya persyaratan adalah posisi relatif kamera dan robot tetap tidak berubah sepanjang waktu. Kami juga menyarankan Anda untuk segera memotret set gambar kedua untuk validasi - untuk mengevaluasi seberapa akurat kalibrasi dihitung.

Langkah 3. Dapatkan koordinat

Kami tahu koordinat manipulator, karena kami secara khusus mengirim robot ke posisi yang ditentukan dalam daftar. Untuk robot dengan derajat kebebasan yang besar, Anda harus menentukan lebih banyak parameter, tetapi di lengan robot 4-sumbu kami, posisinya ditentukan secara unik oleh koordinat ujung lengan robot. Jadi kami hanya menjaga posisi di mana tangan berada.



Untuk gambar bola, koordinatnya belum dihitung. Kami akan menggunakan objek yang dipilih dengan baik untuk kalibrasi. Kami merumuskan kembali tugas menemukan bola sebagai "menemukan wilayah merah terbesar", yang pada python + opencv akan terdengar seperti:

def get_center(image): #       image = cv2.GaussianBlur(image, (7, 7), 0) #     HSV hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) #    saturation = hsv[...,1] saturation[(hsv[..., 0] > 15) & (hsv[..., 0] < 165)] = 0 _, image1 = cv2.threshold(saturation, 92, 255, cv2.THRESH_BINARY) #     contours = cv2.findContours(image1, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0] contour = max(contours, key=cv2.contourArea) #    b_circle = cv2.minEnclosingCircle(contour) return b_circle[0] 

Mari kita lihat lebih dekat.

Setelah mengonversi ke ruang HSV, gambar terlihat seperti ini:



Seperti yang dapat Anda lihat, untuk piksel gelap, rona cukup bising, dan kriteria tambahan untuk segmentasi diperlukan. Hanya menyisakan piksel merah  texthue[u,v] di[15;15], dan lihat saluran saturasi. Di saluran ini, bola kalibrasi menonjol dengan jelas.

Maka kriteria terakhir akan terlihat seperti ini:

  • Periksa bahwa bayangan kurang lebih merah
  • Hanya menyisakan piksel dengan saturasi di atas ambang yang diberikan
  • Binari gambar

Setelah itu kita mendapatkan sesuatu seperti berikut:



Sekarang Anda perlu menemukan koordinat pusat bola. Ada beberapa pendekatan yang berbeda, misalnya, Anda dapat menyesuaikan model 3D bola ke awan titik. Namun, untuk realsense D435, nilai kedalaman pada batas objek cukup bising, jadi kita akan pergi ke arah lain.

Kami berasumsi bahwa bola di sini adalah area terhubung terbesar. Kemudian kami menemukan pusatnya dan mencari tahu kedalaman ke titik ini di permukaan bola dari kedalaman saluran. Dan dengan sedikit bantuan dari stereometri, mari kita bergerak dari titik yang terlihat di permukaan bola ke pusatnya.

Untuk menemukan pusat bola, kami menggunakan pengetahuan bahwa proyeksi harus berupa lingkaran, dan kami ingin mendapatkan estimasi tengah yang tidak bias (tetapi cangkir hisap robot berusaha mencegah kami). Di sini cukup untuk menemukan lingkaran area minimum yang menggambarkan area ini, dan ini sudah diputuskan dalam opencv - minEnclosingCircle .

Setelah menerima 2 koordinat titik u, v dalam piksel, dan kedalamannya dalam milimeter, kami menerjemahkannya ke dalam koordinat fisik di kamera SK:

 def get_world_coords(u, v, depth, camera_matrix): f = np.linalg.inv(camera_matrix) l = np.array([u,v,1]) * depth return np.dot(f,l) 

camera_matrix - matriks parameter internal kamera, sesuai dengan rumus .

Langkah 4. Lakukan kalibrasi

Saat ini, kami telah menerima 2 set titik untuk posisi berbeda di luar angkasa: koordinat bagian atas bola - titik di mana bola menghisap robot di SC robot, dan koordinat pusat bola yang terlihat - titik bola yang paling dekat dengan kamera di kamera SC. Untuk membandingkannya, pertama-tama Anda harus membawanya ke satu titik fisik bola.

Dan cara termudah adalah menerjemahkan poin-poin ini ke tengah bola. Kami mengukur jari-jarinya r = 24mm. Maka jelas bagaimana mendapatkan koordinat pusat bola O dari titik singgung K - sentuhan selalu 1 jari-jari lebih tinggi di sepanjang sumbu Z.

Tetap menerjemahkan koordinat pusat V dari wilayah yang terlihat ke dalam koordinat pusat bola O. Untuk menjelaskan cara melakukan ini, gunakan gambar:



Ternyata pusat bola O yang sebenarnya selalu tepat 1 jari-jari lebih dalam dari titik yang terlihat V. Ini berarti bahwa vektor radius yang ditemukan harus diperpanjang 24 mm.

 vecCO= vecCV+ frac vecCV| vecCV|r



Tetap sedikit - memiliki 2 set koordinat 3D yang sesuai dengan titik fisik yang sama, temukan transformasi set pertama ke yang kedua. Kami akan menggunakan fungsi opencv cv2.estimateAffine3D untuk ini. Untuk koordinat yang ditemukan secara ideal, transformasi affine tentu saja enumerasi, untuk menggambarkan transformasi titik, rotasi dan perpindahan cukup, ekstensi akan berlebihan. Namun, penggunaan transformasi affine memungkinkan Anda untuk mengkompensasi ketidakakuratan dengan matriks parameter kamera internal yang dihitung dengan buruk. Bahkan lebih dari itu, ini memungkinkan Anda untuk mendapatkan kalibrasi tanpa mengetahuinya sama sekali.

 transformation = cv2.estimateAffine3D(camera_coords, robot_coords) 

Outputnya adalah matriks transformasi 3x4, komponen 3x3 pertama adalah matriks rotasi yang dikombinasikan dengan ekstensi di sepanjang sumbu. Dengan kalibrasi kamera yang benar dan data input yang baik, Anda harus mendapatkan matriks yang dekat dengan matriks rotasi. 3 angka yang tersisa adalah vektor perpindahan antara kamera dan robot.

Langkah 5. Kami menggunakan kalibrasi

Untuk menggunakan kalibrasi yang dihasilkan, Anda harus mengulangi transformasi yang ditentukan. Kami membawanya ke satu algoritma tunggal.

  1. Kami menemukan pada gambar RGBD koordinat titik u, v, kedalaman yang menarik bagi kami
  2. Kami menerjemahkannya ke dalam koordinat fisik x, y, z di kamera SK menggunakan matriks parameter internal
  3. Dalam kasus bola, poin yang menarik bagi kami adalah kedalaman bola v= frac|v|+r|v| cdotv,v=[x,y,z]
  4. Kami menerapkan transformasi transformasi yang ditemukan, yang kami tunjukkan dengan matriks T
    v=T kali[v0,v1,v2,1]T
  5. Kami mendapat koordinat tengah bola di robot SK. Agar robot tidak mencoba menembus bola, kami mengirim titik 1 radius lebih tinggi untuk kontrol v=[v0,v1,v2+r]

Akurasi kalibrasi

Kami menghitung kalibrasi pada 9 posisi. Pada set validasi 6 posisi lagi, akurasi 2,5 mm diperoleh dengan area kerja 16x30x5 cm. Untuk melakukan ini, kami menerapkan transformasi yang ditemukan ke gambar yang tersisa dan menghitung panjang rata-rata vektor kesalahan.

Langkah 6. Kami menggunakan dalam tugas yang diterapkan

Setelah melakukan kalibrasi, Anda dapat mulai memecahkan masalah nyata. Sebagai contoh, kami menghubungkan helm VR dengan pengontrol dan mampu mengendalikan robot dan memindahkan kubus dalam realitas virtual.


Tetapi metode kalibrasi ini cukup umum. Tidak masalah kamera dan robot mana yang digunakan, metode yang dijelaskan memudahkan menghitung hubungan antara sistem koordinat robot dan kamera. Selain itu, dengan perubahan kecil, metode ini otonom sehingga robot dapat secara otomatis melakukan kalibrasi, karena seiring waktu kamera akan bergerak relatif terhadap robot.

Vasyutka dan ZlodeiBaal dan saya berencana untuk terus berbicara tentang dunia robot, VR, dan pembelajaran mesin, jika itu menarik. Dan sumber kalibrasi dapat ditemukan di geit saya.

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


All Articles