Исследуйте базовое поведение TurtleBot

Этот пример помогает вам исследовать базовую автономность с помощью TurtleBot ®. Описанное поведение управляет роботом вперед и изменяет его направление, когда есть препятствие. Вы подпишетесь на тему лазерного скана и публикуете тему скорости, чтобы управлять TurtleBot.

Необходимые условия: Общайтесь с TurtleBot

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

Убедитесь, что TurtleBot работает либо в симуляции через Gazebo ®, либо на реальном оборудовании. Для получения информации о процедуре запуска см. раздел «Начало работы с Gazebo и моделируемым TurtleBot или Начало работы с реальным TurtleBot». Этот пример использует Gazebo-моделируемый Turtlebot.

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

Инициализация ROS. Подключиться к TurtleBot путем замены ipaddress с IP-адресом TurtleBot.

ipaddress = 'http://192.168.203.132:11311'
ipaddress = 
'http://192.168.203.132:11311'
rosinit(ipaddress)
Initializing global node /matlab_global_node_48605 with NodeURI http://192.168.203.1:60009/

Создайте издателя для скорости робота и создайте сообщение для этой темы.

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

Получение скана

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

 roslaunch turtlebot3_bringup turtlebot3_core.launch
 roslaunch turtlebot3_bringup turtlebot3_lidar.launch
 roslaunch turtlebot3_bringup turtlebot3_rpicamera.launch

Необходимо выполнить команду в терминале на TurtleBot. TurtleBot использует LDS-01 Lidar, чтобы создать лазерный скан, которое опубликовано на /scan тема. Для оставшейся части этого примера термин лазерный скан относится к данным, опубликованным по этой теме.

Подписаться на тему /scan.

laser = rossubscriber('/scan');

Дождитесь прибытия одного сообщения лазерного скана и отобразите его.

scan = receive(laser,3)
scan = 
  ROS LaserScan message with properties:

       MessageType: 'sensor_msgs/LaserScan'
            Header: [1×1 Header]
          AngleMin: 0
          AngleMax: 6.2832
    AngleIncrement: 0.0175
     TimeIncrement: 0
          ScanTime: 0
          RangeMin: 0.1200
          RangeMax: 3.5000
            Ranges: [360×1 single]
       Intensities: [360×1 single]

  Use showdetails to show the contents of the message

figure
plot(scan);

Если вы видите ошибку, возможно, что тема лазерного скана не получает никаких данных. Если вы работаете в симуляции, попробуйте перезапустить Gazebo. Если вы используете оборудование, убедитесь, что вы запустили лидар и камеру правильно.

Запустите следующие строки кода, которые строят live-канал лазерного скана в течение десяти секунд. Переместите объект перед TurtleBot и приблизите его достаточно близко, пока он больше не показы в окне plot. Лазерный скан имеет ограниченную область значений из-за аппаратных ограничений. LDS-01 лидар имеет минимальную область измерения 0,12 метра и максимальную область значений 3,5 метра. Любые объекты, выходящие за эти пределы, не будут обнаружены датчиком.

tic;
while toc < 10
  scan = receive(laser,3);
  plot(scan);
end

Простое предотвращение препятствий

На основе показаний расстояния от лазерного скана можно реализовать простой алгоритм предотвращения препятствий. Можно использовать простое while цикл для реализации этого поведения.

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

spinVelocity = 0.6;       % Angular velocity (rad/s)
forwardVelocity = 0.1;    % Linear velocity (m/s)
backwardVelocity = -0.02; % Linear velocity (reverse) (m/s)
distanceThreshold = 0.6;  % Distance threshold (m) for turning

Запустите цикл, чтобы переместить робота вперед и вычислить ближайшие препятствия для робота. Когда препятствие находится в пределах distanceThresholdробот поворачивается. Этот цикл останавливается после 20 секунд выполнения. CTRL + C (или Control + C на Mac) также останавливает этот цикл.

  tic;
  while toc < 20
      % Collect information from laser scan
      scan = receive(laser);
      plot(scan);
      data = readCartesian(scan);
      x = data(:,1);
      y = data(:,2);
      % Compute distance of the closest obstacle
      dist = sqrt(x.^2 + y.^2);
      minDist = min(dist);     
      % Command robot action
      if minDist < distanceThreshold
          % If close to obstacle, back up slightly and spin
          velmsg.Angular.Z = spinVelocity;
          velmsg.Linear.X = backwardVelocity;
      else
          % Continue on forward path
          velmsg.Linear.X = forwardVelocity;
          velmsg.Angular.Z = 0;
      end   
      send(robot,velmsg);
  end

Отсоединитесь от робота

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

clear

Использование rosshutdown после завершения работы с сетью ROS. Завершите работу глобального узла и отсоединитесь от TurtleBot.

rosshutdown
Shutting down global node /matlab_global_node_48605 with NodeURI http://192.168.203.1:60009/

Дополнительная информация

Лазерный скан имеет минимальную область значений, в котором оно больше не видит объекты на своем пути. Этот минимум находится где-то в 0,12 метрах от лидара.

Лазерный скан не может обнаружить стеклянные стенки. Ниже приведено изображение с камеры:

Вот соответствующий лазерный скан:

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

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

См. следующий пример: Управление TurtleBot с помощью телеоперации