Оглавление:

Как сделать автономного робота для игры в баскетбол, используя IRobot Create в качестве базы: 7 шагов (с изображениями)
Как сделать автономного робота для игры в баскетбол, используя IRobot Create в качестве базы: 7 шагов (с изображениями)

Видео: Как сделать автономного робота для игры в баскетбол, используя IRobot Create в качестве базы: 7 шагов (с изображениями)

Видео: Как сделать автономного робота для игры в баскетбол, используя IRobot Create в качестве базы: 7 шагов (с изображениями)
Видео: Как Сделать Игру Без Программирования 2024, Декабрь
Anonim
Как сделать автономного робота для игры в баскетбол, используя IRobot Create в качестве базы
Как сделать автономного робота для игры в баскетбол, используя IRobot Create в качестве базы

Это моя запись на конкурс 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: Заключение

Конечным результатом является робот, который может подбирать и забивать оранжевые мячи в воротах самостоятельно.

Мне понравилось работать над этим проектом. Чем больше я работал над этим роботом, тем больше я к нему привязался. Теперь я разговариваю с ним, как с домашним животным. Я надеюсь, что это помогло вам в следующем проекте. Мне нужно поблагодарить многих людей, но их слишком много. Как Бернар Шартрский так элегантно заявил: «мы подобны карликам на плечах гигантов, так что мы можем видеть больше, чем они, и вещи на большем расстоянии, не в силу какой-либо остроты зрения с нашей стороны или какой-либо физической различие, но потому что нас несут высоко и возносят их гигантские размеры.

Рекомендуемые: