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

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

Предпосылки: свяжитесь с TurtleBot

Пакет аппаратной поддержки для TurtleBot

Этот пример дает обзор работы с TurtleBot с помощью его нативного интерфейса ROS. Пакет Поддержки ROS Toolbox™ для основанных на TurtleBot Роботов обеспечивает более оптимизированный интерфейс к TurtleBot. Это позволяет вам:

  • Получите данные о датчике и отправьте команды управления, явным образом не вызывая команды ROS

  • Свяжитесь прозрачно с симулированным роботом в Gazebo или с физическим TurtleBot

Чтобы установить пакет поддержки, откройтесь, Дополнения> Получают Пакеты Аппаратной поддержки на вкладке Home MATLAB® и выбирают основанных на ROS Toolbox Support Package for TurtleBot Роботов. В качестве альтернативы используйте rosAddons команда.

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

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

Инициализируйте ROS. Соединитесь с TurtleBot, заменив ipaddress с IP-адресом TurtleBot.

ipaddress = 'http://192.168.233.133:11311'
ipaddress = 
'http://192.168.233.133:11311'
rosinit(ipaddress)
Initializing global node /matlab_global_node_09953 with NodeURI http://192.168.233.1:61154/

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

robot = rospublisher('/mobile_base/commands/velocity');
velmsg = rosmessage(robot);

Получите данные сканирования

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

 roslaunch turtlebot_bringup 3dsensor.launch

Необходимо выполнить команду в терминале на TurtleBot. TurtleBot использует данные Kinect, чтобы симулировать лазерное сканирование, которое публикуется на /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.5216
          AngleMax: 0.5243
    AngleIncrement: 0.0016
     TimeIncrement: 0
          ScanTime: 0.0330
          RangeMin: 0.4500
          RangeMax: 10
            Ranges: [640×1 single]
       Intensities: [0×1 single]

  Use showdetails to show the contents of the message

figure
plot(scan);

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

Запустите следующие строки кода, которые строят живой лазерный канал сканирования в течение десяти секунд. Переместите объект перед TurtleBot и принесите его достаточно близко, пока он больше не обнаружится в окне графика. Лазерное сканирование имеет ограниченный диапазон из-за аппаратных ограничений камеры Kinect. Kinect имеет минимальную область значений обнаружения 0,8 метров и максимальную область значений 4 метров. Любые объекты вне этих пределов не будут обнаружены датчиком.

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_09953 with NodeURI http://192.168.233.1:61154/

Больше информации

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

Лазерное сканирование не может обнаружить стеклянные стенки. Следующее является изображением от камеры Kinect:

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

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

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

Обратитесь к следующему примеру: Управляйте TurtleBot с Дистанционным управлением