Эта модель реализует waypoint после наряду с предотвращением препятствия на UAV в симулированном сценарии. Модель берет набор waypoints и использует 3D VFH + алгоритм, чтобы обеспечить путь без препятствий.
Создайте сценарий UAV и установите его локальный источник.
Scenario = uavScenario("UpdateRate",100,"ReferenceLocation",[0 0 0]);
Добавьте маркер, чтобы указать на положение запуска UAV.
addMesh(Scenario,"cylinder",{[0 0 1] [0 .01]},[0 1 0]);
Задайте исходное положение и ориентацию UAV на северо-востоке вниз (NED) система координат.
InitialPosition = [0 0 -7]; InitialOrientation = [0 0 0];
Создайте платформу UAV в сценарии.
platUAV = uavPlatform("UAV",Scenario, ... "ReferenceFrame","NED", ... "InitialPosition",InitialPosition, ... "InitialOrientation",eul2quat(InitialOrientation));
Добавьте mesh quadrotor для визуализации.
updateMesh(platUAV,"quadrotor",{1.2},[0 0 1],eul2tform([0 0 pi]));
Задайте разрешение лидара.
AzimuthResolution = 0.5; ElevationResolution = 2;
Укажите диапазон лидара.
MaxRange = 7; AzimuthLimits = [-179 179]; ElevationLimits = [-15 15];
Создайте статистическую модель датчика, чтобы сгенерировать облака точек для датчика лидара.
LidarModel = uavLidarPointCloudGenerator("UpdateRate",10, ... "MaxRange",MaxRange, ... "RangeAccuracy",3, ... "AzimuthResolution",AzimuthResolution, ... "ElevationResolution",ElevationResolution, ... "AzimuthLimits",AzimuthLimits, ... "ElevationLimits",ElevationLimits, ... "HasOrganizedOutput",true);
Создайте датчик лидара и смонтируйте датчик на quadrotor.
uavSensor("Lidar",platUAV,LidarModel, ... "MountingLocation",[0 0 -0.4], ... "MountingAngles",[0 0 180]);
Предварительно просмотрите сценарий с помощью show3D
функция.
show3D(Scenario);
Добавьте препятствия кубоида, представляя создания, к сценарию.
ObstaclePositions = [10 0; 20 10; 10 20]; % Locations of the obstacles ObstacleHeight = 15; % Height of the obstacles ObstaclesWidth = 3; % Width of the obstacles for i = 1:size(ObstaclePositions,1) addMesh(Scenario,"polygon", ... {[ObstaclePositions(i,1)-ObstaclesWidth/2 ObstaclePositions(i,2)-ObstaclesWidth/2; ... ObstaclePositions(i,1)+ObstaclesWidth/2 ObstaclePositions(i,2)-ObstaclesWidth/2; ... ObstaclePositions(i,1)+ObstaclesWidth/2 ObstaclePositions(i,2)+ObstaclesWidth/2; ... ObstaclePositions(i,1)-ObstaclesWidth/2 ObstaclePositions(i,2)+ObstaclesWidth/2], ... [0 ObstacleHeight]},0.651*ones(1,3)); end show3D(Scenario); legend("Start Position","Obstacles")
Модель состоит из этих основных компонентов:
UAV scenario
— Конфигурирует сценарий и визуализирует траекторию.
Waypoint following and obstacle avoidance
— Реализации waypoint после с предотвращением препятствия.
Controller and plant
— Контроллер положения для UAV.
Control Panel
— Используйте эту панель, чтобы включить или отключить предотвращение препятствия, а также изменить предварительное расстояние для предотвращения препятствия.
Откройте модель.
open_system("ObstacleAvoidanceDemo.slx");
Блоки сценария конфигурируют сценарий и визуализируют препятствия, траекторию и данные об облаке точек лидара.
Эта подсистема содержит эти блоки:
Настройка Сценария UAV — Конфигурирует блоки сценария, чтобы использовать сгенерированный сценарий для симуляции.
Чтение Движения Сценария UAV — Чтения текущий UAV утверждают из сценария.
Лидар Сценария UAV — Считывает данные об облаке точек из сценария.
Запись Движения Сценария UAV — Обновления новое состояние UAV.
Осциллограф Сценария UAV — Визуализирует траекторию UAV и данные об облаке точек лидара.
Waypoint following and obstacle avoidance
подсистема находит желаемое положение без препятствий и желаемое рыскание согласно текущему состоянию UAV и данным об облаке точек.
Эта подсистема включает эти блоки и подсистемы:
Последователь Waypoint — Вычисляет предварительную точку для UAV в направлении следующего waypoint.
Предотвращение препятствия — Использование 3D VFH + алгоритм, чтобы вычислить направление без препятствий и рыскание для рейса без коллизий и обновлений предварительная точка, вычисленная блоком Waypoint Follower.
Преобразование — Эта подсистема управляет частотой, на которой предотвращение препятствия используется во время рейса и другого типа данных, и преобразуйте преобразования.
Предварительный блок Distance — Constant, значение которого умножается на единичный вектор в желаемом направлении, и затем добавляется к текущему положению UAV, чтобы вычислить желаемое положение.
Включите Предотвращение Препятствия — Эта подсистема включает или отключает предотвращение препятствия.
'Waypoints' Набор waypoints, через который UAV, как ожидают, полетит.
Задайте waypoints для UAV.
Waypoints = [InitialPosition; 0 20 -7; 20 20 -7; 20 0 -7];
Добавьте маркеры, чтобы указать на waypoints.
for i = 2:size(Waypoints,1) addMesh(Scenario,"cylinder",{[Waypoints(i,2) Waypoints(i,1) 1] [0 0.1]},[1 0 0]); end show3D(Scenario); hold on plot3([InitialPosition(1,2); Waypoints(:,2)],[InitialPosition(1,2); Waypoints(:,1)],[-InitialPosition(1,3); -Waypoints(:,3)],"-g") legend(["Start Position","Obstacles","","","Waypoints","","","Direct Path"])
Controller and plant
подсистема генерирует команды управления и обновляет состояние UAV на основе предварительной точки.
Эта подсистема включает эти блоки:
Controller
— Эта подсистема вычисляет команды управления (крен, тангаж, рыскание и тяга), чтобы переместить UAV к желаемой позиции. Это использует несколько циклов ПИДа, чтобы реализовать управление положением.
Quadrotor Plant
— Этот блок Model Руководства обновляет состояние UAV использование команд управления.
Преобразование — Эта подсистема извлекает положение и ориентацию от состояния UAV, и выполняет данные, и координата преобразовывает для визуализации.
Задайте параметры контроллера. Эти параметры основаны на подходе хита-и-испытания и могут быть настроены для более сглаженного рейса.
% Proportional Gains Px = 6; Py = 6; Pz = 6.5; % Derivative Gains Dx = 1.5; Dy = 1.5; Dz = 2.5; % Integral Gains Ix = 0; Iy = 0; Iz = 0; % Filter Coefficients Nx = 10; Ny = 10; Nz = 14.4947065605712;
Задайте силу тяжести, массу беспилотника и шаг расчета для блоков объекта и контроллера.
UAVSampleTime = 0.001; Gravity = 9.81; DroneMass = 0.1;
Переключатель включает или отключает обновления предварительной точки от блока Obstacle Avoidance.
Ползунок обновляется, предварительное расстояние использовалось для расчета предварительной точки.
На больших предварительных расстояниях рейс UAV быстрее, но имеет больший риск столкновения с препятствием.
В нижних значениях рейс медленнее, но имеет более низкий риск столкновения с препятствием.
Сконфигурируйте и запустите модель и наблюдайте движение UAV.
UAV летит через waypoints при предотвращении препятствий, и затем остановок симуляции.
Измените предварительное расстояние, чтобы изменить скорость UAV.
Измените параметры блока Obstacle Avoidance и обратите внимание на изменения в угле тангажа.
out = sim("ObstacleAvoidanceDemo.slx");
Постройте фактическую траекторию UAV и waypoints, чтобы показать эффект предотвращения препятствия на рейсе UAV.
hold on points = squeeze(out.trajectoryPoints(1,:,:))'; plot3(points(:,2),points(:,1),-points(:,3),"-r"); legend(["Start Position","Obstacles","","","Waypoints","","","Direct Path","UAV Trajectory"])