Знакомство с робототехнический конструктор трик: обратный маятник

Знакомство с робототехнический конструктор трик: обратный маятник

447
ПОДЕЛИТЬСЯ

Введение и постановка задачки

Набор является достаточно твердым, создатели говорят, что это отлично для скорого прототипирования и для обучения, а конкретно, (само)образования мне на данный момент и интересует. Верно, обе предусмотрены для малышей, и пап играться с ними. Несколько дней назад я получил бот-конструктор трик. В чем сходство меж женской грудью и игрушечной стальной дорогой?
Лего, гниение, Ардуино. На данный момент обширно представлены на рынке для механизированной игр? Распят и ардуини отлично развернуть, но достаточно неловко и быстро перевоплотиться в » рассыпухи различных карточек-маркеров-maketoc. Лего-это прекрасно, но, к огорчению, чрезвычайно, чрезвычайно ограниченной. Вот и выход на рынок-Петербурге мужчин с дизайнером трюк. Домашнее изготовка открыток для каждого проекта не рассматриваются.
Но как хоть какой обычный (великовозрастных) детка, я люблю играться, и потому увлекательна эта тема. Итак, моя задачка-осознать, как он доступен для публики (меня). Закон Ома я вызнал довольно, чтоб осознать, что розетку лизать не стоит, и паяльничек мне не друг. Я никогда не посещал никаких лекций по теоретической кибернетике либо теории управления.

Я получил этот набор:

370€ базисный набор + 99€ батареи (они совершенно тупые?!) И что я не учел зарядника за 30 евро. Плюс ко всему в базисный набор не включает каких-или сонар (+35€) либо гироскоп (+35€). Как правило, стоимость их наборов варьируется от приблизительно 20 до семидесяти тыщ. Нет. Стоит больше, чем Лего? Месяц назад я купила Лего ev3 для. И про камеру с микрофоном и все можно запамятовать, не говоря уже о в принципе testsite доступ вовнутрь ligovskogo Линукс.
Процессор arm9, в частности, в рамках отдельного видеопроцессора, а не грузить Центральный. В моем наборе (и разложил ее на предшествующей фото) включает два контроллера, две камеры, два микрофона, сонары, два типа инфракрасных датчиков, клавиш, 6 моторов с otoancorin, три сервы, две механическое сцепление, колеса тонн, в том числе голономных, зарядки батареи, шнурки, зубчатые колеса, рельсы и куча железных пластинок и уголков (Привет детство!). Конструктор чисто для начала, в общем случае, контроллер может быть присоединен к практически всем хватает воображения. Программировать можно на чем угодно-от ассемблера до C#, вы даете корень консоли, плюс весь код с открытым начальным кодом прошивки.
Вот мой Волшебство-коробка:

В качестве первого проекта я решил выстроить обратный маятник, и он представлен на главной картинке. Вот как это смотрится сзаду:
Из набора мне необходимо два мотора, два колеса, незначительно крепежа и контроллером впрямую к аккуму. Моя цель была не скопировать учебник из учебного курса трюк, мне любопытно обломать зубы о всех дилеммах без помощи других, так что я собираюсь поновой изобретать колесо.
Я буду писать в QT скрипт. Итак, в моем распоряжении одна степень свободы, акселерометр и гироскоп кодеры из движков я не употреблял.
Так, меня интересует лишь угол отличия телеги от вертикальной. Чтение датчиков
Вначале я желал сделать это с помощью 1-го акселерометра. В теории все отлично, но при этом сделала лишь одичавшие драганья мой грузовик. Типа, читайте символ проекции на ось Z, раз он положительный, потом вращайте колесо в одну сторону, раз отрицательный, то остальные. Он вздохнул и засел за исследование спец литературы, которая к счастью была не чрезвычайно длинноватой.
Вначале скоростях выдается ошибка, интеграция по-прежнему делает ошибки, которые в конечном итоге приведут к opluwaniu показания гироскопа. Потому, лишь нам для гироскопа маятника не довольно, оно обязано сочетаться с акселерометром. Гироскоп
Он также угловой скорости датчика, дает неплохой ровненький сигнал, но глядеть на ориентацию в пространстве, скорость нужно интегрировать.
Вот мой код работает с гироскопом, тут пока(истина) — основной цикл программы. вар gyr_x_angle = 0;
Варе крайний раз = Дата.сейчас();
в то время как (правда) {
вар г = кирпич.гироскоп().прочесть();
Г[0] = г[0] + 69; // корректировка дрейфа
в var curtime = Дата.сейчас();
вар ДТ = (curtime — крайний раз)/1000.0;
крайний раз = curtime;
gyr_x_rate = г[0] * 0.07;
gyr_x_angle = gyr_x_angle + gyr_x_rate * ДТ;
}
Осталось интегрировать, плодятся методом измерения времени DT. В массиве г я читать значения датчиков, в последующей строке исправленной оси энтузиазма ко мне. На веб-сайте написано, что это соответствует константа в 70mdps/цифра. Датчик содержит целое число, которое нужно перевести в углы. В обыкновенном режиме он работает на 2000 градусов/сек (ДПС). Выходит, что мой определенный датчик в полном покое указывает среднюю скорость в 69, так что я беру их, чтоб получить меня интересует скорость. Таковым образом, г(числа) * 0.07 (ДПС/цифра) дает нам угловую скорость.
Акселерометр
От акселерометра угол, чтоб получить еще проще, но неувязка в том, что уж больно она гулкая, и когда грузовик начинает прыгать ввысь и вниз, вообщем туши свет. Вот код:
[…]
в то время как (правда) {
[…]
в Варе = кирпич.акселерометр().прочесть();
вар a_x_angle = Математика.атан(в[2] / В[0]) * 180.0 / пи;
}
Гасим шум: сочетание акселерометра и гироскопа
[…]
вар CF_x_angle = 0;
в то время как (правда) {
[…]
CF_x_angle = 0.98*(CF_x_angle+ gyr_x_rate*ДТ) + 0.2*a_x_angle;
}

Это просто говорит о том, что значение текущего угла составляет 98% от стоимости прошлых угол регулируется от гироскопа, и 2% — это прямое считывание угла с акселерометра. Такое сочетание дозволяет совладать с opilivaniem гироскоп, обратите внимание, что переменная gyr_x_angle мы вообщем не употребляется.
Но ПИД нормально. ПИД-регулятор
Как я уже произнес, я не посещали умные лекции по теории управления, так LQR контроллеры для меня, для разумного (пару часов).
Код
Можно сделать лучше с помощью Калмановской фильтрации, но это стрельба из пушки по воробьям. Сейчас пришло время, чтоб повернуть колеса — чем больше угол, тем скорее вы будете вращать колесо. В прошлом пт мы получили хороший (я надеюсь) оценку угла отличия телеги от вертикальной.
Скорость вращения колеса, которая даст нам ПИД состоит из 3-х (взвешенное) условия: пропорциональное, intelimouse и дифференциации. Просто пропорционально равен углу отличия от вертикальной интеграции — это Сумма всех ошибок регулирования, дифференциации, пропорционального скорости конфигурации отличия от вертикали.
Это звучит страшно, но на самом деле код чрезвычайно обычный:
вар pTerm = КП*CF_x_angle; // пропорциональная составляющая

деталь = деталь + ки*CF_x_angle; // компонент integrala

dTerm = КД * (CF_x_angle — CF_x_angle_prev); // производный термин
CF_x_angle_prev = CF_x_angle;

мощность = pTerm + iterm в + dTerm;
кирпич.мотора(м3).setPower(мощности);
кирпич.мотор(М4).setPower(мощности);
} полный код программы Варе gyr_x_angle = 0;
Варе крайний раз = Дата.сейчас();
вар CF_x_angle = 0;
iterm в Варе = 0;
вар CF_x_angle_prev = 0;

вар КП = 0;
вар ГИ = 0;
вар КД = 0;

в то время как (правда) {
вар г = кирпич.гироскоп().прочесть();
Г[0] = г[0] + 69; // корректировка дрейфа
в var curtime = Дата.сейчас();
вар ДТ = (curtime — крайний раз)/1000.0;
крайний раз = curtime;
gyr_x_rate = г[0] * 0.07;

в Варе = кирпич.акселерометр().прочесть();
вар a_x_angle = Математика.атан(в[2] / В[0]) * 180.0 / пи;

CF_x_angle = 0.98*(CF_x_angle+ gyr_x_rate*ДТ) + 0.2*a_x_angle;

// поворота колес!

Выбор константы КП, ки, КД
Оставалось самое сложное: отыскать значения весов в сумме, к огорчению, это можно сделать лишь эмпирически.
Положить Ki и KD до нуля и увеличении КП в пределах от нуля до момента, когда наш кар будет начать делать (грубо) неизменные колебания, что-то вроде этого (КП=8, ки=0, КД=0): Для начала найдем коэффициент КП.

Разумеется, это перебор, грузовик получает очень мощный сигнал от пропорциональной составляющей, потому уменьшить его приблизительно наполовину, получить эту (КП=5, ки=0, КД=0):

Равномерно увеличивая ки с нуля, пытаясь достичь того момента, когда они могут показаться колебания телеги вокруг в необходимое положение (КП=5, ки=0.5, КД=0): На данный момент в корзину не довольно чисто пропорционального сигнала, прирастить скорость, добавив интеграции компонентов.

Сейчас добавьте дифференцирующий компонент, который будет играться роль демпфера, гасящего колебания, вот что я делаю (КП=5, ки=0.5, КД=5):

Беря во внимание, что програмку я получил целых 20 5 линий, сейчас на досуге, просто необходимо добавить в обработку, прохождении поворотов и прохождении полосы препятствий, это не обязано быть особенных затруднений. Вывод
Я достаточно быстро (за одну ночь) оказался самобалансирующий корзину.
Я буду продолжать исследование! Ни электрического, ни кибернетических фон у меня есть, то есть, полностью доступной для рядовых юзеров, которые, фактически, меня и чрезвычайно любопытно.
По сопоставлению с аналогичным legowski установить все это естественно смотрится несколько турне, китайские датчики (как Лего), но не закатанную в толстый высококачественный пластик legowski. Наименее улучшенного программного обеспечения, которое находится в активной разработке. Существенно меньше общество людей, которые пишут на этот контроллер, но беря во внимание, что проекту всего несколько дней, но все еще видя недавний фуррор на Arduino, меня это даже стращает. habrahabr.ru Но я восхищаюсь гибкостью контроллера, который был получен от potrjasaushe энтузиазмом, что Петр взялся за развитие.