通过网络发送数据并用八度绘图
Send data by network and plot with octave
我正在研究机器人,我的目标是绘制机器人的状态。
目前,我的工作流程是这样的:
- 启动程序
- 重定向文件中的输出 (robot/bash):
rosrun explo explo_node > states.txt
- 将文件发送到我的本地机器 (robot/bash):
scp states.txt my_desktop:/home/user
- 用八度 (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;
现在按以下顺序执行:
- 运行 来自 Octave 终端的
visualiseRobotData
脚本。
(注意:这将阻塞直到建立连接)
- 从您的 bash 终端 运行:
./sin.sh | nc localhost 9000
并观察数据点在您的 sin.sh
脚本中绘制出来。
我正在研究机器人,我的目标是绘制机器人的状态。
目前,我的工作流程是这样的:
- 启动程序
- 重定向文件中的输出 (robot/bash):
rosrun explo explo_node > states.txt
- 将文件发送到我的本地机器 (robot/bash):
scp states.txt my_desktop:/home/user
- 用八度 (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;
现在按以下顺序执行:
- 运行 来自 Octave 终端的
visualiseRobotData
脚本。
(注意:这将阻塞直到建立连接) - 从您的 bash 终端 运行:
./sin.sh | nc localhost 9000
并观察数据点在您的 sin.sh
脚本中绘制出来。