【问题标题】:Send data by network and plot with octave通过网络发送数据并使用八度进行绘图
【发布时间】:2017-06-10 07:47:42
【问题描述】:

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

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

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

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

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

我对八度以外的其他解决方案持开放态度。问题是我需要为机器人的方向绘制带有箭头的 2d 图。

【问题讨论】:

  • 我认为限制是这个“rosrun/rosbash”的东西。如果您有nc,您可以使用 Octave 打开一个 tcp 套接字并使用nc 发送数据。

标签: bash plot octave


【解决方案1】:

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

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

#!/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

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

准备以下 octave 脚本(需要 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 脚本传入的数据点被绘制出来。

【讨论】:

  • 不错的答案,也许我们也应该将它添加到 GNU Octave wiki。顺便说一句,我经常想要一个具有恒定宽度的实时图,其中新样本添加到右侧,旧样本从左侧删除,如果在生成的行上设置ydata,这很容易。
  • @Andy 谢谢,如果你有建议可以在 wiki 上发布这样的示例,我很乐意添加。
  • 那是更好的答案,非常感谢!我只有一个问题,当程序停止时,我不能再次使用同一个端口,因为它说那个端口已经被使用了。所以必须重新启动octave-cli。你知道为什么吗? (这不是一个真正的问题,因为我已经绕过它......)
  • @onda47:不使用@其他人不会收到通知,他们通常不会监控所有帖子。我看到这个纯属幸运,因为 Tasos 将此答案与另一个问题联系起来。对于您的问题:如果您想再次使用该端口(或等到超时),您必须使用 SO_REUSEADDR。看到这个分叉:github.com/octave-de/octave-sockets-enh
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    你可以通过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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 2017-08-02
      • 2021-02-24
      相关资源
      最近更新 更多