Робототехническая платформа "K-LAB-CAR" для Кубка РТК
Выступления и результаты
Студенческая команда лаборатории робототехники представляет своего робота для участия в соревнованиях Кубка РТК.
Первый отборочный этап в Самаре, май 2022 год – 1 место, выход в финал соревнований.
Финал в Сочи ноябрь-декабрь 2022г – 9 место, конец сезона
Ожидается первый отборочный этап весной 2023 года.
Команда K-LAB-CAR:
Алексей Прутский – преподаватель КИТ ФКТиПМ, заведующий лабораторией робототехники и мехатроники Кубанского госудерственного университета, руководитель проекта;
Илья Звонков – студент 3 курса ФТФ, инженер-конструктор, моделирование деталей, 3D-печать, тестирование прочностных характеристик, сборка;
Андрей Иванисов – студент 3 курса ФТФ, инженер электроники, проектирование платы, разводка проводов, подключение устройств;
Олег Лихогуб – студент 4 курса ФКТиПМ, инженер-программист, создание ПО для управления роботом, оператор робота;
Принимали участие:
Виталий Трегубов – студент 3 курса ФТФ, разработка и отладка ПО для управления сервомоторами Dynamixel;
Евгений Васильев – студент 1 курса магистратуры ФТФ, помощь в построении системы управления роботом в фреймворке ROS;
Ренат Енокаев – выпускник ФМиКН, помощь в разработке алгоритмов машинного зрения для распознавания знаков опасности
Создание робототехнической платформы для участия в робототехнических соревнования Кубка РТК.
Робот
На соревнования команда должна представить заранее собранного, полностью функционального робота. Робот может быть собран на любой элементной базе, без ограничений по конструкции. Управление роботом должно осуществляеться по беспроводной связи кроме ИК-пультов. Рекомендуемые габариты робота в стартовом положении – 350х400х400 мм (ВхДхШ), вес не более 10 кг.
На специальном испытательном полигоне
который представляет собой реконфигурируемую полосу препятствий, лабиринт, состоящий из участков, имитирующих условия пересеченной местности и урбанизированной среды, а также последствия катастроф.
Робот на полигоне может продемонстрировать:
Ход соревнований
Каждой команде отводится две попытки по 10 минут. В зачет идет лучшая из попыток.
В ходе попытки робот, под управлением оператора, должен за наименьшее время преодолеть полосу препятствий и выполнить задания.
Маршрут участник выбирает сам, исходя из возможностей своего робота.
Команда имеет право выставить только одного робота, и только в одной номинации в ходе текущих соревнований.
Проектирование деталей
При старте проекта была выдана колёсная платформа: две полосы из тонколистового упругого к деформации металла, скрепленные между с собой в начале, середине и конце плоскими дощечками с отверстиями для креплений под коллекторные моторы. Проектирование началось с моделирования расположения конструкционных частей. После были изменены крепления моторов в связи с особенностями трассы и габаритов робота. Далее взяв за основу уже имеющиеся, были спроектированы соединения серводвигателей манипулятора. В это же время было смоделировано крепление камеры в роборуке. Окончательным этапом проектирование деталей было моделирование креплений электроники и АКБ к основанию робота.
Печать деталей
Печать деталей велась по мере проектирования. Печатались также запасные составляющие. Плотность заполнения почти всех деталей была порядка 20%. Использовался ABS пластик.
Сборка устройства
Сборка проводилась на ⅔ этапе проекта. Болты и гайки различной длины, использованные для сборки: манипулятора – М2, М3(основание), моторов – M4.
Обслуживание устройства
Обслуживание робота производилось по мере необходимости. Основной проблемой были крепления моторов, из-за особенностей печати крепления были слабы на поперечные нагрузки. В процессе эксплуатации было заменено порядка 10 деталей.
Разработка платы соединений
Главные этапы:
- Разработка электрической схемы и печатной платы
- Радиомонтаж компонентов
- Установка, соединение и тестирование
Основная задача данного устройства – согласование между собой управляющей платы Arduino Mega 2560 и различных периферийных элементов робота, таких как источник питания, драйвера моторов, приемо-передатчик телеметрии, IMU-сенсор и прочих механических элементов.
На плате согласования находится предохранитель для защиты элементов. Также на ней предусматривается специальный коннектор для переключения между внутренним и внешним источниками напряжения +5 В (SB1).
Все элементы подключения специально подобраны таким образом, чтобы не допускать возможность ошибочного подключения, предотвращая переполюсовку питания и неверное согласование цифровых линий.
(сюда можно довставить 2 фотки реальной платы подровнять)
Плата управления устанавливается с обратной стороны, относительно коннекторов периферии. В специальную ячейку устанавливается стеклянный предохранитель вида “179020” на 20 ампер.
Электромонтаж
Данный этап выполняется в несколько шагов:
- Установка всех периферийных элементов
- Соединение устройств между собой
- Аккуратное распределение и закрепление проводов
Все составляющие элементы робота обязательно должны
быть изолированы от металлической рамы. Также провода обязаны надежно скрепляться с корпусом, при этом не мешая движению всех подвижных частей робота. Все соединения должны обеспечивать максимальную надежность контакта, не давая ни
шанса на расцепление электрического контакта при движении на любой допустимой скорости и маневрах.
Концептуальная схема информационной системы
Часть управления на роботе
Подключение устройств к Arduino
- HolyBro – приемо-передатчик, который подключается по интерфейсу Serial. Он берет на себя помехоустойчивость (под капотом осуществляет проверку пакетов данных на предмет повреждения). Работает как с текстом, так и с двоичными данными.
- Драйвер моторов. Подключается к Arduino по 4 пинам: два ШИМ, два аналоговых.
- Роборука. Подключается к Arduino по интерфейсу Serial.
- MPU9250 (гироскоп, акселерометр, магнитометр). Подключается к Arduino по интерфейсу I2C.
Получение пакетов управления
Пакет управления
struct Command
{
int8_t _SB0 = 0xA5; // стартовый байт
int8_t _SB1 = 0x5A; // -||-
int8_t WL = 0; // скорость левых колес
int8_t WR = 0; // скорость правых колес
int8_t AR = 0; // угол поворота основания роборуки
int8_t A0 = 0; // угол поворота нижнего звена роборуки
int8_t A1 = 0; // угол поворота верхнего звена роборуки
int8_t AS = 0; // угол поворота захвата роборуки
uint8_t AF = 0; // степень захвата роборуки
uint8_t LED = 0; // яркость подсветки
uint8_t CRC = 0; // контрольная сумма
};
Сбор данных из HolyBro
Рассмотрим пакет управления размером N байт полезной нагрузки.
Построим конечный автомат:
Проверка хэш-сумм пакетов
При получении байтов полезной нагрузки последовательно вычисляем хэш-сумму с помощью алгоритма CRC8.
При получении n+1-го байта, который является контрольной суммой пакета, сравниваем его с вычисленной локально хэш-суммой.
В случае, если они совпали, то пакет считается принятым и неповрежденным. Иначе – пакет поврежден.
Интерпретация пакета управления
Полученная в результате работы конечного автомата последовательность байт интерпретируется Arduino как пакета управления путем тривиального явного приведения типов С++.
Псевдокод
Command command = &(Command*)byteArrayPtr;
Отправка команд устройствам
Отправка команды драйверу моторов
Псевдокод
wheels.setSpeedLeft(command.WL);
wheels.setSpeedRight(command.WR);
Отправка команды сервомоторам роборуки
Псевдокод
arm.setAngleRotate(command.AR*158/255);
arm.setAngle0(command.A0*180/255);
arm.setAngle1(command.A1*240/255); arm.setAngleSpin(-command.AS*180/255);
arm.setFistPressure(command.AF);
Замечание. Применения параметров производится согласно физическим ограничениям соответствующих моторов. Таким образом уменьшается вероятность повреждения робота и увеличивается точность сервомотора за счет сужения рабочего диапазона положений роборуки при том же диапазоне управляющих значений от -128 до 127.
Опрос датчика MP9250
Псевдокод
if (IMU.readSensor() > 0) {
telemetry.ACC_X = (int8_t)((IMU.getAccelX_mss() / 20) * 127);
telemetry.ACC_Y = (int8_t)((IMU.getAccelY_mss() / 20) * 127);
telemetry.ACC_Z = (int8_t)((IMU.getAccelZ_mss() / 20) * 127);
}
Отправка пакетов телеметрии
Пакет телеметрии
struct Telemetry
{
int8_t _SB0 = 0xA5;
int8_t _SB1 = 0x5A;
int8_t WL = 0;
int8_t WR = 0;
int8_t AR = 0;
int8_t A0 = 0;
int8_t A1 = 0;
int8_t AS = 0;
uint8_t AF = 0;
int8_t ACC_X = 0;
int8_t ACC_Y = 0;
int8_t ACC_Z = 0;
uint8_t CRC = 0;
};
Пакет телеметрии аналогичен управляющему пакету, однако содержит дополнительные данные о положении в пространстве.
Формирование пакета телеметрии
Псевдокод
if (radio.receive_command(&command)) {
telemetry.WL = command.WL;
telemetry.WR = command.WR;
telemetry.AR = command.AR;
telemetry.A0 = command.A0;
telemetry.A1 = command.A1;
telemetry.AS = command.AS;
telemetry.AF = command.AF;
last_command = millis();
}
Получаем пакет управления и обновляем данные телеметрии.
if (millis() – last_telemetry > 50) {
radio.send_telemetry(&telemetry);
last_telemetry = millis();
}
Отправляем пакет телеметрии не чаще, чем раз в 50 миллисекунд.
Вычисление хэш-сумм пакетов
Псевдокод
void Radio::send_telemetry(Telemetry* telemetry) {
telemetry->CRC = calc_check_sum((uint8_t*)telemetry, sizeof(Telemetry));
_serial->write((uint8_t*)telemetry, sizeof(Telemetry));
}
uint8_t Radio::calc_check_sum(uint8_t* package, size_t len) {
return crc.smbus((uint8_t*)package + 2, len – 3);
}
Установка передатчик FPV камеры
Передатчик подключается к бортовой 12-ти вольтовой сети питания.
Часть хоста
Подключение устройств к хосту
- HolyBro – USB
- Геймпад – USB
- Приемник FPV камеры
Разработка системы ROS
Узлы связи
Узел TX
Предоставляет абстракцию для отправки команд на робот.
Узел подписывается на topic /node_tx/command. При получении сообщения из этого топика происходит формирование пакета управления, вычисление его контрольной суммы.
Узел RX
Предоставляет абстракцию для получения телеметрии от робота.
Узел работает с HolyBro, парсит полученные байты на предмет пакета, проверяет пакеты на валидность с помощью контрольной суммы по алгоритма CRC8.
Как только валидный пакет получен, то он преобразуется в сообщение и отправляется в топик /node_telemetry/telemetry
Узел контроля
Ручное управление построено на основе “чистых функций”.
Состояние робота эквивалентно команде, которая отправляется на робота.
От обработчика зависит то, как будут интерпретированы нажатия на кнопки геймпада.
Предусмотрены два типа управления: ручной и автоматический (следование по линии).
При автоматическом режиме происходит формирование команд с помощью механизма анализа кадра с FPV камеры.
Алгоритм для движения по линии на данный момент не существует.
Узел распознавания знаков опасности
Некий алгоритм пытается распознать на кадрах с FPV камеры:
- наличия знака на кадре
- распознавания типа знака
- выделения знака на кадре графически
Устройства, над которыми велась работа:
Цифровой сервомотор Dynamixel AX-12A(4 штуки)
Цифровой сервомотор Dynamixel MX-106(2 штуки)
Драйвер двигателя для моторов
Хронология работы над устройством:
Обеспечение движения платформы: движение робота вперёд-назад, выполнение танкового разворота в обе стороны. Начало написания кода.
Подключение серводвигателей к компьютеру через «переходник» USB to RS-485(на самом деле это преобразователь интерфейса U2D2, поддерживающий ещё 2 интерфейса для передачи).
После проверки исправности двигателей они были подключены к Arduino Mega через MAX485 MODULE к UART-выходам платы по Serial соединению и был написан пробный код для поворота двигателей на определенный угол.
Рефакторинг кода
Движение робота
Движение обеспечивается за счёт подачи тока на 4 пина драйвера двигателя, к которому подключены 6 коллекторных двигателей (по 3 на сторону). 2 пина отвечают за направление вращения двигателей на каждой из сторон робота, другие 2 – за скорость вращения на каждой из сторон.
Управление манипулятором
Для работы манипулятора использовались сторонние библиотеки AX-12A.h и Dynamixel_Serial.h. Были разработаны функции для вращения серводвигателей. Первая функция принимает значение угла, на которое должен повернуться двигатель, относительно выставленного «нуля». Другая функция – то же самое, только с ограничителем в промежутке от 10 до 170 градусов включительно, оно необходимо, чтобы двигатели не сломали свою основу. И последняя функция была разработана для вращения «весла», выбирается ID весла и направление его движения.
Расположение компонентов
Аккумулятор
Манипулятор