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

Posted

技术标签:

【中文标题】将实时数据从运动捕捉系统写入 CSV 文件?【英文标题】:Writing Real-Time data from Motion Capture System to a CSV file? 【发布时间】:2016-03-11 19:59:22 【问题描述】:

我目前正在开展一个项目,该项目结合了 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    

【问题讨论】:

你不需要在循环内获取一个新的Output_GetMarkerGlobalTranslation 吗?否则我不确定你的信息随着时间的推移存储在哪里,因为你只能访问 Translation 字段的 3 个元素。 否则,请向我们提供有关 Output_GetMarkerGlobalTranslation 外观的更多信息 不用说“提前谢谢”,你可以接受最佳答案后说谢谢:) 为什么在每次循环迭代期间都写入文件?为什么不直接在矩阵中收集数据并在最后将其写入文件?打开、写入和关闭都很慢,只需要执行一次。 【参考方案1】:

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

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

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

因此,您只需将'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)

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

【讨论】:

感谢您的帮助。我更改了“ftemp”的位置,将“w”更改为“a”,一切似乎都可以无缝运行。

以上是关于将实时数据从运动捕捉系统写入 CSV 文件?的主要内容,如果未能解决你的问题,请参考以下文章

10亿+/秒!看阿里如何搞定实时数仓高吞吐实时写入与更新

从 CSV 文件到 Python 的实时数据流

[java实时同步数据库]一种通用的数据库同步系统与实现技术方案

实时即未来,车联网项目之将数据落地到文件系统和数据库

实时即未来,车联网项目之将数据落地到文件系统和数据库

实时即未来,车联网项目之将数据落地到文件系统和数据库