Этот пример помогает вам исследовать основную автономию с 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 с Дистанционным управлением