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