Этот пример помогает вам исследовать основную автономию с TurtleBot®. Описанное поведение управляет роботом вперед и изменяет его направление, когда существует препятствие. Вы подпишетесь на лазерную тему сканирования и опубликуете скоростную тему, чтобы управлять TurtleBot.
Предпосылки: свяжитесь с TurtleBot
Этот пример дает обзор работы с TurtleBot с помощью его нативного интерфейса ROS. Пакет Поддержки Robotics System Toolbox™ для Роботов TurtleBot®-Based обеспечивает более оптимизированный интерфейс к TurtleBot. Это позволяет вам:
Получите данные о датчике и отправьте команды управления, явным образом не вызывая команды ROS
Свяжитесь прозрачно с моделируемым роботом в Gazebo или с физическим TurtleBot
Чтобы установить пакет поддержки, откройтесь, Дополнения> Получают Пакеты Аппаратной поддержки на вкладке Home MATLAB® и выбирают "TurtleBot-Based Robots". Также используйте roboticsAddons команду.
Убедитесь, что у вас есть 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 с Дистанционным управлением