Этот пример помогает вам исследовать основную автономию с TurtleBot®. Описанное поведение управляет роботом вперед и изменяет его направление, когда существует препятствие. Вы подпишетесь на лазерную тему скана и опубликуете скоростную тему, чтобы управлять TurtleBot.
Необходимые условия: свяжитесь с TurtleBot
Убедитесь, что у вас есть TurtleBot, запускающийся или в симуляции через Gazebo® или на действительном оборудовании. Обратитесь к Начало работы с Gazebo и Симулированным TurtleBot или Начало работы с Действительным TurtleBot для процедуры запуска. Этот пример использует симулированный Gazebo Turtlebot.
В загруженной виртуальной машине кликните по ярлыку Дома Gazebo, чтобы запустить мир.
Инициализируйте ROS. Соединитесь с TurtleBot, заменив ipaddress
с IP-адресом TurtleBot.
ipaddress = "http://192.168.178.133:11311";
rosinit(ipaddress)
Initializing global node /matlab_global_node_05319 with NodeURI http://192.168.178.1:51558/
Создайте издателя для скорости робота и создайте сообщение для той темы. Передайте сообщения формата структуры использования для улучшенной производительности.
robot = rospublisher("/cmd_vel","DataFormat","struct"); 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","DataFormat","struct");
Ожидайте одного лазерного сообщения скана, чтобы прибыть и затем отобразить его.
scan = receive(laser,3)
scan = struct with fields:
MessageType: 'sensor_msgs/LaserScan'
Header: [1×1 struct]
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]
figure rosPlot(scan);
Если вы видите ошибку, возможно, что лазерная тема скана не получает данных. Если вы запускаетесь в симуляции, попытайтесь перезапустить Gazebo. Если вы используете оборудование, убедитесь, что вы запустили лидар и камеру правильно.
Запустите следующие строки кода, которые строят живой лазерный канал скана в течение десяти секунд. Переместите объект перед TurtleBot и принесите его достаточно близко, пока он больше не обнаружится в окне графика. Лазерный скан имеет ограниченный диапазон из-за аппаратных ограничений. Лидар LDS-01 имеет минимальную область значений обнаружения 0,12 метров и максимальную область значений 3,5 метров. Любые объекты вне этих пределов не будут обнаружены датчиком.
tic; while toc < 10 scan = receive(laser,3); rosPlot(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); rosPlot(scan); data = rosReadCartesian(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_05319 with NodeURI http://192.168.178.1:51558/
Лазерный скан имеет минимальную область значений, в которой он больше не видит объекты по-своему. Тот минимум - где-нибудь приблизительно 0,12 метра от лидара.
Лазерный скан не может обнаружить стеклянные стены. Следующее является изображением от камеры:
Вот соответствующий лазерный скан:
Корзина отображается, но вы не видите стеклянную стену. Когда вы используете TurtleBot в областях с окнами или стенами, которые TurtleBot не может смочь обнаружить, знать об ограничениях лазерного скана.
Обратитесь к следующему примеру: Управляйте TurtleBot с Дистанционным управлением