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

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

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

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

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

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

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

Чтобы установить пакет поддержки, откройтесь, Дополнения> Получают Пакеты Аппаратной поддержки на вкладке Home MATLAB® и выбирают "TurtleBot-Based Robots". Также используйте roboticsAddons команду.

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

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

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

ipaddress = '192.168.203.129'
ipaddress = 
'192.168.203.129'
rosinit(ipaddress)
Initializing global node /matlab_global_node_60181 with NodeURI http://192.168.203.1:50771/

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

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

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

Убедитесь, что вы запускаете камеру Kinect®, если вы работаете с действительным оборудованием TurtleBot. Та команда: 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_60181 with NodeURI http://192.168.203.1:50771/

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

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

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

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

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

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

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