Симулируйте управление автоматизированного манипулятора с помощью 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, установите необходимые плагины, и протестируйте связь с MATLAB и simulink, смотрите раздел Set Up Gazebo with Robot Model и Plugin Сконфигурировать Gazebo и Simulink для Co-симуляции примера Робота Манипулятора.
Откройте мир путем выполнения этих команд в терминале машины 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 с 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;
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 Pacer гарантирует co-симуляцию Gazebo путем продвижения симуляции Gazebo в синхронизацию с шагами Simulink. Это важно для приложений как эта модель, где контроллер используется, чтобы непосредственно управлять положением робота в мире Gazebo. Объединенные измерения и команды крутящего момента должны синхронизироваться, чтобы гарантировать, что симуляция отражается фактического поведения.
В маске блока задайте шаг расчета как Ts
. Можно протестировать связь Gazebo с помощью сети Configure Gazebo и ссылки настроек симуляции. Эта связь была уже настроена с помощью gzinit
.
Подсистема модели 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'})