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

Evasión de obstáculos con TurtleBot

En este ejemplo se muestra una implementación del algoritmo de evasión de obstáculos de VFH + con el® TurtleBot. Se explora el uso de temporizadores para exponer su potencia en algoritmos autónomos.

El algoritmo VFH + es un método simple y local para ayudar a un robot a navegar por un espacio sin golpear obstáculos. Debido a que el algoritmo solo incorpora información local, no se garantiza que el robot llegue al punto de destino. Puede quedar atascado en las esquinas (mínimo local). Puede golpear paredes si el objetivo de la ganancia es demasiado grande en comparación con la evasión de obstáculos. Puede moverse sin rumbo si la ganancia de objetivo es demasiado baja en comparación con la evasión de obstáculos. Experimente con las ganancias y los parámetros del algoritmo para investigar diferentes tipos de comportamientos para el robot.

Este ejemplo muestra cómo desarrollar y probar la evasión de obstáculos simple en el TurtleBot. Robotics System Toolbox™ contiene una implementación más potente del algoritmo de evitación de obstáculos VFH +. El rendimiento del algoritmo de evasión de obstáculos está sujeto a las limitaciones del sensor Kinect®, a saber, su alcance mínimo y su campo de visión limitado.

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

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® de 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 Para este ejemplo, el uso del gazebo® TurtleBot World proporciona el entorno más interesante.

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_17598 with NodeURI http://192.168.203.1:50399/ 

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 Ejecute este comando en un terminal en el TurtleBot.

Inicializar el algoritmo de evasión de obstáculos

Genere una estructura que contenga las ganancias utilizadas en el algoritmo VFH +. Para cambiar el comportamiento del robot, cambie estas ganancias antes de inicializar el temporizador. Las ganancias controlan cuatro comportamientos: apuntar el objetivo, moverse en una línea recta, moverse a lo largo de un camino continuo, y evitar correr en obstáculos. Diferentes ganancias causan diferentes comportamientos. Por ejemplo, si, el robot intenta arar a través de un obstáculo sin importar la distancia.obstaclesAvoid = 0 Si, el robot vaga sin rumbo evitando obstáculos.goalTargeting = 0 La selección de los parámetros apropiados es difícil y depende del entorno del robot. Este ejemplo proporciona más información para ayudarle a seleccionar los parámetros apropiados. Estas ganancias intentan equilibrar la segmentación de objetivos con la evasión de obstáculos de manera justa.

gains.goalTargeting = 100;          % Gain for desire to reach goal gains.forwardPath = 0;            % Gain for moving forward  gains.continuousPath = 0;         % Gain for maintaining continuous path gains.obstacleAvoid = 5;        % Gain for avoiding obstacles

El escaneo láser de Kinect tiene un rango mínimo.Note: Debido a este rango mínimo, el TurtleBot puede evitar algunos obstáculos bien y luego girar y conducir en ellos cuando están muy cerca. Este comportamiento se debe a que el láser no los ve. Este movimiento a menudo puede suceder en las puertas, donde el TurtleBot no cruza completamente el umbral antes de girar hacia la ubicación del objetivo. El marco de la puerta puede estar demasiado cerca para ver en este punto, y el TurtleBot conduce en él sin saber que está allí. Este problema es un inconveniente de los algoritmos de planificación local combinados con el rango limitado del escáner láser. Con el hardware real, el sensor de relieve se debe activar en este caso, pero en la simulación el sensor de relieve no funcionará, por lo que el robot puede quedar atascado contra el marco de la puerta.

Crea publicadores y suscriptores y haz que sean parte de un struct () que pasas al temporizador cuando se crea.timerHandles El editor es para la velocidad y los suscriptores son para el escáner láser, la odometría, y el sensor de relieve.

timerHandles.pub = rospublisher('/mobile_base/commands/velocity'); % Set up publisher timerHandles.pubmsg = rosmessage('geometry_msgs/Twist');  timerHandles.sublaser = rossubscriber('/scan');  % Set up subscribers timerHandles.subodom = rossubscriber('/odom'); timerHandles.subbump = rossubscriber('/mobile_base/sensors/bumper_pointcloud');

Si desea restablecer el odometría antes de continuar, debe suscribirse al tema y enviarle un mensaje vacío:reset_odometry

odomresetpub = rospublisher('/mobile_base/commands/reset_odometry');  % Reset odometry  odomresetmsg = rosmessage('std_msgs/Empty'); send(odomresetpub,odomresetmsg) pause(2);     % Wait until odometry is reset

Agregue las ganancias a la estructura.timerHandles

timerHandles.gains = gains;

Prueba de evasión de obstáculos

Inicialice el temporizador. La función TIMER toma una serie de argumentos de par nombre-valor. El primer par es la función de devolución de llamada para el temporizador, que también incluye la estructura previamente definida. El segundo define el período del temporizador (en este caso es 0,1 segundos por el Loop). El tercer y último par nombre-valor define el modo de ejecución que es el espaciado fijo. También puede definir una función de parada para el temporizador, que en este caso apaga ROS cuando se detiene el temporizador.

timer1 = timer('TimerFcn',{@exampleHelperTurtleBotObstacleTimer,timerHandles},'Period',0.1,'ExecutionMode','fixedSpacing'); timer1.StopFcn = {@exampleHelperTurtleBotStopCallback}; 

Antes de iniciar el temporizador, puede visualizar algunos pasos del algoritmo en la línea de comandos. Puede ver la forma básica en que el algoritmo VFH + funciona utilizando la función.exampleHelperTurtleBotShowGrid Se muestran tres parcelas. La figura 1 muestra los datos de láser sin procesar después de que se ha ordenado en un histograma 2D. La figura 2 muestra el histograma después de que se ha suavizado para tener en cuenta el ancho del robot. La figura 3 muestra el histograma angular, que se crea mediante la discretización de los obstáculos en grupos según las direcciones que el robot puede recorrer. El algoritmo VFH + utiliza estos pasos para determinar cómo evitar los obstáculos mientras se apunta a un punto de objetivo.

exampleHelperTurtleBotShowGrid(timerHandles.sublaser);

El trazado "bin angular" se invierte visualmente desde los dos trazados de rejilla x-y. Las cuadrículas representan el plano 2D real y los ejes X e y reales (aunque las coordenadas no corresponden al mundo real porque representan bins). En la gráfica de ángulo, las agrupaciones angulares se listan de izquierda a derecha en orden ascendente, pero en un plano 2D estos ángulos corresponden al espacio desplazándose de la derecha a la izquierda, por Convención.

Ejecute el robot

Introduzca los siguientes comandos para iniciar el temporizador. Seleccione un punto para enviar el TurtleBot. El TurtleBot comenzará a moverse y evitará cualquier obstáculo detectado. El temporizador se detendrá automáticamente una vez que el robot alcance su objetivo.

start(timer1); while strcmp(timer1.Running, 'on')     exampleHelperTurtleBotShowGrid(timerHandles.sublaser);     pause(0.5);     end 

Para detener el temporizador mientras está en medio de un bucle, cierre la ventana de la figura. Si el temporizador no se borra, una manera segura de borrar todos los temporizadores es utilizar el siguiente comando:

delete(timerfindall) 

En el inicio, la simulación de gazebo con el trazado del mundo puede verse como esta figura:

Después de seleccionar un punto en la habitación siguiente al objetivo, puede ver algo como esta figura:

Apague la red de ROS

Cuando haya terminado, borre los editores y los suscriptores. Apague la red de ROS para desconectar del Turtlebot.

clear rosshutdown
Shutting down global node /matlab_global_node_17598 with NodeURI http://192.168.203.1:50399/ 

Más información

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

En este ejemplo el código se puede alterar para permitirle más libertad y exploración con el TurtleBot. La siguiente es una descripción de las características del ejemplo junto con sugerencias de modificación y uso alternativo.

Este script utiliza, que se puede utilizar de muchas maneras diferentes.timer En este ejemplo se utilizan las devoluciones de llamada TimerFcn y StopFcn.

La devolución de llamada del temporizador y el área de trabajo base comparten información a través de la estructura, que contiene las ganancias, los editores y los suscriptores.timerHandles Si necesita información adicional del espacio de trabajo base incluido en la devolución de llamada del temporizador, agréguelo a la estructura.timerHandles

Una vez que el temporizador ha comenzado, la devolución de llamada del temporizador se ejecuta según los parámetros. En este ejemplo, la devolución de llamada del temporizador () llama a dos funciones principales que ejecutan las funciones principales del algoritmo.exampleHelperTurtleBotObstacleTimer Esta es la estructura básica (excluyendo las declaraciones, las inicializaciones y las funciones de devolución de llamada):

function exampleHelperTurtleBotObstacleTimer(mTimer, event, handles) 
   % Declarations and Initializations would be here 
   % Determine current time    currentTime = datetime(event.Data.time); 
   % Execute the VFH+ algorithm to determine the desired angle trajectory    angleTarget = exampleHelperTurtleBotComputeTargetAngle(goal, data, pose, anglePrev, handles.gains); 
   % Execute the main control loop            [linV, angV] = turtlebotController(currentTime,angleTarget,bumper); 
   % Set the velocities    handles.pubmsg.Linear.X = linV;    handles.pubmsg.Angular.Z = angV;    send(handles.pub,handles.pubmsg); 
   % Set the previous angle    anglePrev = angleTarget; 
   % Callback functions would be here 

La primera función importante es, que devuelve un ángulo que el robot apuntará para girar hacia (en relación con su orientación actual).exampleHelperTurtleBotComputeTargetAngle En este ejemplo, computeTargetAngle es una implementación del algoritmo VFH +. La función computeTargetAngle se puede reemplazar por cualquier función definida por el usuario que devuelva un ángulo de destino. Puede explorar muchos algoritmos potenciales. Los pasos básicos del algoritmo VFH + se toman de un papel de Ulrich y Borenstein [1]. Estos son los pasos cruciales en el algoritmo:

Si desea ajustar los tamaños de las bin para los histogramas y los valores máximos y mínimos para el escaneo láser y los histogramas angulares, consulte la función local llamada setBin.exampleHelperTurtleBotComputeTargetAngle Puede ajustar cualquiera de los parámetros, incluidos los tamaños mínimo y máximo x e y y el tamaño del paso. Tenga en cuenta las limitaciones físicas del robot (por ejemplo, el mínimo de y nunca debe ser negativo porque el robot no puede ver detrás de sí mismo).

El segundo método principal de la devolución de llamada del temporizador es el, que devuelve velocidades lineales y angulares cuando se dan argumentos como la posición del objetivo, la pose actual y el ángulo de destino.turtlebotController Este controlador se puede reemplazar con cualquier controlador definido por el usuario que devuelva velocidades lineales y angulares (en m/s). Dentro de la función está la clase.turtlebotControllerExampleHelperPIDControl Como se implementa actualmente, el turtlebotController utiliza sólo el control proporcional. Sin embargo, la clase de control PID tiene opciones para el control proporcional, derivado e integral, que se puede utilizar de la siguiente manera: linGains. pgain = 0,2; linGains. dgain = 0; linGains. igain = 0; linGains. maxwindup = 0; linGains. setpoint = 0; linPID = ExampleHelperPIDControl (linGains);

Una manera más rápida de establecer las ganancias es: linGains = struct (' pgain ', 0.2, ' dgain ',0, ' igain ',0, ' maxwindup ', 0 ', ' setpoint ', 0);

Asegúrese de probar y ajustar las ganancias que seleccione, ya que pueden resultar en comportamientos de robot muy diferentes. es el punto que desea controlar alrededor.setpoint Los demás elementos de la estructura se denominan claramente. Para actualizar el controlador y devolver el valor de control, utilice la función de actualización.

       controlvalue = update(linPID,currentpoint); 

Las funciones de devolución de llamada para suscriptores se definen como funciones anidadas en la función de devolución de llamada del temporizador. Variables importantes como, y se definen en esas devoluciones de llamada.posegoalbumper En general, la modularidad de la función de devolución de llamada del temporizador y las funciones de soporte permite una gran flexibilidad en la personalización.

Próximos pasos

Referencias

[1] I. Ulrich, J. Borenstein, "VFH +: evitación de obstáculos fiable para robots móviles rápidos," en actas del IEEE® Conferencia Internacional sobre robótica y automatización (ICRA), 1998, Vol. 2, PP. 1572-1577