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

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

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

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

rosinit('192.168.203.129',11311)
Initializing global node /matlab_global_node_41200 with NodeURI http://192.168.203.1:54964/

Создайте издателя и подписчика для обмена информацией с классом 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 (Navigation Toolbox), который может отслеживать синхронизацию вашего цикла. Этот объект может использоваться, чтобы управлять скоростью, которую работает цикл.

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_41200 with NodeURI http://192.168.203.1:54964/