Этот пример иллюстрирует набор способов приложения сил и крутящих моментов к моделям в симуляторе Gazebo ®. Во-первых, применение крутящих моментов рассматривается тремя различными способами с помощью дверей для рисунка. Во-вторых, две модели TurtleBot ® Create демонстрируют форсирование составных моделей. Наконец, свойства объекта (отскок, в этом случае) исследуются с помощью основных мячей.
Необходимые условия: Запуск с Gazebo и моделируемым TurtleBot, добавление, сборка и удаление объектов в Gazebo
На компьютере Linux ® запустите Gazebo. Если вы используете виртуальную машину из Запуск with Gazebo и моделируемого TurtleBot, нажмите Gazebo Пустой мир на рабочем столе.
Инициализируйте ROS путем замены ipaddress
с IP-адресом виртуальной машины. Создайте образец ExampleHelperGazeboCommunicator
класс.
rosinit('http://192.168.233.133:11311')
Initializing global node /matlab_global_node_68978 with NodeURI http://192.168.233.1:53907/
gazebo = ExampleHelperGazeboCommunicator;
Этот раздел демонстрирует три различных метода применения моментов в соединениях. В этом случае используются двери.
Создайте модель двери и породите три образцов в симуляторе. Задайте положение и ориентацию нереста (модулями являются метры и радианы).
doormodel = ExampleHelperGazeboModel('hinged_door','gazeboDB'); door1 = spawnModel(gazebo,doormodel,[-1.5 2.0 0]); door2 = spawnModel(gazebo,doormodel,[-1.5 0.5 0],[0 0 pi]); door3 = spawnModel(gazebo,doormodel,[-1.5 -2.5 0]);
Все модули в Gazebo указаны с использованием конвенции СИ. С добавленными дверями мир выглядит следующим образом:
Примечание: Когда симуляция Gazebo остается пустой, подвижные элементы часто дрейфуют. Если вы видите, что двери медленно движутся без команды, это поведение нормально. Это происходит потому, что в реальном мире часто больше трений, чем в идеальной обстановке симулятора Gazebo.
Извлеките указатели на ссылки и соединения первой двери и отобразите их.
[links, joints] = getComponents(door1)
links = 3×1 cell
{'hinged_door::frame' }
{'hinged_door::door' }
{'hinged_door::handles'}
joints = 3×1 cell
{'hinged_door::handle' }
{'hinged_door::hinge' }
{'hinged_door::world_joint'}
Для первой двери приложите крутящий момент непосредственно к hinge
соединение.
Приложите крутящий момент к первой двери, используя jointTorque
. Это делает его открытым и остается открытым во время симуляции. Первые две линии определяют время остановки и параметры усилия для приложения крутящего момента. Вторая запись в joints
массив ячеек hinged_door::hinge
. Используйте это в jointTorque
вызов.
stopTime = 5; % Seconds effort = 3.0; % Newton-meters jointTorque(door1, joints{2}, stopTime, effort);
Второй способ заключается в приложении крутящего момента к дверной ссылке вместо шарнирного соединения. Этот метод не является таким чистым, потому что крутящий момент прикладывается к центру массы ссылки (который в этом случае является дверью) и не прикладывается вокруг оси вращения. Этот метод все еще создает крутящий момент, который перемещает дверь.
Используйте applyForce
функция. Вторая запись в links
'hinged _ door:: door'. Используйте его в applyForce
вызов.
forceVector = [0 0 0]; % Newtons torqueVector = [0 0 3]; % Newton-meters applyForce(door2, links{2}, stopTime, forceVector, torqueVector);
Для перемещения можно применить силу (вместо крутящего момента) непосредственно к центру масс двери. Команды:
forceVector = [0 -2 0]; % Newtons
applyForce(door2, links{2}, stopTime, forceVector);
Примечание: Силы всегда применяются из мировой координатной системы координат, а не из объектной системы координат. Когда вы применяете эту силу, она постоянно действует в отрицательном y
направление. Это не приводит к постоянному крутящему моменту на двери.
Для третьей двери вручную задайте угол поворота без приложения силы или крутящего момента.
Используйте цикл while, чтобы создать поведение качания для двери. Используйте setConfig
функция ExampleHelperGazeboSpawnedModel
класс.
angdelta = 0.1; % Radians dt = 0; % Seconds angle = 0; % Radians tic while (toc < stopTime) if angle > 1.5 || angle < 0 % In radians angdelta = -angdelta; end angle = angle+angdelta; setConfig(door3,joints{2},angle); pause(dt); end
Этот раздел демонстрирует создание и внешнюю манипуляцию TurtleBot Create. Это иллюстрирует простое управление более сложным объектом.
Создайте еще один TurtleBot в мире, добавив GazeboModel
из базы данных (GazeboDB). Порожденный робот - TurtleBot Create, а не Kobuki. Приложите внешний крутящий момент к правому колесу.
Примечание: Для нереста Create требуется подключение к Интернету.
botmodel = ExampleHelperGazeboModel('turtlebot','gazeboDB'); bot = spawnModel(gazebo,botmodel,[1,0,0]);
TurtleBot первоначально нерестится лицом вдоль оси X с углом 0 степеней. Измените ориентацию на pi/2 радиана (90 степени) с помощью этой команды:
setState(bot,'orientation',[0 0 pi/2]);
Использование applyForce
, сделайте правое колесо TurtleBot Create двигаться, приложив к нему внешний крутящий момент из ExampleHelperGazeboSpawnedModel
объект.
[botlinks, botjoints] = getComponents(bot)
botlinks = 5×1 cell
{'turtlebot::rack' }
{'turtlebot::create::base' }
{'turtlebot::create::left_wheel' }
{'turtlebot::create::right_wheel'}
{'turtlebot::kinect::link' }
botjoints = 4×1 cell
{'turtlebot::create::left_wheel' }
{'turtlebot::create::right_wheel'}
{'turtlebot::create_rack' }
{'turtlebot::kinect_rack' }
Вторая запись botjoints
is 'turtlebot:: create:: right _ wheel' Использовать ботджойнты {2} в jointTorque
вызов.
turnStopTime = 1; % Seconds turnEffort = 0.2; % Newton-meters jointTorque(bot, botjoints{2}, turnStopTime, turnEffort)
Можно экспериментировать с приложением сил к основе TurtleBot вместо к колесам.
Создайте второй TurtleBot с spawnModel
:
bot2 = spawnModel(gazebo,botmodel,[2,0,0]); [botlinks2, botjoints2] = getComponents(bot2)
botlinks2 = 5×1 cell
{'turtlebot::rack' }
{'turtlebot::create::base' }
{'turtlebot::create::left_wheel' }
{'turtlebot::create::right_wheel'}
{'turtlebot::kinect::link' }
botjoints2 = 4×1 cell
{'turtlebot::create::left_wheel' }
{'turtlebot::create::right_wheel'}
{'turtlebot::create_rack' }
{'turtlebot::kinect_rack' }
Приложите силу к основе в направлении y. Видите, что основа едва перемещается. Сила действует перпендикулярно ориентации колеса.
Первая запись botlinks2
is 'turtlebot:: create:: основа'. Использование botlinks2{1}
в applyForce
вызов.
applyForce(bot2,botlinks2{1},2,[0 1 0]);
Приложите силу в направлении x. Робот движется более существенно.
applyForce(bot2,botlinks2{1},2,[1 0 0]);
Приложите крутящий момент к основе TurtleBot, чтобы сделать его вращающимся.
applyForce(bot2,botlinks2{1},2,[0 0 0],[0 0 1]);
Этот раздел демонстрирует создание двух мячей и раскрывает свойство 'bounce'.
Используйте ExampleHelperGazeboModel
Класс для создания двух мячей в симуляции. Задайте параметры прыгания при помощи addLink
.
bounce = 1; % Unitless coefficient maxCorrectionVelocity = 10; % Meters per second ballmodel = ExampleHelperGazeboModel('ball'); addLink(ballmodel,'sphere',0.2,'color',[0.3 0.7 0.7 0.5],'bounce',[bounce maxCorrectionVelocity]);
Породить два мячей, один на верхнюю часть из других, чтобы проиллюстрировать прыгание.
spawnModel(gazebo,ballmodel,[0 1 2]); spawnModel(gazebo,ballmodel,[0 1 3]); pause(5);
После добавления мячей мир выглядит так:
Очистите модели.
exampleHelperGazeboCleanupApplyForces;
Очистить рабочую область издателей, подписчиков и других связанных с ROS объектов, когда вы закончите с ними.
clear
Использовать rosshutdown
после завершения работы с сетью ROS. Завершите работу глобального узла и отключите от Gazebo.
rosshutdown
Shutting down global node /matlab_global_node_68978 with NodeURI http://192.168.233.1:53907/
После завершения закройте окно Gazebo на виртуальной машине
См. следующий пример: Автономность тестового робота в симуляции