我在 Windows 上收集数据集,并且必须重复执行以下操作。
我正在寻找一种方法来自动化其中一些。
一般描述
- 运行一个不断将其数据打印到标准输出的进程
- 使用以下方法将标准输出重定向到文件
>
- 等到文件长度超过 1200 行(在查看器中打开文件并观察变化)
- Ctrl-C
- 重新配置流程并转到1
我正在寻找某种管道过滤器来帮我完成第 3 步和第 4 步。我可以使用 cmd.exe 或 Powershell。
细节
我正在从 ROS2 节点收集数据。以下是具体命令和我的操作。
步骤1、2:运行节点,然后打开单独的ROS2控制台并发出命令ros2 topic echo --csv --field range /range > filename.txt
。
filename.txt
步骤 3:在 gvim 中打开文件(它会立即创建)并发出命令:set autoread | au CursorHold * checktime | call feedkeys("lh")
。这些命令使 vim 监视文件中的更改并自动从磁盘重新加载它。有关它们的更多信息这里。
等待一段时间后filename.txt
包含以下内容:
...
0.7152443528175354
0.7513738870620728
0.725148618221283
0.7509835362434387
0.7565790414810181
0.7424352765083313
0.7426444292068481
0.7367836833000183
0.7558256387710571
0.7744500637054443
0.7122563123703003
0.7287737727165222
0.780799388885498
...
由于获取 1200 行数据块需要大约 10-12 分钟,因此我运行命令并切换到另一项任务。控制台窗口转到后台,现在我需要某种方式来获取已收集所需数据量的通知。
Vim 向我显示文件中的行数。目前,我将其窗口保持在第二个显示器上打开,并在做其他事情时定期查看该数字。当我注意到收集了超过 1200 行时,我切换到 ROS2 控制台并按 Ctrl-C。
然后我停止我的 ROS2 节点,重新配置它并再次运行。
我正在寻找一些过滤器,以便可以发出以下命令
ros2 topic echo --csv --field range /range | THAT-FILTER --1200 > filename.txt
我希望该过滤器能够断开管道并以某种方式通知我它已经收集了所需数量的数据。
我尝试过但没有效果的方法。
我看过透析,但它似乎没有终止管道的选项。
按照 Kamil Maciorowski 在评论中的建议,我尝试使用
head
Powershellselect -first n
。但没有成功。这个命令永不结束:
ros2 topic echo ... | "C:\Program Files\Git\usr\bin\head.exe" -n 1200 > file.txt
尽管
file.txt
恰好包含1200行。与 类似
head.exe
,select -first 10
打印前 10 行但不会中断管道。还有一个问题:创建文件的编码是 U16Le,而不是 ANSI。我发现可以使用以下方式实现通知Windows 版通知发送。但是,我需要管道终止。
最终,可以通过编写另一个 ROS2 节点来实现目标,该节点将订阅主题、将请求的数据量转储到文件并发出通知。我想知道是否可以使用通用操作系统工具来实现该目标。