exponenta event banner

Ознакомьтесь с основным поведением TurtleBot

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

Предпосылки: Общайтесь с TurtleBot

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

Убедитесь, что TurtleBot работает либо в симуляции через Gazebo ®, либо на реальном оборудовании. Процедуру запуска см. в разделе Начало работы с беседкой и моделируемым TurtleBot или Начало работы с реальным 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);

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

Выполните следующие строки кода, в которых в течение десяти секунд будет отображен прямой канал лазерного сканирования. Переместите объект перед TurtleBot и достаточно близко, пока он не появится в окне печати. Лазерное сканирование имеет ограниченный диапазон из-за аппаратных ограничений. У лидара 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 с помощью телеоперации