Author: finereader

December 16, 2018 finereader No comments exist

Робот манипулятор. Алгоритм управления

 

  • robmodel2
  • robmodel1

Создадим систему управления роботом и разработаем алгоритм управления его движением.

 

Задача системы управления (СУ) – определять ошибку между требуемым и текущим положениями схвата робота, рассчитывать перемещения отдельных звеньев и выдавать управляющий сигнал на серво-двигатели.

 

Наша СУ будет состоять из сервоприводов (SG-90), платы Arduino и ПК с программой, получающей координаты цели и рассчитывающей требуемые углы поворота серв.

Общий алгоритм управления Роботом такой:

  • Определить требуемое положение схвата: схват должен придти в точку цели. Цель можно указать мышкой, написав программу на компьютере (например в Processing) или обработать изображение с камеры, висящей над рабочей зоной робота, выделив на нем объект нужного цвета или формы.
  • Рассчитать требуемые положения звеньев робота, т..е. углы поворота двигателей. Ввиду простоты схемы робота, сильно напоминающей треугольник, нам понадобятся некоторые знания геометрии (теорема Пифагора, синусы, теорема косинусов). В нашей программе на Processing, определив координаты цели, сразу же рассчитаем и все углы, высвобождая этим ресурсы Arduino.
  • Передача рассчитанных требуемых углов в Arduino. А дальше есть библиотека Servo и команда Servo::write(угол). Но попытка просто использовать эту функцию может привести к тому, что в случае требования повернуться на большой угол (например 180 град), серво-двигатель попытается мгновенно придти в указанное положение. Робот имеет некоторую массу и обладает инерцией, а это значит, что он будет сопротивляться изменению своей скорости. Силы инерции могут сорвать зубья шестеренок сервы. Необходимо попытаться сгладить переход между положениями, растянув его во времени.

Разобьем весь переход на несколько временных шагов и на каждом будем двигаться на долю, пропорциональную (составляющую часть) ошибке: Kp*error. Это еще называется пропорциональный регулятор (П-регулятор). 

 

Итак, микроконтроллер, получив значение требуемого угла поворота, рассчитает ошибку положения (текущее положение доступно из Servo::read()) и за некоторое количество тактов плавно переместит робота. От коэффициента пропорциональности зависит плавность.

 

 

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

Тут понадобятся базовые знания геометрии о прямоугольном треугольнике, соотношении его сторон в теореме Пифагора, откуда берутся синусы и косинусы. 

Сведения из геометрии

  • sin1
  • sin2
  • sin3
  • sin4
  • sin5
  • sin6
  • sin7

Программа на Processing с наглядной демонстрацией того, что sin(А) – это просто средство расчета противолежащего углу А катета.

 

 

Робот имеет 3 степени свободы (3 цилиндрических шарнира – 3 оси вращения), что позволяет перемещаться схвату по трем координатам xyz, но мы ограничимся плоскостью xy. 

На виде в плане (сверху то есть) мы видим схему робота и точку положения мишени с координатами xy, которые нам известны. Зная координаты, рассчитываем общий вылет робота – С (гипотенуза = сумме квадратов катетов). Угол поворота основания рассчитывается как дуга, соответствующая sin (y/c).

 

Робот_расчет1
Робот_расчет2

 

На профильном виде А-А, соединив точки центров серв и схвата, получим треугольник со сторонами L1 L2 R. Длина стороны R рассчитывается из прямоугольного треугольника СhR (где h-высота основания робота).

Но как быть с треугольником L1 L2 R- все стороны мы знаем, а углы нет. Оказывается, в любом треугольнике, имея длины его сторон можно найти его углы по теореме косинусов (или сторону, лежащую напротив известного угла, образованного двумя известными сторонами).

 

 

 

Теперь напишем модель робота в среде Processing и протестируем алгоритм.

Программа, как и Arduino, должна иметь две обязательные функции – setup() и draw(бесконечный цикл).

 

Создаем глобальные переменные для хранения размеров звеньев робота и текущих углов поворота этих звеньев, а также окно 800х600:

 

/* Переменные с размерами робота*/
float c = 0.0;  //вылет робота
float h = 80;   //высота основания
float L1 = h*3; //плечо
float L2 = h*4; //предплечье

/* Переменные с углами робота*/
  float alfa;
  float Beta,Beta2;
  float gamma;
  float tau,tau2;

void setup(){
  size(800,600,P3D);
}

 

В функции draw() на каждом такте перерисовки экрана :

 – отображаем мишень по координатам мыши

 – переносим систему координат в удобное место для отрисовки первого звена (основания)

 – рассчитываем положения звеньев робота

 – отрисовываем звенья основания, плеча и предплечья (с поочередным переносом систем координат)

 

void draw(){
  
  //Очищаем окно
  //background(#EAD5D5);

  /*Рисуем цель-мишень по координатам мыши*/
  drawTarget();
  
  //Перенос системы координат
  //и поворот
  //Y /\
  //X >>>
  translate(width/4,height/2+height/4);
  rotateX(radians(180));
  
  /* Рассчитываем положение робота - углы*/
  computeRobotpos();
  
  //Рисуем Основание Робота
  drawBase();
  
  //Рисуем Плечо Робота
  drawArm();

  //Рисуем Предплечье Робота
  drawForeArm();
}

 

 

Функция расчета положений звеньев – computeRobotpos() – смотри картинку выше

 

void computeRobotpos(){
  //Вылет Робота
  float c = (mouseX-width/4);
  float R = sqrt(h*h + c*c);
   alfa = asin(h/R);
   Beta = acos( (L1*L1 + L2*L2 - R*R) / (2*L1*L2));
   gamma = acos( (L1*L1 + R*R - L2*L2) / (2*L1*R));
   tau = gamma - alfa;
}

 

 

Функции отрисовки звеньев нехитрым образом переносят СК в точку начала следующего звена, поворачивают её на рассчитанный угол и командой line() чертят линию вдоль оси Х, по длине совпадающую с длиной данного звена:

 

void drawBase(){
  //Точка центра
  strokeWeight(3);
  stroke(255,255,0);
  point(0,0);
  
    strokeWeight(3);
    stroke(255,255,0);
  line(0,0,0,h);
    strokeWeight(15);
    point(0,h);
  drawlocalCS();
}

void drawArm(){
  //переносим систему координат
  //в точку начала звена
  translate(0,h);
  rotateZ((tau));
  
    strokeWeight(3);
    stroke(255,255,0);
  line(0,0,L1,0);
    strokeWeight(15);
    point(L1,0);
  drawlocalCS();
}

void drawForeArm(){
  //переносим систему координат
  //в точку начала звена
  translate(L1,0);
  rotateZ(-(PI-Beta));
  
    strokeWeight(3);
    stroke(255,255,0);
  line(0,0,L2,0);
    strokeWeight(15);
    point(L2,0);
  drawlocalCS();
}

 

 

November 23, 2018 finereader No comments exist

Робот-манипулятор. Производственное

 

Для подготовки печати деталек робота использовалась программа Cura 14.

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

 

Технология печати такова, что сначала печатаются внешний и внутренние замкнутые контуры (оболочки), а между ними пространство детали заполняется относительно редкой сеткой. И так слой за слоем. Необходимо только указать базовые настройки печати:

– толщина слоя Layer height (брали 0,2 мм для грубой и 0,1 мм для тонкой печати)

– толщина оболочки детали Shell thickness (0,8 мм в основном)

– толщины нижнего/верхнего слоев Bottom/Top thickness (0,8 мм не всегда достаточно, можно и 1,2 мм)

– заполнение Fill density (30 – 45%)

– скорость печати Print speed (сначала была 60 мм/с, уменьшили до 15-20 мм/с, немного выросло качество печати)

– температура печати т. е. сопла Printing temperature (для PLA-пластика 200 гр С)

– температура стола Bed temperature (50 гр С для PLA-пластика)

 

  • shaft8set
  • forearmset
  • pinceset
  • armset
  • basesetting

Сборка, тоже технологический процесс

  • IMG-20181115-WA0003
  • IMG-20181115-WA0000
  • IMG-20181115-WA0010
  • IMG-20181115-WA0008
  • IMG-20181115-WA0007
  • IMG-20181115-WA0006
November 1, 2018 finereader No comments exist

Робот-манипулятор. Конструируем

 

Робот_кин

 

Добрались, наконец, до первого серьёзного (без кавычек) проекта в группе Ардуино (продолжающие). Делаем роборуку или робота-манипулятора

 

Поставили себе с учениками задачу – конструируем робота. Робот должен уметь хватать объекты-мишени на плоскости. Зона обслуживания – сектор в 180 градусов.

 

Определять координаты мишени можно будет сначала прямым указанием (создадим программу на компьютере в среде Processing, где мышкой можно будет указать точку в рабочей зоне), ну а следующий шаг – подключим веб-камеру и будем обрабатывать изображение с помощью цветового фильтра, который позволит выделить мишень характерного цвета для определения её координат.

 

Начнем с кинематической схемы и конструкции робота

 

Нарисовали схему с тремя степенями свободы — с ней проще будет рассчитать кинематику движения в дальнейшем (обойдемся теоремой косинусов) — собственно, есть звенья плеча и предплечья, а также схват. Ну и поворачивается вся эта конструкция на пятке

 

Нижнюю опору с пяткой решили сделать с настоящим металлическим подшипником (будет служить дополнительной опорой и не даст нагрузке срезать валик на нижнем серводвигателе), все остальные детали будем печатать на 3D-принтере

 

Для начала мне пришлось подготовиться к занятию и набросать эскизы деталек и сборки в САПР Компас (на самом деле это переросло в создание альбома чертежей):

 

  • Манипулятор0004
  • Манипулятор0003
  • Манипулятор0005
  • Манипулятор0001
  • Манипулятор0002

Для создания по этим чертежам 3D моделек использовали FreeCAD. Это параметрическая САПР, довольно удобная, с большими яркими кнопками (что для обучения таким рисовалкам, наверное, главное), даже модуль сборки есть. Там же можно создать и файлы сетки *.stl для 3D-принтера

 

 

Вот, собственно, напечатанное и собранное основание будущего робота:

 

  • IMG_20181021_135716
  • IMG_20181020_181238
  • IMG_20181021_135724

 

В итоге, получается вот что

  • IMG_20181118_135940
  • IMG_20181118_133551
  • IMG_20181118_133309
  • IMG_20181118_133358

 

Вообще, с простой программой моделирования типа FreeCAD и 3D-принтером под рукой открываются большие возможности для получения быстрого результата и материализации мыслей, что особенно радовало моих учеников

 

 

 

April 5, 2018 finereader No comments exist

Летний лагерь «IT club»

Летний Лагерь «IT club» — это внеклассное образование для детей школьного возраста. У нас дети становятся настоящими инженерами и программистами: за смену мы напишем несколько игр, научимся собирать и программировать роботов. А всех выпускников ждем на наши занятия в «IT club» в сентябре!

 
  • Уникальные занятия по робототехнике и программированию
  • Трёхразовое питание (завтрак, обед и полдник)
  • Развлечения на свежем воздухе на специально оборудованной, охраняемой территории (активные подвижные и интеллектуальные игры), обучение плаванию в бассейне
  • Творческие мастерские и мастер-классы, походы в лес
  • Стоимость смены с 1 по 30 июня — 20500 рублей (для работников РКК «Энергия» — 14500 рублей)
  • Для детей 9-12 лет есть возможность пройти курс робототехники «Интенсив», стоимость смены в этом случае будет 28200 рублей
5 дней в неделю (пн-пт) с 8:30 до 18:30
  • 1-я смена 01.06-30.06

9:00      Утренний сбор

9:15      Завтрак

9:30      Прогулка на свежем воздухе, поход в кино, бассейн

13:00     Сытный обед

14:00     Культурная программа по плану: активные игры, квесты, настольные игры

16:00     Учебная программа 3 занятия по 40 минут

18:00     Окончание дня

January 19, 2018 finereader

Server date and time is: Thursday, March 21, 2019 at 17:29:48
GD Version: bundled (2.1.0 compatible)
FreeType Support: Да
FreeType Linkage: with freetype
T1Lib Support:
GIF Read Support: Да
GIF Create Support: Да
JPEG Support: Да
PNG Support: Да
WBMP Support: Да
XPM Support:
XBM Support: Да
JIS-mapped Japanese Font Support: