将运动捕捉系统的实时数据写入 CSV 文件?

Writing Real-Time data from Motion Capture System to a CSV file?

我目前正在开展一个项目,该项目结合了 VICON 运动捕捉系统来分析受试者的步长。该系统使用带有标记的红外摄像机来创建 3D 模型。 VICON 系统目前设置为使用 DataStreamSDK 以允许在 MATLAB 中进行实时数据记录。我的最终目标是从一个特定标记(XYZ 坐标)中提取数据并将该数据导出到一个 txt 文件,以便我以后可以对其进行编辑)。我已经集成了预先存在的代码以及我的一些原始代码,以允许我提取特定标记的坐标并尝试将这些坐标放入 CSV 文件中,该文件为每个帧添加一个新坐标。然而,当我 运行 代码时,CSV 文件似乎只包含在我告诉数据停止流式传输后最近一帧的坐标重复。相反,我希望将每一帧的坐标输入到 CSV 文件的新行中。我提供了下面的代码片段。如果需要,我可以提供完整的代码,但其中大部分涉及启用来自 VICON Nexus 程序的数据流。写入CSV文件的部分在底部。

我应该如何编辑代码,以便在提取新数据时不断更新 CSV 文件,而不是简单地重复 1:n 最近提取的坐标点?提前谢谢你。

for MarkerIndex = 9:9
  % Get the marker name
  MarkerName = MyClient.GetMarkerName( SubjectName, MarkerIndex ).MarkerName;

  % Get the marker parent
  MarkerParentName = MyClient.GetMarkerParentName( SubjectName, MarkerName ).SegmentName;

  % Get the global marker translation
  Output_GetMarkerGlobalTranslation = MyClient.GetMarkerGlobalTranslation( SubjectName, MarkerName );

  fprintf( '      Marker #%d: %s (%g, %g, %g) %s\n',                     ...
                     MarkerIndex - 1,                                    ...
                     MarkerName,                                         ...
                     Output_GetMarkerGlobalTranslation.Translation( 1 ), ...
                     Output_GetMarkerGlobalTranslation.Translation( 2 ), ...
                     Output_GetMarkerGlobalTranslation.Translation( 3 ), ...
                     AdaptBool( Output_GetMarkerGlobalTranslation.Occluded ) );



 ftemp = fopen('TestData.txt','w' );
for Output_GetFrameNumber = 1:n
    fprintf(ftemp, '%f,%f,%f\n',Output_GetMarkerGlobalTranslation.Translation( 1 ),Output_GetMarkerGlobalTranslation.Translation( 2 ),Output_GetMarkerGlobalTranslation.Translation( 3 ));
end
fclose(ftemp);
end    

您需要更改打开文件进行写入的语句。你有:

ftemp = fopen('TestData.txt','w' );

'w' 参数打开文件并丢弃现有内容。所以你在每个循环中覆盖文件。如果您使用 'a',它会将 append 内容添加到文件中。请参阅文档 here 并阅读有关 "permission" 参数的信息。

所以您只需将 'w'' 更改为 'a',您的代码就可以正常工作。另外,你可以考虑在循环外打开文件:

ftemp = fopen('TestData.txt','a');
for MarkerIndex = 9:9
 % [insert your code for getting position data]
    for Output_GetFrameNumber = 1:n
        fprintf(ftemp, '%f,%f,%f\n',...); % [insert your print statement]
    end
end
close(ftemp)

这将通过最小化循环内的操作来提高性能。