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

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

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

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

rosinit('192.168.203.129')
Initializing global node /matlab_global_node_96529 with NodeURI http://192.168.203.1:60914/

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

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

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

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

vfh = robotics.VectorFieldHistogram;
vfh.DistanceLimits = [0.05 1];
vfh.RobotRadius = 0.1;
vfh.MinTurningRadius = 0.2;
vfh.SafetyDistance = 0.1;

targetDir = 0;

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

rate = robotics.Rate(10);

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

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

Управляйте роботом путем отправки сообщения, содержащего угловую скорость и желаемую линейную скорость с помощью издателя ROS.

while rate.TotalElapsedTime < 30

	% Get laser scan data
	laserScan = receive(laserSub);
	ranges = double(laserScan.Ranges);
	angles = double(laserScan.readScanAngles);
	
	% Call VFH object to computer steering direction
	steerDir = vfh(ranges, angles, 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

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

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

rosshutdown
Shutting down global node /matlab_global_node_96529 with NodeURI http://192.168.203.1:60914/

Смотрите также

| |

Похожие темы