Предотвращение препятствия с TurtleBot и VFH

В этом примере показано, как использовать ROS Toolbox и TurtleBot® с векторными полевыми гистограммами (VFH), чтобы выполнить предотвращение препятствия при управлении роботом в среде. Блуждания робота путем управления вперед до препятствий мешают. controllerVFH объект вычисляет держащиеся направления, чтобы избежать объектов при попытке управлять вперед.

Дополнительный: Если у вас уже нет TurtleBot (симулированный, или действительный) настраивают, устанавливают виртуальную машину со средством моделирования Gazebo и пакетом TurtleBot. Смотрите Начало работы с Gazebo и Симулированным TurtleBot (ROS Toolbox), чтобы установить и создать TurtleBot в Gazebo.

Соединитесь с TurtleBot с помощью IP-адреса, полученного из настройки.

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

Создайте издателя и подписчика, чтобы поделиться информацией с классом VFH. Подписчик получает лазерные данные сканирования от робота. Издатель отправляет скоростные команды в робота.

Используемые темы для симулированного TurtleBot. Настройте названия темы для своего определенного робота.

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

Настройте объект VFH для предотвращения препятствия. Установите UseLidarScan свойство к true. Задайте свойства алгоритма для технических требований робота. Установите целевое направление на 0 для того, чтобы управлять прямо.

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

targetDir = 0;

Настройте объект Rate с помощью rateControl, который может отследить синхронизацию вашего цикла. Этот объект может использоваться, чтобы управлять уровнем, которым цикл управляет также.

rate = rateControl(10);

Создайте цикл, который собирает данные, вычисляет держащееся направление и управляет роботом. Назначьте время цикла 30 секунд.

Используйте подписчика ROS, чтобы собрать лазерные данные сканирования. Создайте lidarScan объект путем указывания диапазонов и углов. Вычислите держащееся направление с основанным на объектах VFH на входных данных сканирования лазера. Преобразуйте держащееся направление в желаемое линейное и скорость вращения. Если держащееся направление не найдено, остановки робота и поисковые запросы путем вращения на месте.

Управляйте роботом путем отправки сообщения, содержащего скорость вращения и желаемую линейную скорость с помощью издателя 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

Этот код показывает, как можно использовать алгоритмы Navigation Toolbox™, чтобы управлять роботами и реагировать на динамические изменения в их среде. В настоящее время концы цикла после того, как 30 секунд, но другие условия могут собираться выйти из цикла на основе информации о сети ROS (т.е. положение робота или количество лазерных сообщений сканирования).

Отключитесь от сети ROS

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