Этот пример помогает вам исследовать базовую автономность с помощью TurtleBot ®. Описанное поведение управляет роботом вперед и изменяет его направление, когда есть препятствие. Вы подпишетесь на тему лазерного скана и публикуете тему скорости, чтобы управлять TurtleBot.
Необходимые условия: Общайтесь с TurtleBot
Убедитесь, что TurtleBot работает либо в симуляции через Gazebo ®, либо на реальном оборудовании. Для получения информации о процедуре запуска см. раздел «Начало работы с Gazebo и моделируемым TurtleBot или Начало работы с реальным TurtleBot». Этот пример использует Gazebo-моделируемый Turtlebot.
В загруженной виртуальной машине щелкните ярлык Gazebo Office, чтобы запустить мир.
Инициализация 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 Lidar, чтобы создать лазерный скан, которое опубликовано на /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. Если вы используете оборудование, убедитесь, что вы запустили лидар и камеру правильно.
Запустите следующие строки кода, которые строят live-канал лазерного скана в течение десяти секунд. Переместите объект перед TurtleBot и приблизите его достаточно близко, пока он больше не показы в окне plot. Лазерный скан имеет ограниченную область значений из-за аппаратных ограничений. 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 с помощью телеоперации