В этом примере вы исследуете автономное поведение, которое включает камеру Kinect®. Этот алгоритм включает TurtleBot®, ища синий шар и затем оставаясь в фиксированном расстоянии от шара. Вы включаете функции безопасности, такие как обнаружение утеса и удар.
Выполнение этого примера требует Image Processing Toolbox™.
Предпосылки: свяжитесь с TurtleBot, исследуйте основное поведение TurtleBot, управляйте TurtleBot с дистанционным управлением, объездом препятствий с TurtleBot
Этот пример дает обзор работы с TurtleBot с помощью его нативного интерфейса ROS. Пакет Поддержки Robotics System Toolbox™ для Находящихся в TurtleBot Роботов обеспечивает более оптимизированный интерфейс к 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';
rosinit(ipaddress)
Initializing global node /matlab_global_node_46760 with NodeURI http://192.168.203.1:53697/
Убедитесь, что вы запустили камеру Kinect, если вы работаете с действительным оборудованием TurtleBot. Команда, чтобы запустить камеру:
roslaunch turtlebot_bringup 3dsensor.launch.
Необходимо ввести это в терминал на TurtleBot.
Создайте подписчиков для цветной камеры, датчика утеса и датчика бампера. Создайте издателей для испускания звука и для управления скоростью робота. сообщения
handles.colorImgSub = exampleHelperTurtleBotEnableColorCamera;
Successfully Enabled Camera (raw image)
handles.cliffSub = rossubscriber('/mobile_base/events/cliff', 'BufferSize', 5); handles.bumpSub = rossubscriber('/mobile_base/sensors/bumper_pointcloud', 'BufferSize', 5); handles.soundPub = rospublisher('/mobile_base/commands/sound', 'kobuki_msgs/Sound'); handles.velPub = rospublisher('/mobile_base/commands/velocity');
Установите параметры для фильтрации изображений. Добавьте их в структуру данных, которая будет использоваться в алгоритме.
blueBallParams.blueMax = 120; % Maximum permissible deviation from pure blue blueBallParams.darkMin = 30; % Minimum acceptable darkness value
Попытайтесь визуализировать шар, чтобы убедиться, что нахождение параметров шара может определить местоположение его. Запустите функцию exampleHelperTurtleBotFindBlueBall
, чтобы видеть, найден ли круг. Если так, c
и m
являются присвоенными значениями. ball
является двухуровневым изображением, созданным путем применения фильтров синевы и темноты на изображение. Просмотрите ball
, чтобы видеть, был ли синий шар правильно изолирован:
latestImg = readImage(handles.colorImgSub.LatestMessage); [c,~,ball] = exampleHelperTurtleBotFindBlueBall(latestImg,blueBallParams);
Используйте этого помощника в качестве примера, чтобы отобразить действительное и двухуровневое изображение в фигуре и построить красный плюс в центре шара.
exampleHelperTurtleBotPlotObject(latestImg,ball,c);
Если шар не найден, попытайтесь увеличить или уменьшить blueBallParams.blueMax
и blueBallParams.darkMin
. Просмотрите график снова, пока шар не будет найден. Этот метод является хорошим способом точно настроить находящий шар алгоритм перед использованием контроллера.
В Gazebo используемые параметры не могут найти шар, потому что пороговые значения слишком щедры. Изображение Gazebo (оставленный фигуры) включает части стены и других объектов в пробеле. Действительное изображение (правильные фигуры) выглядит очень влажным с белым. Попытайтесь изменить параметры так, чтобы они были более строгими:
blueBallParams.blueMax = 10; % Maximum permissible deviation from pure blue blueBallParams.darkMin = 220; % Minimum acceptable darkness value latestImg = readImage(handles.colorImgSub.LatestMessage); [c,~,ball] = exampleHelperTurtleBotFindBlueBall(latestImg,blueBallParams);
Используйте этого помощника в качестве примера, чтобы отобразить фигуры.
exampleHelperTurtleBotPlotObject(latestImg,ball,c);
Теперь параметры слишком строги. Часть шара даже не обнаруживается в изображении Gazebo, и вы ничего не видите в действительном изображении. Если вы настраиваете параметры далее, можно найти второй план. В Gazebo следующие параметры должны работать хорошо. С оборудованием окружающая подсветка может потребовать, чтобы вы провели больше времени, точно настраивая параметры.
blueBallParams.blueMax = 30; % Maximum permissible deviation from pure blue blueBallParams.darkMin = 90; % Minimum acceptable darkness value latestImg = readImage(handles.colorImgSub.LatestMessage); [c,~,ball] = exampleHelperTurtleBotFindBlueBall(latestImg,blueBallParams);
Используйте этого помощника в качестве примера, чтобы отобразить фигуры.
exampleHelperTurtleBotPlotObject(latestImg,ball,c);
Настройка цветовых порогов сложна когда по сравнению с настройкой их в моделируемой среде как Gazebo.
После того, как вы подстроили параметры, добавьте их в объект handles
, который будет использоваться алгоритмом отслеживания шара.
handles.params = blueBallParams;
Установите усиления контроллера для TurtleBot. TurtleBot использует ПИД-регулятор, чтобы остаться в постоянном расстоянии от шара.
Первый набор усилений контроллера хорош для TurtleBot в Gazebo. Второй набор хорош для TurtleBot в действительном оборудовании. Настройте усиления, как вы считаете целесообразным.
Вот компактный способ присвоить значения struct.
Эффективные усиления для симуляции Gazebo:
gains.lin = struct('pgain',1/100,'dgain',1/100,'igain',0,'maxwindup',0','setpoint',0.65); gains.ang = struct('pgain',1/400,'dgain',1/500,'igain',0,'maxwindup',0','setpoint',0.5);
Эффективные усиления для оборудования TurtleBot:
gains.lin = struct('pgain',1/100,'dgain',1/1000,'igain',0,'maxwindup',0','setpoint',0.75); gains.ang = struct('pgain',1/100,'dgain',1/3000,'igain',0,'maxwindup',0','setpoint',0.5);
Убедитесь, что добавили struct gains
в переменную handles
.
handles.gains = gains;
Задайте таймер, чтобы выполнить поведение отслеживания шара через коллбэк. Задайте функцию остановки, чтобы закрыть ROS. Включайте указатели в функцию обратного вызова для таймера:
timer2 = timer('TimerFcn',{@exampleHelperTurtleBotTrackingTimer,handles},'Period',0.1,'ExecutionMode','fixedSpacing'); timer2.StopFcn = {@exampleHelperTurtleBotStopCallback};
Запустите таймер с помощью следующей команды. Вы видите, что TurtleBot начинает перемещаться во всем мире, ища шар. Когда это найдет его в изображении Kinect, робот будет использовать контроллер, чтобы остаться в фиксированном расстоянии.
start(timer2); pause(1);
Датчик удара не активируется в симуляции, таким образом, TurtleBot не может восстановиться, когда это врезается в стену.
Если вы хотите переместить синий шар вокруг, используйте следующие команды, чтобы прикладывать силу:
g = ExampleHelperGazeboCommunicator(); ballhandle = ExampleHelperGazeboSpawnedModel('unit_sphere_1',g) duration = 2; forceVector = [0 4 0]; applyForce(ballhandle,'link',duration,forceVector)
Если вы хотите далее исследовать управление Gazebo симуляции, относятся к Read Model and Simulation Properties из Gazebo и Добавляют, Сборка, и Удаляют Объекты в Gazebo.
Чтобы остановить таймер и автономное поведение, используйте следующую команду:
stop(timer2);
Если таймер очищен от рабочей области, прежде чем это будет остановлено, необходимо удалить его иначе. Чтобы остановить все таймеры (даже таймеры в фоновом режиме) выполняют следующую команду:
delete(timerfindall)
Очистите рабочую область издателей, подписчиков и других связанных с ROS объектов, когда вы будете закончены с ними
clear
ПРИМЕЧАНИЕ: Код в этом разделе не для выполнения командной строки MATLAB
В этом примере организация вспомогательных файлов позволяет вам большую гибкость в настройке и перенамерении кода. Можно изменить нахождение параметров шара и усиления контроллера путем изменения значений в struct handles
. Этот пример включает timer
, который управляет всеми аспектами алгоритма управления. Этот таймер является exampleHelperTurtleBotTrackingTimer
. Этот таймер имеет Пары "имя-значение" Period
и ExecutionMode
, которые собираются определить, как часто коллбэк таймера называется. Кроме того, коллбэк остановки используется. Можно включить дополнительные функции обратного вызова, если вы хотите.
Указатели, переданные в таймер, включают params
для нахождения шара и gains
для контроллера.
Структура exampleHelperTurtleBotTrackingTimer
проста. Это - основной конечный автомат с некоторыми шагами инициализации. Функция инициализации определяет, который отслеживание алгоритма и который утверждает диспетчер использовать если не в утесе или восстановлении бампера. Функция:
function [objectTrack, imgControl] = initControl() % INITCONTROL - Initialization function to determine which control % and object detection algorithms to use objectTrack = @exampleHelperTurtleBotFindBlueBall; imgControl = @exampleHelperTurtleBotPointController;
В этом примере функцией отслеживания является exampleHelperTurtleBotFindBlueBall
, и контроллером является exampleHelperTurtleBotPointController
, можно заменить эту функцию и контроллер с любыми пользовательскими функциями, которые имеют ту же структуру аргумента ввода и вывода. Входные параметры для exampleHelperTurtleBotFindBlueBall
являются цветным изображением и struct нахождения параметров шара. Выходными аргументами является центр, значение и двухуровневое изображение разыскиваемого объекта. Входные параметры для exampleHelperTurtleBotPointController
являются центром объекта, значение (хотя значение не используется в примере), размер изображения и усиления контроллера (struct). Выходными аргументами являются линейные и угловые скорости.
Основной конечный автомат, используемый в exampleHelperTurtleBotTrackingTimer
:
switch state case ExampleHelperTurtleBotStates.Seek % Object-finding state [center, scale] = findObject(handles.Tbot.ImColor,handles.params); % Wander if no circle is found, target the circle if it exists if isempty(center) [linearV, angularV] = exampleHelperTurtleBotWanderController(); else [linearV, angularV] = imageControl(center, scale, size(handles.Tbot.ImColor),handles.gains); setSound(handles.Tbot,2); end state = ExampleHelperTurtleBotStates.Seek; case ExampleHelperTurtleBotStates.Bumper % Bumper contact state case ExampleHelperTurtleBotStates.Spin % Spin state case ExampleHelperTurtleBotStates.Cliff % Cliff avoidance end
Можно добавить или удалить случаи из конечного автомата. Если вы хотите поменять имена состояния, используйте класс ExampleHelperTurtleBotStates
.
Находящий шар алгоритм является модульным и изменяемым. Это использует два фильтра изображений (один на темноте и один на синеве) замаскированный вместе, чтобы изолировать синий шар. Можно изменить маски, чтобы найти красный или зеленый шар вместо этого. Если вы хотите исследовать другие формы отслеживания формы, основной рабочий процесс остается то же самое.
Синий канал изолируется (с некоторыми масштабными коэффициентами), и порог применяется, чтобы произвести маску двухуровневого изображения.
blueImg = img(:,:,1)/2 + img(:,:,2)/2 - img(:,:,3)/2; blueThresh = blueImg < params.blueMax;
Эти команды изолируют инверсию синего (с различным масштабированием) и подчеркивают темноту. Порог применяется.
darkIso = -img(:,:,1)/2 - img(:,:,2)/2 + 3*img(:,:,3) - 2*rgb2gray(img); darkThresh = darkIso > params.darkMin;
Замаскируйте эти два двухуровневых изображения вместе, чтобы изолировать темно-синий шар.
ball1 = blueThresh & darkThresh;
Константы и масштабные коэффициенты на изображении определяются пользователями изолировать определенный цвет. Можно экспериментировать с различными комбинациями.
Можно также найти непрерывные области в отфильтрованном изображении с помощью regionprops
, который является частью Image Processing Toolbox.
s = regionprops(ball1, {'Centroid','Area','EquivDiameter'});
Существуют дополнительные шаги, чтобы найти шар из этой области, которую можно найти в exampleHelperTurtleBotFindBlueBall
.
Функция exampleHelperTurtleBotPointController
использует класс ExampleHelperPIDControl
, чтобы сохранить заданную точку (в этом случае местоположение центра шара) в точном местоположении в изображении.
Модульный принцип и гибкость примера кода позволяют вам экспериментировать со своими собственными алгоритмами и функциями.