通过网络发送数据并以八度为单位绘图

时间:2017-06-09 15:34:20

标签: bash plot octave

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

目前,我的工作流程是:

  1. 启动程序
  2. 将输出重定向到文件(robot / bash):rosrun explo explo_node > states.txt
  3. 将文件发送到我的本地计算机(机器人/ bash):scp states.txt my_desktop:/home/user
  4. 用八度(桌面/八度)绘制状态:plot_data('states.txt')
  5. 是否有一个简单的解决方案可以将数据放在"实时"?对于八度音阶。我认为我可以毫不费力地从文件中读取输入并在添加数据时绘制数据。

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

    我对八度音阶以外的其他解决方案开放了。问题是我需要用箭头绘制2d用于机器人方向的图。

3 个答案:

答案 0 :(得分:2)

以下是您可以通过网络发送数据的示例(如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. 从八度音阶终端运行visualiseRobotData脚本  (注意:这将阻止,直到建立连接)
  2. 从您的bash终端运行:./sin.sh | nc localhost 9000
  3. 观看数据点从您的sin.sh脚本中进行绘制。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以通过sshfs安装远程目录:

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

所以你不必加载远程文件。如果未安装sshfs,请安装它。要稍后卸载远程目录,请执行

fusermount -u local_dir

要从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