КЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35M

КЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35M Вертолеты

Coex клевер 4 pro инструкция сборки

Для увеличения прочности рамы вы можете распечатать на 3D принтере или нарезать на лазерном резаке рем-накладки.

В случае наличия, закрепите рем-накладки на пластинах жесткости, иначе продолжайте без них.

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

Используя пазы, установите сверху карбоновую центральную деку.

Стяните конструкцию с помощью винтов М3х8 и стальных гаек с нейлоновой вставкой, установленных в пазах пластин.

Используя бокорезы, укоротите провода на моторах:

    Обрежьте половину длины (оставив 30 мм).

Зачистите (снимите 5 мм изоляции с конца провода, не повредив медные жилы).

Скрутите медные жилы.

Установите мотор на луч.

Прикрепите мотор к лучу винтами М3х5, используя шестигранный ключ или отвёртку.

Повторите эти действия для остальных моторов.

Установите 4 луча с моторами на базу рамы, используя пазы, согласно схеме вращения моторов.

Для правильной установки моторов обратите внимание на цвета гаек. Моторы с красными гайками следует установить на передний правый и задний левый лучи, с чёрными — на передний левый и задний правый.

Зафиксируйте лучи на раме, используя 8 винтов М3х8 и 6 стальных гаек, а также 2 стойки «мама-мама» 15 мм.

  1. Залудите контактные площадки платы питания.
  2. С помощью мультиметра проверьте отсутствие короткого замыкания (прозвонить):
    • Установите мультиметр в режим прозвонки.
    • Проверьте работу мультиметра путем замыкания щупов между собой. При корректной работе прибор издаст характерный звук.
    • Попарно один щуп прикладывается к контакту « », а второй к «-»/GND. Если в цепи есть короткое замыкание, издается звук.

Установите 4 стойки «папа-мама» 6 мм на центральную деку винтами М3х6.

Установите PDB на стойки.

Стрелки на PDB и центральной деке должны быть направлены в одну сторону.

    Припаяйте фазные провода моторов к регуляторам.

Припаяйте силовые провода регуляторов к контактным площадкам платы ( красный к « », черный к «-»).

Припаяйте силовые провода каждого BEC к контактным площадкам одного из регуляторов ( красный к « », черный к «-»).

С помощью мультиметра проверьте, что в цепи нет короткого замыкания.

Включите пульт с помощью слайдера POWER. Если пульт заблокирован, необходимо перевести все стики в начальное положение:

  1. Левый стик в центральной нижней позиции.
  2. Правый стик в центре.

Переключатели A, B, C, D в положение «от себя».

Убедитесь, что PPM в меню RX Setup отключен:

  1. Убедитесь, что питание дрона выключено.
  2. Для входа в меню удерживайте нажатой кнопку «ОК».
  3. Кнопками Up/Down выбираем меню «System setup», кнопкой «ОК» подтвердите выбор.
  4. Выберите «RX Setup».
  5. Выберите «Output mode».
  6. Убедитесь, что в открывшемся меню выбран пункт «PWM».
  7. Чтобы сохранить настройки, удерживайте нажатой кнопку «Cancel».
  1. Выключите пульт с помощью слайдера POWER.
  2. Подключите радиоприемник к разъему BEC 5В. Чёрный провод подключите к одному из нижних пинов, красный — к одному из центральных.
  3. Установите джампер на вход (B/VCC).
  4. Подключите АКБ.

Светодиод на радиоприемнике должен мигать.

Зажмите кнопку BIND KEY на пульте.

Включите пульт (перещелкните POWER, не отпуская BIND KEY).

  • Отсоедините джампер.
  • Светодиод на приемнике должен гореть непрерывно.
  • Моторы с красными гайками должны вращаться против часовой стрелки, с чёрными — по часовой стрелке. Правильные направления вращения также указаны на самих моторах. Для проверки направления вращения можно использовать серво-тестер или радиоприёмник с пультом.

    1. Отключите АКБ и пульт.
    2. Подключите сигнальный провод от ESC к выходу CH3 на приёмнике. Белый провод должен подходить к верхнему пину, чёрный — к нижнему.
    3. Включите пульт. Левый стик должен быть в нижнем положении.
    4. Подключите АКБ.
    5. Медленно поднимайте левый стик до тех пор, пока мотор не начнёт вращаться.

    Если мотор вращается в неправильную сторону, поменяйте местами два любых фазных провода.

    Направление вращения также можно изменить программно. Процесс описан в статье про прошивку ESC.

    Повторите процесс для каждого мотора.

    Полётный контроллер не может работать с пультом в режиме PWM, поэтому следует произвести перевод пульта в режим PPM.

    1. Убедитесь, что питание дрона выключено.
    2. Для входа в меню удерживайте нажатой кнопку «ОК».
    3. Кнопками Up/Down выбираем меню «System setup», кнопкой «ОК» подтвердите выбор.
    4. Выберите «RX Setup».
    5. Выберите «Output mode».
    6. Убедитесь, что в открывшемся меню выбран пункт «PPM».
    7. Чтобы сохранить настройки, удерживайте нажатой кнопку «Cancel».

    Установите 4 стойки «папа-мама» 6 мм на PDB.

    Подключите шлейф питания к PDB.

    Установите поликарбонатную пластину на стойки и зафиксируйте нейлоновыми гайками.

    Вставьте карту microSD в полётный контроллер.

    Установите полетный контроллер на пластину с помощью двухстороннего скотча.

    Стрелки на полетном контроллере и центральной деке должны быть направлены в одну сторону.

    Подключите шлейф питания PDB к разъему «POWER» полетного контроллера, закрутив его в «косичку» для взаимной фиксации проводов.

    Установите 4 алюминиевые стойки 40 мм с помощью винтов М3х10.

    Подключите сигнальные провода регуляторов к полетному контроллеру следующим образом:

    Установите 2 стойки «мама-мама» 15 мм на центральную деку с помощью винтов М3х8.

    Другие 2 стойки были установлены ранее в разделе «Сборка рамы», п. 2.

      Согните поликарбонатную заготовку в обруч и зафиксируйте ее концы в замке.

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

    Вставьте карту microSD с записанным образом в Raspberry Pi

    Установите плату Raspberry Pi на стойки, используя 4 стойки «папа-мама».

    Протяните провода от BEC через паз в центральной раме.

    Подключите провод питания от BEC к Raspberry, согласно схеме:

    Проверьте наличие напаянных пинов на контактах ленты (при отсутствии — напаять).

    Установите светодиодную ленту на обруч (используя клеевой слой на ленте) так, чтобы контакты были в задней части коптера. Для дополнительной фиксации используйте стяжки.

    Питание для ленты берется от второго BEC. Подключите контакты «-» и « » к Ground и 5v на ленте соответственно.

    Подключите контакт D к GPIO-пину на Raspberry. Рекомендуется использовать пин GPIO21.

    1. Поднимите защелку.
    2. Подключите шлейф.
    3. Закройте защелку.
      Подготовьте лазерный дальномер к монтажу, предварительно напаяв на него контакты.

    Установите камеру на 4 самореза 2х5.

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

    Установить на деку лазерный дальномер с помощью 2 винтов М3х8 и стальных гаек.

    Установите приемник на нижнюю деку с помощью двухстороннего скотча.

    Установите нижнюю деку с помощью 4 винтов М3х10.

    Подключите шлейф к камере.

    Подключите лазерный дальномер к Raspberry Pi с помощью проводов типа «мама-мама»:

    • Разъем VCC к пину 1 (3.3v).
    • Разъем GND к пину 9 (Ground).
    • Разъем SDA к пину 3 (GPIO02).

    Разъем SCL к пину 5 (GPIO03).

    Установите 8 ножек с помощью винтов М3х10 и стальных гаек.

    Установите демпфирующие прокладки на ножки с помощью винтов М3х10 и стальных гаек.

    Подключите кабель радиоприемника в RCIN разъем полетного контроллера.

    Подключите кабель к приемнику, соответственно изображению.

    Смотрите про коптеры:  Самый лучший и недорогой квадрокоптер с камерой

    Соберите нижнюю часть защиты, используя 12 винтов М3х10 и 12 нейлоновых стоек 40 мм.

    Установите верхнюю часть, используя 12 винтов М3х10.

    Установите защиту на коптер, с помощью 4 винтов М3х10 и стальных гаек.

    1. Установите на верхнюю деку держатель АКБ с помощью 4 винтов М3х8 и стальных гаек.
    2. Проденьте в пазы ремешок для фиксации АКБ.

    Установите верхнюю деку на коптер с помощью 4 винтов М3х10.

    Подключите USB кабель к разъему на полетном контроллере и USB разъему Raspberry Pi.

    Зафиксируйте «улитку» кабеля в удобном месте с помощью двухстороннего скотча так, чтобы провод не мешал вращению винтов.

    Произведите настройку компонентов квадрокоптера, используя раздел «Настройка».

    Установка пропеллеров должна производиться только после окончательной настройки коптера, непосредственно перед полетом.

    Установите 4 пропеллера, согласно схеме вращения. При установке пропеллеров АКБ должна быть отключена.

    При установке будьте внимательны, чтобы пропеллер не был перевернут. На лицевой стороне пропеллера имеется маркировка его характеристик, а также направление вращения, которое должно совпадать с направлением вращения моторов.

    Убедитесь, чтобы все провода были спрятаны и движению пропеллеров ничего не мешает.

    Проверьте сборку квадрокоптера:

    • Балансировочный разъем АКБ должен быть спрятан под утягивающим ремешком.
    • Регуляторы должны быть зафиксированы хомутами.
    • Все провода, идущие от PDB и полетного контроллера, должны быть зафиксированы липучкой или обмотанной вокруг алюминиевых стоек.
    • Пропеллеры установлены правильной стороной и соответствуют направлению кручения моторов.

    Обязательно установите и настройте индикатор напряжения перед полетом, чтобы не переразрядить аккумулятор. Для настройки индикатора используйте кнопку расположенную в его основании. Отображаемые цифры во время настройки обозначают минимально возможное напряжение в каждой ячейке аккумулятора, рекомендуемое значение 3.5.

    Звуковая индикация означает, что ваш аккумулятор разряжен и его нужно зарядить.

    Дрон готов к полету!

    Документация Клевера доступна по лицензии Creative Commons «Attribution-NonCommercial-ShareAlike» 4.0 Всемирная.

    Источник

    Runtime программирование промышленного робота на rcml

    КЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35M

    Под runtime программированием в этой статье понимается процесс создания исполняемой программы для контроллера робота (далее просто робота) на внешнем контроллере. Процесс исполнения роботом созданной программы в таком случае, происходит итерационно, путем передачи ему минимальной исполняемой команды или пакета команд. Другими словами, при runtime программировании, исполняемая программа передаётся роботу порционно, при этом робот не обладает, не хранит и не знает заранее всю исполняемую программу. Такой подход позволяет создать абстрактную параметризованную исполняемую программу, которая формируется внешним устройством «на ходу», т.е. runtime.

    Под катом описание и реальный пример того, как работает runtime программирование.

    КЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MТипично программа для робота представляет собой последовательность позиций, в которые должен прийти манипулятор робота. Каждая из этих позиций характеризуются положением TCP (Tool Center Point) – точкой острия инструмента, установленного на манипуляторе. По умолчанию TCP находится в центре фланца робота, см. рисунок ниже, но её положение может быть перенастроено и чаще всего так, что TCP совпадает с острием установленного инструмента на манипуляторе робота. Поэтому обычно при программировании задается положение TCP в пространстве, а положение суставов манипулятора робот определяет сам. Далее в статье будет использоваться термин «положение TCP», или другими словами точка, в которую робот должен «прийти».
    Программа для робота также может содержать примитивную управляющую логику (ветвления, циклы), простые математические операции, а также команды по управлению периферией – аналоговыми и цифровыми входами/выходами. В предлагаемом подходе runtime программирования, в качестве внешнего контроллера используется обычный ПК, на котором могут быть использованы мощные средства программирования дающие необходимый уровень абстракции (ООП и прочие парадигмы) и инструменты, обеспечивающие скорость и легкость разработки сложной логики (высокоуровневые языки программирования). На роботе же остается только логика критичная к скорости реакции, для исполнения которой нужна надежность промышленного контроллера, например, оперативная и адекватная реакция на внештатную ситуацию. Управление же периферией, подключенной к роботу, попросту «проксируется» самим роботом на ПК, позволяя ПО с ПК включать или выключать соответствующие сигналы на роботе. Это чем-то похоже на управление «ножками» на Arduino.

    КЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35M

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

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

    Еще немного теории и переходим к практике.

    Описание существующих способов программирования промышленных роботов

    Без учета, вводимого в данной статье подхода runtime программирования, принято выделять два способа программирования промышленных роботов. Офлайн- и онлайн-программирование.

    Процесс онлайн программирования происходит при непосредственном взаимодействии программиста с роботом на месте его использования. При помощи пульта управления или физического перемещения осуществляется подвод инструмента (TCP), установленного на фланце робота, к необходимой точке пространства.

    Процесс

    офлайн программирования

    , как понятно из названия, происходит удаленно от робота и его контроллера. Исполняемая программа разрабатывается в какой-либо специализированной среде для программирования промышленных роботов на ПК, а затем загружается в робота целиком. Однако, программные инструменты для такой разработки не входят в базовый комплект поставки робота и являются дополнительными опциями, которые приобретаются отдельно и в своей массе не дешевы.

    В качестве примера, рассмотрим создание программы робота в runtime режиме, обеспечивающей технологический процесс написания объявления маркером.

    Для написания этого текста потребовалось передать роботу более 1700 точек.

    В качестве примера в спойлере приведен скриншот, с пульта робота, программы рисующей квадрат. В ней всего 5 точек (строки 4-8), каждая точка по сути представляет собой законченное выражение (оператор) и занимает одну строку. Манипулятор обходит каждую из четырех точек и по завершению возвращается в начальную точку.

    Если писать программу подобный образом, то это было бы минимум 1700 операторов — строк кода, по оператору на точку. А что если бы потом потребовалось изменить текст или высоту букв, или расстояние между ними? Править все 1700 точек-строк? Это противоречит духу автоматизации!

    Итак, приступим к решению…

    Смотрите про коптеры:  Как сделать радиоуправляемый корабль своими руками

    Имеем робота FANUC LR Mate 200iD с котроллером R-30i серии B cabinet. У робота предварительно настроена TCP на конце маркера и координатная система рабочего стола, поэтому мы можем отправлять координаты, напрямую не заботясь о преобразовании координат из координатной системы стола в координатную систему робота.

    Для реализации программы передачи координат роботу, которая будет высчитывать абсолютные значения каждой конкретной точки будем использовать язык программирования RCML, который поддерживает предлагаемый подход, имеет модули для связи с данным роботом и который, что немаловажно бесплатен для любого использования.

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

    Чтобы написать текст нам потребуется вызвать последовательность функций, рисующих буквы в такой же последовательности, в которой они (буквы) указаны в тексте. RCML имеет скудный инструментарий для работы со строками, поэтому сделаем внешний скрипт на Python, который будет генерировать программу на RCML – по сути генерировать только последовательность вызовов функций соответствующих последовательности букв.

    Весь код доступен в репозитории на GitHub: rct_paint_words

    Рассмотрим подробнее выходной файл, исполнение начинается с функции main():

    Пример выходного файла на языке RCML
    include "chars.rcml"
    function main(){
      try {
    //Задействование робота
        @fr = robot_fanuc;
        system.echo("Start move programn");
    //Предварительная настройка окружения робота, координатная система, нагрузка, скорость
        @fr->set_real_di("speed", SPEED);
        @fr->set_real_di("cnt", CNT);
        @fr->startProgram(UFRAME, UTOOL, PAYLOAD);
    
        system.echo("preparen");
        @fr->prepare();
        system.echo("start drawn");
    //Сгенерированный, на Python, участок
        @fr->draw_r_P(0, 0);
        @fr->draw_P(1, 0);
        @fr->draw_r_I(2, 0);
        @fr->draw_B(3, 0);
        @fr->draw_E(4, 0);
        @fr->draw_T(5, 0);
        @fr->draw_Comm(6, 0);
    
        @fr->draw_r_L(8, 0);
        @fr->draw_r_Yu(9, 0);
        @fr->draw_r_D(10, 0);
        @fr->draw_r_I(11, 0);
        @fr->draw_Exclamation(12, 0);
    
        @fr->draw_H(14, 0);
        @fr->draw_A(15, 0);
        @fr->draw_M(16, 0);
    
        @fr->draw_H(18, 0);
        @fr->draw_r_U(19, 0);
        @fr->draw_r_Je(20, 0);
        @fr->draw_E(21, 0);
        @fr->draw_H(22, 0);
    
        @fr->draw_P(0, 1);
        @fr->draw_A(1, 1);
        @fr->draw_r_Z(2, 1);
        @fr->draw_P(3, 1);
        @fr->draw_A(4, 1);
        @fr->draw_r_B(5, 1);
        @fr->draw_O(6, 1);
        @fr->draw_T(7, 1);
        @fr->draw_r_Che(8, 1);
        @fr->draw_r_I(9, 1);
        @fr->draw_K(10, 1);
        @fr->draw_Dot(11, 1);
        @fr->draw_r_D(12, 1);
        @fr->draw_r_L(13, 1);
        @fr->draw_r_Ya(14, 1);
    
        @fr->draw_C(16, 1);
        @fr->draw_O(17, 1);
        @fr->draw_r_Z(18, 1);
        @fr->draw_r_D(19, 1);
        @fr->draw_A(20, 1);
        @fr->draw_H(21, 1);
        @fr->draw_r_I(22, 1);
        @fr->draw_r_Ya(23, 1);
    
        @fr->draw_B(25, 1);
        @fr->draw_E(26, 1);
        @fr->draw_r_B(27, 1);
    
        @fr->draw_r_I(0, 2);
        @fr->draw_H(1, 2);
        @fr->draw_T(2, 2);
        @fr->draw_E(3, 2);
        @fr->draw_P(4, 2);
        @fr->draw_r_F(5, 2);
        @fr->draw_E(6, 2);
        @fr->draw_r_Ii(7, 2);
        @fr->draw_C(8, 2);
        @fr->draw_A(9, 2);
    
        @fr->draw_C(11, 2);
        @fr->draw_r_I(12, 2);
        @fr->draw_C(13, 2);
        @fr->draw_T(14, 2);
        @fr->draw_E(15, 2);
        @fr->draw_M(16, 2);
        @fr->draw_r_y(17, 2);
    
        @fr->draw_H(19, 2);
        @fr->draw_A(20, 2);
        @fr->draw_r_Sha(21, 2);
        @fr->draw_r_I(22, 2);
        @fr->draw_X(23, 2);
    
        @fr->draw_r_Z(0, 3);
        @fr->draw_H(1, 3);
        @fr->draw_A(2, 3);
        @fr->draw_H(3, 3);
        @fr->draw_r_I(4, 3);
        @fr->draw_r_Ii(5, 3);
        @fr->draw_Dot(6, 3);
    
        @fr->draw_T(8, 3);
        @fr->draw_A(9, 3);
        @fr->draw_K(10, 3);
    
        @fr->draw_M(12, 3);
        @fr->draw_r_y(13, 3);
    
        @fr->draw_C(15, 3);
        @fr->draw_M(16, 3);
        @fr->draw_O(17, 3);
        @fr->draw_r_Je(18, 3);
        @fr->draw_E(19, 3);
        @fr->draw_M(20, 3);
    
        @fr->draw_r_P(22, 3);
        @fr->draw_E(23, 3);
        @fr->draw_P(24, 3);
        @fr->draw_E(25, 3);
        @fr->draw_H(26, 3);
        @fr->draw_r_Ya(27, 3);
        @fr->draw_T(28, 3);
        @fr->draw_soft_sign(29, 3);
    
        @fr->draw_O(0, 4);
        @fr->draw_T(1, 4);
    
        @fr->draw_B(3, 4);
        @fr->draw_A(4, 4);
        @fr->draw_C(5, 4);
    
        @fr->draw_r_Ge(7, 4);
        @fr->draw_r_U(8, 4);
        @fr->draw_M(9, 4);
        @fr->draw_A(10, 4);
        @fr->draw_H(11, 4);
        @fr->draw_O(12, 4);
        @fr->draw_r_Ii(13, 4);
        @fr->draw_r_D(14, 4);
        @fr->draw_O(15, 4);
        @fr->draw_B(16, 4);
    
        @fr->draw_r_Z(18, 4);
        @fr->draw_H(19, 4);
        @fr->draw_A(20, 4);
        @fr->draw_H(21, 4);
        @fr->draw_r_I(22, 4);
        @fr->draw_r_Ya(23, 4);
        @fr->draw_Dot(24, 4);
    
    //Изменение ориентации маркера, чтобы роботу было проще дотянуться до края стола
        @fr->set_real_di("speed", 10); 
        @fr->rotateMarker();
        @fr->set_real_di("speed", SPEED); 
    
        @fr->draw_r_I(0, 6);
    
        @fr->draw_H(2, 6);
        @fr->draw_A(3, 6);
        @fr->draw_K(4, 6);
        @fr->draw_O(5, 6);
        @fr->draw_H(6, 6);
        @fr->draw_E(7, 6);
        @fr->draw_r_Ce(8, 6);
        @fr->draw_Minus(9, 6);
        @fr->draw_T(10, 6);
        @fr->draw_O(11, 6);
    
        @fr->draw_M(13, 6);
        @fr->draw_r_y(14, 6);
    
        @fr->draw_C(16, 6);
        @fr->draw_M(17, 6);
        @fr->draw_O(18, 6);
        @fr->draw_r_Je(19, 6);
        @fr->draw_E(20, 6);
        @fr->draw_M(21, 6);
    
        @fr->draw_r_Z(0, 7);
        @fr->draw_A(1, 7);
        @fr->draw_X(2, 7);
        @fr->draw_B(3, 7);
        @fr->draw_A(4, 7);
        @fr->draw_T(5, 7);
        @fr->draw_r_I(6, 7);
        @fr->draw_T(7, 7);
        @fr->draw_soft_sign(8, 7);
    
        @fr->draw_r_U(10, 7);
        @fr->draw_r_L(11, 7);
        @fr->draw_r_U(12, 7);
        @fr->draw_r_Che(13, 7);
        @fr->draw_r_Sha(14, 7);
        @fr->draw_r_I(15, 7);
        @fr->draw_T(16, 7);
        @fr->draw_soft_sign(17, 7);
    
        @fr->draw_r_aE(19, 7);
        @fr->draw_T(20, 7);
        @fr->draw_O(21, 7);
        @fr->draw_T(22, 7);
    
        @fr->draw_M(24, 7);
        @fr->draw_r_I(25, 7);
        @fr->draw_P(26, 7);
    
        @fr->draw_r_P(0, 9);
        @fr->draw_O(1, 9);
        @fr->draw_r_D(2, 9);
        @fr->draw_P(3, 9);
        @fr->draw_O(4, 9);
        @fr->draw_r_B(5, 9);
        @fr->draw_H(6, 9);
        @fr->draw_E(7, 9);
        @fr->draw_E(8, 9);
        @fr->draw_two_dots(9, 9);
    
        @fr->draw_H(11, 9);
        @fr->draw_T(12, 9);
        @fr->draw_T(13, 9);
        @fr->draw_P(14, 9);
        @fr->draw_two_dots(15, 9);
        @fr->draw_Slash(16, 9);
        @fr->draw_Slash(17, 9);
        @fr->draw_R(18, 9);
        @fr->draw_O(19, 9);
        @fr->draw_B(20, 9);
        @fr->draw_O(21, 9);
        @fr->draw_T(22, 9);
        @fr->draw_C(23, 9);
        @fr->draw_T(24, 9);
        @fr->draw_Dot(25, 9);
        @fr->draw_C(26, 9);
        @fr->draw_O(27, 9);
        @fr->draw_M(28, 9);
        @fr->draw_Slash(29, 9);
        @fr->draw_H(30, 9);
        @fr->draw_I(31, 9);
    
        @fr->draw_r_I(2, 10);
        @fr->draw_C(3, 10);
        @fr->draw_K(4, 10);
        @fr->draw_P(5, 10);
        @fr->draw_E(6, 10);
        @fr->draw_H(7, 10);
        @fr->draw_H(8, 10);
        @fr->draw_E(9, 10);
    
        @fr->draw_B(11, 10);
        @fr->draw_A(12, 10);
        @fr->draw_r_Sha(13, 10);
    
        @fr->draw_S(15, 10);
        @fr->draw_K(16, 10);
        @fr->draw_Y(17, 10);
        @fr->draw_N(18, 10);
        @fr->draw_E(19, 10);
        @fr->draw_T(20, 10);
    
        @fr->draw_Equal(22, 10);
        @fr->draw_Roof(23, 10);
        @fr->draw_Minus(24, 10);
        @fr->draw_Roof(25, 10);
        @fr->draw_Equal(26, 10);
    // Конец сгенерированного участка
        @fr->stopProgram();
        @fr->go_home();
      } catch(E){
        system.echo("Exception catched!");
        return E;
      }
      return 0;
    }
    

    Рассмотрим код отрисовки буквы на примере буквы А:
    function robot_fanuc::draw_A(x_cell,y_cell){
      
      //Постановка маркера в точку, координаты точки 5% по Х и 95% по Y в рамке буквы
      robot->setPoint(x_cell, y_cell, 5, 95); 
      //Ведем линию
      robot->movePoint(x_cell, y_cell, 50, 5);
      //Ведем вторую линию
      robot->movePoint(x_cell, y_cell, 95, 95);
      //Получили "крышу" /
    
      //Переносим маркер с отрывом от стола для отрисовки палочки
      robot->setPoint(x_cell, y_cell, 35, 50);
      //Рисуем палочку
      robot->movePoint(x_cell, y_cell, 65, 50);
    
      //отрываем маркер от доски для перехода к следующей букве
      robot->marker_up();
    }
    

    Функции перемещения маркера в точку с отрывом или без, тоже очень просты:
    //Перемещение в точку с отрывом маркера или установка точки для начала рисования
    function robot_fanuc::setPoint(x_cell, y_cell, x_percent, y_precent){
      //вычисляем абсолютные координаты
      x = calculate_absolute_coords_x(x_cell, x_percent);
      y = calculate_absolute_coords_y(y_cell, y_precent);
      
      robot->marker_up(); // отрываем маркер от стола
      robot->marker_move(x,y); // перемещаем
      robot->marker_down(); // ставим маркер на стол
    }
    
    //Перемещение в точку без отрыва маркера/рисование
    function robot_fanuc::movePoint(x_cell, y_cell, x_percent, y_precent){
      x = calculate_absolute_coords_x(x_cell, x_percent);
      y = calculate_absolute_coords_y(y_cell, y_precent);
      
      // тут все понятно :)
      robot->marker_move(x,y);
    }
    

    Все константы конфигурации, в том числе размер букв, их количество в строке и пр. были вынесены в отдельный файл chars_config.rcml.

    В итоге суммарно мы получили примерно 300 строк высокоуровневого кода, на проектирование и написание которого ушло не более 2 часов.

    Если бы данная задача решалась «в лоб» онлайн программированием по точкам, то на это бы ушло более 9 часов (примерно по 20-25 сек на точку, с учетом того, что точек более 1700 шт.). В этом случае страдания разработчика трудно представить :), особенно когда выяснилось бы, что он забыл про отступы между буквами, или ошибся с высотой букв и текст не влез, и теперь придется начинать всё с начала.

    Вывод:

    Runtime программирование позволяет решать задачу по перемещению робота в общем виде, динамически составляя частную программу перемещения в зависимости от заданных параметров. Причем программа, решающая задачу в общем виде может разрабатываться без необходимости наличия робота, что с одной стороны можно отнести к офлайн подходу программирования промышленного робота. С другой стороны программа перемещения непосредственно для робота создается уже под конкретный экземпляр и частные параметры решения задачи на месте, как в онлайн программировании.

    Смотрите про коптеры:  Отличный квадрокоптер с камерой - Syma X5C-1.

    В рассмотренном примере общим алгоритмом было начертание букв, а такие параметры как их размер, отступы между ними, количество букв в строке и пр. зависели уже от частных условий на площадке с роботом.

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

    Однако данный подход следует использовать с осторожностью

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

    Что же есть CNT?

    При перемещении инструмента робота возможно влиять на два параметра:

    Оба эти параметра влияют на конечную получаемую траекторию, что проиллюстрировано на рисунке ниже:

    КЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35M

    В худшем случае опасность использования данной инструкции в runtime режиме заключается в том, что робот сообщает о приходе в намеченную сглаживаемую точку, хотя в действительности он ещё идет к ней. Робот это делает, чтобы запросить следующую точку и рассчитать сглаживание. Очевидно, что нельзя точно знать в какой позиции находится робот при проходе такой точки, к тому же, в определенной точке может потребоваться, например, включение инструмента на манипуляторе. Робот даст сигнал, что доехал до точки, но на самом деле нет. В таком случае, инструмент будет включен раньше, чем следует.

    В лучшем случае робот просто игнорирует инструкцию CNT (зависит от модели).

    Лечится же это передачей 2-х и более точек за раз, где CNT-точка не последняя, однако это повышает сложность программы и нагрузку на программиста.

    Надеюсь, статья оказалась вам полезной.

    С радостью отвечу на ваши вопросы.

    Математика стабилизации, пид-регуляторы (pid)

    Если вы решили заняться мультикоптерами, то рано или поздно вам придется столкнуться с настройкой ПИД-регулятора, поскольку этот математический аппарат применяется почти во всех задачах стабилизации: стабилизация углов квадрокоптера в воздухе, полет и удержание позиции по GPS, удержание высоты по барометру, бесколлекторные механизмы стабилизации видеокамеры в полете (подвес камеры).

    Вы приобретаете двухосевой подвес для камеры, ставите туда, например, GoPro, включаете и вместо стабилизации получаете конвульсии, вибрации и дергания, хотя все датчики откалиброваны и механические проблемы устранены. Причина — неверные параметры ПИД-регуляторов.

    Вы собираете мультикоптер, калибруете датчики, регуляторы, радио, все проверяете, пытаетесь взлететь, а он такой унылый в воздухе, что его даже легким ветерком переворачивает. Или наоборот: он такой резкий, что внезапно срывается с места и крутит тройное сальто без разрешения. Причина все та же: параметры ПИД-регуляторов.

    Для многих устройств использующих ПИД-регуляторы существуют инструкции по настройке, а то и несколько в добавок к многочисленным видеонструкциям от самих пользователей. Но чтобы легче ориентироваться в этом многообразии полезно понимать, как же внутри устроены эти регуляторы.

    Кроме того, мы же собираемся писать собственную систему стабилизации квадрокоптера! Предлагаю вместе со мной самим заново «изобрести» и «на пальцах» понять формулу ПИД-регулятора. Для тех, кому больше нравится сухой математический язык, я рекомендую Википедию, английскую статью, т.к. в русской пока не так подробно изложен материал.

    Будем рассматривать квадрокоптер в двумерном пространстве, где у него есть только один угол — угол крена, и два мотора: левый и правый.

    В полетный контроллер непрерывно поступают команды с земли: «крен 30 градусов», «крен -10 градусов», «крен 0 градусов (держать горизонт)»; его задача — как можно быстрее и точнее их выполнять с помощью моторов с учетом: ветра, неравномерного распределения веса квадрокоптера, неравномерного износа моторов, инерции квадрокоптера и т.п.

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

    На Adruino вполне можно одну итерацию цикла обработки и управления уместить в 10 миллисекунд. Это значит, что раз в 10 миллисекунд будут считываться показания углов квадрокоптера, и на их основе будут отправляться управляющие сигналы к моторам. Эти 10 миллисекунд называют периодом регулирования. Понятно, что чем он меньше, тем чаще и точнее происходит регулирование.

    Уровень газа поступает из приемника в контроллер. Обозначим его КЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35M

    Чем больше разность между желаемым углом крена и текущим, тем сильнее должна быть реакция, тем быстрее левый мотор должен закрутиться относительно правого. Если это записать с использованием наших обозначений:

    Здесь P — коэффициент пропорциональности. Чем он больше, тем сильнее будет реакция, тем резче квадрокоптер будет реагировать на отклонение от требуемого угла крена. Эта интуитивно понятная и простая формула описывает работу пропорционального регулятора.

    За несколько десятков миллисекунд (несколько итераций цикла обработки) под воздействием пропорционального регулятора квадрокоптер вернется в требуемое (в данном случае горизонтальное) положение. Все это время ошибка КЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35M

    где D — настраиваемый коэффициент: чем он больше, тем сильнее останавливающее усилие. Из школьного курса физики всплывают смутные воспоминания, что скорость изменения любой величины — производная этой величины по времени:

    И вот пропорциональный регулятор превращается в пропорционально-дифференциальный (пропорциональное слагаемое и дифференциальное):

    Ошибку КЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35M

    Теперь у нас есть пропорционально-дифференциальный регулятор в плоском «бикоптере», но осталась еще одна проблема. Пусть левый край будет весить чуть больше правого, или, что то же самое, левый мотор работает чуть хуже правого. Квадрокоптер чуть наклонен влево и не поворачивается обратно: дифференциальное слагаемое равно нулю, а пропорциональное слагаемое хоть и принимает положительное значение, но его не хватает, чтобы вернуть квадрокоптер в горизонтальное положение, ведь левый край весит чуть больше правого. Как следствие — квадрокоптер будет все время тянуть влево.

    Необходим механизм, который бы отслеживал такие отклонения и исправлял их. Характерной особенностью таких ошибок является то, что они прявляют себя со временем. На помощь приходит интегральное слагаемое. Оно хранит сумму всех ошибкок КЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35M

    где T — текущий момент времени.
    Пришло время записать окончательную формулу пропорционально-интергрально-дифференциального регулятора:

    где КЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35MКЕЙС: Автоматизация склада косметики с роботом Fanuc M-20iA/35M

    Существует несколько ее вариаций, например, можно ограничить модуль интегрального слагаемого, чтобы он не превысил определенный допустимый порог (мы так и будем делать).

    Оцените статью
    Радиокоптер.ру
    Добавить комментарий

    Adblock
    detector