通过网络发送数据并用八度绘图

Send data by network and plot with octave

我正在研究机器人,我的目标是绘制机器人的状态。

目前,我的工作流程是这样的:

  1. 启动程序
  2. 重定向文件中的输出 (robot/bash):rosrun explo explo_node > states.txt
  3. 将文件发送到我的本地机器 (robot/bash): scp states.txt my_desktop:/home/user
  4. 用八度 (desktop/octave) 绘制状态:plot_data('states.txt')

是否有一个简单的解决方案可以让 "real time" 中的数据?对于八度音阶。我认为我可以毫不费力地从文件中读取作为输入并在添加数据时绘制数据。

问题是如何将数据发送到文件?

我对 Octave 以外的其他解决方案持开放态度。问题是我需要用带箭头的二维图来表示机器人的方向。

有点粗糙,但是你可以循环重新加载文件。这个运行 5 分钟:

for i = 1:300
  load Test/sine.txt
  plot (sine(:,1), sine(:,2))
  sleep (1)
endfor

您可以通过sshfs挂载远程目录:

sshfs user@remote:/path/to/remote_dir local_dir

因此您不必加载远程文件。如果 sshfs 没有安装,请安装它。稍后要卸载远程目录,执行

fusermount -u local_dir

要从Octave获取机器人数据,执行(Octave代码)

system("ssh user@host 'cd remote_dir; rosrun explo explo_node > states.txt'")
%% then plot picture from the data in local_dir
%% that is defacto the directory on the remote server

这是一个示例,说明如何通过网络发送数据(如 Andy 所建议的那样)并绘制 生成的数据(即实时)。我也觉得这种方式是最灵活/合适的。

为了演示,我将使用一个 bash 脚本生成一个 每十分之一秒配对一次,对于 函数,在范围内 :

#!/bin/bash
# script: sin.sh

for i in `seq 0 0.01 31.4`;
do
  printf "$i, `echo "s($i)" | bc -l`\n"
  sleep 0.1
done

(别忘了让这个脚本可执行!)

准备以下八度脚本(需要sockets package!):

% in visualiseRobotData.m
pkg load sockets
s = socket();
bind(s, 9000);
listen(s, 1);
c = accept(s);

figure; hold on; 
while ! isempty (a = str2num (char (recv (c, inf))))
  plot (a(:,1), a(:,2), '*'); drawnow;
end
hold off;

现在按以下顺序执行:

  1. 运行 来自 Octave 终端的 visualiseRobotData 脚本。
    (注意:这将阻塞直到建立连接)
  2. 从您的 bash 终端 运行:./sin.sh | nc localhost 9000

并观察数据点在您的 sin.sh 脚本中绘制出来。