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/