В этом примере показано, как использовать 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 (i.e. положение робота или количество лазерных сообщений скана).
Отключитесь от сети ROS
rosshutdown
Shutting down global node /matlab_global_node_90736 with NodeURI http://192.168.233.1:61063/