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

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

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

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

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

Подключение к Gazebo

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

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

rosinit("http://192.168.178.132:11311")
Initializing global node /matlab_global_node_19208 with NodeURI http://192.168.178.1:53310/
gazebo = ExampleHelperGazeboCommunicator;

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

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

Все модули в Gazebo указаны с использованием конвенции СИ.

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

 turtleBot = ExampleHelperGazeboSpawnedModel("turtlebot3_burger",gazebo);
 setState(turtleBot,"orientation",[0 0 pi/2]);

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

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

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

 global robot
 global velmsg

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

 robot = rospublisher("/cmd_vel");
 velmsg = rosmessage(robot);

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

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

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

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

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

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

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)
delete(t)

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

list = getSpawnedModels(gazebo)
list = 4×1 cell
    {'ground_plane'     }
    {'turtlebot3_burger'}
    {'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_19208 with NodeURI http://192.168.178.1:53310/

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