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

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

Необходимые условия: Запуск с Gazebo и моделируемым TurtleBot, добавление, сборка и удаление объектов в Gazebo

Подключение к 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 для манипуляции

Этот раздел демонстрирует создание и внешнюю манипуляцию 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 на виртуальной машине

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