Как мы связали хаптик с промышленным роботом и учим его повторять движения полировщика

в 12:35, , рубрики: завод, обучение роботов, роботы, С++
Крокодил
Как мы связали хаптик с промышленным роботом и учим его повторять движения полировщика - 1

Привет, я Иван из НИИ Крокодил. Это небольшая команда внутри ИЖ‑РЭСТ — завода штампов и пресс‑форм. Мы пришли на завод из IT и теперь разбираемся, как соединить опыт людей из цеха с тем, что умеем сами.

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

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

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

Но давайте по порядку.

Зачем понадобился робот

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

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

Полностью убрать полировщика из процесса тоже нельзя. Робот всё‑таки машина и не понимает всех нюансов обработки.

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

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

Поехали искать тех, кто уже двигал роботов рукой

Готового решения у нас не было.

Во время одной из первых поездок в Казань мы искали команды, которые занимаются промышленной робототехникой и могли бы помочь оценить нашу идею. Так мы познакомились со специалистами Университета Иннополис — российского вуза, специализирующегося на образовании и разработках в ИТ, ИИ и робототехнике. Он находится в Иннополисе в 40 км от Казани.

В Университете нам показали лабораторию, роботизированный манипулятор и хаптик 3D Systems Touch. Команда уже работала с близкими задачами и разрабатывала собственную CAM‑систему для роботизированной обработки.

Мы рассказали о своей идее: полировщик управляет роботом через хаптик, система записывает движение, а затем робот воспроизводит ту же траекторию самостоятельно. Оказалось, в Центре развития промышленной робототехники Университета Иннополис уже работали с похожими задачами. Поэтому решили проверить нашу идею на их платформе.

Для проведения эксперимента Университет Иннополис предоставил нам оборудование и помог разобраться с его базовой архитектурой и управлением. Так в проекте появились промышленный робот SIASUN SR25A-20/1.80, контроллер RH06A, хаптик 3D Systems Touch и RobotSDK.

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

Как нам тогда казалось, оставалось совсем немного.

Как мы связали хаптик с промышленным роботом

В итоге у нас получилась такая цепочка:

3D Systems Touch → компьютер с нашим программным мостом → контроллер RH06A → робот SIASUN SR25A

Как мы связали хаптик с промышленным роботом и учим его повторять движения полировщика - 2

Подпись: OpenHaptics получает положение стилуса, наш мост переводит его в координаты SIASUN, а RobotSDK отправляет команды контроллеру RH06A.

Хаптик подключается к компьютеру по USB. Его положение и кнопки мы читаем через OpenHaptics.

На компьютере работает наш консольный мост touch_to_siasun_min.exe. Он получает данные от Touch, пересчитывает их в координаты робота и передаёт команды контроллеру.

С контроллером программа общается через SIASUN RobotSDK по UDP, порт 9999.

Дальше RH06A уже управляет сервоприводами самого робота.

Движение идёт не через графический интерфейс штатного пульта. Наша программа напрямую вызывает API RobotSDK. То есть компьютер открывает UDP‑сессию с контроллером и отправляет ему команды движения.

Как отправить робота на 20 миллиметров вверх

Вот упрощённый пример того же пути, который использует наш мост:

#include <RobotSDK.h>

int main() {
    RobotInit();

    // Открываем UDP-сессию с контроллером RH06A
    int id = ConnectUDP("192.168.3.150", 9999);
    if (id <= 0) return 1;

    // Читаем текущую позицию и ориентацию инструмента
    RPY pose{};
    float exAxis[6] = {};
    ReadPOSE_RPY(&pose, exAxis, id);

    // Сдвигаем целевую точку на 20 мм вверх
    pose.pz += 20.0f;

    // Отправляем команду линейного движения
    MovL_P2P_RPY(
        &pose,
        exAxis,
        /*tool*/ 0,
        /*speed mm/s*/ 80.0f,
        id
    );

    Disconnect(id);
    RobotRelease();
    return 0;
}

Программа инициализирует RobotSDK, соединяется с контроллером, получает текущую позу рабочего инструмента и меняет координату по оси Z на 20 миллиметров.

Затем команда Movl_P2P_RPY отправляет робота в новую точку линейным движением.

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

Основную часть мы написали на C++. Дополнительно сделали Python‑обёртку. Над первой версией работали Дима, Паша и Женя. MVP, с которым уже можно было передавать и повторять движения, собрали примерно за месяц.

Правда, написать pose.pz += 20 оказалось гораздо легче, чем сделать нормальное управление рукой.

Маленький хаптик и большая промышленная рука

У Touch и промышленного робота разные рабочие зоны. Стилус хаптика можно переместить на несколько сантиметров. Рабочая зона Touch измеряется сантиметрами, а радиус досягаемости SIASUN SR25A составляет около 1,8 метра.

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

Поэтому нельзя просто взять координату Touch и отправить её роботу.

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

Мы получаем декартову позу инструмента:

  • px, py, pz — положение в миллиметрах;

  • rx, ry, rz — ориентация кисти в градусах.

Также читаем углы всех шести суставов J1–J6 и состояния контроллера:

  • установлена ли связь;

  • включены ли сервоприводы;

  • выполняется ли основная программа;

  • находится ли робот на траектории;

  • есть ли предупреждение или авария.

За счёт этого мост понимает не только куда мы хотим отправить робота, но и где он находится сейчас.

Интерфейса пока нет. Есть консоль

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

Как мы связали хаптик с промышленным роботом и учим его повторять движения полировщика - 3

[STREAM] #4301 (372.252, -323.739, 7.235)

d=1.83225 mm speed=200 rc=0 OnPath=1

В этой строке видно, в какую точку движется робот, каким получился шаг, с какой скоростью отправлена команда и принял ли её контроллер. rc=0 означает, что вызов RobotSDK прошёл без ошибки, а OnPath=1 — что робот находится на траектории.

Иногда в логе появляется такая запись:

[QUEUE] skip (stream): within deadzone

Это значит, что хаптик сдвинулся совсем немного и мы решили не отправлять роботу новую команду. Даже когда человек старается держать стилус неподвижно, координаты всё равно слегка меняются. Если передавать роботу каждое такое движение, очередь быстро заполнится почти одинаковыми точками. На траекторию они практически не повлияют, а задержку увеличат.

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

Есть в логе и такая строка:

[CLUTCH] ON @re‑anchor

Это режим переякорения. Рабочая зона у настольного Touch небольшая, а у промышленного робота — заметно больше. В какой‑то момент стилус упирается в край, хотя манипулятору ещё есть куда двигаться.

Тогда человек включает условное «сцепление», возвращает стилус в удобное положение и продолжает работу. Робот это обратное движение не повторяет.

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

Человек может двигаться быстрее робота

Когда мы впервые заставили SIASUN следовать за Touch, появилась ещё одна проблема.

Человек может очень быстро передвинуть стилус. Роботу для выполнения той же команды нужно повернуть несколько осей и физически переместить тяжёлый манипулятор. Если точки приходят быстрее, чем робот успевает их проходить, они начинают складываться в очередь.

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

Часть проблемы решает мёртвая зона: мы не отправляем микросдвиги. Но просто выбрасывать больше точек тоже нельзя.

Если оставить их слишком много, робот будет отставать. Если отфильтровать траектория станет грубой и рваной.

Поэтому нужно найти баланс:

  • не засорять поток лишними координатами;

  • сохранять форму движения человека;

  • учитывать реальную скорость робота;

  • не позволять очереди бесконечно расти;

  • не создавать опасных рывков;

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

В этот момент наш мост перестал быть просто проводом между двумя устройствами. Он превратился в слой управления, который должен примирить маленький быстрый хаптик и большую медленную промышленную руку.

А где полировка?

Пока робот в основном повторяет движения в пространстве.

Для полноценной работы с металлом этого мало.

Можно идеально воспроизвести траекторию и получить плохую полировку. Например, неправильно выставить инструмент, выбрать слишком высокую скорость или не выдержать нужный прижим.

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

Нужно будет проверить:

  • как инструмент касается поверхности;

  • какое усилие получается в разных точках;

  • как влияет скорость движения;

  • насколько точно повторяется проход;

  • что происходит при отклонениях геометрии;

  • как меняется качество после нескольких повторов.

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

Сейчас у нас есть работающий MVP управления: хаптик передаёт движение, мост преобразует координаты, контроллер принимает команды, а робот повторяет траекторию.

Следующий этап — доказать, что эта траектория полезна не только на экране консоли, но и при контакте с настоящим металлом.

Это можно использовать не только для полировки

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

Полировка — первая задача, с которой всё началось.

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

Конечно, нельзя просто снять полировальную машинку, поставить сварочную горелку и сказать: «Теперь вари».

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

Что мы поняли

Получить промышленного робота и научить его двигаться — ещё не значит автоматизировать операцию. 

Сейчас мы решили только первую часть задачи. Хаптик передаёт движение, наш мост переводит его в координаты SIASUN, контроллер принимает команды, а робот повторяет траекторию. Дальше предстоит проверить систему уже на детали и понять, сможет ли она дать стабильный результат при полировке.

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

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

Скорее всего, с первого раза идеально не получится. Но в прошлый раз мы начинали с того, что робот просто двигался вслед за рукой. Теперь он уже понимает наши команды, фильтрует лишние движения и умеет повторять маршрут. Для начала неплохо.

Крокодил за работой
Как мы связали хаптик с промышленным роботом и учим его повторять движения полировщика - 4

Автор: Zappusik

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js