В этом примере вы исследуете автономное поведение, которое включает камеру Kinect®. Этот алгоритм включает TurtleBot®, ища синий шар и затем оставаясь в фиксированном расстоянии от шара. Вы включаете функции безопасности, такие как обнаружение утеса и удар.
Выполнение этого примера требует Image Processing Toolbox™.
Предпосылки: свяжитесь с TurtleBot, исследуйте основное поведение TurtleBot, управляйте TurtleBot с дистанционным управлением, предотвращением препятствия с TurtleBot и VFH
Этот пример дает обзор работы с TurtleBot с помощью его нативного интерфейса ROS. Пакет Поддержки ROS Toolbox™ для основанных на TurtleBot Роботов обеспечивает более оптимизированный интерфейс к TurtleBot. Это позволяет вам:
Получите данные о датчике и отправьте команды управления, явным образом не вызывая команды ROS
Свяжитесь прозрачно с симулированным роботом в Gazebo или с физическим TurtleBot
Чтобы установить пакет поддержки, откройтесь, Дополнения> Получают Пакеты Аппаратной поддержки на вкладке Home MATLAB® и выбирают основанных на ROS Toolbox™ Support Package for TurtleBot Роботов. В качестве альтернативы используйте roboticsAddons
команда.
Убедитесь, что у вас есть TurtleBot, запускающийся или в симуляции через Gazebo® или на действительном оборудовании. Обратитесь к Запуску с Gazebo и Симулированным TurtleBot или Запуску с Действительным TurtleBot для процедуры запуска. Если вы используете оборудование, найдите, что синий шар использует в отслеживании. Если вы используете Gazebo®, синий шар должен быть в мире перед роботом (убедитесь, что вы используете Gazebo TurtleBot World
).
Инициализируйте ROS. Соединитесь с TurtleBot, заменив ipaddress
с IP-адресом TurtleBot
ipaddress = '192.168.233.133';
rosinit(ipaddress)
Initializing global node /matlab_global_node_86337 with NodeURI http://192.168.233.1:59313/
Убедитесь, что вы запустили камеру 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);
Убедитесь, что добавили gains
struct к 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 симуляции, относятся, чтобы Добавить, Создать, и Удалить Объекты в Gazebo.
Чтобы остановить таймер и автономное поведение, используйте следующую команду:
stop(timer2);
Если таймер очищен от рабочей области, прежде чем это будет остановлено, необходимо удалить его иначе. Чтобы остановить все таймеры (даже таймеры в фоновом режиме) выполняют следующую команду:
delete(timerfindall)
Очистите рабочую область издателей, подписчиков и других связанных с ROS объектов, когда вы будете закончены с ними
clear
ПРИМЕЧАНИЕ: Код в этом разделе не для выполнения командной строки MATLAB
В этом примере организация вспомогательных файлов позволяет вам большую гибкость в настройке и перенамерении кода. Можно изменить нахождение параметров шара и усиления контроллера путем изменения значений в handles
struct (). Этот пример включает a 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
класс, чтобы сохранить заданную точку (в этом случае местоположение центра шара) в точном местоположении в изображении.
Модульный принцип и гибкость примера кода позволяют вам экспериментировать со своими собственными алгоритмами и функциями.