Прикладывайте силы и крутящие моменты в Gazebo

Этот пример иллюстрирует набор способов прикладывать силы и крутящие моменты к моделям в средстве моделирования Gazebo®. Во-первых, приложение крутящих моментов исследовано в трех отличных способах использовать двери в рисунке. Во-вторых, две модели TurtleBot® Create демонстрируют принуждение составных моделей. Наконец, свойства объектов (возврат, в этом случае) исследованы с помощью основных шаров.

Предпосылки: Начало работы с Gazebo и симулированным TurtleBot, добавьте, создайте и удалите объекты в Gazebo

Соединитесь с 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 Создают. Это иллюстрирует простое управление более сложного объекта.

Создайте другой 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 на своей виртуальной машине

Следующие шаги