주요 콘텐츠

adtfFileReader

ADTF DAT 파일에서 스트림 정보 읽어오기

R2022a 이후

    설명

    adtfFileReader 객체는 ADTF(Automotive Data and Time-Triggered Framework) DAT 파일에서 다양한 센서와 연결된 스트림 정보를 읽어옵니다. ADTF는 ADAS(첨단 운전자 보조 시스템)와 자율주행 기능을 개발, 시각화, 테스트, 검증하기 위해 Elektrobit에서 개발한 프레임워크입니다. DAT 파일에는 라이다, 카메라 등 다양한 센서의 데이터와 기타 자동차 데이터가 포함되어 있습니다.

    adtfFileReader 객체에서 읽어 올 특정 유형의 메시지를 선택하려면 select 객체 함수를 선택합니다.

    adtfFileReader는 ADTF DAT 파일의 2.0 버전과 3.0 버전 읽어오기를 모두 지원합니다. DAT 파일의 각 스트림에는 정렬된 청크 타임스탬프가 포함되어야 합니다. 이 요구 사항은 스트림 내의 데이터에만 적용되며, 여러 스트림에 걸쳐서는 해당되지 않습니다.

    생성

    설명

    adtfReader = adtfFileReader(dataFileName)은 지정된 ADTF DAT 파일에서 스트림 정보를 읽어오는 adtfFileReader 객체 adtfReader를 생성합니다.

    예제

    adtfReader = adtfFileReader(dataFileName,descriptionFileName)은 ADTF DAT 파일에 있는 스트림의 구조를 정의하는 설명 파일 descriptionFileName을 지정합니다.

    adtfReader = adtfFileReader(dataFileName,pluginDirectoryPath)는 ADTF DAT 파일에서 정보를 읽어 올 때 사용할 플러그인이 포함된 디렉터리 pluginDirectoryPath를 지정합니다. 플러그인은 DAT 파일 읽어오기를 지원하는 컴파일된 오브젝트 파일로, 운영 체제에 따라 다릅니다.

    adtfReader = adtfFileReader(dataFileName,descriptionFileName,pluginDirectoryPath)는 ADTF DAT 파일에서 데이터를 읽어 올 플러그인 디렉터리와 설명 파일을 지정합니다.

    입력 인수

    모두 확장

    ADTF DAT 파일 이름으로, string형 스칼라 또는 문자형 벡터로 지정됩니다.

    설명 파일 이름으로, string형 스칼라 또는 문자형 벡터로 지정됩니다. 설명 파일의 확장자는 XML 또는 DESCRIPTION입니다.

    ADTF 플러그인 디렉터리의 절대 경로로, string형 스칼라 또는 문자형 벡터로 지정됩니다. 객체는 지정된 디렉터리 내에서 확장자가 .adtffileplugin인 플러그인 파일만 사용합니다.

    속성

    모두 확장

    읽기 전용 속성입니다.

    읽어올 ADTF DAT 파일의 절대 경로로, string형 스칼라로 지정됩니다.

    읽기 전용 속성입니다.

    설명 파일의 절대 경로로, string형 스칼라로 지정됩니다.

    읽기 전용 속성입니다.

    ADTF 플러그인 디렉터리의 절대 경로로, string형 스칼라로 지정됩니다.

    읽기 전용 속성입니다.

    DAT 파일의 스트림 개수로, 양의 정수로 지정됩니다.

    읽기 전용 속성입니다.

    DAT 파일의 모든 스트림의 요약으로, 구조체로 지정됩니다.

    객체 함수

    selectCreate reader for selected subset of ADTF DAT file data

    예제

    모두 축소

    이 예제에서는 ADTF DAT 파일에 저장된 비디오 스트림을 추출하고 시각화하는 방법을 보여줍니다. 또한 비디오 스트림을 비디오 파일로 쓰는 방법도 보여줍니다.

    샘플 비디오 DAT 파일을 다운로드합니다.

    downloadURL  = 'https://ssd.mathworks.com/supportfiles/driving/data/sample_can_video_dat.zip';
    dataFolder   = fullfile(tempdir, 'adtf-video', filesep); 
    options      = weboptions('Timeout', Inf);
    zipFileName  = [dataFolder, 'sample_can_video_dat.zip'];
    folderExists = exist(dataFolder, 'dir');
    
    % Create a folder in a temporary directory to save the downloaded file.
    if ~folderExists  
        mkdir(dataFolder); 
        disp('Downloading sample_can_video_dat.zip (9.74 MB)...') 
        websave(zipFileName, downloadURL, options); 
        
        % Extract contents of the downloaded file.
        disp('Extracting sample_can_video_dat.zip...') 
        unzip(zipFileName, dataFolder); 
    end
    Downloading sample_can_video_dat.zip (9.74 MB)...
    
    Extracting sample_can_video_dat.zip...
    

    ADTF File Reader 객체를 생성합니다.

    datFileName = fullfile(dataFolder,"sample_can_video.dat");
    fileReader  = adtfFileReader(datFileName) 
    fileReader = 
                  DataFileName: "C:\Users\latriwal\AppData\Local\Temp\adtf-video\sample_can_video.dat"
           DescriptionFileName: ""
               PluginDirectory: ""
                   StreamCount: 2
                    StreamInfo: 
    
        StreamIndex    StreamName      StreamType      StartTime     EndTime      ItemCount    SubstreamInfo
        ___________    __________    ______________    _________    __________    _________    _____________
    
             1         {'rawcan'}    {'UNRESOLVED'}      0 sec      14.805 sec       743       {0×1 struct} 
             2         {'video' }    {'adtf/image'}      0 sec      14.799 sec       149       {0×1 struct} 
    
    
    

    StreamInfo 속성에서 비디오 스트림의 인덱스는 2입니다. adtfFileReader 객체의 select 함수를 사용하여 읽어올 비디오 스트림을 선택합니다. 반환된 adtfStreamReader 객체에는 선택한 항목에 대한 모든 정보가 있습니다.

    streamReader = select(fileReader,2) 
    streamReader = 
      adtfStreamReader with properties:
    
               DataFileName: "C:\Users\latriwal\AppData\Local\Temp\adtf-video\sample_can_video.dat"
        DescriptionFileName: ""
            PluginDirectory: ""
                StreamIndex: 2
                 StartIndex: 1
                   EndIndex: 149
         CurrentIndexOffset: 0
                  StartTime: [0×0 duration]
                    EndTime: [0×0 duration]
                  DataCount: 149
    
    

    CurrentIndexOffset의 값은 0입니다. 이는 다음번 readNext 호출이 첫 번째 항목을 반환할 것임을 의미합니다.

    스트림의 첫 번째 이미지 프레임을 미리 봅니다.

    firstFrame = readNext(streamReader);
    imshow(firstFrame.Data.Item)

    Figure contains an axes object. The axes object contains an object of type image.

    비디오를 생성하기 전에 reset 함수를 사용하여 첫 번째 프레임부터 읽어오기 시작합니다. 그러면 CurrentIndexOffset의 값이 0으로 재설정됩니다.

    reset(streamReader);
    fprintf("CurrentIndexOffset = %d\n",streamReader.CurrentIndexOffset)
    CurrentIndexOffset = 0
    

    이미지 프레임을 비디오 파일에 쓰는 용도로 사용할 수 있는 VideoWriter 객체를 생성합니다. 초당 1프레임의 프레임 속도를 지정합니다.

    videoWriterObj = VideoWriter("example_video.avi"); 
    videoWriterObj.FrameRate = 1; 
    open(videoWriterObj); 

    streamReader 객체를 사용하여 선택한 항목의 데이터 항목을 하나씩 반복합니다. hasNext 함수는 파일을 단계적으로 읽으면서 읽어올 항목이 남아 있는지 확인합니다. readNext는 데이터 및 연결된 타임스탬프가 포함된 구조체인 데이터 항목을 반환합니다. 반복할 때마다 이미지 프레임을 추출하여 비디오 파일에 씁니다.

    while streamReader.hasNext()
        streamData = streamReader.readNext(); 
        imageFrame = streamData.Data.Item; 
        frame      = im2frame(streamData.Data.Item, gray); 
        writeVideo(videoWriterObj, frame); 
    end 

    또는 read 함수를 사용하여 모든 이미지 프레임을 한 번에 읽어오고 나중에 이를 반복할 수도 있습니다.

    allData = read(streamReader)
    allData = struct with fields:
        StreamIndex: 2
               Data: [149×1 struct]
    
    

    비디오 파일과의 연결을 닫습니다.

    close(videoWriterObj);
    close all

    비디오 뷰어를 사용하여 출력 파일 example_video.avi를 시각화합니다.

    implay("example_video.avi") 

    {"String":"Figure Movie Player contains an axes object and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes object contains an object of type image.","Tex":[],"LaTex":[]}

    제한 사항

    • Mac 플랫폼에서 DAT 파일 읽어오기는 지원되지 않습니다.

    • 다음 스트림 유형의 읽어오기는 지원되지 않습니다.

      • adtf/anonymous

      • adtf/audio

    • adtf/video_compressed 스트림 유형 읽어오기에서는 JPEG 압축 형식만 지원됩니다.

    버전 내역

    R2022a에 개발됨