Этот пример иллюстрирует набор способов прикладывать силы и крутящие моменты к моделям в средстве моделирования Gazebo®. Во-первых, приложение крутящих моментов исследовано в трех отличных способах использовать двери для рисунка. Во-вторых, две модели TurtleBot® Create демонстрируют принуждение составных моделей. Наконец, свойства объектов (возврат, в этом случае) исследованы с помощью основных шаров.
Предпосылки: Запуск с Gazebo и моделируемым TurtleBot, моделью чтения и свойствами симуляции из Gazebo, добавляет, создает и удаляет объекты в Gazebo
На вашей машине Linux® запустите Gazebo. Если вы используете виртуальную машину из Запуска с Gazebo и Моделируемым TurtleBot, используйте Gazebo Пустой мир.
Инициализируйте ROS, заменив ipaddress
на IP-адрес виртуальной машины. Создайте экземпляр класса ExampleHelperGazeboCommunicator
.
ipaddress = '192.168.203.129';
rosinit(ipaddress)
Initializing global node /matlab_global_node_16668 with NodeURI http://192.168.203.1:50907/
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 заданы с помощью соглашения SI. С добавленными дверями выглядит так мир:
Примечание: Когда симуляцию Gazebo оставляют часто дрейфуют, неактивные, подвижные элементы. Если вы видите, что двери медленно перемещаются без команды, это поведение нормально. Это происходит, потому что часто существует больше трения в реальном мире, чем существует в идеальной установке средства моделирования Gazebo.
Получите указатели для ссылок и соединений первой двери и отобразите их.
[links, joints] = getComponents(door1)
links = 3×1 cell array
{'hinged_door::frame' }
{'hinged_door::door' }
{'hinged_door::handles'}
joints = 3×1 cell array
{'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:: дверь'. Используйте его в вызове 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
. Это не приводит к постоянному крутящему моменту на двери.
Для третьей двери вручную задайте угол стержня, не прикладывая силу или крутящий момент.
Использование некоторое время цикл, чтобы создать колеблющееся поведение для двери. Используйте функцию 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 Создают. Это иллюстрирует простое управление более сложного объекта.
Создайте другой TurtleBot в мире путем добавления GazeboModel
от базы данных (GazeboDB). Порожденным роботом является TurtleBot, Создают, не Kobuki. Примените внешний крутящий момент к его правильному колесу.
Примечание: Порождение Создавания требует интернет-соединения.
botmodel = ExampleHelperGazeboModel('turtlebot','gazeboDB'); bot = spawnModel(gazebo,botmodel,[1,0,0]);
TurtleBot первоначально порождает направление вдоль оси X с углом 0 градусов. Измените ориентацию на радианы пи/2 (90 градусов) использующий эту команду:
setState(bot,'orientation',[0 0 pi/2]);
Используя applyForce
, заставьте правильное колесо TurtleBot Создать перемещение путем применения внешнего крутящего момента к нему от объекта ExampleHelperGazeboSpawnedModel
.
[botlinks, botjoints] = getComponents(bot)
botlinks = 5×1 cell array
{'turtlebot::rack' }
{'turtlebot::create::base' }
{'turtlebot::create::left_wheel' }
{'turtlebot::create::right_wheel'}
{'turtlebot::kinect::link' }
botjoints = 4×1 cell array
{'turtlebot::create::left_wheel' }
{'turtlebot::create::right_wheel'}
{'turtlebot::create_rack' }
{'turtlebot::kinect_rack' }
Вторая запись botjoints
'turtlebot:: создайте:: right_wheel' botjoints {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 array
{'turtlebot::rack' }
{'turtlebot::create::base' }
{'turtlebot::create::left_wheel' }
{'turtlebot::create::right_wheel'}
{'turtlebot::kinect::link' }
botjoints2 = 4×1 cell array
{'turtlebot::create::left_wheel' }
{'turtlebot::create::right_wheel'}
{'turtlebot::create_rack' }
{'turtlebot::kinect_rack' }
Прикладывайте силу к основе в направлении Y. Смотрите, что основа едва перемещается. Сила действует перпендикуляр к ориентации колеса.
Первая запись botlinks2
'turtlebot:: создайте:: основа'. Используйте 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]);
Этот раздел демонстрирует создание двух шаров и представляет свойство 'возврата'.
Используйте класс 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_16668 with NodeURI http://192.168.203.1:50907/
По окончании закройте окно Gazebo на своей виртуальной машине
Обратитесь к следующему примеру: Протестируйте Автономию Робота в Симуляции