Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

Evitación de obstáculos con TurtleBot y VFH

Este ejemplo muestra cómo utilizar ROS Toolbox y un TurtleBot® con histogramas de campo vectorial (VFH) para evitar obstáculos al conducir un robot en un entorno. El robot se desplaza avanzando hasta que se interponen obstáculos en su camino. El objeto controllerVFH calcula las direcciones de dirección para evitar objetos mientras intenta avanzar.

Opcional: Si aún no tienes un TurtleBot (simulado o real) configurado, instala una máquina virtual con el simulador Gazebo y el paquete TurtleBot. Consulte Get Started with Gazebo and Simulated TurtleBot (ROS Toolbox) para instalar y configurar un TurtleBot en Gazebo.

Conéctese al TurtleBot utilizando la dirección IP obtenida durante la configuración.

rosinit('192.168.233.133',11311)
Initializing global node /matlab_global_node_90736 with NodeURI http://192.168.233.1:61063/

Cree un editor y un suscriptor para compartir información con la clase VFH. El suscriptor recibe los datos del escaneo láser del robot. El editor envía comandos de velocidad al robot.

Los temas utilizados son para el TurtleBot simulado. Ajuste los nombres de los temas para su robot específico.

laserSub = rossubscriber('/scan');
[velPub,velMsg] = rospublisher('/mobile_base/commands/velocity');

Configure el objeto VFH para evitar obstáculos. Establezca la propiedad UseLidarScan en true. Especifique propiedades de algoritmo para las especificaciones del robot. Establezca la dirección del objetivo en 0 para seguir recto.

vfh = controllerVFH;
vfh.UseLidarScan = true;
vfh.DistanceLimits = [0.05 1];
vfh.RobotRadius = 0.1;
vfh.MinTurningRadius = 0.2;
vfh.SafetyDistance = 0.1;

targetDir = 0;

Configure un objeto Rate usando rateControl, que puede rastrear el tiempo de su bucle. Este objeto también se puede utilizar para controlar la velocidad a la que opera el bucle.

rate = rateControl(10);

Cree un bucle que recopile datos, calcule la dirección de dirección y conduzca el robot. Establezca un tiempo de bucle de 30 segundos.

Utilice el suscriptor de ROS para recopilar datos de escaneo láser. Cree un objeto lidarScan especificando los rangos y ángulos. Calcule la dirección de dirección con el objeto VFH en función de los datos de escaneo láser de entrada. Convierta la dirección de dirección a una velocidad lineal y angular deseada. Si no se encuentra una dirección de dirección, el robot se detiene y busca girando en el lugar.

Conduzca el robot enviando un mensaje que contenga la velocidad angular y la velocidad lineal deseada utilizando el editor ROS.

while rate.TotalElapsedTime < 30

	% Get laser scan data
	laserScan = receive(laserSub);
	ranges = double(laserScan.Ranges);
	angles = double(laserScan.readScanAngles);
 
	% Create a lidarScan object from the ranges and angles
        scan = lidarScan(ranges,angles);
        
	% Call VFH object to computer steering direction
	steerDir = vfh(scan, targetDir);  
    
	% Calculate velocities
	if ~isnan(steerDir) % If steering direction is valid
		desiredV = 0.2;
		w = exampleHelperComputeAngularVelocity(steerDir, 1);
	else % Stop and search for valid direction
		desiredV = 0.0;
		w = 0.5;
	end

	% Assign and send velocity commands
	velMsg.Linear.X = desiredV;
	velMsg.Angular.Z = w;
	velPub.send(velMsg);
end

Este código muestra cómo puede utilizar los algoritmos de Navigation Toolbox™ para controlar robots y reaccionar a cambios dinámicos en su entorno. Actualmente, el bucle finaliza después de 30 segundos, pero se pueden establecer otras condiciones para salir del bucle en función de la información de la red ROS (es decir, la posición del robot o la cantidad de mensajes de escaneo láser).

Desconectarse de la red ROS

rosshutdown
Shutting down global node /matlab_global_node_90736 with NodeURI http://192.168.233.1:61063/