root / trunk / code / projects / diagnostic_station / tools / plot.rb @ 1300
History | View | Annotate | Download (2.16 KB)
1 |
#!/usr/bin/env ruby
|
---|---|
2 |
|
3 |
# All rows must have the same length. rows are arrays of [x y]. titles are strings.
|
4 |
def plot(rows, titles) |
5 |
datafile='/tmp/data.tmp'
|
6 |
|
7 |
#write it
|
8 |
|
9 |
num_points=rows[0].size
|
10 |
|
11 |
File.open(datafile, 'w') { |f| |
12 |
(0...num_points).each { |n|
|
13 |
f.puts rows.map { |row| row[n] }.join(' ')
|
14 |
} |
15 |
} |
16 |
|
17 |
# plot it
|
18 |
num_rows=rows.size |
19 |
|
20 |
p=IO.popen('gnuplot', 'w') |
21 |
#p.puts("set xlabel 'Station encoders'")
|
22 |
#p.puts("set ylabel 'Robot encoders'")
|
23 |
|
24 |
(0...num_rows).each { |n|
|
25 |
plotcmd=(n==0)?"plot":"replot" |
26 |
p.puts "#{plotcmd} '#{datafile}' using #{2*n+1}:#{2*n+2} with linespoints title '#{titles[n]}'";
|
27 |
} |
28 |
|
29 |
end
|
30 |
|
31 |
encoder_data=Hash.new { |hash,key| hash[key]=Hash.new { |h,k| h[k]=[] } } |
32 |
motor_data=Hash.new { |hash,key| hash[key]=Hash.new { |h,k| h[k]=Hash.new { |hh,kk| hh[kk]=[] } } } |
33 |
|
34 |
puts "Paste output from station here please"
|
35 |
|
36 |
while a=gets
|
37 |
a.chomp! |
38 |
a.strip! |
39 |
|
40 |
if a =~ /^data encoder (0|1) (forward|backward) (.*)$/ |
41 |
num=$1.to_i; dir=$2; data=$3 |
42 |
|
43 |
data.split(' ').each { |pair|
|
44 |
point=pair.split('/').map { |v| v.to_i };
|
45 |
encoder_data[num][dir]<<point |
46 |
} |
47 |
elsif a =~ /^data motor (0|1) (forward|backward) (increasing|decreasing) (.*)$/ |
48 |
num=$1.to_i; dir=$2; acc=$3; data=$4 |
49 |
|
50 |
data.split(' ').each { |pair|
|
51 |
point=pair.split('/').map { |v| v.to_i };
|
52 |
motor_data[num][dir][acc]<<point |
53 |
} |
54 |
end
|
55 |
end
|
56 |
|
57 |
|
58 |
if !encoder_data.empty?
|
59 |
encoder_rows=[0,1].map { |n| encoder_data[n]['forward']+encoder_data[n]['backward'] } |
60 |
|
61 |
encoder_rows[0].sort! { |a,b| a[0]<=>b[0] } |
62 |
encoder_rows[1].sort! { |a,b| a[0]<=>b[0] } |
63 |
|
64 |
plot(encoder_rows, ['left', 'right']) |
65 |
end
|
66 |
|
67 |
if !motor_data.empty?
|
68 |
motor_data[0]['backward']['increasing'].each { |x| x[0]=-x[0] } |
69 |
motor_data[0]['backward']['decreasing'].each { |x| x[0]=-x[0] } |
70 |
motor_data[1]['backward']['increasing'].each { |x| x[0]=-x[0] } |
71 |
motor_data[1]['backward']['decreasing'].each { |x| x[0]=-x[0] } |
72 |
|
73 |
motor_rows=[0,1].map { |n| |
74 |
motor_data[n]['forward']['increasing']+\ |
75 |
motor_data[n]['forward']['decreasing']+\ |
76 |
motor_data[n]['backward']['increasing']+\ |
77 |
motor_data[n]['backward']['decreasing'] |
78 |
} |
79 |
|
80 |
plot(motor_rows, ['left', 'right']) |
81 |
end
|
82 |
|
83 |
|
84 |
puts "Interrupt to close"
|
85 |
begin
|
86 |
while 1; end |
87 |
rescue Interrupt |
88 |
end
|
89 |
|
90 |
|