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

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

Предпосылки: Запуск с Gazebo и моделируемым TurtleBot, моделью чтения и свойствами симуляции из Gazebo, добавляет, создает и удаляет объекты в 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 Создают. Это иллюстрирует простое управление более сложного объекта.

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

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