Матчи делятся на два периода игры: 30-секундный автономный период и последующий двухминутный телеуправляемый период, последние 30 секунд телеуправляемого периода называются «финальным периодом», в течение которых у роботов будут дополнительные возможности заработать очки.
Автономный период
В ходе автономного периода роботы управляются только инструкциями команд, предварительно загруженных в них. Альянсы получают очки за:
переключение («захват») маяков, перемещение мяча-затычки с центральной воронки на пол игрового поля, перемещение частиц в центральную или угловую воронку своего альянса. Альянсы также зарабатывают очки, припарковав своих роботов либо в контакте с основанием центральной воронки, либо – на угловой воронке.
По окончанию автономного периода очки присуждаются следующим образом:
● Робот частично припаркован на основании центральной воронки...........5 очков
● Робот полностью припаркован на основании центральной воронки...........10 очков
● Робот частично припаркован на угловой воронке............ 5 очков
● Робот полностью припаркован на угловой воронке........... 10 очков
● Частицы в центральной воронке........... 15 очков /частицу
● Частицы в угловой воронке........... 5 очков /частицу
● Мяч-затычка на полу........... 5 очков
● Переключенный («захваченный») маячок......... 30 очков /маячок
(плюс по одной частице за каждый «захваченный» маячок, но не больше двух частиц в целом)
Телеуправляемый период
В ходе телеуправляемого периода альянсы зарабатывают очки, помещая свои частицы в свои центральные и угловые воронки. Роботы также могут «захватывать» маячки, переключив их цвета в цвета своего альянса. Нет ограничений на число переключения маячков. В конце игры цвет маячка определяет, какой из альянсов получит очки за его «захват». Ниже указано распределение очков:
● Частица в центральной воронке.......... 5 очков /частицу
● Частица в угловой воронке..........1 очко/частицу
Финальный этап игры
Последние 30 секунд телеуправляемого периода называются «финальным периодом». В дополнение к заданиям телеуправляемого периода альянсы зарабатывают очки, подняв вверх свои мячи-затычки или «заткнув» ими свои центральные воронки. По окончанию матча очки распределяются следующим образом:
● «Захваченный» маячок………. 10 очков/маячок
● Мяч-затычка поднят над полом, но не выше 76 см………. 10 очков
● Мяч-затычка поднят над полом выше 76 см………. 20 очков
● Мяч-затычка в центральной воронке………. 40 очков
Инженерный раздел
План работы |
Краткое изучение основ робототехники |
Определение целей соревнований; информация об их правилах |
Деление на команды |
Выборы капитана и названия команды |
Первый день стал ознакомительным. Нам рассказали о правилах сезона “Velocity Vortex”.
Так как на занятия по робототехнике пришло много ребят, было решено разбиться на две команды. В первой команде оказались Волков Алексей (участник соревнований прошлых лет), Нефёдов Лев, Александров Андрей, Шалимов Глеб, Кулаженок Мария и Кундашкин Александр. Во второй - Ревацкий Андрей, Трубачеев Артём, Устинов Андрей, Кунеков Александр и Клещин Илья - мальчики, занимающиеся робототехникой не первый год.
Капитаном нашей команды стал Волков Алексей, так как он уже не первый год занимается робототехникой и имеет опыт участия в соревнованиях в направлении FTC.
Название команды было решено оставить прежним - “Розовый гусь”, хотя их прежнего состава остался только наш нынешний капитан. Мы поддерживаем связь с бывшими членами команды, они уже не лицеисты, а студенты и разъехались по другим городам. Мы рады продолжать дело, начатое ими. “Make pink goose great again!”
После решения организационных вопросов, мы начали обсуждать варианты стратегии на сезон. Большое количество очков можно заработать в автономном периоде. Для этого нужно закинуть частицы в центральную мишень и нажать кнопки маяков. Забрасыванием частиц в центральную мишень, так же, можно зарабатывать очки и в управляемом периоде. Следовательно было решено сделать упор забрасывание частиц в центральную мишень. Чтобы рационально распределить время, решили собрать простую тележку и на ней начать отрабатывать автономный период - езду по датчикам. Второй задачей стала разработка механизма запуска шаров. Т.к. перед автономным периодом шары в робота можно загрузить вручную, механизм сбора шаров на данном этапе не обсуждался. Итогом обсуждения стала конструкция робота с механизмом запуска шаров с возможностью дальнейшей установки сборщика для управляемого периода.
План работы |
Создание тележки |
Работа над автономным периодом |
Создание механизма запуска шаров |
На втором занятии мы начали собирать простую тележку.
Сначала мы решили, что лучше сделать её полностью из больших П-образных балок, но как выяснилось позднее, габариты такой тележки не подходят под максимальный размер робота. Поэтому нам пришлось изготовить нашу конструкцию из 3-х больших балок, одной средней и множества пластин. Конечно, это решение было принято не просто так, по задумке наша тележка должна быть очень прочной, такой она и получилась. Тележка наверху имеет накопитель, расположенный под определенным углом так, чтобы шары скатывались по очереди в место запуска.
Для робота в телеуправляемом и автономном периодах нужна программа, ей занялся наш главный программист, Глеб Шалимов. В этом сезоне используется программирование JAVA, и сначала с ним надо разобраться. У Глеба это не составило огромного труда, и он отправился писать программу управления роботом для автономного периода.
Пока несколько человек занимались тележкой, остальные участники команды работали над механизмом запуска. Было несколько вариантов: запускать шары с помощью колёс, использовать вращающийся ротор или катапульту.
На этом занятии мы пробовали первый способ - с помощью колёс. Принцип работы следующий: шары подаются между двумя колёсами, колёса начинают вращаться с большой скоростью и вталкивают шар.
https://vk.com/ftc_ru?z=video51298751_456239024%2Fdb67bb9eec6161da4a%2Fpl_post_-84781876_813
Мы отказались от данного механизма запуска, потому что он занимал много места, и выталкивающей силы не хватало, чтобы запускать шар на большое расстояние.
План работы |
Создание механизма запуска |
Написание программы |
На этом занятии мы попробовали реализовать идею бросания шаров с помощью вращающегося ротора. В теории он должен брать шарик, разгонять его и бросать. С помощью данного устройства мы хотели попробовать бросать шарик по кругу на боковой горке. Конструкцию собрали из подручных материалов, вращали шуруповёртом. В ходе испытаний вскрылась одна проблема - ротор не всегда брал шарики, очень часто он их выстреливал обратно. На рисунке показано, почему это происходит.
Пути устранения данной проблемы мы пока не нашли.
План работы |
Создание игровой конструкции |
Правила соревнований меняются каждый год, и чтобы создать обстановку для тестирования робота, необходимо было сделать самим игровую конструкцию (4 маяка, 2 боковые стенки и центральная мишень), так как наше учебное заведение не может позволить себе такую дорогую установку. Поскольку, у нас еще мало опыта и инженерного мышления, мы обратились за помощью к нашему тренеру, Лосеву Егору Давидовичу. Все конструкции на поле, предоставленном на соревновании, сделаны из пластика, и на боковых стенках металлическое покрытие. Егор Давидович предложил сделать их из фанеры согласно инструкции по изготовлению “дешёвого поля” с сайта направления FIRST. Работали мы в этот день двумя командами для того, чтобы быстрее закончить.
Сначала в чертежной программе “Компас 3D” были нарисованы все детали, необходимые для изготовления игровых конструкций в натуральную величину. После этого команды расположили детали в прямоугольники размером 1, 22 х 2,44 м для оптимизации раскроя фанерного листа.
Также понадобились полипропиленовые трубы, их размеры были переведены в миллиметры и подсчитано необходимое количество материалов. Необходимые материалы:
● фанера 18 мм - 1/2 листа
● фанера 9 мм - 1 лист
● труба полипропиленовая ф32 - 3 м
● труба полипропиленовая ф20 - 9 м
● уголок полипропиленовый ф32 х 90* - 2шт.
● тройник полипропиленовый ф32
● заглушка полипропиленовая ф20 - 28 шт.
● переходник полипропиленовый ф32хф20
Инструменты: лобзик, шуруповёрт, паяльник для полипропиленовых труб, ножницы для пластиковых труб. Сначала мы разрезали трубы на куски согласно чертежам, просверлили заглушки по центру для того, чтобы в дальнейшем их было удобно крепить, и приварили заглушки к трубе на 20 мм при помощи паяльника для полипропиленовых труб. Далее мы собрали опору центральной конструкции из трубы на 32 мм, из двух уголков и тройника, при помощи шаблона, распечатанного в натуральную величину, лобзиком вырезали из 18 фанеры 2 "колеса" для центральной конструкции и сверлили отверстия для крепления 14 труб диаметром 20 мм. Колёса с трубами соединили при помощи саморезов и вырезали из 18 мм фанеры квадрат - основание центральной конструкции.
Инструкцию по сборке с расчетом материалов и всеми необходимыми чертежами мы выложили в группе FTC.ru “Вконтакте”, чтобы поделиться нашим опытом с другими командами. https://vk.com/wall-84781876_754
План работы |
Создание игровой конструкции |
В это занятие мы приступили к маякам и боковым стенкам.
Маяки также были изготовлены из фанеры, но сверху прикреплена бумага двух разных цветов: синий и красный. Перемещая лист бумаги, можно выбирать с какой стороны маяка красный, а с какой синий цвет. Это нам понадобится для тестирования автономной программы. В качестве кнопок на маяках используем пуговицы.
Разметка на поле была нанесена с помощью малярного скотча.
Процесс создания игровых конструкций занял у нас целых два занятия, зато после его завершения мы имели полное поле для тренировок.
План работы |
Создание механизма запуска |
На шестом занятии мы занялись созданием второго варианта механизма запуска - катапульты. Она была сделана из пружины и вала, который подкидывал шар.
https://vk.com/ftc_ru?z=video162992858_456239021%2F3fc8d4128634d0b1c1%2Fpl_post_-84781876_800
Нам пришлось отказаться от этой идеи, потому что не хватало силы для подкидывания шаров.
Тогда пришла мысль сделать механизм запуска, состоящего из прямоугольной пластмассовой пластины и металлической трубки. Руководил этим процессом Лев Нефёдов. Он придумал это устройство, как оно должно выглядеть, и уже через полчаса Лев и Алексей Волков приступил к его изготовлению.
В итоге, данный механизм работает следующим образом: труба начинает вращаться вокруг своей оси, и прикрепленная к ней пластина тоже начинает вращаться, тем самым задевает ограничитель и на изгибе бьет по шарику. Преимущества данного устройства в том, что он запускает мяч под углом и выше, чем все предыдущие.
На изготовление такого маленького механизма ушёл весь день, на следующий день мы решили сделать сборщик.
План работы |
Создание сборщика |
Написание программы |
На седьмой день мы поняли, что перед нами встала одна проблема: как подавать шарики в корзину. Изначально нашей стратегией было создать механизм запуска для запуска 3 автономных шаров, и заработать 45 очков. Потом мы решили усовершенствовать робота - создать и поставить сборщик, чтобы работать с шарами в телеуправляемом периоде.
Наш тренер посоветовал создать как можно проще конструкцию.
Сборщик представляет собой три трубки, расположенные в ряд, в каждой из которой 5 резиновых трубочек. Работа сборщика происходит следующим образом: к аккумулятору подключен мотор, на осях мотора стоят три звёздочки, они, вращаясь, заставляют двигаться велосипедную цепь. Трубки сборщика установлены на осях, поэтому при вращении звёздочек, они начинают двигаться, собирая с помощью резиновых трубок шары.
Целый день мы собирали эту конструкцию, несмотря на её небольшие размеры, работы было сделано немало. Данная конструкция сборщика хорошо себя зарекомендовала в прошлом сезоне. Однако раньше частицы были меньшего диаметра, и нам пришлось адаптировать конструкцию под диаметр шаров 95 мм.
За этот день было проделано немало работы, и проверку работы нашего сборщика мы решили оставить на следующее занятие.
План работы |
Проверка работы сборщика |
Создание большого шара |
Написание программы |
Восьмое занятие началось с поставленной задачи – проверка сборщика. Мы подключили наше устройство к аккумулятору, и убедились, что оно захватывает шары, но ему еще требуется доработка. Тогда нашим инженерам пришлось убрать верхнюю ось, но возникла проблема. Оставшихся двух осей не хватало, чтобы шары долетали до накопителя, и третья ось вернулась на место.
https://vk.com/im?sel=145537964&z=video132959757_456239043%2Fae2b80bc869716888e
По правилам этого сезона в соревнованиях применяются большие шары, в нашей лаборатории такие отсутствовали, из-за чего мы до конца не могли протестировать работу робота. Тогда наш тренер предложил создать шар нужных размеров на 3D-принтере. Файл с моделью нам был предоставлен робототехниками из Красноярска. За что им огромное спасибо. По трехмерной модели была создана управляющая программа для принтера. Одна половинка печаталась около пяти часов. https://vk.com/ftc_ru?z=video51298751_456239028%2F1415f8eb6543ce6bd9%2Fpl_wall_-84781876
План работы |
Выбор эмблемы и символики |
Распределение обязанностей на оставшееся время |
Создание большого шара |
Написание программы |
На этом занятии нужно было выбрать эмблему и символику. Как уже упоминалось, символом стал розовый гусь, отсюда и такое название нашей команды. Но существует множество вариантов логотипа с этой птицей, какой из них выбрать оставалось вопросом. Тогда Егор Давидович скинул нам пару идей, которые показаны ниже.
Чтобы выглядеть одинаково на соревнованиях, стоило придумать “костюмы”. Из огромного выбора, начиная от кепок, заканчивая обувью, мы выбрали одинаковые футболки.
Нам больше всех понравился 3 логотип, именно его мы распечатали на наших футболках.
Также мы решили спланировать дальнейшую деятельность каждого члена команды на оставшееся время, чтобы ничего не упустить в подготовке к соревнованиям. На 3D-печать была отправлена вторая половинка большого шара. Этот процесс также занял 5 часов. После этого мы склеили большой шар клеем-моментом, и отправились тестировать робота. После нескольких падений, шар развалился, тогда мы обмотали его изолентой. После чего он был хорошо скреплён и выдерживал все падения.
Следующей задачей стало создание механизма подъема большого шара-затычки в end-game. Посмотрев в интернете, как другие команды решают данную задачу, было решено собрать конструкцию, состоящую из механизма линейного перемещения и механизма захвата шара.
План работы |
Доработка механизма запуска |
Написание программы и инженерной книги |
Создание большого шара |
Разработка телескопического механизма |
Теперь все наши занятия начинались с печати большого шара. Каждый выполнял свою роль в команде: Глеб писал программу, Мария – инженерную книгу, остальные занимались роботом, а сегодня - механизмом запуска.
Как уже упоминалось, он сделан из пластмассовой пластины и металлической трубки, которая установлена на оси. Мы не знали, каким местом механизм должен бить по шару, поэтому перебрали разные способы: использование линейки, другие виды пластика. Но потом нам пришла в голову мысль, обрезать под шар пластмассовую пластину и прикрепить под нее кусочек текстолита для увеличения жёсткости, и как следствие, увеличения силы удара. Дальнейшая работа заключалась в настройке механизма запуска: необходимо чтобы шар всегда стоял в определённом месте, удар всегда приходился ровно по центру шара, и сила удара была строго определённой. Для настройки положения шара нами были установлены направляющие из пластика.
Регулировка силы удара производилась подбором положения упора, за который зацепляется упругий элемент при вращении.
После тестирования обнаружилось, что есть большой разброс в траектории полёта шаров и не все шары попадают в мишень. Причиной тому является консольное крепление упругого элемента на шпинделе мотора и вследствие недостаточной жёсткости.
Было решено поставить дополнительную опору, чтобы уменьшить отклонение оси с пластиком в момент запуска.
В результате изменений удалось добиться большей стабильности механизма запуска. При тестировании 5 из 5 шаров попадали в мишень.
https://vk.com/ftc_ru?z=video51298751_456239026%2Fc3986aa98bb7fe49a7%2Fpl_wall_-84781876
Также сегодня предстояла задача – подумать над телескопическим механизмом, в который входит механизм подъёма большого шара-затычки в end-game и устройство для захвата шара.
План работы |
Разработка направляющей |
Написание программы и инженерной книги |
Создание большого шара |
Работа над полной конструкцией тележки подходила к концу. Оставалось сделать направляющую и установить цветовой датчик.
Направляющая нужна для того, чтобы задавать угол шару при запуске, иначе он летит ровно вверх. Этот механизм был очень прост, состоял всего лишь из куска пластика и детали из конструктора (металлической палочки), которая выполняет роль ограничителя. Он нужен для того, чтобы пластина механизма запуска задерживалась, прогибалась, после ударяла по шару с нужной силой.
Наши инженеры установили направляющую и до конца дня тестировали робот, проверяя на точность попадания в мишень.
План работы |
Замена направляющей |
Разработка подъёмника |
Написание программы и инженерной книги |
Создание большого шара |
На одиннадцатом занятии Алексей выяснил, что из-за направляющей наша тележка не подходит под установленные правилами габариты. Наши инженеры долго размышляли, чем можно заменить данное устройство. Они пришли к выводу, что лучше будет поставить металлическую пластинку. Она намного легче и меньше, чем из пластика, но при этом также направляет шар.
Замену мы произвели достаточно быстро и отправились на поле для тестирования новой установки.
В этот же день мы сделали уже третий шар. Теперь есть возможность тестирования последовательного запуска трёх шаров.
Последняя часть нашего робота – это устройство для подъема большого шара. Но чтобы его сделать, сначала нужно разработать его устройство, чем мы и занялись в этот день. Изначально была задумка поднимать шар ножницами, но их конструкция занимает слишком много места.
Тогда возникла идея придумать вилы и механизм подъёма.
Так эта пара должна выглядеть вместе, только из чего их сделать оставалось главным вопросом. Опять же мы обратились к нашему тренеру за помощью. Он посмотрел на наш приблизительный чертёж, и посоветовал использовать линейный механизм для выдвижения полок, алюминиевый профиль, верёвку и шкивы из фторопласта. Вилы прикрепляются к устройству подъёма, образуя вместе телескопический механизм.
Начался процесс создания механизма подъёма. По большей части над этой конструкцией работали Лев Нефёдов и Александров Андрей. Они разобрали старое устройство и собрали новое из линейных механизмов для выдвижения полок. Сначала мальчики соединили их, потом установили шкивы и натянули верёвку.
План работы |
Установка цветового датчика |
Доработка тележки |
Написание программы и инженерной книги |
На соревнованиях в автономном периоде для получения очков роботу необходимо нажать маяк своего цвета (цвет задают судьи) и отстоять перед другими командами. Чтобы распознать его, нужно было установить цветовой датчик. Мы взяли его из основного комплекта конструктора «Lego» собирались установить на переднюю верхнюю часть тележки.
Но возникла проблема - нам мешала трубка на сборщике. Пришлось её убрать и модернизировать сборщик: установить ограничитель, чтобы шары, которые закатывались, не били по датчику.
При тестировании робота оказалось, что шары выпадают из накопителя, их нужно было чем-то ограничить. Самое простое было накрыть куском ткани верхнюю часть тележки, так мы и сделали.
План работы |
Создание вил |
Написание программы и инженерной книги |
На пятнадцатое занятие робототехники мы ещё раз обдумали, как будут выглядеть наши вилы, как соединить все те материалы, которые решили использовать.
Вилы состоят из 4 простых балок, 2 угловых, 2 уголков и 2 шарниров. На фото показано, как все детали соединены.
На наш взгляд, это очень простая конструкция, которая не имеет абсолютно никаких недостатков.
План работы |
Соединение телескопического механизма |
Тестирование робота на поле |
Написание программы |
Программы для автономного и телеуправляемого периодов были написаны, и телескопический механизм был почти готов, оставалось только его собрать (вилы, механизм подъёма) и прикрепить к тележке, всё шло без каких-либо затруднений.
Как только этот процесс был завершен, мы начали тестировать устройство. В ходе работы выяснилось, что телескопический механизм вместе с шаром перевешивают тележку, тогда к ней пришлось крепить груз к передней части робота. В качестве груза использовался стальной прокат квадратного сечения.
В этот раз у нас получилось поднять и положить шар в центральную мишень.
https://vk.com/im?sel=51298751&z=video51298751_456239031%2F561c36a73224fbd932
Видно, что ещё нужно было закрепить вал, на который наматывается верёвка.
План работы |
Подведение итогов |
Тестирование робота |
Подготовка к поездке |
На семнадцатом занятии у нас была модель робота (тележка с накопителем, механизм запуска, сборщик, направляющая, цветовой датчик, телескопический механизм).
Вся наша команда вместе с тренером подвели итоги проделанной работы: все было сделано, оставалось лишь выявить небольшие недостатки робота, устранить их и дописать инженерную книгу и программу для автономного периода.
Выявить недоработки можно было только при тестировании робота на поле, одна из них нашлась - сборщик перестал захватывать шары. Для устранения этой проблемы мы поменяли угол планки тележки.
В этот день было проведено собрание, мы прослушали инструктаж по правилам поведения и техники безопасности во время поездки, обсудили, что с собой взять, кто за что отвечает.
На протяжении всей работы мы общались и делились своими успехами с командой “Masquerade” из США.
Итоговая версия программы
Телеуправляемый период:
package com.qualcomm.ftcrobotcontroller.opmodes;
import com.qualcomm.robotcore.eventloop.opmode.OpMode;
import com.qualcomm.robotcore.hardware.DcMotor;
import com.qualcomm.robotcore.hardware.DcMotorController;
import com.qualcomm.robotcore.hardware.Servo;
import com.qualcomm.robotcore.util.Range;
public class GooseTeleOp extends OpMode {
public DcMotorController c1;
public DcMotor leftMotor;
public DcMotor rightMotor;
public DcMotor shooter; // Бросок
public DcMotor collector; // Сборщик
public DcMotor up;
public Servo arm; // Рука
public static final double SHOOTER_POWER = 1;
public static final double COLLECTOR_POWER = 1;
double armPosition = 0;
long time;
public GooseTeleOp() {
}
@Override
public void init() {
c1 = hardwareMap.dcMotorController.get("c1");
leftMotor = hardwareMap.dcMotor.get("m2");
rightMotor = hardwareMap.dcMotor.get("m1");
shooter = hardwareMap.dcMotor.get("shooter");
collector = hardwareMap.dcMotor.get("collector");
arm = hardwareMap.servo.get("hand");
up = hardwareMap.dcMotor.get("up");
leftMotor.setDirection(DcMotor.Direction.REVERSE);
up.setDirection(DcMotor.Direction.REVERSE);
}
@Override
public void loop() {
// Управление моторами
float left = -gamepad1.left_stick_y;
float right = -gamepad1.right_stick_y;
left = Range.clip(left, -1, 1);
right = Range.clip(right, -1, 1);
//if(gamepad1.left_stick_y)
//time = System.currentTimeMillis();
if(gamepad1.left_trigger > 0.25 || gamepad1.right_trigger > 0.25) {
left = left / 3;
right = right / 3;
}
leftMotor.setPower(left);
rightMotor.setPower(right);
// Сборщик
if (gamepad2.a)
collector.setPower(-COLLECTOR_POWER);
else
collector.setPower(0.0);
// Броски
if (gamepad2.y)
shooter.setPower(-SHOOTER_POWER);
else
shooter.setPower(0.0);
float upper = -gamepad2.left_stick_y;
upper = Range.clip(upper, -1, 1);
if(gamepad2.left_trigger > 0.25 || gamepad2.right_trigger > 0.25) {
upper = upper / 3;
}
up.setPower(upper);
// Рука
if (gamepad1.b && (armPosition <= 0.9)) { armPosition = armPosition + 0.05; arm.setPosition(armPosition); }
if (gamepad1.x && (armPosition >= 0.1)) { armPosition = armPosition - 0.05; arm.setPosition(armPosition); }
}
@Override
public void stop() {
}
}
Автономный период:
package com.qualcomm.ftcrobotcontroller.opmodes;
import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
import com.qualcomm.robotcore.hardware.DcMotor;
import com.qualcomm.robotcore.hardware.DcMotorController;
import com.qualcomm.robotcore.hardware.LightSensor;
import com.qualcomm.robotcore.hardware.UltrasonicSensor;
import com.qualcomm.robotcore.hardware.ColorSensor;
import com.qualcomm.robotcore.hardware.Servo;
public class GooseAutonomous extends LinearOpMode {
DcMotorController c1;
DcMotor leftMotor;
DcMotor rightMotor;
DcMotor shooter;
LightSensor lightSensor;
UltrasonicSensor ultrasonicSensor;
ColorSensor sensorRGB;
Servo hand;
final static long TURN_RIGHT = 650;
long now;
@Override
public void runOpMode() throws InterruptedException {
lightSensor = hardwareMap.lightSensor.get("sensor_light");
lightSensor.enableLed(true);
ultrasonicSensor = hardwareMap.ultrasonicSensor.get("distance");
sensorRGB = hardwareMap.colorSensor.get("color");
c1 = hardwareMap.dcMotorController.get("c1");
leftMotor = hardwareMap.dcMotor.get("m2");
rightMotor = hardwareMap.dcMotor.get("m1");
leftMotor.setDirection(DcMotor.Direction.REVERSE);
shooter = hardwareMap.dcMotor.get("shooter");
hand = hardwareMap.servo.get("hand");
stopDriving();
shooter.setPower(0);
waitForStart();
// Немного проезжаем
drive(-0.70, -0.70, 1100);
sleep(50);
// Стреляем шарами
shooter.setPower(-1);
sleep(5000);
shooter.setPower(0);
sleep(100);
// Поворачиваем к цели - белой линии и маяку
drive(0.7, -0.7, TURN_RIGHT);
sleep(50);
drive(0.7, 0.7, 1100);
sleep(50);
drive(0.7, -0.7, TURN_RIGHT+100);
sleep(50);
while(opModeIsActive() && (lightSensor.getLightDetected() < 0.70) && (lightSensor.getLightDetected() > 0.60)) { drive2(0.5, 0.5); }
sleep(1);
stopDriving();
sleep(50);
mayak();
sleep(1);
drive(0.7, -0.7, TURN_RIGHT);
sleep(1);
while(opModeIsActive() && (lightSensor.getLightDetected() < 0.70) && (lightSensor.getLightDetected() > 0.60)) { drive2(0.5, 0.5); }
sleep(1);
stopDriving();
sleep(50);
mayak();
sleep(1);
}
public void stopDriving() {
leftMotor.setPower(0);
rightMotor.setPower(0);
}
public void drive(double lpower, double rpower, long waiting) {
now = System.currentTimeMillis();
while(opModeIsActive() && (System.currentTimeMillis() - now < waiting)) {
leftMotor.setPower(lpower);
rightMotor.setPower(rpower);
}
stopDriving();
}
public void drive2(double lpower, double rpower) {
leftMotor.setPower(lpower);
rightMotor.setPower(rpower);
}
public void mayak() {
while(opModeIsActive() && (ultrasonicSensor.getUltrasonicLevel() > 20)) {
if (lightSensor.getLightDetected() > 0.70) {
drive(0.25, 0, 1);
} else if(lightSensor.getLightDetected() < 0.50) {
drive(0, 0.25, 1);
} else {
drive(0.25, 0.25, 1);
}
}
stopDriving();
if(sensorRGB.red() >= 100) {
hand.setPosition(0.2);
drive(0.3, 0.3, 100);
} else {
hand.setPosition(0.8);
drive(0.3, 0.3, 100);
}
}
}
Программу для автономного периода мы будем дорабатывать уже в Иркутске перед соревнованиями, подгонять её под поле.