Этот пример иллюстрирует набор способов прикладывать силы и крутящие моменты к моделям в средстве моделирования Gazebo®. Во-первых, приложение крутящих моментов исследовано в трех отличных способах использовать двери в рисунке. Во-вторых, две модели TurtleBot® Create демонстрируют принуждение составных моделей. Наконец, свойства объектов (возврат, в этом случае) исследованы с помощью основных шаров.
Предпосылки: Начало работы с Gazebo и симулированным TurtleBot, добавьте, создайте и удалите объекты в Gazebo
На вашей машине Linux® запустите Gazebo. Если вы используете виртуальную машину от Начало работы с Gazebo и Симулированным TurtleBot, нажмите мир Gazebo Empty на рабочем столе.
Инициализируйте 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 заданы с помощью соглашения SI. С добавленными дверями выглядит так мир:
Примечание: Когда симуляцию 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:: дверь'. Используйте его в 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
{'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
'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
{'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
'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_68978 with NodeURI http://192.168.233.1:53907/
По окончании закройте окно Gazebo на своей виртуальной машине
Обратитесь к следующему примеру: Протестируйте Автономию Робота в Симуляции