Создайте сценарий для моделирования рейсов беспилотных летательных аппаратов (БПЛА) между набором созданий. Пример демонстрирует обновление положения БПЛА в симуляциях без разомкнутого контура. Используйте сценарий БПЛА, чтобы визуализировать рейс БПЛА и сгенерировать имитированные показания датчика облака точек.
Чтобы протестировать автономные алгоритмы, сценарий БПЛА позволяет вам генерировать тесты и генерировать данные о датчике из окружения. Можно задать препятствия в рабочей области, предоставить траектории БПЛА в глобальных координатах и преобразовать данные между системами координат. Сценарий БПЛА позволяет вам визуализировать эту информацию в исходной системе окружений.
A uavScenario
Объект является моделью, состоящей из множества статических препятствий и подвижных объектов, называемых платформами. Использование uavPlatform
объекты для моделирования фиксированных БПЛА, мультироторов и других объектов в рамках сценария. Этот пример создает сценарий, состоящий из наземной плоскости и 11 созданий, как с помощью экструдированных многоугольников. Данные многоугольника для созданий загружаются и используются для добавления полигональных сеток.
% Create the UAV scenario. scene = uavScenario("UpdateRate",2,"ReferenceLocation",[75 -46 0]); % Add a ground plane. color.Gray = 0.651*ones(1,3); color.Green = [0.3922 0.8314 0.0745]; color.Red = [1 0 0]; addMesh(scene,"polygon",{[-250 -150; 200 -150; 200 180; -250 180],[-4 0]},color.Gray) % Load building polygons. load("buildingData.mat"); % Add sets of polygons as extruded meshes with varying heights from 10-30. addMesh(scene,"polygon",{buildingData{1}(1:4,:),[0 30]},color.Green) addMesh(scene,"polygon",{buildingData{2}(2:5,:),[0 30]},color.Green) addMesh(scene,"polygon",{buildingData{3}(2:10,:),[0 30]},color.Green) addMesh(scene,"polygon",{buildingData{4}(2:9,:),[0 30]},color.Green) addMesh(scene,"polygon",{buildingData{5}(1:end-1,:),[0 30]},color.Green) addMesh(scene,"polygon",{buildingData{6}(1:end-1,:),[0 15]},color.Green) addMesh(scene,"polygon",{buildingData{7}(1:end-1,:),[0 30]},color.Green) addMesh(scene,"polygon",{buildingData{8}(2:end-1,:),[0 10]},color.Green) addMesh(scene,"polygon",{buildingData{9}(1:end-1,:),[0 15]},color.Green) addMesh(scene,"polygon",{buildingData{10}(1:end-1,:),[0 30]},color.Green) addMesh(scene,"polygon",{buildingData{11}(1:end-2,:),[0 30]},color.Green) % Show the scenario. show3D(scene); xlim([-250 200]) ylim([-150 180]) zlim([0 50])
Можно задать uavPlatform
в сценарии как носитель ваших моделей датчика и проведите их по сценарию, чтобы собрать имитированные данные датчика. Можно связать платформу с различными сетками, такими как fixedwing
, quadrotor
, и cuboid
сетки. Можно задать пользовательский mesh, заданную таковые вершин и граней. Задайте опорную систему координат для описания движения вашей платформы.
Загрузите данные о рейсе в рабочую область и создайте квадроторную платформу с помощью опорной системы координат NED. Задайте начальное положение и ориентацию на основе загруженных рейсов журнала данных. Строение каркаса кузова БПЛА ориентирует ось X как прямое-положительное, ось Y как правое-положительное и ось Z вниз-положительное.
load("flightData.mat") % Set up platform plat = uavPlatform("UAV",scene,"ReferenceFrame","NED", ... "InitialPosition",position(:,:,1),"InitialOrientation",eul2quat(orientation(:,:,1))); % Set up platform mesh. Add a rotation to orient the mesh to the UAV body frame. updateMesh(plat,"quadrotor",{10},color.Red,[0 0 0],eul2quat([0 0 pi]))
Можно принять решение монтировать различные датчики, такие как insSensor
, gpsSensor
, или uavLidarPointCloudGenerator
Системные объекты вашего БПЛА. Монтируйте лидар облака точек генератор и uavSensor
объект, который содержит модель датчика лидара. Укажите место установки датчика относительно каркаса кузова БПЛА.
lidarmodel = uavLidarPointCloudGenerator("AzimuthResolution",0.3324099,... "ElevationLimits",[-20 20],"ElevationResolution",1.25,... "MaxRange",90,"UpdateRate",2,"HasOrganizedOutput",true); lidar = uavSensor("Lidar",plat,lidarmodel,"MountingLocation",[0,0,-1]);
Перемещайте БПЛА по предварительно определенной траектории и собирайте показания датчика лидара по пути. Эти данные могут использоваться, чтобы протестировать основанные на лидаре алгоритмы отображения и локализации.
Предварительно выделите traj
и scatterPlot
Линейными графиками и затем укажите специфичные для графика источники данных. Во время симуляции uavScenario
, используйте предоставленную plotFrames
выход из сцены в качестве родительской оси для визуализации данных о датчике в правильных системах координат.
% Visualize the scene [ax,plotFrames] = show3D(scene); % Update plot view for better visibility. xlim([-250 200]) ylim([-150 180]) zlim([0 50]) view([-110 30]) axis equal hold on % Create a line plot for the trajectory. traj = plot3(nan,nan,nan,"Color",[1 1 1],"LineWidth",2); traj.XDataSource = "position(:,1,1:idx+1)"; traj.YDataSource = "position(:,2,1:idx+1)"; traj.ZDataSource = "position(:,3,1:idx+1)"; % Create a scatter plot for the point cloud. colormap("jet") pt = pointCloud(nan(1,1,3)); scatterplot = scatter3(nan,nan,nan,1,[0.3020 0.7451 0.9333],... "Parent",plotFrames.UAV.Lidar); scatterplot.XDataSource = "reshape(pt.Location(:,:,1),[],1)"; scatterplot.YDataSource = "reshape(pt.Location(:,:,2),[],1)"; scatterplot.ZDataSource = "reshape(pt.Location(:,:,3),[],1)"; scatterplot.CDataSource = "reshape(pt.Location(:,:,3),[],1) - min(reshape(pt.Location(:,:,3),[],1))"; % Start Simulation setup(scene) for idx = 0:size(position, 3)-1 [isupdated,lidarSampleTime, pt] = read(lidar); if isupdated % Use fast update to move platform visualization frames. show3D(scene,"Time",lidarSampleTime,"FastUpdate",true,"Parent",ax); % Refresh all plot data and visualize. refreshdata drawnow limitrate end % Advance scene simulation time and move platform. advance(scene); move(plat,[position(:,:,idx+1),zeros(1,6),eul2quat(orientation(:,:,idx+1)),zeros(1,3)]) % Update all sensors in the scene. updateSensors(scene) end hold off