robotic-arm 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/robotic-arm.rb +152 -10
- metadata +2 -2
data/lib/robotic-arm.rb
CHANGED
@@ -7,19 +7,135 @@ require 'libusb'
|
|
7
7
|
|
8
8
|
OFF = 0x00
|
9
9
|
|
10
|
+
|
11
|
+
module Session
|
12
|
+
|
13
|
+
class Recorder
|
14
|
+
|
15
|
+
def initialize(obj)
|
16
|
+
@log = []
|
17
|
+
@recording = false
|
18
|
+
@obj = obj
|
19
|
+
end
|
20
|
+
|
21
|
+
def start
|
22
|
+
@log = [{:time => Time.now, :method => :stop}]
|
23
|
+
@recording = true
|
24
|
+
end
|
25
|
+
|
26
|
+
def stop
|
27
|
+
|
28
|
+
return unless @recording == true
|
29
|
+
@log << {time: Time.now, class: nil, :method => :stop}
|
30
|
+
|
31
|
+
@recording = false
|
32
|
+
|
33
|
+
# convert the time to elapsed time in seconds
|
34
|
+
|
35
|
+
@log.first[:time] = @log[1][:time]
|
36
|
+
t1 = @log.first[:time]
|
37
|
+
@log.first[:sleep] = 0
|
38
|
+
@log[1..-2].each do |record|
|
39
|
+
t2 = record[:time]
|
40
|
+
record[:sleep] = (t2 - t1).round(2)
|
41
|
+
t1 = t2
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
@rlog = @log.reverse.map{|x| x.clone}
|
46
|
+
t1 = @rlog.shift[:time]
|
47
|
+
@rlog.pop
|
48
|
+
|
49
|
+
@rlog[0..-2].each_with_index do |record,i |
|
50
|
+
|
51
|
+
classname = record[:class]
|
52
|
+
|
53
|
+
tmp = record.clone
|
54
|
+
j = @rlog[(i+1)..-1].map{|x| x[:class]}.index(classname)
|
55
|
+
|
56
|
+
next unless j
|
57
|
+
|
58
|
+
record[:method] = swap_state @rlog[i+1+j][:method]
|
59
|
+
record[:sleep] = swap_state @rlog[i+1+j][:sleep]
|
60
|
+
|
61
|
+
@rlog[i+1+j][:method] = swap_state tmp[:method]
|
62
|
+
@rlog[i+1+j][:sleep] = tmp[:sleep]
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
@log
|
67
|
+
end
|
68
|
+
|
69
|
+
def record(classname, methodname)
|
70
|
+
|
71
|
+
@log << {
|
72
|
+
time: Time.now,
|
73
|
+
class: classname.to_sym,
|
74
|
+
method: methodname.to_sym
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
def recording?() @recording end
|
79
|
+
def playback() play @rlog end
|
80
|
+
def reverse_play() play @rlog end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def play(log)
|
85
|
+
|
86
|
+
log.each do |record|
|
87
|
+
|
88
|
+
sleep record[:sleep].to_f
|
89
|
+
component, action = *[:class, :method].map{|x| record[x]}
|
90
|
+
|
91
|
+
unless component.nil? then
|
92
|
+
@obj.method(component).call.method(action).call
|
93
|
+
else
|
94
|
+
@obj.method(action).call
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def swap_state(methodname)
|
100
|
+
case methodname
|
101
|
+
when :up
|
102
|
+
:down
|
103
|
+
when :down
|
104
|
+
:up
|
105
|
+
when :left
|
106
|
+
:right
|
107
|
+
when :right
|
108
|
+
:left
|
109
|
+
when :open
|
110
|
+
:close
|
111
|
+
when :close
|
112
|
+
:open
|
113
|
+
else
|
114
|
+
methodname
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
def recording() @sr ||= Recorder.new(self) end
|
121
|
+
def recording?() @sr ||= Recorder.new(self); @sr.recording? end
|
122
|
+
def record(classname, methodname) @sr.record classname, methodname end
|
123
|
+
|
124
|
+
end
|
125
|
+
|
10
126
|
class RoboticArm
|
127
|
+
include Session
|
11
128
|
|
12
129
|
attr_reader :led, :wrist, :elbow, :shoulder, :base, :grip
|
13
130
|
attr_reader :light, :gripper # aliases for :led and :grip
|
14
131
|
|
15
132
|
class Component
|
16
133
|
|
17
|
-
def initialize(robot_arm) @ra = robot_arm end
|
134
|
+
def initialize(robot_arm) @ra = robot_arm end
|
135
|
+
def active?() @active end
|
18
136
|
|
19
|
-
protected
|
137
|
+
protected
|
20
138
|
|
21
|
-
def active?() @active end
|
22
|
-
|
23
139
|
def activate(switch, val, seconds=0)
|
24
140
|
|
25
141
|
return if val == @previous_val
|
@@ -34,6 +150,9 @@ class RoboticArm
|
|
34
150
|
@active = false
|
35
151
|
end
|
36
152
|
end
|
153
|
+
|
154
|
+
def inspect() '<' + self.class.to_s + '>' end
|
155
|
+
|
37
156
|
end
|
38
157
|
|
39
158
|
class Led < Component
|
@@ -43,7 +162,7 @@ class RoboticArm
|
|
43
162
|
super(robot_arm)
|
44
163
|
@switch = 2
|
45
164
|
end
|
46
|
-
|
165
|
+
|
47
166
|
def on(seconds=0) activate(@switch, 0x01, seconds) unless on? end
|
48
167
|
def off() activate(@switch, -0x01) if on? end
|
49
168
|
|
@@ -173,7 +292,8 @@ class RoboticArm
|
|
173
292
|
|
174
293
|
@light, @gripper = @led, @grip #aliases
|
175
294
|
end
|
176
|
-
|
295
|
+
|
296
|
+
def inspect() '#<RoboticArm:>' end
|
177
297
|
def left(seconds=0) @base.left seconds end
|
178
298
|
def right(seconds=0) @base.right seconds end
|
179
299
|
|
@@ -182,23 +302,45 @@ class RoboticArm
|
|
182
302
|
def command(switch, val)
|
183
303
|
|
184
304
|
@register[switch] += val
|
185
|
-
handle_command
|
305
|
+
handle_command
|
306
|
+
|
307
|
+
if recording? then
|
308
|
+
|
309
|
+
commands = {
|
310
|
+
'21' => [:light, :on], '2-1' => [:light, :off],
|
311
|
+
'02' => [:gripper, :open], '01' => [:gripper, :close],
|
312
|
+
'0-2' => [:gripper, :stop], '0-1' => [:gripper, :stop],
|
313
|
+
'04' => [:wrist, :up], '08' => [:wrist, :down],
|
314
|
+
'0-4' => [:wrist, :stop], '0-8' => [:wrist, :stop],
|
315
|
+
'016' => [:elbow, :up], '032' => [:elbow, :down],
|
316
|
+
'0-16' => [:elbow, :stop], '0-32' => [:elbow, :stop],
|
317
|
+
'064' => [:shoulder, :up], '0128' => [:shoulder, :down],
|
318
|
+
'0-64' => [:shoulder, :stop], '0-128' => [:shoulder, :stop],
|
319
|
+
'12' => [:base, :left], '11' => [:base, :right],
|
320
|
+
'1-2' => [:base, :stop], '1-1' => [:base, :stop]
|
321
|
+
}
|
322
|
+
|
323
|
+
classname, methodname = *commands[switch.to_s + val.to_s]
|
324
|
+
|
325
|
+
record classname, methodname
|
326
|
+
end
|
186
327
|
end
|
187
328
|
|
188
329
|
# turn off all active signals
|
189
330
|
#
|
190
|
-
def off()
|
191
|
-
led.off if led.on?
|
331
|
+
def off()
|
192
332
|
stop
|
193
333
|
@handle.release_interface(0)
|
194
334
|
end
|
195
335
|
|
196
336
|
# stop all robotic movement
|
197
337
|
#
|
198
|
-
def stop()
|
338
|
+
def stop()
|
199
339
|
[wrist, elbow, shoulder, base, grip].each do |motor|
|
200
340
|
motor.stop if motor.moving?
|
201
341
|
end
|
342
|
+
led.off if led.on?
|
343
|
+
nil
|
202
344
|
end
|
203
345
|
|
204
346
|
private
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: robotic-arm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.2.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- James Robertson
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-12-
|
13
|
+
date: 2012-12-24 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: libusb
|