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

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

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

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

rosinit("192.168.178.133",11311)
Initializing global node /matlab_global_node_05320 with NodeURI http://192.168.178.1:63605/

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

Используемые темы для симулированного TurtleBot. Настройте названия темы для своего определенного робота. Передайте сообщения формата структуры использования для лучшей эффективности.

laserSub = rossubscriber("/scan","DataFormat","struct");
[velPub, velMsg] = rospublisher("/cmd_vel","DataFormat","struct");

Настройте объект 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 and create a lidarScan object
	scanMsg = receive(laserSub);
    scan = rosReadLidarScan(scanMsg);
        
	% 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 (i.e. положение робота или количество лазерных сообщений скана).

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

rosshutdown
Shutting down global node /matlab_global_node_05320 with NodeURI http://192.168.178.1:63605/