ur-sock 0.3 → 1.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.
- checksums.yaml +4 -4
- data/README.md +6 -1
- data/lib/dashboard.rb +320 -54
- data/lib/rtde.rb +69 -8
- data/lib/serialize.rb +6 -15
- data/ur-sock.gemspec +1 -1
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77f86804b68a66dbe0f5c547004d2bb58e0a84385a8f57d4b0dab4c60d7b1baf
|
4
|
+
data.tar.gz: d96c731d006689f1dd80f3052e84084d3219964e8670a9f40afaac97f38710bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e48eadd3e4f07cd3fab23c3c77e397ed7ed91ca350251683944552a8759b1086487c4e4933bb5aaa068b4949b54ff69379f64d72cb39accdcb1c5086bc7254ac
|
7
|
+
data.tar.gz: c770cbc905113eac5fa35ec8f658ee215f24ea5076e85aa4520a12e2aa88eb893ff79d4f53a84380d769abf98859009de462f932a10466a00e4d9ad70f59e22c
|
data/README.md
CHANGED
@@ -2,6 +2,11 @@
|
|
2
2
|
|
3
3
|
Universal robot interface implementation in ruby. This library provides functions using different interfaces of the universal robot. Primary this was designed for the new e-series.
|
4
4
|
|
5
|
+
## Requirements
|
6
|
+
|
7
|
+
This software requires URControl version newer than 5.1.
|
8
|
+
Latest supported URControl vresion: 5.5
|
9
|
+
|
5
10
|
## Getting Started
|
6
11
|
|
7
12
|
This library uses 3 interfaces of the universal robot:
|
@@ -79,7 +84,7 @@ Please read [CONTRIBUTING.md](https://gist.github.com/PurpleBooth/b24679402957c6
|
|
79
84
|
* **Florian Pauker**
|
80
85
|
* **Jürgen Mangler**
|
81
86
|
|
82
|
-
See also the list of [contributors](https://
|
87
|
+
See also the list of [contributors](https://github.com/fpauker/ua4ur/contributors) who participated in this project.
|
83
88
|
|
84
89
|
## License
|
85
90
|
|
data/lib/dashboard.rb
CHANGED
@@ -6,23 +6,43 @@ require 'uri'
|
|
6
6
|
module UR
|
7
7
|
|
8
8
|
class Dash
|
9
|
+
class Reconnect < Exception; end
|
10
|
+
|
9
11
|
module ConnectionState
|
10
|
-
DISCONNECTED =
|
11
|
-
CONNECTED =
|
12
|
-
STARTED =
|
13
|
-
PAUSED =
|
12
|
+
DISCONNECTED = 'DISCONNECTED'
|
13
|
+
CONNECTED = 'CONNECTED'
|
14
|
+
STARTED = 'STARTED'
|
15
|
+
PAUSED = 'PAUSED'
|
16
|
+
end
|
17
|
+
|
18
|
+
module ProgramState
|
19
|
+
STOPPED = 'STOPPED'
|
20
|
+
PLAYING ='PLAYING'
|
21
|
+
PAUSED = 'PAUSED'
|
22
|
+
end
|
23
|
+
|
24
|
+
module SafetyMode
|
25
|
+
NORMAL = "NORMAL"
|
26
|
+
REDUCED = "REDUCED"
|
27
|
+
PROTECTIVE_STOP = "PROTECTIVE_STOP"
|
28
|
+
RECOVERY = "RECOVERY"
|
29
|
+
SAFEGUARD_STOP = "SAFEGUARD_STOP"
|
30
|
+
SYSTEM_EMERGENCY_STOP = "SYSTEM_EMERGENCY_STOP"
|
31
|
+
ROBOT_EMERGENCY_STOP = "ROBOT_EMERGENCY_STOP"
|
32
|
+
VIOLATION = "VIOLATION"
|
33
|
+
FAULT = "FAULT"
|
14
34
|
end
|
15
35
|
|
16
36
|
module ProgramState
|
17
|
-
NO_CONTROLLER =
|
18
|
-
DISCONNECTED =
|
19
|
-
CONFIRM_SAFETY =
|
20
|
-
BOOTING =
|
21
|
-
POWER_OFF =
|
22
|
-
POWER_ON =
|
23
|
-
IDLE =
|
24
|
-
BACKDRIVE =
|
25
|
-
RUNNING =
|
37
|
+
NO_CONTROLLER = 'NO_CONTROLLER'
|
38
|
+
DISCONNECTED = 'DISCONNECTED'
|
39
|
+
CONFIRM_SAFETY = 'CONFIRM_SAFETY'
|
40
|
+
BOOTING = 'BOOTING'
|
41
|
+
POWER_OFF = 'POWER_OFF'
|
42
|
+
POWER_ON = 'POWER_ON'
|
43
|
+
IDLE = 'IDLE'
|
44
|
+
BACKDRIVE = 'BACKDRIVE'
|
45
|
+
RUNNING = 'RUNNING'
|
26
46
|
end
|
27
47
|
|
28
48
|
def initialize(host, logger=Logger.new(STDOUT,level: :INFO))
|
@@ -58,84 +78,330 @@ module UR
|
|
58
78
|
end
|
59
79
|
end
|
60
80
|
|
81
|
+
def load_program (programname)
|
82
|
+
@logger.debug "loadprogram"
|
83
|
+
send = "load " + programname + ".urp\n"
|
84
|
+
@sock.write send
|
85
|
+
line = @sock.gets.strip
|
86
|
+
if line.match(/^L/)
|
87
|
+
@logger.debug line
|
88
|
+
true
|
89
|
+
else
|
90
|
+
@logger.error line
|
91
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
61
95
|
def start_program
|
62
96
|
@sock.write("play\n")
|
63
97
|
line = @sock.gets.strip
|
64
98
|
if line == "Starting program"
|
65
|
-
@logger.
|
99
|
+
@logger.debug line
|
100
|
+
true
|
66
101
|
else
|
67
102
|
@logger.error line
|
103
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
68
104
|
end
|
69
105
|
end
|
70
106
|
|
71
|
-
def
|
72
|
-
@sock.write("
|
73
|
-
|
107
|
+
def stop_program
|
108
|
+
@sock.write("stop\n")
|
109
|
+
line = @sock.gets.strip
|
110
|
+
if line == "Stopped"
|
111
|
+
@logger.debug line
|
112
|
+
true
|
113
|
+
else
|
114
|
+
@logger.error line
|
115
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
116
|
+
end
|
74
117
|
end
|
75
118
|
|
76
|
-
def
|
77
|
-
@sock.write("
|
78
|
-
|
119
|
+
def pause_program
|
120
|
+
@sock.write("pause\n")
|
121
|
+
line = @sock.gets.strip
|
122
|
+
if line == "Pausing program"
|
123
|
+
@logger.debug line
|
124
|
+
true
|
125
|
+
else
|
126
|
+
@logger.error line
|
127
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
128
|
+
end
|
79
129
|
end
|
80
130
|
|
81
|
-
def
|
82
|
-
@sock.write("
|
83
|
-
|
131
|
+
def shutdown
|
132
|
+
@sock.write("shutdown\n")
|
133
|
+
line = @sock.gets.strip
|
134
|
+
if line == "Shutting down"
|
135
|
+
@logger.debug line
|
136
|
+
true
|
137
|
+
else
|
138
|
+
@logger.error line
|
139
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def running?
|
144
|
+
@sock.write("running\n")
|
145
|
+
line = @sock.gets.strip
|
146
|
+
if line == "Program running: True"
|
147
|
+
@logger.debug line
|
148
|
+
true
|
149
|
+
else
|
150
|
+
@logger.error line
|
151
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def get_robotmode
|
156
|
+
@sock.write("robotmode\n")
|
157
|
+
line = @sock.gets.strip
|
158
|
+
@logger.debug line
|
159
|
+
result = $1.strip if line.match(/^Robotmode:\s(.+)/)
|
160
|
+
end
|
161
|
+
|
162
|
+
def get_loaded_program
|
163
|
+
begin
|
164
|
+
@sock.write ("get loaded program\n")
|
165
|
+
line = @sock.gets.strip
|
166
|
+
rescue
|
167
|
+
raise UR::Dash::Reconnect.new('Loaded program can not be got. Dashboard server down or not in Remote Mode')
|
168
|
+
end
|
169
|
+
@logger.debug line
|
170
|
+
if line.match(/^Loaded program:\s(.+)/)
|
171
|
+
$1.strip
|
172
|
+
elsif line.match(/^No program loaded/)
|
173
|
+
nil
|
174
|
+
else
|
175
|
+
raise UR::Dash::Reconnect.new('Loaded program can not be got. Dashboard server down or not in Remote Mode')
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def open_popupmessage(message)
|
180
|
+
@sock.write ("popup " + message.to_s + "\n")
|
181
|
+
@logger.debug @sock.gets.strip
|
182
|
+
end
|
183
|
+
|
184
|
+
def close_popupmessage
|
185
|
+
@sock.write ("close popup\n")
|
186
|
+
@logger.debug @sock.gets.strip
|
187
|
+
end
|
188
|
+
|
189
|
+
def add_to_log(message)
|
190
|
+
@sock.write ("addToLog " + message.to_s + "\n")
|
191
|
+
line = @sock.gets.strip
|
192
|
+
if line.match(/^Added log message/)
|
193
|
+
@logger.debug line
|
194
|
+
else
|
195
|
+
@logger.error line
|
196
|
+
raise UR::Dash::Reconnect.new('Dashboard server down or not in Remote Mode')
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def is_program_saved?
|
201
|
+
@sock.write("isProgramSaved\n")
|
202
|
+
line = @sock.gets.strip
|
203
|
+
if line == "True"
|
204
|
+
@logger.debug line
|
205
|
+
true
|
206
|
+
else
|
207
|
+
@logger.error line
|
208
|
+
raise UR::Dash::Reconnect.new('Cant determine if program is saved. Dashboard server down or not in Remote Mode')
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
def get_program_state
|
213
|
+
@sock.write("programState\n")
|
214
|
+
line = @sock.gets.strip
|
215
|
+
@logger.debug line
|
216
|
+
line
|
217
|
+
end
|
218
|
+
|
219
|
+
def get_polyscope_version
|
220
|
+
@sock.write("PolyscopeVersion\n")
|
221
|
+
line = @sock.gets.strip
|
222
|
+
@logger.debug line
|
223
|
+
line
|
224
|
+
end
|
225
|
+
|
226
|
+
def set_operation_mode_manual
|
227
|
+
@sock.write("set operational mode manual\n")
|
228
|
+
line = @sock.gets.strip
|
229
|
+
if line.match(/^S/)
|
230
|
+
@logger.debug line
|
231
|
+
else
|
232
|
+
@logger.error line
|
233
|
+
raise UR::Dash::Reconnect.new('Cant set operation mode manual. Dashboard server down or not in Remote Mode')
|
234
|
+
end
|
84
235
|
end
|
85
236
|
|
86
237
|
def set_operation_mode_auto
|
87
|
-
@sock.write("set operational mode automatic\n")
|
88
|
-
|
238
|
+
@sock.write("set operational mode automatic\n")
|
239
|
+
line = @sock.gets.strip
|
240
|
+
if line.match(/^S/)
|
241
|
+
@logger.debug line
|
242
|
+
else
|
243
|
+
@logger.error line
|
244
|
+
raise UR::Dash::Reconnect.new('Cant set operation mode automatic. Dashboard server down or not in Remote Mode')
|
245
|
+
end
|
89
246
|
end
|
90
247
|
|
91
248
|
def clear_operation_mode
|
249
|
+
@sock.write("clear operational mode\n")
|
250
|
+
line = @sock.gets.strip
|
251
|
+
if line.match(/^operational/)
|
252
|
+
@logger.debug line
|
253
|
+
true
|
254
|
+
else
|
255
|
+
@logger.error line
|
256
|
+
raise UR::Dash::Reconnect.new('Cant clear operation mode. Dashboard server down or not in Remote Mode')
|
257
|
+
end
|
258
|
+
end
|
92
259
|
|
93
|
-
|
94
|
-
@
|
260
|
+
def power_on
|
261
|
+
@sock.write("power on\n")
|
262
|
+
line = @sock.gets.strip
|
263
|
+
if line.match(/^Powering/)
|
264
|
+
@logger.debug line
|
265
|
+
true
|
266
|
+
else
|
267
|
+
@logger.error line
|
268
|
+
raise UR::Dash::Reconnect.new('Cant power on. Dashboard server down or not in Remote Mode')
|
269
|
+
end
|
95
270
|
end
|
96
271
|
|
97
|
-
def
|
98
|
-
@sock.write
|
99
|
-
|
272
|
+
def power_off
|
273
|
+
@sock.write("power off\n")
|
274
|
+
line = @sock.gets.strip
|
275
|
+
if line.match(/^Powering/)
|
276
|
+
@logger.debug line
|
277
|
+
true
|
278
|
+
else
|
279
|
+
@logger.error line
|
280
|
+
raise UR::Dash::Reconnect.new('Cant power off. Dashboard server down or not in Remote Mode')
|
281
|
+
end
|
100
282
|
end
|
101
|
-
|
102
|
-
|
103
|
-
@
|
104
|
-
|
283
|
+
|
284
|
+
def break_release
|
285
|
+
@sock.write("brake release\n")
|
286
|
+
line = @sock.gets.strip
|
287
|
+
if line.match(/^Brake/)
|
288
|
+
@logger.debug line
|
289
|
+
true
|
290
|
+
else
|
291
|
+
@logger.error line
|
292
|
+
raise UR::Dash::Reconnect.new('Cant release breaks. Dashboard server down or not in Remote Mode')
|
293
|
+
end
|
105
294
|
end
|
106
295
|
|
107
|
-
def
|
108
|
-
@sock.write("
|
109
|
-
@
|
110
|
-
@logger.
|
296
|
+
def get_safety_mode
|
297
|
+
@sock.write("safetymode\n")
|
298
|
+
line = @sock.gets.strip
|
299
|
+
@logger.debug line
|
300
|
+
result = $1.strip if line.match(/^Safetymode:\s(.+)/)
|
111
301
|
end
|
112
302
|
|
113
|
-
def
|
114
|
-
@sock.write("
|
303
|
+
def unlock_protective_stop
|
304
|
+
@sock.write("unlock protective stop\n")
|
115
305
|
line = @sock.gets.strip
|
116
|
-
|
117
|
-
|
306
|
+
if line.match(/^Protective/)
|
307
|
+
@logger.debug line
|
308
|
+
true
|
309
|
+
else
|
310
|
+
@logger.error line
|
311
|
+
raise UR::Dash::Reconnect.new('Cant unlock protective stop. Dashboard server down or not in Remote Mode')
|
312
|
+
end
|
118
313
|
end
|
119
314
|
|
120
|
-
def
|
121
|
-
@sock.write
|
315
|
+
def close_safety_popup
|
316
|
+
@sock.write("close safety popup\n")
|
122
317
|
line = @sock.gets.strip
|
123
|
-
|
124
|
-
|
318
|
+
if line.match(/^closing/)
|
319
|
+
@logger.debug line
|
320
|
+
true
|
321
|
+
else
|
322
|
+
@logger.error line
|
323
|
+
raise UR::Dash::Reconnect.new('Cant close safety popup. Dashboard server down or not in Remote Mode')
|
324
|
+
end
|
125
325
|
end
|
126
326
|
|
127
|
-
def
|
128
|
-
@
|
129
|
-
send = "load " + programname + ".urp\n"
|
130
|
-
puts send
|
131
|
-
@sock.write (send)
|
327
|
+
def load_installation
|
328
|
+
@sock.write("load installation\n")
|
132
329
|
line = @sock.gets.strip
|
133
|
-
|
330
|
+
if line.match(/^Loading/)
|
331
|
+
@logger.debug line
|
332
|
+
true
|
333
|
+
else
|
334
|
+
@logger.error line
|
335
|
+
raise UR::Dash::Reconnect.new('Cant load installation. Dashboard server down or not in Remote Mode')
|
336
|
+
end
|
134
337
|
end
|
135
338
|
|
136
|
-
def
|
339
|
+
def restart_safety
|
340
|
+
@sock.write("restart safety\n")
|
341
|
+
line = @sock.gets.strip
|
342
|
+
if line.match(/^Brake/)
|
343
|
+
@logger.debug line
|
344
|
+
true
|
345
|
+
elsif line.match(/^could not understand/)
|
346
|
+
@logger.warn'Could not execute restart_safety: Please upgrade to current version'
|
347
|
+
line
|
348
|
+
else
|
349
|
+
@logger.error line
|
350
|
+
raise UR::Dash::Reconnect.new('Cant restart safety. Dashboard server down or not in Remote Mode')
|
351
|
+
end
|
352
|
+
end
|
137
353
|
|
354
|
+
def get_operational_mode
|
355
|
+
@sock.write("get operational mode\n")
|
356
|
+
line = @sock.gets.strip
|
357
|
+
if line == "MANUAL" || line == "AUTOMATIC"
|
358
|
+
@logger.debug line
|
359
|
+
line
|
360
|
+
elsif line == "NONE"
|
361
|
+
@logger.warn'No password set, so no modes variable is available'
|
362
|
+
elsif line.match(/^could not understand/)
|
363
|
+
@logger.warn'Could not execute get_operational_mode: Please upgrade to current version'
|
364
|
+
line
|
365
|
+
else
|
366
|
+
@logger.error line
|
367
|
+
raise UR::Dash::Reconnect.new('Cant restart safety. Dashboard server down or not in Remote Mode')
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
def is_in_remote_control
|
372
|
+
@sock.write("is in remote control\n")
|
373
|
+
line = @sock.gets.strip
|
374
|
+
if line.match(/^could not understand/)
|
375
|
+
@logger.warn'Could not execute is_in_remote_control: Please upgrade to current version'
|
376
|
+
line
|
377
|
+
else
|
378
|
+
@logger.debug line
|
379
|
+
line
|
380
|
+
end
|
138
381
|
end
|
139
|
-
end
|
140
382
|
|
383
|
+
def get_serial_number
|
384
|
+
@sock.write("get serial number\n")
|
385
|
+
line = @sock.gets.strip
|
386
|
+
if line.match(/^could not understand/)
|
387
|
+
@logger.warn'Could not execute get_serial_number: Please upgrade to current version'
|
388
|
+
line
|
389
|
+
else
|
390
|
+
@logger.debug line
|
391
|
+
line
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
def get_robot_model
|
396
|
+
@sock.write("get robot model\n")
|
397
|
+
line = @sock.gets.strip
|
398
|
+
if line.match(/^could not understand/)
|
399
|
+
@logger.warn'Could not execute get_robot_model: Please upgrade to current version'
|
400
|
+
line
|
401
|
+
else
|
402
|
+
@logger.debug line
|
403
|
+
line
|
404
|
+
end
|
405
|
+
end
|
406
|
+
end
|
141
407
|
end
|
data/lib/rtde.rb
CHANGED
@@ -7,6 +7,66 @@ module UR
|
|
7
7
|
|
8
8
|
class Rtde
|
9
9
|
PROTOCOL_VERSION = 2
|
10
|
+
ROBOTMODE = {
|
11
|
+
-1 => 'No Controller',
|
12
|
+
0 => 'Disconnected',
|
13
|
+
1 => 'Confirm Safety',
|
14
|
+
2 => 'Booting',
|
15
|
+
3 => 'Power Off',
|
16
|
+
4 => 'Power On',
|
17
|
+
5 => 'Idle',
|
18
|
+
6 => 'Backdrive',
|
19
|
+
7 => 'Running',
|
20
|
+
8 => 'Updating Firmware'
|
21
|
+
}
|
22
|
+
PROGRAMSTATE = {
|
23
|
+
1 => 'Stopped',
|
24
|
+
2 => 'Playing',
|
25
|
+
4 => 'Paused'
|
26
|
+
}
|
27
|
+
JOINTMODE = {
|
28
|
+
235 => 'JOINT_MODE_RESET',
|
29
|
+
236 => 'JOINT_MODE_SHUTTING_DOWN',
|
30
|
+
237 => 'JOINT_PART_D_CALIBRATION_MODE (INTERNAL USE ONLY)',
|
31
|
+
238 => 'JOINT_MODE_BACKDRIVE',
|
32
|
+
239 => 'JOINT_MODE_POWER_OFF',
|
33
|
+
240 => 'JOINT_MODE_READY_FOR_POWER_OFF (FROM VERSION 5.1)',
|
34
|
+
245 => 'JOINT_MODE_NOT_RESPONDING',
|
35
|
+
246 => 'JOINT_MODE_MOTOR_INITIALISATION',
|
36
|
+
247 => 'JOINT_MODE_BOOTING',
|
37
|
+
248 => 'JOINT_PART_D_CALIBRATION_ERROR_MODE (INTERNAL USE ONLY)',
|
38
|
+
249 => 'JOINT_MODE_BOOTLOADER',
|
39
|
+
250 => 'JOINT_CALIBRATION_MODE (INTERNAL USE ONLY)',
|
40
|
+
251 => 'JOINT_MODE_VIOLATION',
|
41
|
+
252 => 'JOINT_MODE_FAULT',
|
42
|
+
253 => 'JOINT_MODE_RUNNING',
|
43
|
+
255 => 'JOINT_MODE_IDLE'
|
44
|
+
}
|
45
|
+
SAFETYMODE = {
|
46
|
+
11 => 'SAFETY_MODE_UNDEFINED_SAFETY_MODE',
|
47
|
+
10 => 'SAFETY_MODE_VALIDATE_JOINT_ID',
|
48
|
+
9 => 'SAFETY_MODE_FAULT',
|
49
|
+
8 => 'SAFETY_MODE_VIOLATION',
|
50
|
+
7 => 'SAFETY_MODE_ROBOT_EMERGENCY_STOP',
|
51
|
+
6 => 'SAFETY_MODE_SYSTEM_EMERGENCY_STOP',
|
52
|
+
5 => 'SAFETY_MODE_SAFEGUARD_STOP',
|
53
|
+
4 => 'SAFETY_MODE_RECOVERY',
|
54
|
+
3 => 'SAFETY_MODE_PROTECTIVE_STOP',
|
55
|
+
2 => 'SAFETY_MODE_REDUCED',
|
56
|
+
1 => 'SAFETY_MODE_NORMAL'
|
57
|
+
}
|
58
|
+
|
59
|
+
TOOLMODE = {
|
60
|
+
235 => 'JOINT_MODE_RESET',
|
61
|
+
236 => 'JOINT_MODE_SHUTTING_DOWN',
|
62
|
+
239 => 'JOINT_MODE_POWER_OFF',
|
63
|
+
245 => 'JOINT_MODE_NOT_RESPONDING',
|
64
|
+
247 => 'JOINT_MODE_BOOTING',
|
65
|
+
249 => 'JOINT_MODE_BOOTLOADER',
|
66
|
+
252 => 'JOINT_MODE_FAULT',
|
67
|
+
253 => 'JOINT_MODE_RUNNING',
|
68
|
+
255 => 'JOINT_MODE_IDLE'
|
69
|
+
}
|
10
70
|
|
11
71
|
module Command #{{{
|
12
72
|
RTDE_REQUEST_PROTOCOL_VERSION = 86 # ASCII V
|
@@ -18,6 +78,7 @@ module UR
|
|
18
78
|
RTDE_CONTROL_PACKAGE_START = 83 # ASCII S
|
19
79
|
RTDE_CONTROL_PACKAGE_PAUSE = 80 # ascii p
|
20
80
|
end #}}}
|
81
|
+
|
21
82
|
module ConnectionState #{{{
|
22
83
|
DISCONNECTED = 0
|
23
84
|
CONNECTED = 1
|
@@ -40,7 +101,7 @@ module UR
|
|
40
101
|
def connect #{{{
|
41
102
|
return if @sock
|
42
103
|
|
43
|
-
@buf = '' # buffer data in binary format
|
104
|
+
@buf = ''.b # buffer data in binary format
|
44
105
|
begin
|
45
106
|
@sock = Socket.new Socket::AF_INET, Socket::SOCK_STREAM
|
46
107
|
@sock.setsockopt Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1
|
@@ -98,18 +159,18 @@ module UR
|
|
98
159
|
@logger.error 'Cannot send when RTDE synchroinization is inactive'
|
99
160
|
return
|
100
161
|
end
|
101
|
-
if not @input_config.
|
162
|
+
if not @input_config.include? input_data.recipe_id
|
102
163
|
@logger.error 'Input configuration id not found: ' + @input_data.recipe_id
|
103
164
|
return
|
104
165
|
end
|
105
166
|
config = @input_config[input_data.recipe_id]
|
106
167
|
send_all Command::RTDE_DATA_PACKAGE, config.pack(input_data)
|
107
168
|
end #}}}
|
108
|
-
def send_and_receive(cmd, payload = '') #{{{
|
169
|
+
def send_and_receive(cmd, payload = ''.b) #{{{
|
109
170
|
@logger.debug 'Start send_and_receive'
|
110
171
|
send_all(cmd, payload) ? recv(cmd) : nil
|
111
172
|
end #}}}
|
112
|
-
def send_all(command, payload = '') #{{{
|
173
|
+
def send_all(command, payload = ''.b) #{{{
|
113
174
|
fmt = 'S>C'
|
114
175
|
size = ([0,0].pack fmt).length + payload.length
|
115
176
|
buf = [size, command].pack(fmt) + payload
|
@@ -200,16 +261,16 @@ module UR
|
|
200
261
|
return true
|
201
262
|
end #}}}
|
202
263
|
|
203
|
-
def receive #{{{
|
264
|
+
def receive(binary=false) #{{{
|
204
265
|
@logger.debug 'Start receive'
|
205
266
|
if !@output_config
|
206
267
|
@logger.error 'Output configuration not initialized'
|
207
268
|
nil
|
208
269
|
end
|
209
270
|
return nil if @conn_state != ConnectionState::STARTED
|
210
|
-
recv Command::RTDE_DATA_PACKAGE
|
271
|
+
recv Command::RTDE_DATA_PACKAGE, binary
|
211
272
|
end #}}}
|
212
|
-
def recv(command) #{{{
|
273
|
+
def recv(command, binary=false) #{{{
|
213
274
|
@logger.debug 'Start recv' + @buf.to_s
|
214
275
|
while connected?
|
215
276
|
readable, _, xlist = IO.select([@sock], [], [@sock])
|
@@ -250,7 +311,7 @@ module UR
|
|
250
311
|
end
|
251
312
|
if packet_header.command == command
|
252
313
|
@logger.debug 'returning becuase of packet_header.command == command'
|
253
|
-
return data
|
314
|
+
return binary ? packet[1..-1] : data
|
254
315
|
else
|
255
316
|
@logger.info 'skipping package(2)'
|
256
317
|
end
|
data/lib/serialize.rb
CHANGED
@@ -64,6 +64,8 @@ module UR
|
|
64
64
|
data[offset...offset+size].map(&:to_i)
|
65
65
|
elsif data_type == 'INT32' or data_type == 'UINT8'
|
66
66
|
data[offset].to_i
|
67
|
+
elsif data_type == 'BOOL'
|
68
|
+
data[offset].to_i > 0 ? true : false
|
67
69
|
else
|
68
70
|
raise TypeError.new('unpack_field: unknown data type: ' + data_type)
|
69
71
|
end
|
@@ -95,19 +97,10 @@ module UR
|
|
95
97
|
obj = DataObject.new
|
96
98
|
offset = 0
|
97
99
|
obj.recipe_id = data[0]
|
98
|
-
|
99
|
-
#puts "Datat:" + data.to_s
|
100
|
-
|
101
100
|
names.each_with_index do |name,i|
|
102
|
-
#obj.values[i] = data[1..-1].unpack('x' * offset + types[i])
|
103
|
-
#puts unpack_field(data[1..-1], offset, types[i])
|
104
|
-
|
105
101
|
obj.values[name] = Serialize.unpack_field(data[1..-1], offset, types[i])
|
106
|
-
#puts "obj"
|
107
|
-
#puts obj.values[i]
|
108
102
|
offset += Serialize::get_item_size(types[i])
|
109
103
|
end
|
110
|
-
#puts "obj:" + obj.values.to_s
|
111
104
|
obj
|
112
105
|
end
|
113
106
|
|
@@ -140,7 +133,6 @@ module UR
|
|
140
133
|
rmd.id = buf.unpack('C')[0]
|
141
134
|
rmd.types = buf[1..-1].split(',')
|
142
135
|
rmd.fmt = 'C'
|
143
|
-
p rmd.types
|
144
136
|
rmd.types.each do |i|
|
145
137
|
if i == 'INT32'
|
146
138
|
rmd.fmt += 'i>'
|
@@ -160,20 +152,19 @@ module UR
|
|
160
152
|
rmd.fmt += 'Q>'
|
161
153
|
elsif i == 'UINT8'
|
162
154
|
rmd.fmt += 'C'
|
155
|
+
elsif i == 'BOOL'
|
156
|
+
rmd.fmt += '?'
|
163
157
|
elsif i == 'IN_USE'
|
164
|
-
raise TypeError 'An input parameter is already in use.'
|
158
|
+
#raise TypeError 'An input parameter is already in use.'
|
165
159
|
else
|
166
|
-
raise TypeError 'Unknown data type: ' + i
|
160
|
+
#raise TypeError 'Unknown data type: ' + i
|
167
161
|
end
|
168
162
|
end
|
169
163
|
rmd
|
170
164
|
end
|
171
165
|
|
172
166
|
def pack(state)
|
173
|
-
p state.class
|
174
167
|
l = state.pack(self.names, self.types)
|
175
|
-
p l
|
176
|
-
p self.fmt
|
177
168
|
l.pack(self.fmt)
|
178
169
|
end
|
179
170
|
|
data/ur-sock.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ur-sock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0
|
4
|
+
version: '1.0'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Pauker
|
@@ -9,28 +9,28 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-06-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: xml-smart
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "~>"
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: '0'
|
21
18
|
- - ">="
|
22
19
|
- !ruby/object:Gem::Version
|
23
20
|
version: 0.3.6
|
21
|
+
- - "~>"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '0'
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
27
|
requirements:
|
28
|
-
- - "~>"
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: '0'
|
31
28
|
- - ">="
|
32
29
|
- !ruby/object:Gem::Version
|
33
30
|
version: 0.3.6
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
34
|
description: see https://github.com/fpauker/ur-sock
|
35
35
|
email: florian.pauker@gmail.com
|
36
36
|
executables: []
|
@@ -67,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
requirements: []
|
70
|
-
rubygems_version: 3.
|
70
|
+
rubygems_version: 3.1.2
|
71
71
|
signing_key:
|
72
72
|
specification_version: 4
|
73
73
|
summary: Preliminary release of Universal Robot (UR) Socket Communication.
|