В промышленной робототехнике есть две основные задачи кинематики: прямая и обратная (инверсная). Цель решения которых состоит в определении параметров связанных гибких объектов для достижения необходимой позиции, ориентации и расположения этих объектов [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.
Далее необходимо удалить ненужные объекты из иерархии сцены, как показано на рисунке 2.
Для всех шарниров (IRB140_joint1…IRB140_joint6) в окне Scene Object Properties во вкладке Joint в поле Mode значение Torque/force mode необходимо изменить на Passive mode.
Далее рассмотрим структуру беспоточного дочернего скрипта для управления роботом (язык программирования Lua).
Lua - язык программирования расширений, разработан для поддержки общего процедурного программирования с возможностью описания данных [5].
Общая структура скрипта управления имеет вид, представленный на рисунке 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, а решив прямую задачу кинематики по известной кинематической схеме – проверить результаты практическим путем.
Исходный файл проекта располагается на сервисе 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).