Этот пример исследует управление MATLAB® Средства моделирования Gazebo®.
При использовании средств моделирования робота важно протестировать автономные алгоритмы и динамически изменить среду в мире, в то время как симуляция запускается. В этом примере показано, как создать основную автономию робота с Gazebo и как взаимодействовать с ним. В этом примере робот является платформой TurtleBot®. Для определенных примеров, вовлекающих TurtleBot, смотрите Передавание с примером TurtleBot.
В этом примере вы используете a timer
управлять автономными аспектами перемещения TurtleBot. Таймеры позволяют процессам запускаться в фоновом режиме в регулярных интервалах выполнения, не блокируя командную строку MATLAB®. В то время как можно использовать циклы и другие методы, чтобы исследовать основную автономию, запланированное выполнение и не блокирующаяся природа таймеров делают их лучшим выбором для достижения автономного поведения.
Предпосылки: Начало работы с Gazebo и симулированным TurtleBot, добавьте, создайте, и удалите объекты в Gazebo, прикладывайте силы и крутящие моменты в Gazebo
На вашей машине Linux® запустите Gazebo. Если вы используете виртуальную машину от Начало работы с Gazebo и Симулированным TurtleBot, используйте Пустой Gazebo.
Инициализируйте ROS, заменив демонстрационный IP-адрес (192.168.233.131
) с IP-адресом виртуальной машины. Создайте экземпляр ExampleHelperGazeboCommunicator
класс.
ipaddress = '192.168.233.131';
rosinit(ipaddress)
Initializing global node /matlab_global_node_03241 with NodeURI http://192.168.233.1:65289/
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 в 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
{'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_03241 with NodeURI http://192.168.233.1:65289/
По окончании закройте окно Gazebo на своей виртуальной машине.