В промышленной робототехнике есть две основные задачи кинематики: прямая и обратная (инверсная). Цель решения которых состоит в определении параметров связанных гибких объектов для достижения необходимой позиции, ориентации и расположения этих объектов [1, 2]. Полученные теоретические результаты должны быть подтверждены практическим путем. Применение для данных целей реального промышленного робота не всегда является возможным. Оптимальным вариантом является применение программ для имитационного моделирования робототехнических систем.

Одним из инструментов по моделированию робототехнических систем является программный комплекс CoppeliaSim, используемый в промышленности, образовании и исследованиях. Имеет бесплатную (CoppeliaSim Player), образовательную (CoppeliaSim Edu) и платную (CoppeliaSim Pro) версии. На момент написания статьи была доступна для скачивания версия 4.2.0.

Симулятор CoppeliaSim с интегрированной средой разработки основан на архитектуре распределенного управления: каждым объектом/моделью можно управлять индивидуально с помощью встроенного скрипта, плагина, узлов ROS/ROS2, узлов BlueZERO, удаленных клиентов API или пользовательского решения. Поддерживает работу с разными языками программирования: Lua (используется по умолчанию), Python, C/C++, Java, Matlab, Octave, Urbi [3].

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

В рамках данной статьи рассмотрим модель робота ABB IRB 140.

ABB IRB 140 является компактным и эффективным промышленный роботом с шестью степенями подвижности, способный работать с загрузкой до 6 кг в рабочей зоне 810 мм [4].

Добавим модель робота ABB IRB 140 на сцену. Для этого в обзорщике моделей в дереве robots необходимо выбирать no-mobile и перетащить промышленного робота ABB IRB 140 на сцену. Модель промышленного робота ABB IRB 140 представлена на рисунке 1.

Рисунок 1 – Модель промышленного робота ABB IRB 140
Рисунок 1 – Модель промышленного робота ABB IRB 140

Далее необходимо удалить ненужные объекты из иерархии сцены, как показано на рисунке 2.

Рисунок 2 – Иерархия сцены после удаления ненужных объектов
Рисунок 2 – Иерархия сцены после удаления ненужных объектов

Для всех шарниров (IRB140_joint1…IRB140_joint6) в окне Scene Object Properties во вкладке Joint в поле Mode значение Torque/force mode необходимо изменить на Passive mode.

Далее рассмотрим структуру беспоточного дочернего скрипта для управления роботом (язык программирования Lua).

Lua - язык программирования расширений, разработан для поддержки общего процедурного программирования с возможностью описания данных [5].

Общая структура скрипта управления  имеет вид, представленный на рисунке 3.

Рисунок 3 – Общая структура скрипта управления
Рисунок 3 – Общая структура скрипта управления

Скрипт в этом примере выполняет четыре основных функции, а именно [6]:

sysCall_init() – функция инициализации. Функции инициализации вызывается при запуске симулирования. Она вызывается только один раз и обычно используется для инициализации переменных, пользовательского интерфейса и т.п. Функция sysCall_init() всегда вызывается до функции sysCall_actuation().

sysCall_actuation() – функция активации. Функция активации выполняется циклически в процессе симулирования. Является основной функцией для управления роботом.

sysCall_sensing() – функция датчиков. Данная функция  предназначена для опрашивания состояния датчиков во время симулирования, и выполняется на каждом этапе симулирования.

sysCall_cleanup() – функция очистки. Эта функция вызывается при остановке симулирования. Функция отвечает за восстановление исходной конфигурации робота, очистку состояний датчиков и т.п.

CoppeliaSim предлагает создание настраиваемого пользовательского интерфейса (сustom user interfaces) с помощью встроенного плагина Qt. При создании пользовательского интерфейса используется специальный XML синтаксис. Пример синтаксиса наиболее хорошо отображен в учебной сцене customUI.ttt находящейся в корне папки scenes в месте установки программы.

Далее приступим к разработке управляющего скрипта.

Для функции sysCall_init()напишем следующий код:

function sysCall_init()
    simJoints={0,0,0,0,0,0}
    for i=1,6,1 do
        simJoints[i]=sim.getObjectHandle('IRB140_joint'..i)
    end
    xml = '<ui title="Forward Kinematics" closeable="true" on-close="closeEventHandler" resizable="false">'..[[
    <label text="Forward Kinematics for ABB IRB 140 using CoppeliaSim and Qt"/>
    <group layout="hbox">
    <label text="J1" id="11" />
    <hslider id="21" minimum="-500" maximum="500" on-change="sliderChange" />
    <edit value="0" id="31" on-editing-finished="jointEntry" />
    </group>
    <group layout="hbox">
    <label text="J2" id="12"/>
    <hslider id="22" minimum="-500" maximum="500" on-change="sliderChange" />
    <edit value="0" id="32" on-editing-finished="jointEntry" />
    </group>
    <group layout="hbox">
    <label text="J3" id="13"/>
    <hslider id="23" minimum="-500" maximum="500" on-change="sliderChange" />
    <edit value="0" id="33" on-editing-finished="jointEntry" />
    </group>
    <group layout="hbox">
    <label text="J4" id="14"/>
    <hslider id="24" minimum="-500" maximum="500" on-change="sliderChange" />
    <edit value="0" id="34" on-editing-finished="jointEntry" />
    </group>
    <group layout="hbox">
    <label text="J5" id="15"/>
    <hslider id="25" minimum="-500" maximum="500" on-change="sliderChange" />
    <edit value="0" id="35" on-editing-finished="jointEntry" />
    </group>
    <group layout="hbox">
    <label text="J6" id="16"/>
    <hslider id="26" minimum="-500" maximum="500" on-change="sliderChange" />
    <edit value="0" id="36" on-editing-finished="jointEntry" />
    </group>
    </ui>
    ]]
    ui=simUI.create(xml)
end

Для функции sysCall_cleanup() напишем следующий код:

function sysCall_cleanup()
simUI.destroy(ui)    
end

При остановке симулирования, с помощью команды simUI.destroy(ui) уничтожаем пользовательский интерфейс.

Также добавим еще одну функцию closeEventHandler():

function closeEventHandler()
simUI.hide(ui)
end

Функция closeEventHandler() отвечает за обработку событий кнопки «закрыть» пользовательского интерфейса.

Функция обработки событий слайдеров:

function sliderChange(ui,id,newVal)
   for i=1,6,1 do
	  if (id==20+i) then
         simUI.setLabelText(ui,10+i,string.format('J' ..i))
         simUI.setEditValue(ui,30+i,string.format(newVal))
         sim.setJointPosition(simJoints[i],newVal*math.pi/180)
		 break
	  end
   end
end

Функция обработки событий редактируемых полей:

function jointEntry(ui,id,newVal)
   if (tonumber(newVal)==nil) then
	  print("Error: could not convert number")
	  return
   end
   for i=1,6,1 do
	  if (id==30+i) then
		 simUI.setLabelText(ui,10+i,string.format('J'..i))
         simUI.setEditValue(ui,30+i,string.format(newVal))         
         sim.setJointPosition(simJoints[i],newVal*math.pi/180)
		 break
	  end
   end
end

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

Рисунок 4 – Окно пользовательского интерфейса
Рисунок 4 – Окно пользовательского интерфейса

Исходный файл проекта располагается на сервисе GitHub по следующей ссылке.

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

Литература

1. Прямая кинематика. — Текст : электронный // Wikipedia : [сайт]. — URL: http://ru.wikipedia.org/wiki/Прямая_кинематика (дата обращения: 15.10.2021).

2. Инверсная кинематика. — Текст : электронный // Wikipedia : [сайт]. — URL: http://ru.wikipedia.org/wiki/Инверсная_кинематика (дата обращения: 15.10.2021).

3. CoppeliaSim User Manual. — Текст : электронный // Coppelia Robotics : [сайт]. — URL: https://www.coppeliarobotics.com/helpFiles/index.html (дата обращения: 15.10.2021).

4. Промышленный робот IRB 140. — Текст : электронный // ДельтаСвар : [сайт]. — URL: https://www.deltasvar.ru/katalog/abb/Промышленные-роботы-abb/Промышленный-робот-irb-140 (дата обращения: 16.10.2021).

5. Lua 5.3 Руководство. — Текст : электронный // Lua : [сайт]. — URL: https://lua.org.ru/contents_ru.html (дата обращения: 16.10.2021).

6. CoppeliaSim实例分析系列-ABB IRB140(二). — Текст : электронный // CSDN : [сайт]. — URL: https://blog.csdn.net/feima9999/article/details/111070411 (дата обращения: 15.10.2021).

Комментарии (6)


  1. McHummer1
    31.12.2021 18:59

    Попробуйте симулятор webots


    1. FranzDev Автор
      01.01.2022 05:43

      Окей


  1. koreec
    01.01.2022 04:48
    +1

    То-ли реферат, то-ли методичка. А точно, методичка.


  1. Northbound
    03.01.2022 16:33
    +1

    Спасибо за статью) ????


    1. FranzDev Автор
      03.01.2022 16:58

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


  1. GoodFoxxx
    03.01.2022 16:33

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