Протестируйте автономию робота в симуляции

Этот пример исследует управление MATLAB® Средства моделирования Gazebo®.

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

В этом примере вы используете timer, чтобы управлять автономными аспектами перемещения TurtleBot. Таймеры позволяют процессам запускаться в фоновом режиме в регулярных интервалах выполнения, не блокируя командную строку MATLAB®. В то время как можно использовать циклы и другие методы, чтобы исследовать основную автономию, запланированное выполнение и не блокирующаяся природа таймеров делают их лучшим выбором для достижения автономного поведения.

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

Соединитесь с Gazebo

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

Инициализируйте ROS, заменив демонстрационный IP-адрес (192.168.1.1) с IP-адресом виртуальной машины. Создайте экземпляр класса ExampleHelperGazeboCommunicator.

ipaddress = '192.168.203.129';
rosinit(ipaddress)
Initializing global node /matlab_global_node_57640 with NodeURI http://192.168.203.1:64500/
gazebo = ExampleHelperGazeboCommunicator;

Создайте стену в мире.

 wall = ExampleHelperGazeboModel('grey_wall','gazeboDB');
 spawnModel(gazebo,wall,[-2 4 0]);

Все модули в Gazebo заданы с помощью соглашения SI.

Создайте объект ExampleHelperGazeboSpawnedModel для мобильной основы и измените ее состояние ориентации. Вручную вращайте TurtleBot 90 градусами (радианы пи/2) так, чтобы он непосредственно стоял перед стеной.

 kobuki = ExampleHelperGazeboSpawnedModel('mobile_base',gazebo);
 setState(kobuki,'orientation',[0 0 pi/2]);

Запустите предотвращение препятствия TurtleBot

В этом разделе описываются простой способ создать автономное поведение на TurtleBot в Gazebo. Используйте основное поведение предотвращения препятствия для TurtleBot. Поведение должно управлять вперед и поворот, когда робот добирается очень близко к препятствию, обнаруженному лазерным сканером.

Создайте глобальные переменные для сообщения издателя и издателя, таким образом, к ним может получить доступ алгоритм управления.

 global robot
 global velmsg

Создайте издателя для скорости и сообщения ROS, чтобы нести информацию.

 robot = rospublisher('/mobile_base/commands/velocity');
 velmsg = rosmessage(robot);

Подпишитесь на лазерную тему сканирования.

 timerHandles.sub = rossubscriber('/scan');

Создайте таймер, чтобы управлять основным циклом управления TurtleBot.

 t = timer('TimerFcn',{@exampleHelperGazeboAvoidanceTimer,timerHandles},'Period',0.1,'ExecutionMode','fixedSpacing');

В функции обратного вызова для таймера exampleHelperGazeboAvoidanceTimer задает лазерную функцию обратного вызова сканирования и выполняет основной алгоритм, чтобы позволить TurtleBot стараться не поражать объекты, когда это перемещается. Файл расположен в +gazebo директории.

Запустите таймер.

start(t);

Добавьте объекты

TurtleBot управляет к стене. Если это добирается очень близко к стене, это должно повернуть налево, чтобы не сталкиваться с ним.

Примечание: Если TurtleBot врезался в стену, лазерное сканирование, вероятно, не публикуется через Gazebo. Перезапустите свой сеанс Gazebo и попробуйте еще раз.

Можно все еще внести изменения в мир, в то время как TurtleBot перемещается. Добавьте новую стену в мир. Если вы добавляете его достаточно скоро, это может блокировать TurtleBot так, чтобы это постаралось не врезаться в стену.

 spawnModel(gazebo,wall,[-5.85 0.15 0],[0, 0, pi/2]);
 
 pause(20);     % TurtleBot avoids walls for 20 seconds

Удалите модели и закрытие

Остановите таймер, чтобы остановить алгоритм робота.

stop(t)

Найдите все объекты в мире и удалите тех добавленных вручную

list = getSpawnedModels(gazebo)
list = 4×1 cell array
    {'ground_plane'}
    {'mobile_base' }
    {'grey_wall'   }
    {'grey_wall_0' }

Удалите эти две стены, с помощью следующих команд:

removeModel(gazebo,'grey_wall');
removeModel(gazebo,'grey_wall_0');

Очистите рабочую область издателей, подписчиков и других СВЯЗАННЫХ С ROS объектов, когда вы будете закончены с ними

clear

Используйте rosshutdown, если вы сделаны, работая с сетью ROS. Закройте глобальный узел и отключитесь от Gazebo.

rosshutdown
Shutting down global node /matlab_global_node_57640 with NodeURI http://192.168.203.1:64500/

По окончании закройте окно Gazebo на своей виртуальной машине