В этом примере показано, как использовать 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/