История этого проекта начинается в 2014 году, когда я учился на 4-м курсе в ведущем техническом вузе России на кафедре «Робототехнические системы». В это время я уже начал задумываться над темой диплома и искал проект, который был бы интересен мне, и при этом в нем присутствовала некоторая новизна. И вот однажды, увидев видео шаробота Rezero, я с друзьями захотел попробовать повторить успех. Кому интересно, что из этого получилось — прошу под кат. В начале хотелось бы поговорить о достоинствах шаробота. Благодаря единственной точке контакта с поверхностью, шаробот одинаково легко передвигается во всех направлениях, являясь чрезвычайно подвижным и манёвренным, по сравнению с обычными колесными роботами. Манёвренность шаробота ограничена только его динамикой, в отличие от механических ограничений, налагаемых колёсами (например, невозможность движения боком).  Следующее важное достоинство — робот может быть высоким, и чем выше он будет, тем он будет устойчивее. Почему устойчивее? Это видно из уравнения динамики обратного маятника. Ускорение отклонения от вертикального положения равновесия обратно-пропорционально расстоянию до центра масс, т.е. более высокий обратный маятник будет медленнее падать. Это снижает требования к скорости реакции системы управления, но, возможно, увеличивает момент, который должны развивать привода. Еще одно преимущество — он может ездить по наклонным и подвижным поверхностям, например, палуба корабля или пол самолета при взлете. Да и согласитесь, движется он гораздо красивее, чем обычные колесные роботы. Один из главных недостатков шаробота — возможность потери вертикального положения равновесия. Но лично я думаю, что это вполне решаемая инженерная задача. Инженеры роботов Aido и Mobi решили ее следующим образом: при превышении некоторого угла отклонения выдвигаются “ноги”, чтобы робот не потерял устойчивость.  Мой рассказ состоит из следующих частей:
 — Математическая модель
 — Разработка алгоритмов управления
 — Конструкция
 — Аппаратно-программное обеспечение
 — Результаты Вывод уравнений движения необходим для дальнейшего синтеза управления и моделирования движения. В этом разделе будет немного математики и механики. На данный момент все существующие математические модели шаробота составлены с учетом некоторых упрощений с помощью уравнений Лагранжа 2-го рода. А так как шаробот является неголономной механической системой, то применять уравнения Лагранжа 2-го рода к такой систему некорректно. В роботе CMU модель шаробота рассматривается как три независимые плоские модели, тем самым не учитывается взаимовлияние этих моделей. В Rezero разработали трехмерную математическую модель, в которой не учитываются гироскопические эффекты, возникающие при вращении омниколес. Я поставил цель создать наиболее полную математическую модель робота с минимальным количеством допущений. В достижении этой цели мне помог мой научный руководитель С.Л. Крутиков, за что я выражаю ему огромную благодарность.  Для кинематического описания системы я ввел подвижные системы координат, показанные на рисунке.  Инерциальная система координат обозначена как . Система координат  находится в центре шара. Для перехода от инерциальной системы отсчёта к центру шара используется следующая однородная матрица:   где  и  смещение центра шара вдоль оси  и  соответственно. Для описания вращения шара удобно использовать кардановы углы или углы Tait–Bryan. Таким образом, система координат , связанная с шаром, получается путем поворота  на углы ,  и  вокруг осей  и  соответственно. Данную последовательность поворотов можно представить в виде произведения матриц поворота:   Аналогично можно описать вращение тела шаробота в пространстве. Система координат  2-го звена, связанная с телом, получается путем поворота  на углы ,  и  вокруг осей  и  соответственно. Данную последовательность поворотов также можно представить в виде произведения матриц поворота:   3-я, 4-ая и 5-ая системы координат связаны с омниколесами. Чтобы перейти от системы координат тела к системе координат омниколеса требуется выполнить ряд элементарных преобразований(два поворота, перенос, затем опять поворот), я не буду их описывать здесь. Последовательность переходов представлена в виде следующего кинематического графа: 
 Для описания положения системы используется следующий вектор обобщенных координат:   где  — координаты центра шара,  — кардановы углы, описывающие вращение шара и тела соответственно,  — углы поворота омниколеса вокруг оси двигателя. Исходя из неголономности системы было принято решение использовать уравнения Аппеля для составления дифференциальных уравнений движения шаробота.  На систему наложено 6 неголономных связей: три связи качения омниколес по шару, две связи для скорости центра шара и одна связь отсутствия верчения шара. Таким образом, число обобщенных координат m=11, число связей s=6, а число степеней свободы n=5. Будем использовать следующий вектор псевдоскоростей:   Для составления уравнений движения необходимо вычислить энергию ускорений для каждого звена:   где  — количество звеньев,  — матрица перехода от инерциальной системы координат к системе координат -го звена,  — матрица инерции -го звена, а  — след матрицы. В общем случае  является функцией от . С помощью уравнений связи энергия ускорений сводится к функции, зависящей только от . Матрица инерции шара имеет диагональный вид, т.к. оси системы координат  являются главными центральными осями инерции:   Т.к. плоскости  и  являются плоскостями симметрии тела, центробежные моменты инерции  и  равны нулю. Матрица инерции тела будет иметь следующий вид:   где  – расстояние от центра шара до центра масс тела вдоль оси . Матрица инерции омниколес имеет диагональный вид, т.к. оси системы координат омниколеса образуют плоскости симметрии:   В приведенном моменте инерции  необходимо также учесть момент инерции ротора двигателя:   где  – передаточное число редуктора. Дифференциальное уравнение движения Аппеля в псевдокоординатах:   где  – обобщенная сила от моментов приводов,  – обобщенная сила от сил тяжести. Записываем уравнения Аппеля в матричной форме и решаем относительно :   Уравнения движения можно записать в матричной форме   где   Все вычисления выполнялись символьно с помощью Maple. Затем полученные уравнения были перенесены из Maple в Matlab для моделирования. Еще немного теории управления и матчасть на этом закончится. В теории управления хорошо развиты методы анализа линейных систем. Для вполне наблюдаемых систем наиболее часто применяется оптимальное управление с квадратичным функционалом(линейно-квадратичный регулятор, LQR), которое гарантирует стабилизацию системы в случае, если система вполне управляема. Шаробот является вполне наблюдаемой системой, т.к. вектор состояния может быть полностью измерен. Вычислив ранг матрицы управляемости, я также убедился в управляемости системы. Для получения линейно-квадратичного регулятора в начале необходимо линеаризовать систему в окрестности вертикального положения неустойчивого равновесия    Вектор  — вектор состояния или фазовый вектор,  — вектор измерения и  — управление(моменты приводов). LQR регулятор имеет следующий критерий оптимальности:   где  и  — положительно определённая матрица. Задача минимизации данного функционала сводится к решению матричного алгебраического уравнения Риккати:   Для линейно-квадратичного регулятора управление записывается в виде , где ,  – решение уравнения Риккати. В итоге мы имеет матрицу коэффициентов обратной связи:   При умножении данной матрицы на вектор состояния  мы получим три момента, которые необходимо подать на двигатели для стабилизации системы. LQR является PD регулятором, в случае если вектор состояния состоит из координат и их производных. Как вы понимаете, использовать обычный PID регулятор и подбирать коэффициенты вручную в такой системе почти невозможно. Дам небольшие пояснения к каждому блоку. В блоке «Ballbot 3D model» реализованы уравнения Аппеля. На вход подается управление  (три момента), на выходе получается вектор состояния  (см. п.2). Блок «VRML transform» преобразует вектор состояния в координаты для визуализации. «VR Sink» содержит модель в формате vrml и именно этот блок отрисовывает графику. На вход блоку «controller» подается вектор состояния  и желаемый вектор состояния , с помощью которого можно задавать траекторию движения и скорость. Блок производит элементарное уможножение матриц для получения трех моментов . Так как момент, который развивают привода, ограничен, я добавил звено насыщения(saturation). 
 Для трехмерной визуализации была сделана простая модель шаробота в SolidWorks. Затем она была экспортирована в формате vrml и добавлена в блок VR Sink. 
Результаты моделирования при начальном отклонении в 10 градусов Конструкция робота разработана в CAD системе Siemens NX. На основании построенной модели были определены массовые и инерционные характеристики звеньев робота.  Конструкция состоит из двух алюминиевых оснований. На нижнем основании закреплены три двигателя, которые приводят в движение омниколеса. Верхнее основание крепится к нижнему с помощью амортизаторов и направляющих. Задача амортизаторов заключалась в уменьшении вибраций верхней части корпуса, где находится вся электроника, правда на практике это не помогло.  Полки сделаны из оргстекла для облегчения конструкции. На них располагается вся бортовая электроника: аккумулятор, контроллеры приводов, микроконтроллер, инерциалка и др.  В качестве шара используется баскетбольный мяч диаметром 240 мм. Держатели шара прижимают его к омниколесам, тем самым увеличивают трение. К сожалению, их не получилось изготовить, так как на нашей кафедре нет 3D принтера, а печатать на заказ дорого, т.к. они не маленькие и коэффициент заполнения нужен большой для прочности. Омниколеса были приобретены на Aliexpress по 120$ за штуку. Самая дорогая часть робота, после приводов, конечно. Все металлические детали изготовлены из дюралюминия на заказ на одном московском заводе. На этом же заводе нам сделали полки из оргстекла. Заказ вышел на сумму 30 000р, примерно. Друг помог мне развести плату, на которой находятся DC-DC преобразователь, IMU и логический преобразователь уровней для I2C. Сверху втыкается ODROID 
Это самый первый вариант конструкции с приводами Dynamixel MX64. Коробки для приводов напечатаны. 
Амортизаторы фирмы HSP для радиоуправляемых моделей с масштабом 1:10. 
В таком виде я получил комплект приводов и контроллеров. 
Чтобы надеть омниколесо на вал двигателя пришлось вытачивать втулку. 
Это уже финальный результат. Почти все аппаратные компоненты шаробота представлены на функциональной схеме. Скажу пару слов про каждый элемент, двигаясь "снизу вверх". 
 Всех сложнее было найти привода и контроллеры приводов. На выходе LQR регулятора у нас момент, следовательно надо иметь контроллер с возможностью управления по току(т.е. по моменту). Видимо, эта задача встречается очень редко в повседневной жизни, и мы нашли только одно доступное по деньгам решение — Dynamixel. Мы купили и попробовали привода Dynamixel MX64, в которых есть режим управления по току. К сожалению, их быстродействия не хватало для стабилизации робота.  Я уже было потерял надежду на создание реального шаробота, но к счастью нам помог Ярослав из НУЦ "Робототехника" и предоставил на некоторое время три привода Maxon с контроллерами, за что мы ему очень благодарен. В итоге у нас оказался бесколлекторный двигатель постоянного тока Maxon EC-max 30 40Вт со следующими характеристиками: Планетарный редуктор Maxon GP 32 с передаточным числом n=14 и контроллер привода Maxon EPOS 24/5, который имеет режим управления по току. Как вы можете заметить, привода не очень мощные и передаточное число маленькое, поэтому момента на выходе едва ли хватает для стабилизации шаробота. У Rezero, например, используются двигатели 200Вт и редуктор с передаточным числом 51. В качестве микроконтроллера использовался STM32F4-Discovery, который имеет необходимые нам интерфейсы: CAN, UART и I2C. Он получает данные с гироскопа и акселерометра по I2C и энкодеров по шине CAN. На основе полученных данных рассчитывает управление и отправляет задание на контроллеры приводов по шине CAN. Чтобы не реализовывать протокол для связи с EPOS контроллерами самому, я использовал библиотеку libepos. Для того, чтобы подключить STM'ку к CAN сети необходим приемопередатчик CAN(трансивер) за 4$. В качестве инерциального модуля мы использовали плату GY-521 за 3$ на основе микросхемы MPU6050, которая включает в себя 3-х осевой гироскоп и 3-х осевой акселерометр. Для обработки показаний этих датчиков я использовал фильтр Маджвика, который в последнее время так полюбили коптероводы. Для упрощения разработки под STM я использовал STM32Cube HAL(hardware abstraction layer).  Частота на которой работает управление равна примерно 300 Гц, т.е. 300 раз в секунду мы считываем показания всех датчиков, рассчитываем управление и отправляем задание на привода. Все это происходит в бесконечном цикле, который можно представить в виде следующего псевдокода: Бортовой одноплатный компьютер ODROID U3 принимает данные от джойстика через Bluetooth адаптер и передает их на микроконтроллер через UART. На нем установлена операционная система lubuntu c Linux ядром 3.8.13.26-rt31 c поддержкой реального времени.  Свинцово-кислотный аккумулятор Delta 12045 ёмкостью C = 4.5 Ач. Его хватает примерно на час работы. 
 
Напряжение питания одноплатного компьютера Odroid-U3 5В, максимальный потребляемый ток 2А. Т.к. источник питания 12В, необходим понижающий LM2596S DC-DC преобразователь за 2$. 
 
Для управления шароботом используется Bluetooth джойстик Terios. Джойстик передает команды по Bluetooth на ODROID, в котором стоит Asus USB-BT400 адаптер. Для чтения команд джойстика я использовал следующую библиотеку. Поступившая команда парсится, пакуется и отправляется по UART на STM32, где на прием каждого байта происходит прерывание. Так же к ODROID можно подключится по SSH. При запуске одройд создает Ad-hoc сеть через WiFi адаптер. Итого у нас получилось собрать работающего шаробота. На реализацию этого проекта ушло ровно 2 года. Скажем так, у нас не получилось приблизиться к результатам Rezero, так как не было таких человеческих, производственных и финансовых ресурсов как у студентов из Швейцарии. Думаю, если бы были более мощные двигатели и более продвинутый инерциальный модуль, то результаты были бы на порядок лучше.  Исходный код я не открываю по некоторым причинам. Если хотите знать детали реализации — напишите нам, мы с удовольствием поделимся с вами наработками. Двигатели пришлось вернуть и на данный момент "железяка" стоит без них. Возможно, проект будет дальше развиваться студентами, если найдутся подходящие движки и будут желающие. Например, было бы интересно разработать нелинейные алгоритмы управления и улучшить алгоритм фильтрации IMU. Я достаточно поверхностно рассказал про процесс разработки, так что буду рад ответить на ваши вопросы. Robotics engineer