Kami bekerja dengan cobot Dobot M1

Setahun yang lalu di Habré ulasan tentang robot desktop Dobot Magician keluar. Dalam artikel ini, saya mengusulkan untuk mengevaluasi abangnya, Dobot M1, dalam aksinya. Saya juga akan mencoba menjelaskan mengapa saya memilih model khusus ini untuk proyek saya, saya akan menjelaskan proses pengembangan demo di Qt / c ++, serta beberapa momen tidak menyenangkan yang saya temui selama proses pengembangan.

Pendahuluan


Tahun ini saya bekerja di salah satu institut penelitian paling umum. Pada awalnya, semuanya cukup santai, dan tahun tidak menjanjikan sesuatu yang menarik, sampai suatu hari di sebuah rapat umum diskusi tentang bagaimana membuat perakitan sel surya (shingled solar cells). Pendekatan ini bukanlah hal yang baru, kata mereka , ini adalah salah satu cara pertama untuk merakit panel untuk satelit ruang angkasa.

Saya tidak tahu seberapa benar ini karena saya belum melihat artikel atau paten. Tetapi minat publik terhadap keputusan ini telah memanas, sebagian juga karena beberapa tahun yang lalu SunPower meluncurkan panel baru, yang disebut seri-P . Kebetulan di dunia fotovoltaik bahwa karena sanpower melakukan sesuatu, maka semua orang harus melakukan hal ini juga. Itu dia. Semuanya sederhana: kami menyiapkan substrat, memotongnya menjadi potongan-potongan dan berkumpul. Pada saat itu, saya mencatat bahwa saya secara pribadi pasti tidak akan mengumpulkan apa pun secara manual, karena tangan saya tidak berbeda secara merata. Kalau tidak, hasilnya mungkin seperti satu video di YouTube. Dan kita, bagaimanapun juga, adalah seluruh institusi, jika kita benar-benar melakukan sesuatu, itu bukan pertanian kolektif. Saya menawarkan untuk membeli robot dan mengkonfigurasinya untuk proses yang diinginkan, dan mereka memberi saya lampu hijau.

Perlu dicatat bahwa kami memutuskan untuk memulai yang lebih sederhana dan merakit panel mini. Mini-panel adalah panel surya yang lebih kecil dari standar. Kami melakukan ini untuk mengerjakan proses teknologi. Pertama, saya dipandu oleh panel dengan ukuran 1 sel surya standar dengan rencana penskalaan ke panel 2 x 2. Ukuran sisi satu sel surya adalah 16 cm. Dengan demikian, robot dibutuhkan dengan bidang akses 32 x 32 cm. Saya ingin akurasi yang lebih akurat dan harga lebih murah . Jadi, dengan dipersenjatai bilah pencarian, saya mulai mempelajari kalimat-kalimat itu. Saya memutuskan bahwa 6 sumbu tidak diperlukan untuk proyek, 4 sudah cukup, jadi pilihannya dipersempit menjadi robot seperti bekas luka. Saya menemukan bahwa membeli robot industri disertai dengan biaya tambahan, seperti merancang ruang kerja yang aman dan meninggalkan insinyur aplikasi di lokasi instalasi, yang memprogram robot untuk tugas Anda. Robot industri yang baik pada prinsipnya mahal, dan layanan insinyur akan meningkatkan harga bahkan lebih, apalagi, itu menarik untuk mengimplementasikan proyek sendiri. Oleh karena itu, pilihan dipersempit menjadi cobot, robot kolaboratif, dengan persyaratan keamanan yang lebih rendah dan lebih ramah untuk prototipe diri. Jadi, saya segera menemukan perusahaan Dobot. Saya segera menjatuhkan Dobot Magician karena ukuran dan ketepatannya, yaitu 100 mikron. Saya menulis permintaan kepada mereka untuk memberikan spesifikasi dan memberi tahu tempat untuk membeli. Saya menemukan bahwa dengan API ada API dan mereka dapat diprogram dalam C ++. Itu cocok untuk saya, tetapi saya tidak bisa membelinya secara langsung. Untungnya, saya menemukan satu pemasok di Belanda, yang menjual saya 2 buah untuk € 8700 dengan PPN, dengan pengiriman dari Cina, dan pada saat yang sama mengambil alih semua bea cukai.

Fitur kebaikan




Dobot M1 diposisikan sebagai robot kolaborasi profesional 4-sumbu yang terjangkau. Itu dapat menahan hingga 1,5 kg beban (tidak diuji), memiliki jangkauan hingga 400 mm (tidak di mana-mana) dan akurasi hingga 20 mikron (dicentang). Ruang kerja kebaikan terlihat pada gambar di bawah ini. Tidak sulit untuk memperhatikan bahwa karena fitur desain ada zona buta dengan jari-jari sedikit kurang dari 15 sentimeter di depan. Selain itu, peta ruang ini tidak memperhitungkan orientasi tangan. Dobot dapat berupa tangan kanan atau tangan kiri, saya masih belum tahu bagaimana ini bisa diaktifkan saat bepergian tanpa kalibrasi tambahan. Secara default, Dobot adalah tangan kanan, yang berarti bahwa zona kanan dibatasi oleh area akses dari sendi ke-2, ketika sambungan pertama diarahkan ke kanan. Jadi area sebenarnya dari ruang kerja adalah sekitar 2/3 dari yang ditunjukkan dalam gambar resmi.



Goodness memiliki port I / O: input dan output digital dengan level 24 V (level default tinggi), serta input analog. ADC macam apa yang ada di sana saya tidak tahu. Port tersedia pada panel belakang di dudukan dan di tangan itu sendiri untuk bekerja dengan nozel. Saya lupa memotret konektor di lengannya sendiri, tetapi ini sejenis CAA. Ada juga antarmuka ekspansi di mana Anda dapat membeli biaya tambahan. Dobot terhubung ke PC melalui RS-232 atau melalui jaringan.



Bahan perumahan: polikarbonat, tampaknya, ditambah dudukan logam dicat hitam. Desain ini tidak menimbulkan rasa premium, tetapi juga rasa artisanisme. Saya membeli satu penuh, dan satu di pangkalan. Saya tidak menguji nosel laser dan pencetakan 3D.

Untuk menguji kebaikan, saya menggunakan program M1Studio untuk Windows, yang diunduh dari situs web perusahaan. Tapi itu saja. Selanjutnya, dipersenjatai dengan api, Qt dan sebuah stasiun kerja dengan tawon dasar, saya duduk untuk menulis demo untuk bekerja dengan beberapa pasang surut.

Kami sedang menulis demo


Sebenarnya, demo sudah tersedia di github . Dokumentasi untuk API dan protokol komunikasi dapat diunduh dari situs web pabrikan.

Pertama-tama, kami menggunakan metode SearchDobot () dari api, yang tidak menunjukkan apa pun di Linux, dan hanya bekerja di windows jika dobot terhubung melalui RS-232. Aneh, karena M1Studiya dengan sempurna mendefinisikan dobotov melalui jaringan. Dengan alamat ip yang dikenal, metode ConnectDobot () berfungsi dengan baik. Tidak apa-apa, saya pikir, saya akan mengatur router dan membiarkan alamat ip dilampirkan ke poppy. Hari berikutnya saya terkejut melihat fakta bahwa kebaikan tidak bereaksi. Ternyata ketika dinyalakan, dobot memiliki alamat poppy acak. Ini adalah fitur firmware, yang diperbaiki pada versi baru di bulan Mei, tetapi saya takut menginstalnya.

Berbekal sebuah program untuk menganalisis paket jaringan, saya menemukan bahwa Dobot menanggapi permintaan UDP ke port 6000 dengan teks “WhoisDobotM1” tanggapan UDP dengan teks yang berisi nomor model Dobot. Berdasarkan ini, metode kustom ditulis yang mengirimkan permintaan di seluruh subnet, dan dalam hal tanggapan, menginisialisasi kebaikan.

void MainWindow::on_buttonSearch_clicked() { QHostAddress host; QList<QHostAddress> list = QNetworkInterface::allAddresses(); for (int i=0; i<list.count(); i++) { if ((!list.at(i).isLoopback()) && (list.at(i).protocol() == QAbstractSocket::IPv4Protocol)) host = list.at(i); } QString subnet = host.toString().section('.',0,2) + "."; QByteArray data = "WhoisDobotM1"; QUdpSocket udpSocketSend; udpSocketSend.writeDatagram(data);//need tocall it otherwise in Win get socket doesn't open udpSocketSend.bind(host, 54321, QAbstractSocket::ShareAddress); udpSocketGet.bind(host, udpSocketSend.localPort(), QAbstractSocket::ShareAddress); connect(&udpSocketGet, &QUdpSocket::readyRead, this, &MainWindow::readUdpData); for (int i=1; i<255; i++) udpSocketSend.writeDatagram(data, 32, QHostAddress(subnet + QString::number(i)), 6000); } 

 void MainWindow::readUdpData() { while (udpSocketGet.hasPendingDatagrams()) { QNetworkDatagram data = udpSocketGet.receiveDatagram(); QByteArray ip = data.senderAddress().toString().toUtf8(); QString name = QString(data.data()).section('_',0,0); // cuts "dobotM1" from "dobotM1_Dobot M1_0033\x00" if (name == "dobotM1") { MyDobot* a = new MyDobot(); dobot->push_back(a); dobot->last()->initDobot(ip); ui->listDobots->addItem(ip); on_listDobots_activated(ui->listDobots->currentIndex()); } } } 

Antarmuka demo cukup sederhana dan disajikan dalam gambar di bawah ini.



Untuk menginisialisasi dan mengendalikan kebaikan, saya menulis sebuah kelas di mana saya menyadari fungsi yang saya butuhkan: kontrol sumbu, pergerakan dari titik ke titik dalam garis lurus dan dalam kurva, kembali ke posisi awal, kontrol pompa udara, dan juga pemantauan posisi dan kesalahan. Mari bergiliran. Ketika kelas diinisialisasi, alamat ip kebaikan disimpan dalam variabel, koneksi pertama terjadi, seluruh antrian perintah dibersihkan, bahkan jika antrian kosong, dan parameter akselerasi dan kecepatan untuk motor diatur.

 class MyDobot : public QObject { Q_OBJECT public: explicit MyDobot(QObject *parent = nullptr); ~MyDobot(); void initDobot(QByteArray IPaddress); Pose getCurrentPosition(); void goHomeSafe(); void goHome(); void goSafe(); void goPosition(float x, float y, float z, float r); void goPositionStraight(float x, float y, float z, float r); void goJog(int index); void setAirPump(int status, int direction); //status 1 off 0 on; direction 0 suck 1 push void setOutput(uint8_t address, uint8_t level); void setMotor(int velocity, int acceleration); alarmState getAlarms(); void clearAlarms(); void clearQueue(); QString getName(); public slots: private: char deviceSN[64]; char deviceName[64]; QByteArray thisDobotIP; Pose currentPosition, futurePosition; }; 

Saya memutuskan untuk menggunakan vektor dengan elemen kelas saya untuk mengontrol dobot ketika jumlahnya lebih dari 1. Setiap elemen vektor memiliki variabel yang menyimpan alamat ip dobot. Karena perpustakaan adalah satu, dan ada beberapa dobotov, maka di setiap metode kelas Anda harus terlebih dahulu memanggil metode menghubungkan ke dobot tertentu. Ini mungkin terlihat bengkok, tetapi semuanya ada di bawah tenda, dan kemudian bekerja dengan kelas ini sangat nyaman.

 void MyDobot::setAirPump(int status, int direction) { ConnectDobot(thisDobotIP, 115200, nullptr, nullptr); ... 

Gerakan dari titik ke titik di API Goodness diimplementasikan dengan beberapa metode: dalam garis lurus, dalam kurva, dan dalam beberapa cara lain yang saya tidak ingat. Pada gambar di bawah ini, dua lintasan pergerakan antara 2 titik terlihat. Salah satunya adalah garis lurus, yang dengan kalibrasi yang tepat pada perangkat tidak bercabang dua saat bergerak bolak-balik. Lintasan kedua adalah garis lengkung yang Anda dapatkan, karena firmware kebaikan secara berurutan menyesuaikan motor untuk mencapai koordinat yang diinginkan. Perlu dicatat bahwa pergerakan dalam garis lurus tidak selalu memungkinkan, beberapa posisi sambungan tidak memungkinkan mencapai dari titik A ke titik B dalam garis lurus.



Pemantauan posisi Dobot diimplementasikan menggunakan kelas Qtimer, yang sinyal Qtimer :: timeout-nya terkait dengan metode MainWindow :: on_getPoseTimer saya. Harus saya akui, ini adalah solusi yang biasa-biasa saja, karena operasi responsif aplikasi dengan up hanya dimungkinkan jika Anda menetapkan batas waktu 1000 ms. Dengan pengaturan waktu yang lebih singkat, sentakan mulai terasa saat mengatur naik. Saya perhatikan bahwa kadang-kadang dobot bisa bodoh untuk sementara waktu ketika menerima perintah, dan jika Anda cukup sering mengirim perintah, maka kemungkinan untuk masuk ke dalam bodoh bertambah. Mungkin ini karena panggilan konstan untuk ConnectDobot, yang mungkin tampak tidak perlu dalam demo ini, tetapi demo ditulis secara paralel dengan proyek utama, dan dalam proyek utama saya benar-benar membutuhkan implementasi seperti itu. Namun, untuk memonitor koneksi tidak dipanggil setiap waktu, tetapi masalah dengan suspensi tetap ada. Sayangnya, batas waktu 1 detik tidak memberikan pengukuran posisi kebaikan dalam ruang yang mulus, yang, misalnya, diterapkan di Studio M1, tetapi, di sisi lain, ini tidak penting.

Dalam metode yang sama, permintaan untuk kesalahan terjadi. Dalam kebaikan api, transmisi kode kesalahan dilaksanakan melalui struktur AlarmState.

 struct alarmState { uint8_t value[32]; }; 

Struktur ini adalah array elemen 8-bit, dan kode kesalahan dikodekan dalam representasi biner dari salah satu dari beberapa elemen array. Untuk menghitung kode kesalahan, Anda perlu menemukan "1" di elemen dan menambahkan nomor debit (unit) ke 8 * n elemen (mengandung atau tidak mengandung kesalahan lain) sebelum di array nilai. Ya, bisa ada lebih dari satu kesalahan sekaligus. Selanjutnya, kode kesalahan harus ditemukan dalam dokumen, yang tersedia untuk diunduh di situs web pabrikan. Isi pdfk disalin ke file teks, yang dibaut ke proyek sebagai sumber. Jika kode kesalahan berbeda dari 8 * 32 (mis. Tidak ada kesalahan), maka kode ini muncul di bidang kesalahan dan dengan mengklik tombol Alarm, uraiannya diuraikan dalam file, dan kemudian ditampilkan di bidang teks. By the way, kesalahan decoding dan parsing dilakukan di luar kelas untuk mengontrol up. Bagi saya, itu sekarang sepertinya bukan gagasan yang tepat.

Pompa udara termasuk dalam kit, yang dalam manual instruksi menyarankan menghubungkan ke output digital 17 dan 18. Satu output mengontrol on / off pompa, dan yang kedua mengontrol arah pergerakan udara. Jadi, misalnya, gripper pneumatik diaktifkan, yang juga disediakan.

Gulma


Dalam proses mengeksploitasi Dobot, saya mengalami beberapa masalah.

  1. Lubang-lubang pada dudukan tidak dibuat untuk melubangi lubang pada papan tempat memotong roti optik standar. Di sisi lain, sekali, ketika secara tidak sengaja kebaikan saya bertabrakan satu sama lain, salah satu dari mereka hanya bergeser di sekitar sumbu baut pemasangan, yang, saya pikir, menghindari kerusakan parah.
  2. Dari paragraf pertama ikuti yang kedua. Setelah tabrakan Dobot, kapak mereka bergeser. Ini tidak menakutkan pada awalnya, karena saya menulis metode untuk mengkalibrasi sumbu Dobot relatif ke kamera. Hal yang mengerikan terjadi pada ayat 3.
  3. Sumbu vertikal juga telah bergeser dan sekarang normal saya tidak normal. Ini dapat dideteksi oleh kamera, jika Anda menggambar dua tegak lurus dengan titik-titik. Anda dapat memastikan bahwa karena miring vertikal, dobot sekarang menggambar dengan pena bukan sumbu X dan Y yang sebenarnya, tetapi proyeksi mereka. Dan proyeksi ini dapat memiliki sudut kurang dari 90 derajat. Pada kenyataannya, ini mengarah pada kesalahan penyelarasan kecil. Di sisi lain, itu tidak begitu menakutkan karena kesalahannya linear.
  4. Firmware Dobot, pada prinsipnya, sekitar. Ada kusen kecil dengan alamat poppy, ada beberapa masalah dengan menunggu tanggapan terhadap permintaan UDP, tetapi jika tidak berfungsi dengan baik.
  5. Desainnya menyediakan baterai, yang diperlukan untuk menjaga koordinat terakhir setelah mematikan kebaikan. Ketika baterai mati, tegangan di dalamnya turun, yang menghapus data ini. Karena itu, dobot dimuat ke status kesalahan. Untuk menyimpulkan dari keadaan ini, Anda harus terlebih dahulu memanggil metode untuk menghapus pesan kesalahan, dan kemudian memanggil metode pencarian untuk posisi "home". Anda dapat mengganti baterai, manfaatnya sudah termasuk. Namun, baterai tersembunyi di dudukannya, dan untuk mencapainya Anda harus melepaskan 4 baut. Slot salah satunya ditembak jatuh.
  6. Dalam proyek saya, saya menggunakan 3 lembar kaca untuk meningkatkan level meja. Keputusan begitu-begitu, karena kaca bengkok. Faktanya adalah bahwa Dobot mulai menghasilkan kesalahan ketika sumbu vertikal memiliki nilai kurang dari 15 mm, dan tampaknya tidak semua fungsi tersedia. Jadi, perlu bahwa ruang kerja terletak tepat di atas bidang lampiran Dobot.

Kesimpulan


Kebaikan memungkinkan saya untuk mengimplementasikan proyek untuk mengumpulkan sel surya dalam soket mini keramik, yang dapat dilihat di video. Akurasi posisi diperiksa pada wafer silikon yang sama dan berada di batas 1 piksel pada satu sumbu dan 10 piksel pada lainnya. Kamera dalam proyek ini digunakan dengan resolusi 20 MP, dan bidang pandang kamera sepanjang sisi panjangnya sekitar 17 cm, tidak sulit untuk menghitung bahwa 1 piksel sesuai dengan ukuran linier sekitar 30 mikron. Kebetulan optik yang digunakan, meskipun berkualitas tinggi, memungkinkan untuk mengamati wafer silikon dengan jelas hanya di pusatnya, sementara tepi wafer menjadi sangat buram, yang mengarah ke ketidakpastian dalam penentuan wajah mereka di sisi pendek, dan sesuai dengan ketidakpastian dalam menentukan pusat wafer. Setelah mengkalibrasi sumbu, saya mengatur fokus kamera ke sisi pendek pelat. Perlu dicatat bahwa, pada prinsipnya, tidak mungkin untuk fokus di sana seperti di pusat bidang pandang, tetapi tetap saja. Karena efek ini, kesalahan posisi di sepanjang sumbu sepanjang sisi panjang sel surya berada pada batas 10 piksel, tetapi hanya 1 piksel pada sisi pendek. Yang sesuai dengan sekitar 300 dan 30 mikron. Ini memungkinkan saya untuk memverifikasi integritas spesifikasi untuk akurasi.

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


All Articles