Daftar Isi:

Cara Membuat Robot Bermain Bola Basket Otonom Menggunakan IRobot Buat Sebagai Basis: 7 Langkah (dengan Gambar)
Cara Membuat Robot Bermain Bola Basket Otonom Menggunakan IRobot Buat Sebagai Basis: 7 Langkah (dengan Gambar)

Video: Cara Membuat Robot Bermain Bola Basket Otonom Menggunakan IRobot Buat Sebagai Basis: 7 Langkah (dengan Gambar)

Video: Cara Membuat Robot Bermain Bola Basket Otonom Menggunakan IRobot Buat Sebagai Basis: 7 Langkah (dengan Gambar)
Video: Google AGI ?? AI Multimodal BARU (Robotika Visual Teks) + 562.000.000.000 Parameter | PaLM-E 2024, Juli
Anonim
Cara Membuat Robot Bermain Bola Basket Otonom Menggunakan IRobot Buat Sebagai Basis
Cara Membuat Robot Bermain Bola Basket Otonom Menggunakan IRobot Buat Sebagai Basis

Ini adalah entri saya untuk tantangan iRobot Create. Bagian tersulit dari keseluruhan proses ini bagi saya adalah memutuskan apa yang akan dilakukan robot. Saya ingin mendemonstrasikan fitur-fitur keren dari Create, sambil menambahkan beberapa bakat robo. Semua ide saya sepertinya termasuk dalam kategori membosankan tapi bermanfaat, atau keren dan tidak praktis. Pada akhirnya keren dan tidak praktis menang dan robot bermain basket lahir. Setelah beberapa pemikiran saya menyadari bahwa bisa praktis. Misalkan Anda menggunakan kertas oranye, dan semua tempat sampah Anda memiliki papan hijau…

Langkah 1: Dapatkan Suku Cadang

Karena batas waktu kontes, sebagian besar bagian yang saya gunakan adalah "di luar rak". Bagian Robot "Stok" Digunakan: Buat (x1) -- dari iRobot www.irobot.comXBC V.3.0 (x1) -- dari Botball www.botball.orgCreate-Roomba cable (x1) -- dari Botball www.botball.orgServo (x2) -- dari Botball www.botball.orgSharp rangefinder (x1) -- dari Botball www.botball.org Aneka bata LEGO -- dari LEGO www.lego.com6-32 sekrup mesin (x4) -- dari McMaster www.mcmaster.com "Membuat" Bagian Robot Digunakan: 3/8" lembaran PVC ekstrusi tebal -- barang ini luar biasa, tapi saya tidak ingat dari mana saya mendapatkannya, tapi ini persis seperti ini https://www.lynxmotion.com/Category.aspx?CategoryID=62Bagian lain: Bola "POOF" oranye -- dari tempat sampah yang terlihat seperti gawang WalMartBasketball -- dari "papan belakang" LowesGreen -- tambahan PVC dicat hijau terang

Langkah 2: Buat Bagian Unik

Buat Bagian Unik
Buat Bagian Unik

Satu-satunya bagian yang harus saya buat adalah pelat yang dibaut ke Create dan menawarkan jarak LEGO. Jarak lubang bata LEGO adalah 8mm, tetapi saya membuat jarak ganda untuk menghemat waktu. PVC yang diekstrusi sangat mudah digunakan. Itu bisa dipotong dengan pisau utilitas, tetapi kaku dan kuat. Saya sering mengambil robot dengan piring ini dan saya belum punya masalah.

Langkah 1: Potong lembaran menjadi 3,5 "x 9,5", Anda dapat memotongnya dengan pisau utilitas. Langkah 2: Bor lubang untuk membuat sekrup. Sekrup pembuat membuat kotak berukuran 2 dan 5/8" kali 8 dan 5/8". Langkah 3: Bor lubang dengan jarak bata LEGO. Gunakan mata bor 3/16" dan saya memberi jarak lubang 16mm. Tip: Saya meletakkan lembaran dalam program CAD, mencetaknya dalam ukuran penuh dan menempelkannya ke lembaran. Kemudian saya menggunakan ini sebagai panduan untuk memotong dan pengeboran.

Langkah 3: Merakit Robot

Merakit Robot
Merakit Robot
Merakit Robot
Merakit Robot
Merakit Robot
Merakit Robot

Saya menikmati membangun hal-hal sesederhana mungkin, dengan begitu ketika mereka melompat dari meja Anda tidak perlu membangun kembali terlalu banyak!

1. Pasang pelat baru ke bagian atas Buat 2. Bangun lengan untuk mengambil bola 3. Bangun lengan untuk memegang kamera 4. Buat dudukan untuk pengintai 5. Pasang XBC dan sambungkan semua kabel

Langkah 4: Memprogram Robot

Saya memutuskan untuk menggunakan XBC sebagai pengontrol saya terutama karena pelacakan warna bawaannya. Karena saya memutuskan untuk menggunakan XBC sebagai otak operasi, saya memprogram robot saya dalam Interactive C, atau saya menyebutnya IC. IC gratis untuk digunakan dan dapat diunduh di www.botball.org. IC sangat mirip dengan C++, tetapi memiliki beberapa library bawaan. Ternyata, David Miller dari University of Oklahoma telah menulis perpustakaan untuk Create yang dapat diunduh dari halamannya di https://i-borg.engr.ou.edu/~dmiller/create/. Dengan sumber daya itu dan manual untuk pembuatannya, saya siap memprogram. Tapi tantangan besar berikutnya adalah apa yang saya ingin lakukan? Saya menginginkan robot yang bisa pergi dan mengambil bola oranye dan memasukkannya ke dalam keranjang. Tujuan saya terdengar sederhana, dan mungkin bisa saja sederhana, tetapi semakin saya memahami apa yang dapat dilakukan oleh Create, semakin saya menginginkannya. Daftar terakhir saya terlihat seperti ini:1. Temukan bola oranye2. Ambil bola oranye3. Cari keranjang4. Masukkan bola ke dalam keranjangWhile1. Menghindari objek2. Tidak jatuh apapun (seperti meja)3. Mendeteksi pengisian daya baterai dan menyambungkan dengan home base saat lowOh, dan semua ini sepenuhnya otonom, artinya semuanya sudah diprogram sebelumnya.

Langkah 5: Kode

Mungkin berantakan, tetapi berhasil.#gunakan "createlib.ic"#gunakan "xbccamlib.ic"#define cam 0//camera servo port#define arm 3//arm servo port#define et (analog(0)) //et port/*Kabel create juga perlu dicolokkan. Soket listrik, colokan 3 cabang ke port 8 dan yang berlabel UX ke JP 28 (di sebelah port USB) dengan U ke arah kamera*/ #definisi c_down 5//camera servo down#define a_down 17//arm servo down#define hold 50//servo hold ball#define catch 27//arm servo position agar tidak tersangkut di meja#define shoot 150//servo melempar bola#menentukan track_c 25//posisi dekat track servo kamera#menentukan track_f 45//posisi jauh track servo kamera#menentukan center 120//pusat penglihatan kamera#menentukan inrange 30//track_y koordinat saat bola berada di cakar#menentukan bola 0//saluran bola oranye#menentukan bola_x (track_x(bola, 0))//x koordinat bola#menentukan bola_y (trek_y(bola, 0))//y koordinat bola#menentukan lambat 100//kecepatan lambat motor#define fast 175//speed of fast motor#define clear 0.2//s melompat untuk mundur dari rintangan#menentukan waktu 0.5 //1.0 adalah belok kanan 90 derajat#menentukan istirahat 0.05//waktu untuk tidur sambil melacak gumpalan#menentukan kecepatan 175//kecepatan menghindari belokan#menentukan kembali_s -200//kecepatan untuk mundur dari objek yang terbentur#tentukan lurus 32767//berkendara dalam garis lurus#tentukan backb 2//saluran warna utama papan belakang#tentukan persegi 1//saluran warna aksen papan belakang#tentukan track_d 250//posisi kamera untuk tujuan pelacakan# tentukan track_find 70//posisi kamera untuk pelacakan panjang#tentukan mundur 2.25//waktu tidur untuk 180#tentukan back_f -150//kecepatan mundur cepat#tentukan back_sl -125//kecepatan lambat mundur#tetapkan center_x 178//true x center of cam#define center_y 146//true y center of camint pida;//avoid processint pidb;//track processint pidc;//score processint have_ball = 0;//memberi tahu fungsi mana yang kita batalkan main(){ long ch; enable_servos();//enable servos init_camera();//start camera cconnect();//connect untuk membuat dengan kontrol penuh start_a();//start avoid function start_b();//start ball_tracking function while(1) { if(r_button()||gc_ldrop||gc_rdrop){//if diangkat atau r tombol bahu kill(pida); membunuh (pidb); membunuh (pidc); menonaktifkan_servos(); memutuskan(); istirahat;} create_battery_charge(); tampilan_clear(); printf("isi = %l\n", gc_baterai_isi); if(gc_battery_charge<1200l||b_button()){ kill(pida); membunuh (pidb); membunuh (pidc); melemparkan(); punya_bola=0; buat_demo(1); while(b_button()); while(gc_battery_charge<2800l&&!b_button()){ create_battery_charge(); tampilan_clear(); printf("isi = %l\n", gc_baterai_isi); tidur(1.0);} cconnect(); kembali(); tidur(2.0); Mulai sebuah(); start_b();} }}void avoid(){ while(1){//repeat forever create_sensor_update();//update semua nilai sensor //create_drive (speeda, straight); if(gc_lbump==1){//left bump avoid_right();}//belok kanan untuk menghindari else if(gc_rbump==1){//right bump avoid_left();}//belok kiri untuk menghindari else if(gc_lfcliff==1){//left front cliff avoid_right();} else if(gc_rfcliff==1){//right front cliff avoid_left();} else if(gc_lcliff==1){//left cliff avoid_right();} else if(gc_rcliff==1){//right cliff avoid_left();} }}void track_ball(){ kill(pidc); while(!have_ball){//ulangi sampai mendapatkan bola track_update(); far();//set camera ready();//set arm while(et<255){//sampai nilai maksimal terjadi saat bola ditangkap track_update();//update gambar kamera if(ball_x<=(center-5)){//jika bola tertinggal track_update(); create_drive_direct(lambat, cepat);//belok kiri tidur(istirahat);} else if(ball_x>=(center+5)){//jika bola benar track_update(); create_drive_direct(cepat, lambat);// belok kanan sleep(rest);} else if(ball_x(center-5)){// jika bola berada di tengah track_update(); create_drive_straight(fast);//langsung tidur(rest);} } grab();//grab ball beep();//make noise stop();//stop driving have_ball=1;//buat catatan bahwa Saya punya bola } start_c();//find the basket sleep(1.0);//sleep sehingga saya tidak melakukan apa-apa ketika saya terbunuh}void find_basket(){ kill(pidb);//membunuh proses pelacakan bola find();//letakkan kamera track_set_minarea(1000);//papan belakangnya besar, jadi hanya cari gumpalan besar while (have_ball){//sementara saya punya bola track_update(); while(track_x(backb, 0)=(center_x+20)){//sementara tidak dipusatkan track_update(); if(track_x(backb, 0)>=(center_x+20)){//jika backboard dibiarkan track_update(); create_spin_CCW(100);}//belok kiri else if(track_x(backb, 0)<=(center_x-20)){//jika backboard benar track_update(); create_spin_CW(300-center_x);}// belok kanan melambat saat tengah mendekati } stop(); while(track_size(backb, 0)<=(6000)){//sementara ukuran target kurang dari 6000 piksel track_update(); if(track_x(backb, 0)<=(center_x-5)){//jika target tertinggal track_update(); create_drive_direct(lambat, cepat);//belok kiri tidur(istirahat);} else if(track_x(backb, 0)>=(center_x+5)){//jika targetnya benar track_update(); create_drive_direct(cepat, lambat);// belok kanan tidur(istirahat);} else if(track_x(backb, 0)(center_x-5)){// jika target berada di tengah track_update(); create_drive_straight(cepat);//langsung tidur(istirahat);} } stop(); //create_drive_straight(fast);// sedikit lebih dekat //sleep(1.0); //berhenti(); tidur(1.0); create_spin_CW(speeda);//spin right sleep(reverse);//tidur cukup lama untuk 180 turn stop(); down();//letakkan kamera untuk melacak backboard sleep(1.0); track_set_minarea(200);//gunakan ukuran min yang lebih kecil, karena kita diarahkan ke sana dan akan mendekat while(track_y(backb, 0)>=(center_y-140)){//sementara target kurang dari y koordinat track_update(); if(track_x(backb, 0)<=(center_x-5)){//jika target tertinggal track_update(); back_right();//belok ke kiri sleep(rest);} else if(track_x(backb, 0)>=(center_x+5)){//jika targetnya benar track_update(); back_left();// belok kanan tidur(istirahat);} else if(track_x(backb, 0)(center_x-5)){// jika target berada di tengah track_update(); back();//langsung tidur(istirahat);} } stop(); berbunyi(); throw();//menembak tidur(1.0); have_ball=0;//reminder Saya melempar bola dan tidak memilikinya } start_b();//back to ball tracking sleep(1.0);//jangan lakukan apa pun sampai proses ini mati}void cconnect(){ create_connect (); create_full();//untuk kontrol penuh sensor langkan create_power_led(0, 255);}//green power ledvoid disconnect(){ stop();//stop moving create_disconnect();}void back_away(){ back(); tidur (bersih); stop();}void rotate_l(){ create_spin_CCW(speeda); waktu tidur); stop();}void rotate_r(){ create_spin_CW(speeda); waktu tidur); stop();}void stop(){ create_drive(0, straight);}void back(){ create_drive(back_s, straight);}void ready(){ set_servo_position(arm, a_down);}void check(){ set_servo_position (cam, track_c);}void far(){ set_servo_position(cam, track_f);}void ledge(){ set_servo_position(arm, catch);}void throw(){ int a; for(a=50; a>=30; a-=1){//siap-siap set_servo_position(arm, a);} set_servo_position(arm, shoot);}void grab(){ int a; for(a=0; a<=hold; a+=1){//angkat lengan dengan mulus set_servo_position(arm, a);}}void down(){ set_servo_position(cam, track_d);}void find(){ set_servo_position (cam, track_find);}void start_a(){ pida = start_process(avoid());}void start_b(){ pidb = start_process(track_ball());}void start_c(){ pidc = start_process(find_basket());}void kill(int pid){ CREATE_BUSY;//tunggu proses pembuatan saat ini selesai, dan ambil prioritas kill_process(pid); CREATE_FREE;//aku sudah selesai stop();}void avoid_left(){ kill(pidb);//stop semuanya kill(pidc); ledge();//ambil cakar agar tidak tersangkut di meja back_away();//mundur rotate_l();//berputar menjauh dari rintangan siap();//letakkan cakar kembali if(have_ball) {//if i have the ball start_c();}//start goal tracking else if(!have_ball){//if i don't have the ball start_b();}//start ball tracking}void avoid_right() { bunuh(pidb); membunuh (pidc); langkan(); mundur(); putar_r(); siap(); if(have_ball){ start_c();} else if(!have_ball){ start_b();}}void back_left(){ create_drive_direct(back_f, back_sl);}void back_right(){ create_drive_direct(back_sl, back_f);}

Langkah 6: Apakah Itu Layak?

Biayanya adalah:Buat + baterai+ dokumen = $260XBC starter kit (xbc, cam, LEGO bricks, sensor) = $579PVC + cat + sekrup = sekitar $20Total biaya = $859Saya sudah memiliki starter kit XBC dari Botball, jadi biayanya bagi saya adalah biaya Buat. Saya pikir itu sepadan, dan bagian terbaiknya adalah semua bagian yang saya gunakan dapat digunakan kembali, jika saya bisa membawa diri saya untuk memisahkan bot ini. Video ini menunjukkan sub rutin menghindari, di atas meja. Video ini menunjukkan robot mencetak 5 bola oranye dalam satu gol. Saya hanya membantu untuk mempercepat proses, itu akan menemukan bola 5 akhirnya dengan sendirinya.

Langkah 7: Kesimpulan

Hasil akhirnya adalah robot yang bisa mengambil dan mencetak bola oranye di gawang sendiri.

Saya senang mengerjakan proyek ini. Semakin saya mengerjakan robot ini, semakin saya terikat padanya. Saya sekarang berbicara dengannya seolah-olah itu adalah hewan peliharaan. Saya harap ini membantu Anda dalam proyek Anda berikutnya. Ada banyak orang yang perlu saya ucapkan terima kasih, tetapi ada terlalu banyak. Seperti yang dikatakan Bernard dari Chartres dengan sangat elegan: "kita seperti kurcaci di atas bahu raksasa, sehingga kita dapat melihat lebih banyak daripada mereka, dan hal-hal pada jarak yang lebih jauh, bukan berdasarkan ketajaman penglihatan di pihak kita, atau fisik apa pun. perbedaan, tetapi karena kita diangkat tinggi dan dibesarkan oleh ukuran raksasa mereka."

Direkomendasikan: