Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Seguimiento y seguimiento de un objeto

En este ejemplo, explorará el comportamiento autónomo que incorpora la cámara de Kinect®. Este algoritmo involucra al TurtleBot® en busca de una pelota azul y luego se queda a una distancia fija de la pelota. Incorpora características de seguridad, como la detección de protuberancias y acantilados.

Running this example requires the Image Processing Toolbox™.

Requisitos previos:Comuníquese con el TurtleBotExplore el comportamiento básico de la TurtleBotControle el TurtleBot con teleoperaciónEvasión de obstáculos con TurtleBot

Paquete de soporte de hardware para TurtleBot

Este ejemplo proporciona una visión general de trabajar con un TurtleBot utilizando su interfaz ROS nativa. El paquete de soporte de Robotics System Toolbox™ para robots basados en TurtleBot proporciona una interfaz más optimizada para TurtleBot. Le permite:

Adquiera datos de sensores y envíe comandos de control sin llamar explícitamente a los comandos ROS

Comunicarse de forma transparente con un robot simulado en gazebo o con un TurtleBot físico

Para instalar el paquete de soporte, ábralo en la pestaña MATLAB® y seleccione "robots basados en TurtleBot".Add-Ons > Get Hardware Support PackagesHome Alternativamente, utilice el comando.roboticsAddons

Conéctese a la TurtleBot

Asegúrese de que tiene un TurtleBot ejecutándose ya sea en la simulación a través de Gazebo® o en hardware real. Consulte o para el procedimiento de inicio.Empiece con gazebo y un TurtleBot simuladoEmpezar con un real TurtleBot Si está utilizando hardware, busque una bola azul para usar para el seguimiento. Si está utilizando gazebo®, la bola azul debe estar en el mundo delante del robot (Asegúrese de que está utilizando).Gazebo TurtleBot World

Inicializar ROS. Conéctese al TurtleBot reemplazando con la dirección IP del TurtleBotipaddress

ipaddress = '192.168.203.129'; rosinit(ipaddress)
Initializing global node /matlab_global_node_46760 with NodeURI http://192.168.203.1:53697/ 

Asegúrese de que ha iniciado la cámara Kinect si está trabajando con hardware TurtleBot real. El comando para iniciar la cámara es:

roslaunch turtlebot_bringup 3dsensor.launch.  

Usted debe ingresar esto en un terminal en el TurtleBot.

Crea suscriptores para la cámara a color, el sensor del acantilado y el sensor del parachoques. Cree editores para emitir sonido y para controlar la velocidad del robot. Mensajes

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');

Sintonice la detección de bolas azules

Establezca los parámetros para el filtrado de imágenes. Agréguelos a una estructura de datos que se usará en el algoritmo.

blueBallParams.blueMax = 120;  % Maximum permissible deviation from pure blue blueBallParams.darkMin = 30;   % Minimum acceptable darkness value

Trate de visualizar la pelota para asegurarse de que los parámetros de búsqueda de bolas pueden localizarlo. Ejecute la función para ver si se encuentra un círculo.exampleHelperTurtleBotFindBlueBall Si es así, y se asignan valores. es una imagen binaria creada mediante la aplicación de filtros de azul y oscuridad en la imagen.cmball Vista para ver si la pelota azul estaba bien aislada:ball

latestImg = readImage(handles.colorImgSub.LatestMessage); [c,~,ball] = exampleHelperTurtleBotFindBlueBall(latestImg,blueBallParams);

Utilice esta aplicación auxiliar de ejemplo para mostrar la imagen real y binaria en una figura y trazar un signo más en rojo en el centro de la pelota.

exampleHelperTurtleBotPlotObject(latestImg,ball,c); 

Si no se encuentra la pelota, intente aumentar o disminuir y.blueBallParams.blueMaxblueBallParams.darkMin Ver la trama de nuevo hasta que se encuentra la pelota. Este método es una buena manera de afinar el algoritmo de búsqueda de bolas antes de usar el controlador.

En gazebo, los parámetros utilizados podrían no encontrar la pelota, porque los valores de umbral son demasiado generosos. La imagen de Gazebo (figuras de la izquierda) incluye partes de la pared y otros objetos en el espacio en blanco. La imagen real (figuras correctas) se ve muy saturada de blanco. Intente cambiar los parámetros para que sean más restrictivos:

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);

Utilice esta aplicación auxiliar de ejemplo para mostrar las figuras.

exampleHelperTurtleBotPlotObject(latestImg,ball,c); 

Ahora los parámetros son demasiado restrictivos. Parte de la pelota ni siquiera se muestra en la imagen de Gazebo, y no ves nada en la imagen real. Si ajusta los parámetros aún más, puede encontrar un terreno intermedio. En gazebo, los siguientes parámetros deben funcionar bien. Con el hardware, la iluminación ambiental puede requerir que dedique más tiempo a afinar los parámetros.

  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);

Utilice esta aplicación auxiliar de ejemplo para mostrar las figuras.

exampleHelperTurtleBotPlotObject(latestImg,ball,c); 

Ajustar los umbrales de color es desafiante cuando se compara con ajustarlos en un entorno simulado como gazebo.

Después de ajustar los parámetros, agréguelos al objeto, que será utilizado por el algoritmo de rastreo de bolas.handles

  handles.params = blueBallParams;

Pruebe el controlador de distancia fija

Establezca las ganancias del controlador para el TurtleBot. El TurtleBot utiliza un controlador PID para permanecer a una distancia constante de la pelota.

El primer conjunto de ganancias del controlador es bueno para un TurtleBot en gazebo. El segundo conjunto es bueno para un TurtleBot en hardware real. Ajuste las ganancias como le resulte más adecuado.

Aquí hay una forma compacta de asignar los valores de struct.

Effective gains for Gazebo simulation:

  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);  

Effective gains for TurtleBot hardware:

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); 

Asegúrese de agregar la estructura a la variable.gainshandles

handles.gains = gains;

Defina un temporizador para ejecutar el comportamiento de rastreo de pelota a través de la devolución de llamada. Defina la función de parada para apagar ROS. Incluya los identificadores en la función de devolución de llamada para el temporizador:

timer2 = timer('TimerFcn',{@exampleHelperTurtleBotTrackingTimer,handles},'Period',0.1,'ExecutionMode','fixedSpacing'); timer2.StopFcn = {@exampleHelperTurtleBotStopCallback};

Inicie el temporizador con el siguiente comando. Usted ve el TurtleBot comienzan a moverse por todo el mundo, en busca de la pelota. Cuando lo encuentre en la imagen de Kinect, el robot utilizará el controlador para permanecer a una distancia fija.

start(timer2); pause(1);

El sensor de relieve no se activa en la simulación, por lo que el TurtleBot podría no recuperarse cuando golpea una pared.

Si desea mover la pelota azul alrededor, utilice los siguientes comandos para aplicar una fuerza:

g = ExampleHelperGazeboCommunicator();     ballhandle = ExampleHelperGazeboSpawnedModel('unit_sphere_1',g)     duration = 2;     forceVector = [0 4 0];     applyForce(ballhandle,'link',duration,forceVector) 

Si desea explorar aún más el control de Gazebo de la simulación, consulte y.Leer propiedades de modelo y simulación de GazeboAgregar, compilar y quitar objetos en gazebo

Stop robot Motion

Para detener el temporizador y el comportamiento autónomo, utilice el siguiente comando:

stop(timer2);

Si el temporizador se borra del espacio de trabajo antes de que se detenga, debe eliminarlo de otra forma. Para detener todos los temporizadores (incluso temporizadores en segundo plano), ejecute el siguiente comando:

delete(timerfindall)

Borre el espacio de trabajo de los editores, suscriptores y otros objetos relacionados con ROS cuando haya terminado con ellos

clear

Más información

NOTE: Code in this section is not for MATLAB command line execution

En este ejemplo, la organización de archivos auxiliares le permite una gran flexibilidad en la personalización y replanificación del código. Puede alterar los parámetros de búsqueda de pelota y las ganancias del controlador cambiando los valores en la estructura.handles Este ejemplo incorpora un que gestiona todos los aspectos del algoritmo de control.timer Este temporizador es el.exampleHelperTurtleBotTrackingTimer Este temporizador tiene pares nombre-valor de y que se establecen para determinar la frecuencia con la que se llama a la devolución de llamada del temporizador.PeriodExecutionMode Además, se utiliza la devolución de llamada de parada. Puede incorporar funciones de devolución de llamada adicionales si lo desea.

Los tiradores pasados al temporizador incluyen para la búsqueda de bolas y para el controlador.paramsgains

La estructura de es simple.exampleHelperTurtleBotTrackingTimer Es una máquina de estado básica con algunos pasos de inicialización. La función de inicialización determina qué algoritmo de seguimiento y qué controlador utilizar cuando no está en un acantilado o estado de recuperación de parachoques. La función es:

function [objectTrack, imgControl] = initControl()    % INITCONTROL - Initialization function to determine which control    % and object detection algorithms to use    objectTrack = @exampleHelperTurtleBotFindBlueBall;    imgControl = @exampleHelperTurtleBotPointController;      

En este ejemplo la función de seguimiento es y el controlador es puede reemplazar esta función y controlador con cualquier funciones definidas por el usuario que tienen la misma estructura de argumento de entrada y salida.exampleHelperTurtleBotFindBlueBallexampleHelperTurtleBotPointController Los argumentos de entrada son una imagen en color y una estructura de parámetros de búsqueda de bolas.exampleHelperTurtleBotFindBlueBall Los argumentos de salida son un centro, magnitud y una imagen binaria del objeto buscado. Los argumentos de entrada para son centro de objetos, magnitud (aunque la magnitud no se utiliza en el ejemplo), el tamaño de la imagen y las ganancias del controlador (un struct).exampleHelperTurtleBotPointController Los argumentos de salida son velocidades lineales y angulares.

La máquina de estado básica utilizada es: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 

Puede Agregar o quitar casos de la máquina de estado. Si desea cambiar los nombres de estado, utilice la clase.ExampleHelperTurtleBotStates

El algoritmo de búsqueda de bolas es modular y alterable. Utiliza dos filtros de imagen (uno en la oscuridad y otro en blueness) enmascarados juntos para aislar la pelota azul. Puede cambiar las máscaras para encontrar una pelota roja o verde en su lugar. Si desea explorar otras formas de seguimiento de forma, el flujo de trabajo básico sigue siendo el mismo.

El canal azul está aislado (con algunos factores de escalado) y se aplica un umbral para producir una máscara de imagen binaria.

blueImg = img(:,:,1)/2 + img(:,:,2)/2 - img(:,:,3)/2; blueThresh = blueImg < params.blueMax; 

Estos comandos aíslan el inverso del azul (con diverso escalado) y enfatizan la oscuridad. Se aplica un umbral.

darkIso = -img(:,:,1)/2 - img(:,:,2)/2 + 3*img(:,:,3) - 2*rgb2gray(img); darkThresh = darkIso > params.darkMin; 

Enmascarar las dos imágenes binarias juntas para aislar la pelota azul oscuro.

ball1 = blueThresh & darkThresh; 

Las constantes y los factores de escalado de la imagen están determinados por el usuario para aislar un color específico. Puede experimentar con varias combinaciones.

También puede encontrar regiones contiguas en la imagen filtrada utilizando, que forma parte de la caja de herramientas de procesamiento de imágenes.regionprops

s = regionprops(ball1, {'Centroid','Area','EquivDiameter'}); 

Hay pasos adicionales para encontrar la pelota de esta región, que se puede encontrar en.exampleHelperTurtleBotFindBlueBall

La función utiliza la clase para mantener un punto especificado (en este caso la ubicación del centro de la pelota) en una ubicación exacta dentro de la imagen.exampleHelperTurtleBotPointControllerExampleHelperPIDControl

La modularidad y flexibilidad del código de ejemplo le permite experimentar con sus propios algoritmos y funciones.