Этот пример поможет вам изучить базовую автономность с помощью TurtleBot ®. Описанное поведение приводит робота вперед и изменяет его направление при наличии препятствия. Вы подпишетесь на тему лазерного сканирования и опубликуете тему скорости для управления TurtleBot.
Предпосылки: Общайтесь с TurtleBot
Убедитесь, что TurtleBot работает либо в симуляции через Gazebo ®, либо на реальном оборудовании. Процедуру запуска см. в разделе Начало работы с беседкой и моделируемым TurtleBot или Начало работы с реальным 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);

При обнаружении ошибки возможно, что тема лазерного сканирования не получает никаких данных. Если вы работаете в симуляции, попробуйте перезапустить беседку. Если используется оборудование, убедитесь, что лидар и камера запущены правильно.
Выполните следующие строки кода, в которых в течение десяти секунд будет отображен прямой канал лазерного сканирования. Переместите объект перед TurtleBot и достаточно близко, пока он не появится в окне печати. Лазерное сканирование имеет ограниченный диапазон из-за аппаратных ограничений. У лидара 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 с помощью телеоперации