주요 콘텐츠

이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.

RoadRunner HD Map을 사용하여 RoadRunner에서 테스트 트랙 3D 장면 구축

이 예에서는 MATLAB® 함수를 사용하여 테스트 트랙에 대한 RoadRunner 장면을 구축하는 방법을 보여줍니다. 위도-경도 좌표가 포함된 KML(Keyhole Markup Language) 파일과 고도가 포함된 GeoTIFF 파일을 사용하여 테스트 트랙의 장면을 구축할 수 있습니다. 도로에 대한 데이터 파일을 가져오려면 Mapping Toolbox™ 라이선스가 있어야 합니다.

테스트 트랙용 KML 파일 가져오기

이 예에서는 KML 파일(Map data © 2022 by Google)에서 트랙 중심의 좌표를 MATLAB으로 가져온 다음 MATLAB 함수를 사용하여 KML 파일에서 가져온 데이터를 플롯하여 좌표를 확인합니다.

KML 파일에서 지리 데이터를 읽어 지리공간 테이블을 만듭니다.

kmlData = readgeotable("TestTrackKMLData.kml");

테스트 트랙의 좌표를 플롯합니다.

geoplot(kmlData)
geobasemap topographic

Figure contains an axes object with type geoaxes. The geoaxes object contains an object of type line.

테스트 트랙용 GeoTIFF 파일 가져오기

이 예시에 사용된 샘플 지형 데이터는 미국 지질 조사국(USGS)의 기록 보관소에서 지구 과학 데이터를 제공하는 EarthExplorer에서 다운로드한 것입니다. EarthExplorer에 셰이프파일을 업로드하면 USGS 웹사이트에서 TIF 파일을 다운로드할 수 있습니다. 그러면 EarthExplorer가 테스트 트랙 영역으로 자릅니다.

지리공간 테이블을 도로 중심 테이블로 변환하여 테스트 트랙의 위도 및 경도 좌표를 얻습니다.

T = geotable2table(kmlData,["Latitude","Longitude"]);
[georefGrid,spatialRef] = readgeoraster("TestTrack.tif",OutputType="double");
[lat1,lon1] = polyjoin(T.Latitude(1),T.Longitude(1));
[lat2,lon2] = polyjoin(T.Latitude(2),T.Longitude(2));
[lat3,lon3] = polyjoin(T.Latitude(3),T.Longitude(3));
[lat4,lon4] = polyjoin(T.Latitude(4),T.Longitude(4));
[lat5,lon5] = polyjoin(T.Latitude(5),T.Longitude(5));
[lat6,lon6] = polyjoin(T.Latitude(6),T.Longitude(6));
[lat7,lon7] = polyjoin(T.Latitude(7),T.Longitude(7));

지형 데이터에서 트랙 좌표의 고도를 쿼리합니다.

ctrElev1 = geointerp(georefGrid,spatialRef,lat1,lon1);
ctrElev2 = geointerp(georefGrid,spatialRef,lat2,lon2);
ctrElev3 = geointerp(georefGrid,spatialRef,lat3,lon3);
ctrElev4 = geointerp(georefGrid,spatialRef,lat4,lon4);
ctrElev5 = geointerp(georefGrid,spatialRef,lat5,lon5);
ctrElev6 = geointerp(georefGrid,spatialRef,lat6,lon6);
ctrElev7 = geointerp(georefGrid,spatialRef,lat7,lon7);

RoadRunner HD Map 만들기

RoadRunner HD Map을 생성하고 관심 지역에 대한 지리적 참조를 설정합니다.

빈 RoadRunner HD Map을 roadrunnerHDMap 객체로 생성합니다.

rrMap = roadrunnerHDMap;

도로망의 경계 사각형의 중심으로 도로망 원점의 지리적 좌표를 계산합니다.

[latLim1,lonLim1] = geoquadline(lat1,lon1);
latMean1 = mean(latLim1);
lonMean1 = mean(lonLim1);

관심 지역에 대한 지리적 참조를 설정합니다.

rrMap.GeoReference = [latMean1 lonMean1];

프로젝트 위도-경도 좌표를 xy 지도 좌표로

투영된 좌표 참조 시스템(CRS)을 사용하여 가져온 위도 및 경도 좌표를 xy 지도 좌표로 변환합니다. 그런 다음 트랙 중심의 xy 지도 좌표를 사용하여 트랙 너비를 설정합니다.

RoadRunner HD Map에서 횡축 메르카토르 투영 CRS를 읽어보세요.

p = readCRS(rrMap);

위도와 경도 좌표를 xy 좌표로 투영합니다.

[x1,y1] = projfwd(p,lat1,lon1);
[x2,y2] = projfwd(p,lat2,lon2);
[x3,y3] = projfwd(p,lat3,lon3);
[x4,y4] = projfwd(p,lat4,lon4);
[x5,y5] = projfwd(p,lat5,lon5);
[x6,y6] = projfwd(p,lat6,lon6);
[x7,y7] = projfwd(p,lat7,lon7);

테스트 트랙의 도로 중심과 도로 폭을 정의합니다.

rdCtrs1 = [x1 y1 ctrElev1];
rdWidth1 = 6.5;
rdCtrs2 = [x2 y2 ctrElev2];
rdWidth2 = 10;
rdCtrs3 = [x3 y3 ctrElev3];
rdWidth3 = 5;
rdCtrs4 = [x4 y4 ctrElev4];
rdWidth4 = 3.5;

도로 데이터 업샘플링

KML 파일에서 얻은 데이터 포인트는 드물고 테스트 트랙에는 날카로운 곡선이 포함되어 있으므로 부정확한 트랙 차선 모델링을 방지하려면 데이터를 업샘플링해야 합니다. helperRoadDimensions 헬퍼 함수를 사용하여 데이터를 업샘플링합니다.

[lftBndry1,rgtBndry1,ctrBndry1] = helperRoadDimensions(rdCtrs1,rdWidth1);
[lftBndry2,rgtBndry2,ctrBndry2] = helperRoadDimensions(rdCtrs2,rdWidth2);
[lftBndry3,rgtBndry3,ctrBndry3] = helperRoadDimensions(rdCtrs3,rdWidth3);
[lftBndry4,rgtBndry4,ctrBndry4] = helperRoadDimensions(rdCtrs4,rdWidth4);

차선 및 차선 경계 지정

보간된 데이터를 사용하여 RoadRunner HD Map을 생성하고 테스트 트랙과 유사하도록 데이터를 수정합니다.

RoadRunner HD Map의 차선 속성을 지정합니다.

rrMap.Lanes(4,1) = roadrunner.hdmap.Lane;
for i = 1:4
    rrMap.Lanes(i).Geometry = eval(strcat("ctrBndry",num2str(i)));
    rrMap.Lanes(i).TravelDirection = "Bidirectional";
    rrMap.Lanes(i).ID = strcat("Lane",num2str(i));
    rrMap.Lanes(i).LaneType = "Driving";
end

차선 경계 정보를 지정합니다.

rrMap.LaneBoundaries(8,1) = roadrunner.hdmap.LaneBoundary;
for i = 1:4
    rrMap.LaneBoundaries(i*2-1).ID = strcat("Left",num2str(i));
    rrMap.LaneBoundaries(i*2).ID = strcat("Right",num2str(i));
    rrMap.LaneBoundaries(i*2-1).Geometry = eval(strcat('lftBndry',num2str(i)));
    rrMap.LaneBoundaries(i*2).Geometry = eval(strcat('rgtBndry',num2str(i)));
end

차선과 차선 경계 사이의 정렬을 지정합니다.

leftBoundary(rrMap.Lanes(1),"Left1",Alignment="Forward");
rightBoundary(rrMap.Lanes(1),"Right1",Alignment="Forward");
leftBoundary(rrMap.Lanes(2),"Left2",Alignment="Forward");
rightBoundary(rrMap.Lanes(2),"Right2",Alignment="Forward");
leftBoundary(rrMap.Lanes(3),"Left3",Alignment="Forward");
rightBoundary(rrMap.Lanes(3),"Right3",Alignment="Forward");
leftBoundary(rrMap.Lanes(4),"Left4",Alignment="Forward");
rightBoundary(rrMap.Lanes(4),"Right4",Alignment="Forward");

차선 표시 지정

roadrunner.hdmap.RelativeAssetPath 객체를 사용하여 흰색 단색 및 흰색 점선 차선 표시 에셋에 대한 파일 경로를 정의합니다.

wideSolidWhiteAsset = roadrunner.hdmap.RelativeAssetPath(AssetPath="Assets/Markings/Germany/WideSolidSingle.rrlms");
dashedWhiteAsset = roadrunner.hdmap.RelativeAssetPath(AssetPath="Assets/Markings/Germany/DashedSingle12.rrlms");

차선 경계에 표시를 적용하기 위해 roadrunner.hdmap.MarkingReference 객체를 사용하여 넓은 흰색 실선 및 점선 흰색 표시에 대한 참조를 만듭니다.

markingRefSW = roadrunner.hdmap.MarkingReference(MarkingID=roadrunner.hdmap.Reference(ID="WideSolidWhite"));
markingRefDW = roadrunner.hdmap.MarkingReference(MarkingID=roadrunner.hdmap.Reference(ID="DashedWhite"));

roadrunner.hdmap.LaneMarking 객체를 사용하여 차선 표시를 만듭니다.

rrMap.LaneMarkings(2,1) = roadrunner.hdmap.LaneMarking;
rrMap.LaneMarkings(1).ID = "WideSolidWhite";
rrMap.LaneMarkings(2).ID = "DashedWhite";
rrMap.LaneMarkings(1).AssetPath = wideSolidWhiteAsset;
rrMap.LaneMarkings(2).AssetPath = dashedWhiteAsset;

마킹 참조와 맞춤형 마킹 스팬을 사용하여 파라미터 특성을 생성합니다.

prmAttr1Span1 = roadrunner.hdmap.ParametricAttribution(Span=[0 0.007],MarkingReference=markingRefSW);
prmAttr1Span2 = roadrunner.hdmap.ParametricAttribution(Span=[0.007 0.01],MarkingReference=markingRefDW);
prmAttr1Span3 = roadrunner.hdmap.ParametricAttribution(Span=[0.01 0.93],MarkingReference=markingRefSW);
prmAttr1Span4 = roadrunner.hdmap.ParametricAttribution(Span=[0.93 0.95],MarkingReference=markingRefDW);
prmAttr1Span5 = roadrunner.hdmap.ParametricAttribution(Span=[0.95 1],MarkingReference=markingRefSW);
prmAttr2Span1 = roadrunner.hdmap.ParametricAttribution(Span=[0 0.575],MarkingReference=markingRefSW);
prmAttr2Span2 = roadrunner.hdmap.ParametricAttribution(Span=[0.575 0.602],MarkingReference=markingRefDW);
prmAttr2Span3 = roadrunner.hdmap.ParametricAttribution(Span=[0.602 1],MarkingReference=markingRefSW);
prmAttr3Span1 = roadrunner.hdmap.ParametricAttribution(Span=[0 1],MarkingReference=markingRefSW);
prmAttr4Span1 = roadrunner.hdmap.ParametricAttribution(Span=[0 0.439],MarkingReference=markingRefSW);
prmAttr4Span2 = roadrunner.hdmap.ParametricAttribution(Span=[0.471 0.655],MarkingReference=markingRefSW);
prmAttr4Span3 = roadrunner.hdmap.ParametricAttribution(Span=[0.684 1],MarkingReference=markingRefSW);
prmAttr5Span1 = roadrunner.hdmap.ParametricAttribution(Span=[0.06 0.315],MarkingReference=markingRefSW);
prmAttr5Span2 = roadrunner.hdmap.ParametricAttribution(Span=[0.73 0.94],MarkingReference=markingRefSW);
prmAttr6Span1 = roadrunner.hdmap.ParametricAttribution(Span=[0.1 0.85],MarkingReference=markingRefSW);
prmAttr7Span1 = roadrunner.hdmap.ParametricAttribution(Span=[0 1],MarkingReference=markingRefSW);
prmAttr8Span1 = roadrunner.hdmap.ParametricAttribution(Span=[0.2 0.959],MarkingReference=markingRefSW);

테스트 트랙과 유사하도록 차선 경계에 대한 파라미터 특성을 지정합니다.

rrMap.LaneBoundaries(1).ParametricAttributes = [prmAttr1Span1 prmAttr1Span2 prmAttr1Span3 prmAttr1Span4 prmAttr1Span5];
rrMap.LaneBoundaries(2).ParametricAttributes = [prmAttr2Span1 prmAttr2Span2 prmAttr2Span3];
rrMap.LaneBoundaries(3).ParametricAttributes = prmAttr3Span1;
rrMap.LaneBoundaries(4).ParametricAttributes = [prmAttr4Span1 prmAttr4Span2 prmAttr4Span3];
rrMap.LaneBoundaries(5).ParametricAttributes = [prmAttr5Span1 prmAttr5Span2];
rrMap.LaneBoundaries(6).ParametricAttributes = prmAttr6Span1;
rrMap.LaneBoundaries(7).ParametricAttributes = prmAttr7Span1;
rrMap.LaneBoundaries(8).ParametricAttributes = prmAttr8Span1;

장벽 지정

차선 경계에 장벽을 적용하기 위해 BridgeRailing 에셋에 대한 참조를 만듭니다.

path = roadrunner.hdmap.RelativeAssetPath(AssetPath="Assets/Extrusions/BridgeRailing.rrext");
rrMap.BarrierTypes(1) = roadrunner.hdmap.BarrierType(ID="BridgeRailing",ExtrusionPath=path);
guardRailRef = roadrunner.hdmap.Reference(ID="BridgeRailing");

roadrunner.hdmap.Barrier 객체를 사용하여 장벽을 만들고 장벽과 해당 지오메트리를 지정합니다.

rrMap.Barriers(5,1) = roadrunner.hdmap.Barrier;
for i = 1:5
    rrMap.Barriers(i).BarrierTypeReference = guardRailRef;
    rrMap.Barriers(i).ID = strcat('Barrier',num2str(i));
    rrMap.Barriers(i).FlipLaterally = false;
end
rrMap.Barriers(1).Geometry = lftBndry1(6:428,:);
rrMap.Barriers(2).Geometry = [x5 y5 ctrElev5];
rrMap.Barriers(3).Geometry = [x6 y6 ctrElev6];
rrMap.Barriers(4).Geometry = [x7 y7 ctrElev7];
rrMap.Barriers(5).Geometry = lftBndry4;

지리적 경계 설정 및 지도 데이터를 바이너리 파일에 쓰기

RoadRunner HD Map에 대한 지리적 경계를 설정하면 가져온 도로의 중심에 장면이 배치되고 RoadRunner의 World Settings Tool을 사용하지 않고도 도로 네트워크를 장면에 삽입할 수 있습니다.

지도의 지리적 경계를 왼쪽 경계의 최소 및 최대 좌표 값으로 설정합니다.

minBndry = min(lftBndry1);
maxBndry = max(lftBndry1);
rrMap.GeographicBoundary = [minBndry; maxBndry];

차선 중앙과 차선 경계를 플롯합니다.

plot(rrMap)
title("RoadRunner HD Map of Test Track")
xlabel('x (m)')
ylabel('y (m)')

Figure contains an axes object. The axes object with title RoadRunner HD Map of Test Track, xlabel x (m), ylabel y (m) contains 2 objects of type line. These objects represent Lane Boundaries, Lane Centers.

write 함수를 사용하여 RoadRunner HD Map을 바이너리 파일에 작성하고 해당 파일을 프로젝트의 에셋 폴더에 복사합니다. 이 코드는 샘플 Windows® 프로젝트 경로를 사용합니다.

fileName1 = "TestTrackMap.rrhd";
write(rrMap,fileName1)
copyfile TestTrackMap.rrhd C:\RR\MyProjects\Assets\

RoadRunner HD Map 파일을 RoadRunner로 가져오기

RoadRunner HD Map 파일을 RoadRunner로 가져와 장면을 만든 다음 장면을 저장합니다.

MATLAB을 사용하여 RoadRunner를 열려면 프로젝트 경로를 지정하세요. 이 코드는 Windows의 샘플 프로젝트 폴더를 보여줍니다. 프로젝트에 지정된 경로를 사용하여 RoadRunner를 엽니다.

rrProjectPath = "C:\RR\MyProjects";
rrApp = roadrunner(rrProjectPath);

RoadRunner HD Map 파일을 RoadRunner로 가져오고 장면을 구축하세요. 장면을 빌드하려면 활성 RoadRunner Scene Builder 라이선스가 있어야 합니다.

options = roadrunnerHDMapImportOptions(ImportStep="Load");
importScene(rrApp,fullfile("C:\RR\MyProjects\Assets\","TestTrackMap.rrhd"),"RoadRunner HD Map",options)
buildScene(rrApp,"RoadRunner HD Map")

빌드된 장면을 저장합니다.

fileName2 = "TestTrackMap.rrscene";
saveScene(rrApp,fileName2)

이 이미지는 RoadRunner의 테스트 트랙 장면의 3D 장면을 보여줍니다.

Test track scene in RoadRunner

지형 표면을 시각화하려면 Elevation Map Tool를 사용하여 TestTrack.tif 파일을 RoadRunner로 가져올 수 있습니다.

Test Track with terrain in RoadRunner

참고 항목

|

도움말 항목