UAV 시나리오 튜토리얼
일련의 건물 사이에서 UAV(무인 항공기)의 비행을 시뮬레이션하는 시나리오를 생성합니다. 이 예제에서는 개루프 시뮬레이션에서 UAV 자세를 업데이트하는 방법을 보여줍니다. UAV 시나리오를 사용하여 UAV 비행을 시각화하고 시뮬레이션된 포인트 클라우드 센서 측정값을 생성합니다.
소개
자율 알고리즘을 테스트하기 위해 UAV 시나리오를 사용하면 테스트 케이스를 생성하고 환경으로부터 센서 데이터를 생성할 수 있습니다. 작업 공간에 장애물을 지정하고, UAV의 궤적을 전역 좌표로 제공하고, 좌표 프레임 간에 데이터를 변환할 수 있습니다. UAV 시나리오를 사용하면 환경의 기준 프레임에서 이 정보를 시각화할 수 있습니다.
폴리곤 건물 메시를 사용하여 시나리오 생성하기
uavScenario 객체는 여러 정적 장애물 그리고 플랫폼이라고 불리는 움직이는 물체들로 구성된 모델입니다. 시나리오 내에서 고정익 UAV, 멀티로터, 기타 객체를 모델링하려면 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])

UAV 플랫폼을 정의하고 센서를 장착하기
시나리오에서 uavPlatform을 센서 모델을 장착한 이동체로 정의하고 시나리오를 통해 구동하여 시뮬레이션된 센서 데이터를 수집할 수 있습니다. 플랫폼을 fixedwing, quadrotor, cuboid 메시와 같은 다양한 메시에 연결할 수 있습니다. 꼭짓점과 면으로 표현되는 메시로 정의된 사용자 지정 메시를 정의할 수 있습니다. 플랫폼의 모션을 설명하기 위한 기준 프레임을 지정합니다.
비행 데이터를 작업 공간에 불러오고 NED 기준 프레임을 사용하여 쿼드로터 플랫폼을 생성합니다. 불러온 비행 로그 데이터를 기반으로 초기 위치와 방향을 지정합니다. UAV 바디 프레임의 컨피규레이션은 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, gnssMeasurementGenerator, uavLidarPointCloudGenerator 같은 다양한 센서 System object를 선택하여 UAV에 장착할 수 있습니다. 라이다 포인트 클라우드 생성기, 그리고 라이다 센서 모델이 포함된 uavSensor 객체를 장착합니다. UAV 바디 프레임을 기준으로 센서의 장착 위치를 지정합니다.
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]);
미리 정의된 궤적을 따라 UAV 플랫폼을 비행시키면서 포인트 클라우드 센서 측정값 수집하기
미리 정의된 궤적을 따라 UAV를 이동시키면서 그 과정에서 라이다 센서 측정값을 수집합니다. 이 데이터를 사용하여 라이다 기반 지도작성 및 위치추정 알고리즘을 테스트할 수 있습니다.
traj 선 플롯과 scatterPlot 선 플롯을 사전할당한 다음, 플롯별 데이터 소스를 지정합니다. uavScenario를 시뮬레이션하는 동안 장면에서 제공된 plotFrames 출력값을 부모 축으로 사용하여 센서 데이터를 정확한 좌표 프레임으로 시각화합니다.
장면을 시각화합니다.
[ax,plotFrames] = show3D(scene);
플롯 보기를 업데이트하여 가시성을 높입니다.
xlim([-250 200]) ylim([-150 180]) zlim([0 50]) view([-110 30]) axis equal hold on
궤적에 대한 선 플롯을 생성합니다. 우선 plot3을 사용하여 플롯을 생성한 다음, 플롯의 데이터 소스 속성을 수동으로 수정합니다. 그러면 플로팅의 성능이 향상됩니다.
traj = plot3(nan,nan,nan,Color=[1 1 1],LineWidth=2); traj.XDataSource = "position(:,2,1:idx+1)"; traj.YDataSource = "position(:,1,1:idx+1)"; traj.ZDataSource = "-position(:,3,1:idx+1)";
포인트 클라우드에 대한 산점도 플롯을 생성합니다. 데이터 소스 속성을 다시 업데이트합니다.
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))";
시뮬레이션을 설정합니다. 그런 다음 라이다 센서가 업데이트될 때마다 위치를 처음부터 끝까지 반복하고 장면을 표시합니다. 장면을 전진시키고, UAV 플랫폼을 이동시키고, 센서를 업데이트합니다.
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
