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