Оглавление:
- Шаг 1: приобретение запчастей
- Шаг 2: Создайте уникальную деталь
- Шаг 3: Сборка робота
- Шаг 4: программирование робота
- Шаг 5: Код
- Шаг 6: Стоило ли оно того?
- Шаг 7: Заключение
Видео: Как сделать автономного робота для игры в баскетбол, используя IRobot Create в качестве базы: 7 шагов (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:54
Это моя запись на конкурс iRobot Create. Самым сложным в этом процессе для меня было решить, что будет делать робот. Я хотел продемонстрировать классные возможности Create, а также добавить немного робо-чутья. Все мои идеи либо попадали в категорию скучных, но полезных, либо крутых и непрактичных. В конце концов, крутой и непрактичный победил, и родился баскетбольный робот. Поразмыслив, я понял, что это может быть практично. Предположим, вы используете оранжевую бумагу и у всех ваших мусорных баков зеленые щиты …
Шаг 1: приобретение запчастей
Из-за ограниченного времени конкурса, большинство деталей, которые я использовал, были «с полки». Используемые "стандартные" части робота: Create (x1) - от iRobot www.irobot.com XBC V.3.0 (x1) - от Botball www.botball.org Кабель Create-Roomba (x1) - от Botball www.botball.orgServo (x2) - от Botball www.botball.orgSharp rangefinder (x1) - от Botball www.botball.org Разные кубики LEGO - от LEGO www.lego.com 6-32 крепежных винта (x4) - от McMaster www.mcmaster.com Используемые части робота "Created": экструдированный лист ПВХ толщиной 3/8 дюйма - это потрясающе, но я не могу вспомнить, откуда я его взял, но он такой же https://www.lynxmotion.com / Category.aspx? CategoryID = 62 Другие части: Оранжевый мяч "POOF" - от WalMart, баскетбольный мяч, похожий на мусорный бак - от LowesGreen, "щит" - дополнительный ПВХ, окрашенный в ярко-зеленый цвет.
Шаг 2: Создайте уникальную деталь
Единственная деталь, которую мне пришлось изготовить, - это пластина, прикрученная к Create и обеспечивающая расстояние LEGO. Расстояние между отверстиями в кирпиче LEGO составляет 8 мм, но я сделал двойной интервал, чтобы сэкономить время. С экструдированным ПВХ очень просто работать. Его можно разрезать универсальным ножом, но он жесткий и прочный. Я часто забираю робота за эту тарелку и у меня пока не было проблем.
Шаг 1: Отрежьте лист до размеров 3,5 "x 9,5", вы можете разрезать его универсальным ножом. Шаг 2: Просверлите отверстия для шурупов. Создаваемые винты создают коробку размером 2 и 5/8 дюйма на 8 и 5/8 дюйма. Шаг 3. Просверлите отверстия в кирпичах LEGO. Используйте сверло 3/16 дюйма, и я разместил отверстия на расстоянии 16 мм друг от друга. Совет: я разложил лист в программе CAD, распечатал его в полный размер и приклеил к листу. Затем я использовал это как руководство для резки и бурение.
Шаг 3: Сборка робота
Мне нравится строить вещи настолько просто, насколько это возможно, так что, когда они прыгают со стола, вам не нужно так много перестраивать!
1. Прикрутите новую пластину к верхней части Create 2. Постройте руку, чтобы захватывать мяч 3. Постройте руку, чтобы удерживать камеру 4. Постройте крепление для дальномера 5. Установите XBC и подключите все кабели
Шаг 4: программирование робота
Я решил использовать XBC в качестве контроллера в основном из-за встроенного отслеживания цвета. Поскольку я решил использовать XBC в качестве логики операции, я запрограммировал своего робота на Interactive C, или, как я его называю, IC. IC бесплатен для использования и может быть загружен на сайте www.botball.org. IC очень похож на C ++, но имеет несколько встроенных библиотек. Как оказалось, Дэвид Миллер из Университета Оклахомы написал библиотеку для Create, которую можно загрузить с его страницы по адресу https://i-borg.engr.ou.edu/~dmiller/create/. С этими ресурсами и руководствами по созданию я был готов программировать. Но следующей большой проблемой было то, что я хотел от него сделать? Я хотел робота, который мог бы собирать оранжевые мячи и забивать их в корзину. Моя цель казалась простой и, вероятно, могла быть простой, но чем больше я разбирался в том, что может сделать Create, тем больше мне хотелось, чтобы он делал. Мой окончательный список выглядел так: 1. Найдите оранжевый шар 2. Поднимите оранжевый шар 3. Найдите корзину 4. Положите мяч в корзину, пока 1. Избегание предметов 2. Ничего не упало (например, со стола) 3. Обнаружение заряда аккумулятора и стыковка с базовой базой при низком уровне заряда, и все это полностью автономно, что означает, что все это предварительно запрограммировано.
Шаг 5: Код
Это может быть неприятно, но это работает. # Use "createlib.ic" #use "xbccamlib.ic" #define cam 0 // порт сервопривода камеры # define arm 3 // сервопорт руки # define et (аналог (0)) // et port / * Кабель создания также должен быть подключен. Разъем питания, трехштырьковый штекер в порт 8 и один с надписью UX в JP 28 (рядом с портом USB) с U в сторону камеры * / #define c_down 5 // опускание сервопривода камеры # define a_down 17 // опускание сервопривода рычага # определение удержания 50 // шарик удержания сервопривода throw ball # define track_c 25 // servo track close position # define track_f 45 // camera servo track long position # define center 120 // center of camera vision # define inrange 30 // track_y координата, когда мяч находится в когтях # определить мяч 0 // канал оранжевого шара # define ball_x (track_x (ball, 0)) // x-координата шара # define ball_y (track_y (ball, 0)) // y-координата шара # define slow 100 // скорость медленного двигатель # определить быстрый 175 // скорость быстрого двигателя # определить очистить 0,2 // с прыжок, чтобы отступить от препятствий # определить время 0,5 // 1,0 - поворот направо на 90 градусов # определить отдых 0,05 // время засыпать при отслеживании капель # определить скорость 175 // скорость уклонения от поворота # определить back_s -200 // скорость до отойти от объекта, на который нанесен удар # определить прямо 32767 // двигаться по прямой # определить backb 2 // канал основного цвета щита # определить квадрат 1 // канал цвета акцента щита # определить track_d 250 // положение камеры для отслеживания цели # define track_find 70 // положение камеры для длительного отслеживания # define reverse 2.25 // время сна для 180 # define back_f -150 // быстрая скорость назад # define back_sl -125 // низкая скорость назад # define center_x 178 // true x center of cam # define center_y 146 // true y center of camint pida; // избегать processint pidb; // отслеживать processint pidc; // оценивать processint have_ball = 0; // сообщает, какая функция у нас invoid main () {long ch; enable_servos (); // включить сервоприводы init_camera (); // запустить камеру cconnect (); // подключиться для создания с полным контролем start_a (); // запустить функцию избегания start_b (); // запустить функцию ball_tracking while (1) {if (r_button () || gc_ldrop || gc_rdrop) {// если поднята или r кнопка на плече kill (pida); убить (пидб); убить (pidc); disable_servos (); Отключить(); перерыв;} create_battery_charge (); display_clear (); printf ("charge =% l / n", gc_battery_charge); если (gc_battery_charge <1200l || b_button ()) {убить (пида); убить (пидб); убить (pidc); бросать(); иметь_бол = 0; create_demo (1); а (b_button ()); в то время как (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("charge =% l / n", gc_battery_charge); сна (1.0);} cconnect (); назад(); сон (2,0); начать(); start_b ();}}} void escape () {while (1) {// повторять навсегда create_sensor_update (); // обновить все значения датчиков // create_drive (speeda, Straight); if (gc_lbump == 1) {// левый удар escape_right ();} // поворачивает направо, чтобы избежать else if (gc_rbump == 1) {// правый удар escape_left ();} // поворачивает налево, чтобы избежать else if (gc_lfcliff == 1) {// левый передний обрыв escape_right ();} else if (gc_rfcliff == 1) {// правый передний обрыв escape_left ();} else if (gc_lcliff == 1) {// левый передний обрыв escape_right ();} else if (gc_rcliff == 1) {// правый обрыв escape_left ();}}} void track_ball () {kill (pidc); while (! have_ball) {// повторяем, пока не получим мяч track_update (); far (); // устанавливает камеру в состояние готовности (); // устанавливает руку while (et <255) {// до тех пор, пока не будет достигнуто максимальное значение, когда мяч будет пойман track_update (); // обновить изображение камеры if (ball_x <= (center-5)) {// если мяч оставлен track_update (); create_drive_direct (slow, fast); // повернуть налево sleep (rest);} else if (ball_x> = (center + 5)) {// если мяч правый track_update (); create_drive_direct (fast, slow); // повернуть направо sleep (rest);} else if (ball_x (center-5)) {// если мяч находится по центру track_update (); create_drive_straight (fast); // идем прямо sleep (rest);}} grab (); // захватываем мяч beep (); // делаем шум stop (); // прекращаем движение have_ball = 1; // отмечаем, что У меня есть мяч} start_c (); // находим корзину sleep (1.0); // засыпаем, чтобы я ничего не делал, когда меня убивают} void find_basket () {kill (pidb); // останавливаем процесс отслеживания мяча find (); // поднять камеру track_set_minarea (1000); // задняя панель большая, поэтому ищите только большие капли while (have_ball) {// пока у меня есть мяч track_update (); while (track_x (backb, 0) = (center_x + 20)) {// пока не по центру track_update (); if (track_x (backb, 0)> = (center_x + 20)) {// если задняя панель слева track_update (); create_spin_CCW (100);} // повернуть налево иначе if (track_x (backb, 0) <= (center_x-20)) {// если задняя панель права track_update (); create_spin_CW (300-center_x);} // поворачиваем направо, замедляя движение по мере приближения к центру} stop (); while (track_size (backb, 0) <= (6000)) {// пока размер цели меньше 6000 пикселей track_update (); if (track_x (backb, 0) <= (center_x-5)) {// если цель слева track_update (); create_drive_direct (slow, fast); // повернуть налево sleep (rest);} else if (track_x (backb, 0)> = (center_x + 5)) {// если цель справа track_update (); create_drive_direct (fast, slow); // повернуть направо sleep (rest);} else if (track_x (backb, 0) (center_x-5)) {// если цель центрирована track_update (); create_drive_straight (fast); // прямо спать (отдых);}} stop (); // create_drive_straight (fast); // подходим немного ближе //sleep(1.0); //останавливаться(); сон (1.0); create_spin_CW (speeda); // вращаем вправо sleep (назад); // спим достаточно долго для поворота на 180 stop (); down (); // опускаем камеру, чтобы отследить засыпание задней панели (1.0); track_set_minarea (200); // используем меньший минимальный размер, так как мы нацелены на него и собираемся приблизиться while (track_y (backb, 0)> = (center_y-140)) {// пока цель меньше координата y track_update (); if (track_x (backb, 0) <= (center_x-5)) {// если цель слева track_update (); back_right (); // повернуть налево sleep (rest);} else if (track_x (backb, 0)> = (center_x + 5)) {// если цель справа track_update (); back_left (); // поворачиваем вправо sleep (rest);} else if (track_x (backb, 0) (center_x-5)) {// если цель центрирована track_update (); back (); // идем прямо sleep (rest);}} stop (); beep (); throw (); // стреляем sleep (1.0); have_ball = 0; // напоминание, что я бросил мяч, но его нет} start_b (); // вернуться к отслеживанию мяча sleep (1.0); // ничего не делать, пока этот процесс не умрет} void cconnect () {create_connect (); create_full (); // для полного контроля датчиков выступа create_power_led (0, 255);} // зеленый свет ledvoid disconnect () {stop (); // остановить перемещение create_disconnect ();} void back_away () {back (); сон (ясный); stop ();} void rotate_l () {create_spin_CCW (скорость); время сна); stop ();} void rotate_r () {create_spin_CW (скорость); время сна); stop ();} void stop () {create_drive (0, прямо);} void back () {create_drive (back_s, прямо);} void ready () {set_servo_position (arm, a_down);} проверка void () {set_servo_position (cam, track_c);} void far () {set_servo_position (cam, track_f);} void ledge () {set_servo_position (рука, поймано);} void throw () {int a; for (a = 50; a> = 30; a- = 1) {// готовимся set_servo_position (arm, a);} set_servo_position (arm, стрелять);} void grab () {int a; for (a = 0; a <= hold; a + = 1) {// плавно поднимать руку 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 (escape ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // ожидаем завершения текущего процесса создания и получаем приоритет kill_process (pid); CREATE_FREE; // все готово stop ();} void escape_left () {kill (pidb); // остановка всего остального kill (pidc); ledge (); // поднять коготь, чтобы он не зацепился за стол back_away (); // отступить rotate_l (); // повернуть от препятствия ready (); // опустить коготь обратно if (have_ball) {// если у меня есть мяч start_c ();} // начать отслеживание цели else if (! have_ball) {// если у меня нет мяча start_b ();} // начать отслеживание мяча} void escape_right () {убить (пидб); убить (pidc); выступ (); back_away (); rotate_r (); готов(); 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);}
Шаг 6: Стоило ли оно того?
Затраты составили: Создание + аккумулятор + документ = 260 долларов США стартовый комплект XBC (xbc, кулачок, кубики LEGO, датчики) = 579 долларов США ПВХ + краска + винты = около 20 долларов Общая стоимость = 859 долларов У меня уже был стартовый комплект XBC от Botball, поэтому стоимость Для меня это была стоимость создания. Я думаю, что оно того стоило, и самое приятное то, что все части, которые я использовал, можно использовать повторно, если бы я мог заставить себя разделить этого бота. Это видео показывает, как избежать подпрограммы, на столешнице. На этом видео показано, как робот забивает 5 оранжевых мячей в ворота. Я только помог ускорить процесс, он бы нашел пятый шар в конце концов сам.
Шаг 7: Заключение
Конечным результатом является робот, который может подбирать и забивать оранжевые мячи в воротах самостоятельно.
Мне понравилось работать над этим проектом. Чем больше я работал над этим роботом, тем больше я к нему привязался. Теперь я разговариваю с ним, как с домашним животным. Я надеюсь, что это помогло вам в следующем проекте. Мне нужно поблагодарить многих людей, но их слишком много. Как Бернар Шартрский так элегантно заявил: «мы подобны карликам на плечах гигантов, так что мы можем видеть больше, чем они, и вещи на большем расстоянии, не в силу какой-либо остроты зрения с нашей стороны или какой-либо физической различие, но потому что нас несут высоко и возносят их гигантские размеры.
Рекомендуемые:
Миниатюризация автономного робота Arduino (Land Rover / Car) Stage1Model3: 6 шагов
Миниатюризация автономного робота Arduino (Land Rover / Car) Stage1Model3: я решил миниатюризировать Land Rover / Car / Bot, чтобы уменьшить размер и энергопотребление проекта
Как сделать аркаду Bartop DIY на двоих с пользовательскими слотами для монет Marquee, используя ящик Пандоры: 17 шагов (с изображениями)
Как сделать аркадную аркаду для 2 игроков своими руками с пользовательскими слотами для монет Marquee, используя ящик Пандоры: Это пошаговое руководство о том, как построить аркадную машину с верхней панелью для 2 игроков, в которую встроены пользовательские слоты для монет. Прорези для монет будут сделаны таким образом, чтобы в них можно было принимать только монеты размером в четверть и больше. Эта аркада работает
[Робот Arduino] Как сделать робота захвата движения - Большой палец руки робота - Серводвигатель - Исходный код: 26 шагов (с изображениями)
[Робот Arduino] Как сделать робота захвата движения | Большой палец руки робота | Серводвигатель | Исходный код: Thumbs Robot. Использовал потенциометр серводвигателя MG90S. Это очень весело и просто! Код очень простой. Это всего около 30 строк. Это похоже на захват движения. Пожалуйста, оставьте любой вопрос или отзыв! [Инструкция] Исходный код https: //github.c
Симулятор игры для смартфона - играйте в игры для Windows, используя IMU для управления жестами, акселерометр, гироскоп, магнитометр: 5 шагов
SmartPhone Game Simulator - играйте в игры для Windows, используя IMU управления жестами, акселерометр, гироскоп, магнитометр: поддержите этот проект: https://www.paypal.me/vslcreations, сделав пожертвование на программы с открытым исходным кодом & поддержка дальнейшего развития
Как использовать Wiimote в качестве компьютерной мыши, используя свечи в качестве датчика !!: 3 шага
Как использовать Wiimote в качестве компьютерной мыши с использованием свечей в качестве датчика !!: это руководство покажет вам, как подключить Wii Remote (Wiimote) к компьютеру и использовать его в качестве мыши