Управляйте роботом манипулятора с Co-симуляцией в Simulink и Gazebo

Симулируйте управление автоматизированного манипулятора с помощью co-симуляции между Simulink и Gazebo. Пример использует Simulink™, чтобы смоделировать поведение робота, сгенерировать команды управления, отправить эти команды в Gazebo и управлять темпом симуляции Gazebo.

  • Блок Gazebo Pacer продвигается симуляция Gazebo в тот же уровень как Simulink, который позволяет командам выполняться точно при симуляции физической динамики в Gazebo.

  • Чтение Gazebo и Gazebo Применяются, блоки Команды используются для связи между MATLAB® и Gazebo.

  • gzlink, gzjoint, и gzworld функции предоставляют быстрый доступ параметрам модели и запросам.

Этот пример рассматривает каждый из этих компонентов и их настроек подробно с помощью модели Simulink, которая управляет положениями Универсальной Робототехники манипулятор UR10. Модель использует инверсную кинематику, чтобы связать желаемое положение исполнительного элемента конца, чтобы соединить положения, затем применяет контроллер PD объединенного пробела с динамической компенсацией термины прямого распространения, чтобы управлять движением.

Для получения дополнительной информации о подготовке среды для этого примера, смотрите, Конфигурируют Gazebo и Simulink для Co-симуляции Робота Манипулятора.

Настройте Gazebo с моделью робота и плагином

Чтобы установить мир Gazebo, установите необходимые плагины, и протестируйте связь с MATLAB и simulink, смотрите раздел Set Up Gazebo with Robot Model и Plugin Сконфигурировать Gazebo и Simulink для Co-симуляции примера Робота Манипулятора.

Откройте мир в Gazebo

Откройте мир путем выполнения этих команд в терминале машины Gazebo:

cd /home/user/src/GazeboPlugin/export
export SVGA_VGPU10=0
gazebo /home/user/worlds/Ur10BasicWithPlugin.world --verbose

Gazebo показывает робота и любые другие объекты в мире. Если средству моделирования Gazebo не удается открыться, вы, возможно, должны переустановить плагин. Смотрите Установку, Плагин Gazebo Вручную в Выполняет Co-симуляцию между Simulink и Gazebo.

Соединитесь с Gazebo

Затем инициализируйте связь Gazebo с MATLAB и Simulink. Задайте IP-адрес и номер порта 14581, который является портом по умолчанию для плагина Gazebo.

ipGazebo = '192.168.116.162'; % Replace this with the IP of the Gazebo machine
gzinit(ipGazebo,14581);

Загрузите модель робота

Эта модель использует созданное использование универсального робота UR10 loadrobot. Модель Gazebo и соответствие моделей робота, поскольку они от того же исходного репозитория. Для получения дополнительной информации смотрите, Конфигурируют Gazebo и Simulink для Co-симуляции Робота Манипулятора.

robot = loadrobot('universalUR10','Gravity',[0 0 -9.81],'DataFormat','column');
showdetails(robot)
--------------------
Robot: (10 bodies)

 Idx             Body Name                            Joint Name                            Joint Type             Parent Name(Idx)   Children Name(s)
 ---             ---------                            ----------                            ----------             ----------------   ----------------
   1             base_link                           world_joint                                 fixed                     world(0)   base(2)  shoulder_link(3)  
   2                  base            base_link-base_fixed_joint                                 fixed                 base_link(1)   
   3         shoulder_link                    shoulder_pan_joint                              revolute                 base_link(1)   upper_arm_link(4)  
   4        upper_arm_link                   shoulder_lift_joint                              revolute             shoulder_link(3)   forearm_link(5)  
   5          forearm_link                           elbow_joint                              revolute            upper_arm_link(4)   wrist_1_link(6)  
   6          wrist_1_link                         wrist_1_joint                              revolute              forearm_link(5)   wrist_2_link(7)  
   7          wrist_2_link                         wrist_2_joint                              revolute              wrist_1_link(6)   wrist_3_link(8)  
   8          wrist_3_link                         wrist_3_joint                              revolute              wrist_2_link(7)   ee_link(9)  tool0(10)  
   9               ee_link                        ee_fixed_joint                                 fixed              wrist_3_link(8)   
  10                 tool0        wrist_3_link-tool0_fixed_joint                                 fixed              wrist_3_link(8)   
--------------------

Установите начальную настройку робота.

q0 = [0 -70 140 0 0 0]' * pi/180; 

Загрузите модель Simulink

gazeboCosimControl модель управляет положением исполнительного элемента конца манипулятора с помощью ползунков во Вводе данных пользователем: раздел End Effector. Подсистема Инверсной кинематики генерирует объединенную настройку, которая достигает желаемого постиона. Затем Объединенные Подсистемы контроллера генерирует силы крутящего момента для каждого соединения, чтобы достигнуть этого положения

Откройте модель.

open_system('gazeboCosimControl');

Установите шаги расчета контроллера и траектории

Ts = 0.01;
Ts_trajectory = 0.05;

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

Изучите типовую конструкцию

Модель Simulink состоит из четырех областей:

  • Ввод данных пользователем: Обеспечивает входные параметры для желаемого положения исполнительного элемента конца робота с помощью ползунков.

  • Управление: Сопоставляет положение исполнительного элемента конца, чтобы соединить положение с помощью инверсной кинематики, и средства управления соединяют положение с помощью вычисленного контроллера крутящего момента

  • Иноходец Gazebo: Обеспечивает связь с Gazebo, чтобы гарантировать, что модель Simulink продвигается обе симуляции.

  • Робот Gazebo: Отправляет команды в и получает команды от мира Gazebo.

Эти разделы обрисованы в общих чертах более подробно ниже.

Ввод данных пользователем

Ввод данных пользователем имеет 6 ползунков, которые управляют положением исполнительного элемента конца: три, чтобы управлять этими X, Y, и положением Z на пробеле, и три, чтобы управлять ориентацией.

Управление

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

Подсистема инверсной кинематики

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

Объединенная Подсистема контроллера

В этом примере объединенный диспетчер использует обратную связь и feedforward термины. Крутящий момент силы тяжести и скоростные значения продукта объединяются, чтобы сформировать термин прямого распространения. Контроллер пропорциональной производной (PD) генерирует термин обратной связи. Для получения дополнительной информации об объединенных контроллерах, относитесь, чтобы Выполнить Безопасную Траекторию, Отслеживающую Управление Используя Блоки Манипулятора Робототехники.

Иноходец Gazebo

Блок Gazebo Pacer гарантирует co-симуляцию Gazebo путем продвижения симуляции Gazebo в синхронизацию с шагами Simulink. Это важно для приложений как эта модель, где контроллер используется, чтобы непосредственно управлять положением робота в мире Gazebo. Объединенные измерения и команды крутящего момента должны синхронизироваться, чтобы гарантировать, что симуляция отражается фактического поведения.

В маске блока задайте шаг расчета как Ts. Можно протестировать связь Gazebo с помощью сети Configure Gazebo и ссылки настроек симуляции. Эта связь была уже настроена с помощью gzinit.

Модель Gazebo

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

Примените объединенный крутящий момент

Для каждого соединения крутящий момент должен быть применен в Наборе <объединенное имя> подсистемы области Transmit to Gazebo подсистемы модели Gazebo. Например, для соединения панорамирования плеча, инструменты, чтобы отправить подсистему плана плеча содержатся в подсистеме Панорамирования Плеча Набора.

Каждая из этих подсистем использует блок Bus Assignment, входные параметры которого задают тип шины, детали модели и длительности и результирующей команды.

Блок Gazebo Blank Message задает тип шины, чтобы быть форматом сообщения Gazebo соответствующего типа. В диалоговом окне параметров блоков выберите "ApplyJointTorque" из списка типов команды. Блок требуется, чтобы гарантировать, что правильный шаблон шины используется, i.e. то, что порт является блоком Bus Assignment, имеют правильные значения.

Блок Gazebo Select Entity выбирает объект, к которому будет применено это сообщение. В этом случае, поскольку крутящий момент применяется, "сущность" является соединением. Поскольку эта подсистема применит крутящий момент к соединению плеча, выбрать соответствующее соединение в мире Gazebo из списка типов сущности. Пока связь с миром Gazebo была установлена, этот список будет автоматически заполнен. Если связь потеряна, щелкните по ссылке "Configure Gazebo network and simulation settings", чтобы восстановить, или использовать gzinit интерфейс командной строки. Мир Gazebo должен быть открыт для этой операции, чтобы успешно выполниться.

Блок Gazebo Apply Command берет содержимое сообщения, отправляет его в сервер Gazebo. Откройте диалоговые параметры блока, выберите параметр типа Команды и выберите ApplyJointTorque, чтобы отправить соответствующую команду в Gazebo.

Остающиеся входные параметры управляют суммой и длительностью приложенной силы. Импорт усилия задает объединенное количество крутящего момента. Вход индекса диктует ось, к которой должен быть применен крутящий момент. Поскольку каждое из шарнирных соединений является всего 1 степенью свободы, это значение должно быть установлено к uint32(0) указать на первую ось. Наконец, входные параметры длительности задают длительность прикладного крутящего момента, разделенного на секунды и наносекунды. Например, если бы длительность составляет 1,005 секунды, это была бы 1 секунда и 5 000 000 наносекунд как шина. Они выделены, чтобы увеличить точность. В этом случае контроллер применяет крутящий момент для длины шага расчета, ранее заданного к 0,01 секундам, или 1e7 наносекунды. Поэтому первый вход является нулем (0 секунд), и второй вход 1e7.

Подсистема модели Gazebo включает 5 других подсистем, соответствующих другим пяти соединениям, которые были сконфигурированы тем же способом.

Измерьте объединенное состояние

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

Блок Gazebo Read читает сообщения из сервера Gazebo. В диалоговом окне блока нажмите "Select.." рядом с темой, чтобы выбрать правильную тему, чтобы читать из и выбрать соответствующее измеренное объединенное значение, /gazebo/ground_truth/joint_state/ur10/shoulder_pan_joint. Это сообщение выбирает точное значение основной истины, хотя также возможно поместить датчики в Gazebo и читать от тех вместо этого.

Используйте Селектор Шины, чтобы только выбрать соответствующие значения из сообщения. В этом случае только положение измеряется из модели Gazebo, которая в конечном счете возвращена контроллеру.

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

Настройте объекты шины для симуляции

Объекты шины Gazebo сгенерированы, когда блоки cosimulation введены в модели. Сигналы из Gazebo читаются через эти объекты шины. По умолчанию размерности установлены в переменный размер, поскольку соединения могут иметь несколько степеней свободы. Поскольку все соединения в этом примере являются шарнирными соединениями, они являются 1-мерными и фиксированными в размере, который может быть задан как свойство сигналов шины. Этот шаг является дополнительным, но полезно преодолеть ограничения сигналов переменного размера.

Загрузите пользовательские объекты шины.

load('custom_busobjects_basic');   

Чтобы сделать так вручную, откройте Редактор Шины в Simulink. Это может быть найдено при Моделировании> Проект> Редактор Шины.

Выберите шину, используемую, чтобы считать объединенное состояние, затем выберите соответствующее имя элемента на правой стороне. Для Gazebo_SL_Bus_gazebo_msgs_JointState выберите joint_position и joint_velocity и измените Размерность в 1 и DimensionMode к 'Фиксированному'.

Запустите симуляцию

Сбросьте мир Gazebo и положение поля прежде, чем симулировать команды MATLAB использования. Команды как они могут быть более непосредственно включены в модель Simulink как StartFcn коллбэк, чтобы гарантировать, что они выполняются при каждой запущенной Симуляции. В параметрах блоков Иноходца Gazebo только сбрасывается время симуляции, когда вы запускаете модель, если вы не изменяете выпадающий список Поведения Сброса.

gzworld("reset"); % Reset the world to its initial state
gzlink("set","redBox","link","Position",[0.5 -0.4 .3]); % Move the box to a new location
STATUS:  Succeed


MESSAGE:  Parameter set successfully.

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

Запустите симуляцию в течение 20 секунд и протестируйте различные положения с помощью ползунков во Вводе данных пользователем: Закончите Исполнительный элемент. Проверьте инверсную кинематику и соединитесь, контроллер ведут себя правильно в Gazebo.

simoutput = sim('gazeboCosimControl','StopTime','20');

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

Просмотрите эффективность

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

measuredPosition = simoutput.logsout{1}.Values; 
referencePosition = simoutput.logsout{2}.Values; 
figure
plot(measuredPosition.Time, measuredPosition.Data, '-', referencePosition.Time, referencePosition.Data, '--')
legend({'Meas1','Meas2','Meas3','Meas4','Meas5','Meas6','Ref1','Ref2','Ref3','Ref4','Ref5','Ref6'})