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

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

Необходимые условия: свяжитесь с TurtleBot

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

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

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

Инициализируйте 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, чтобы создать лазерный скан, который публикуется на /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. Если вы используете оборудование, убедитесь, что вы запустили лидар и камеру правильно.

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