Роботы. Часть два. Крылатые качели

Дисклаймер. Роботы — очень надёжные парни. Среднестатистический роберт нормального бренда может как проклятый работать годами без перерыва, требуя только коротких перерывов для обслуживания и проверки калибровки. Все нижесказанное — исключительно следствие того, что мы пытаемся этих парней заставить делать то, к чему они не привыкли. Конечно, нельзя не отметить, что мы пытаемся это сделать в рамках мануалов, но, видимо, лезем в такие дебри, где функция вроде как написана, но при этом не до конца проработана. В связи с чем и выхватываем всю ту радость, о которой пойдёт далее речь в тексте. Лонгрид.

image
Добро пожаловать во вторую часть марлезонского балета.

Часть раз.

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

Вставлю в цитату, чтобы выделить — мои глубочайшие извинения перед хабравчанином, написавшим сообщение под моим предыдущим постом, про kawasaki и universal-ов в Питере. Я искренне сожалею, и юзабилити мне не в оправдание, что ткнул кнопку «пожаловаться» вместо «ответить». Это исключительно моя невнимательность, и я не успел даже запомнить ваш ник, чтобы извиниться. Если вас не затруднит — постучитесь в личку, чтобы я мог принести извинения лично. Уверен, что от этого шага, с комментарием «За что, блин!», вас вчера удержала исключительно добродетельная скромность.

Ну и пока не начали — у меня накопилось много разношёрстной информации. Будет пост про вход в профессию, будет программирование микроконтроллеров, будут чудеса в организации и управлении процессом разработки и так далее. В связи с чем хабы, в которых будет публиковаться материал, будут плавать, чтобы не засорять тематические направления нерелевантной информацией.

А теперь — Поехали! © Ю. Гагарин.

Чем мы занимаемся?


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

image

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

Усугубим. А что если — изделие одно?

Возьмём в качестве примера любезно предоставленный vakhramov пример с фрезерованием корпуса лодки. Не силён в кораблестроении (ну кроме сварки микропанелей, которые в судостроении носят такое гулеверовское название исключительно издевательства ради — это дурынды на несколько метров и весом в сотни кг), но могу предположить следующее ТЗ:

  1. У нас есть в некой CAD модель корпуса лодки.
  2. У нас есть нефиговых размеров кубик из чего-то фрезеруемого.
  3. Мы хотим тыкнуть в кнопку, и чтобы софт сотворил магию, а робот сам из кубика (или параллелепипеда) нам что-то отфрезеровал и верифицировал.


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

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

— А почему все внимание этим вашим программам? А зачем ты только там что-то делаешь? А как же я? Меня что, зря делали?
Ну и вываливает кучу особенностей. О которых мы и поговорим.

Сингулярность


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

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

image

Когда роберт ведёт рукой из точки А в точку Б, у него есть две возможности. Либо — установить скорость для всех моторов равномерно. В таком случае скорость каждого конкретного мотора равна требуемому углу поворота конкретной оси, деленной на время выполнения движения. Если выбран этот режим, то робот, двигаясь между точками, пишет красивые дуги. Жаль, но в процессе этого движения он едет не по прямой, а так, как ему удобно. В итоге мы имеем неиллюзорный шанс приехать хоботом в изделие/стены/иже с ним.

Линейное движение гарантирует, что он поедет строго по прямой. Но при этом моторам в разные временные промежутки нужно работать с разной скоростью. И вот если эта скорость превышает ту, которую физически могут выжать из своей обмоточной души двигатели — робот пишет «сингулярность». И все. Программа останавливается.

Чуть лучше ситуация в случаях, когда координаты вместо декартовой указываются в джоинтах. Я не совсем понимаю, почему контроллер реагирует на точки в джоинтах несколько иначе, чем в декартовой — может быть, это связано с логикой пересчёта координат в углы. Но вообще «может быть» — это волшебная фраза в робототехнике, очень помогает в работе и используется как универсальный подорожник.

Тем не менее, даже линейное движение между точками, которые записаны в углах вместо координат — не гарант того, что это обяжет робота по ним ехать. Фанук для этого сделал специнструкцию, а яскава вообще заявляет, что их роботы в сингулярность не играют. Не работают оба подхода. С яскавой — если вдуматься в суть этого явления — вообще похоже на попытку обойти физику. Надписи «сингулярность» пульт действительно не показывает, но при этом информирует о превышении скорости на какой-то оси. Чем это отличается от сингулярности? Ничем. У фануков есть спецкоманда. WIRSJ, если мне память не изменяет (было очень давно и не сработало, потому забыли). Ну да. Робот ехать продолжает. Только в процессе движения «разминает затёкшую кисть», совершая оконечными джоинтами движение, так любимое программистами при наборе текста — покрутить запястьем. Последствия размахивания, если у роберта в руке фреза или лазерная головка, представлять очень смешно, но страшно. Потому сингулярочку надо учитывать.

Ethernet


image

Допустим, мы разобрались с этой историей. Допустим, мы разобрались с нюансами записи УП в углах джоинтов у фанука и моделезависимых пульсах — у яскавы. И теперь нам надо запихнуть программу в робота. Можно, естественно, взять флешку и рабочего, который гордо продефилирует с ней к роберту, но ведь мы про автоматизацию в чистом виде? Потому нам надо отправить прогу в железного друга. Direct memory access отсутствует как класс, но ведь нам, неугомонным, оставили такую штуку, как FTP. Вроде бы — все круто, подключайся и вперёд. Но нет. Робот умеет только в клиента.

На самом деле, эта функция используется для того, чтобы забрать из файлопомойки сети предприятия УП, загрузить ее в робота и выполнить. Робот — весьма современная штука, потому объем памяти в нем исчисляется мегабайтами, а кубинские бароны глотают слёзы отчаяния, пересчитывая стоимость 1 байта и глядя на свою детскую песочницу с белым порошком. В связи с чем — на роберте хранить тыщу УП не получится — память скажет «ой все». И если у нас программ много — будь добр пультиком залезть на файлопомойку и ура: каких то пару минут, и он, качая прогу по Dial-up, отрапортует о готовности к работе.

Ну чтож, если хаос нельзя победить — его надо возглавить. Обяжем роберта загружать файлик по FTP. Для чего ему надо указать имя файла (ну или всегда размещать файл с одним и тем же именем в папке), делов-то. Для этого нужно что? Написать программу для роберта, которая в фоне будет ждать команды на загрузку и загружать программу. А потом выполнять. Для этого Яскава предлагает нам купить среду разработки и разобраться с внутренней песочницей, которая исполняет написанные на Си программы. По синтаксису это, конечно Си, но вот с конструкциями там все не так очевидно и весьма слабо (ибо новое, аж 2 года) документировано. А техподдержка в Дойчлянде, и помощь оказывать не торопится.

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

Написали, запустили. Даже работает. Раз 5. А потом ругается на нехватку памяти, потому что ваши программы длинные — это фу. Три раза. Материмся, идём дописывать удаление. Дебажим. И в какой то момент роберт перестаёт отвечать по сети. А все почему? А потому что он держит коннект и не умеет переподключаться. Тормознул сервак? Будь добр ребутнуть питание. Поставил бряк? Досвидули, ребут питания. За все время работы мы так и не нашли способа воскресить соединение со стороны роберта, и звучный щелчок рубильника был некрологом каждому сеансу отладки.

Отладили, закончили и вытерли трудовой пот? Роберт на позиции, куб готов к опиливанию, фреза запущена и точит в нетерпении зубки? Ура? Вы уверены?

Точность


image

Координаты точки указываются с точностью 1 тысячная мм. Роберт умеет ходить с точностью 1 сотка. Гипотетически. Плюс минус. Но все равно впечатляет! Но что это за точность?

Точность эта — про повторяемость. Повторяемость прихода роберта в точку пространства 100 тысяч раз. Но если вдруг вы решите подвинуть роберта на 1000 мм, то это 1000 мм не будет. Ни в жись. По крайней мере на роберте нормальной, а не крыло-самолётной стоимости. Почему?

Дело в том, что у роберта есть внутри себя виртуальная модель. Он не умеет, как терминатор, рассматривать свои потроха на дисплее внутри черепной коробки, но этот набор циферок, характеризующих размеры каждого сочленения, он использует для пересчёта из декартовой в джоинты. По сути для роберта декартовы координаты — просто неведомая дичь, имя которой «чистая абстракция». Все, что умеет драйвер внутри контроллера — это крутить каждый из 6 двигателей роберта на определенный угол. И для того, чтобы пересчитать из декарта в джоинты, и используются те самые константы, которые обозначают размеры сочленений. А на заводе, где льют, точат и пилят детали будущих угнетателей рода человеческого, тоже есть допуски. А теперь представьте, какую погрешность может привезти смещение размера одного из сочленений на, допустим, 0.5 мм.

Вот и получается, что контроллер считает все правильно, но основывается на неточных данных. На выбеге в метр мы намеряли разброс в 1,5 мм у абсолютно нового, ни разу со стенами не знакомого, фанука. Есть даже специальные ребята, которые приезжают и посредством сложных покатушек с измерительной аппаратурой во всей зоне доступности делают либо корректировочные таблицы, либо — корректируют в потрохах роберта эти значения. Опять же, в классическом применении это нафиг не надо — оператор привёл робота в несколько точек, проверил точность и попросил его повторять это ближайшие 5 лет. Погрешности тут роли не играют — робот теряет свойство расти, сколько в него растишку не лей, сразу после выхода из фабрики. А чтобы искривить геометрию железяк, его надо таааак ушатать… Не думаю, что он после таких нагрузок сможет работать в принципе. Но это надо нам, и эту проблему приходится решать.

Обратная связь


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

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

Я так решил


image

Ещё один фича баг, встречающийся на обоих производителях. Вот скажи мне друх, как так получается, что если J6 закручен в -210, а я тебя прошу повернуться в +240 градусов, ты делаешь это по кратчайшей траектории и плюёшься ошибками? Вот примерно так с ним и начинаешь общаться, когда сталкиваешься с этой бедой. Роберт, при точном указании значения в джоинтах, едет не -210→0→+240, а просто из -210 доворачивает в сторону, которая равна +240. Получаем по факту -380 (что равно +240) — и вуаля, лимит еррор, галактега в опасносте.

Причём нет чёткой закономерности — иногда из -185 в +180 едет корректно, а иногда — из -165 в +175 может рвануть не туда. К чему эта чёртова оптимизация — не ясно, но программу приходится писать, вставляя точку, в котором ось устанавливается в ноль. А если по техпроцессу ты ее подвернул за ±180, то добавляй ещё и ±90, потому что иначе он снова рванёт по кратчайшему пути. Актуально для 4-й и 6-й осей.

Шаманизм


image

У сисадминов бубен? Да они слабаки! Погонщик роботов не появляется перед ликом железяки, не окропив его святой водой, не обвешавшись лапками кур и кроликов, не надев на голову череп буйвола и не выпустив, яки сюрикены, из рук десяток подков.

Я перестал удивляться правилу «семь бед — один ресет». Этот выключатель уже родным мне, собака, стал. Я не удивляюсь ответам «почему-то» и «потому что». Но некоторые вещи продолжают доставлять. Например — калибровка с системой слежения за сварным швом, после которой роберт может начать ехать в сторону. Или бекапы, которые не разворачиваются. Или комментарии «слетела %очереднаяХреньName%». Или абсолютно рандомно работающие нативные скругления траекторий. Это стало нормой.

Вместо заключения


Я не призываю оценивать мои слова, как нытьё. Типа «ой как с ними сложно жить». Несмотря на свои выкрутасы, эти весьма забавные зверьки доставляют множество радости. А пробивание сквозь тернии слабо документированных функций и выхватывание чудес на вроде бы стандартных вещах говорит только об одном — при разработке робертов этим вопросам не уделялось должное внимание. И в целом то, от чего зависит ежедневное использование, работает отлично.

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

В следующий раз поговорим о пороге входа в профессию, а дальше — рассмотрим особенности реализации на .NET импорта моделей из САПР. Или — нюансы сканирования поверхности. Все — на примере лодки из кубика. Мы же должны ее таки выпилить.

© Habrahabr.ru