이 페이지는 기계 번역을 사용하여 번역되었습니다. 영어 원문을 보려면 여기를 클릭하십시오.
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
테스트 트랙용 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)')

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 장면을 보여줍니다.

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