exponenta event banner

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

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

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

Подключиться к беседке

На компьютере Linux ® запустите беседку. Если вы используете виртуальную машину из меню Начало работы с беседкой и моделируемый TurtleBot, нажмите Беседка Пустой мир на рабочем столе.

Инициализация 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]);

Все единицы в Беседке указаны с помощью соглашения СИ. С добавленными дверями мир выглядит так:

Примечание.Когда симулятор «Беседки» остается в нерабочем состоянии, подвижные предметы часто дрейфуют. При медленном движении дверей без команды такое поведение является нормальным. Это происходит потому, что в реальном мире часто больше трений, чем в идеальной установке тренажера «Беседка».

Извлеките ручки для звеньев и соединений первой двери и отобразите их.

 [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 «навесная _ дверь:: дверь». Использовать в 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. Приложите внешний крутящий момент к правому колесу.

Примечание.Для создания требуется подключение к Интернету.

 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 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 имеет значение «turtlebot:: create:: 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:: create:: base». Использовать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. Завершите работу глобального узла и отключитесь от «Беседки».

rosshutdown
Shutting down global node /matlab_global_node_68978 with NodeURI http://192.168.233.1:53907/

По завершении закройте окно «Беседка» на виртуальной машине

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