urua 0.99.5000 → 0.99.5005
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +50 -10
- data/lib/rtde.conf.xml +118 -0
- data/lib/urua.rb +221 -26
- data/server/devserver.conf +6 -5
- data/server/devserver.rsa +49 -0
- data/server/uruaserver.conf +2 -1
- data/tools/urua +1 -1
- metadata +78 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08bfaa4aad14130da8b785c322c4c76509c5748dfab2fb73a19058da444f3842'
|
4
|
+
data.tar.gz: ed91abfd616678a80470132c374ba24034564a3615c2dddf9cda1fc3ae2f2493
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 372ed2f32db3566fda2636aa59bea36cec64734f2f1cda6f6e5e45f4467efe4ad436e9293dae732bdab0adf4bc2e875ece9a7c6fb62c8313a176edede19b7205
|
7
|
+
data.tar.gz: 26b653018bc518e8fc1d9303dad6a9d9e4844b7a11bd8b1a0f2f0ac02ee26cb3154c1120c9c7ec728ce9141c3b4f2b79fb6ad3207f26a19ac005cf42ced4bf01
|
data/README.md
CHANGED
@@ -2,28 +2,68 @@
|
|
2
2
|
|
3
3
|
# URUA
|
4
4
|
|
5
|
-
OPC UA
|
5
|
+
A simple OPC UA server for Universal robots in ruby, which uses the ur-sock and opcua-smart library.
|
6
6
|
|
7
7
|
## Getting Started
|
8
8
|
|
9
|
-
A simple ruby server, which uses
|
9
|
+
A simple ruby server, which uses the ur-sock and opcua-smart library.
|
10
10
|
|
11
11
|
### Prerequisites & Intallation
|
12
12
|
|
13
|
-
|
13
|
+
For this server the OPC UA installation of the opcua-smart gem is required.
|
14
|
+
Please follow the instructions at https://github.com/etm/opcua-smart and install the opcua gem.
|
14
15
|
|
15
|
-
|
16
|
+
Additionally you have to install the URUA gem with:
|
17
|
+
|
18
|
+
```
|
19
|
+
gem install urua
|
20
|
+
```
|
21
|
+
|
22
|
+
If you want to develop or extend the server, just use the following instruction
|
23
|
+
```
|
24
|
+
git clone https://github.com/fpauker/urua
|
25
|
+
git clone https://github.com/fpauker/ur-sock
|
26
|
+
git clone https://github.com/etm/opcua-smart
|
16
27
|
```
|
17
|
-
|
18
|
-
|
28
|
+
|
29
|
+
Just follow the install instructions of the 3 projects.
|
30
|
+
After installing all packages do
|
31
|
+
|
32
|
+
```
|
33
|
+
cd urua/server
|
19
34
|
```
|
35
|
+
in this directory the devserver.rb and the devserver.config are located.
|
36
|
+
|
37
|
+
### Starting the server
|
38
|
+
|
39
|
+
To start the server type in the following commands:
|
40
|
+
|
41
|
+
```
|
42
|
+
cd urua/server
|
43
|
+
./uruaserver.rb start
|
44
|
+
```
|
45
|
+
or
|
46
|
+
```
|
47
|
+
cd urua/server
|
48
|
+
./devserver.rb start
|
49
|
+
```
|
50
|
+
to start the developing server.
|
51
|
+
|
20
52
|
|
21
53
|
## Adress space
|
22
54
|
|
23
|
-
|
24
|
-
|
25
|
-
![Architecture](adressspace/
|
26
|
-
![Architecture](adressspace/
|
55
|
+
The server's adress space is shown in the pictures below.
|
56
|
+
|
57
|
+
![Architecture](https://github.com/fpauker/urua/blob/master/adressspace/ur1.png?raw=true)
|
58
|
+
![Architecture](https://github.com/fpauker/urua/blob/master/adressspace/ur2.png?raw=true)
|
59
|
+
![Architecture](https://github.com/fpauker/urua/blob/master/adressspace/ur3.png?raw=true)
|
60
|
+
![Architecture](https://github.com/fpauker/urua/blob/master/adressspace/ur5.png?raw=true)
|
61
|
+
|
62
|
+
It offers several features combining 3 different interfaces of the Universal robot. It uses the
|
63
|
+
|
64
|
+
* Primary Secondary Interface for direct execution of UR scripts
|
65
|
+
* Dashboard server for orchestration functions e.g. starting/stopping a program
|
66
|
+
* RTDE interface for getting the robot states
|
27
67
|
|
28
68
|
## Contributing
|
29
69
|
|
data/lib/rtde.conf.xml
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<rtde_config>
|
3
|
+
<recipe key="speed">
|
4
|
+
<field name="speed_slider_mask" type="UINT32"/>
|
5
|
+
<field name="speed_slider_fraction" type="DOUBLE"/>
|
6
|
+
</recipe>
|
7
|
+
<recipe key="inbit">
|
8
|
+
<!--Only put Input Registers here which are used-->
|
9
|
+
<field name="input_bit_register_64" type="BOOL"/>
|
10
|
+
<field name="input_bit_register_65" type="BOOL"/>
|
11
|
+
</recipe>
|
12
|
+
<recipe key="inint">
|
13
|
+
<!--Only put Input Registers here which are used-->
|
14
|
+
<field name="input_int_register_0" type="INT32"/>
|
15
|
+
<field name="input_int_register_1" type="INT32"/>
|
16
|
+
<field name="input_int_register_2" type="INT32"/>
|
17
|
+
<field name="input_int_register_3" type="INT32"/>
|
18
|
+
<field name="input_int_register_4" type="INT32"/>
|
19
|
+
<field name="input_int_register_5" type="INT32"/>
|
20
|
+
<field name="input_int_register_6" type="INT32"/>
|
21
|
+
<field name="input_int_register_7" type="INT32"/>
|
22
|
+
<field name="input_int_register_8" type="INT32"/>
|
23
|
+
<field name="input_int_register_9" type="INT32"/>
|
24
|
+
</recipe>
|
25
|
+
<recipe key="indoub">
|
26
|
+
<!--Only put Input Registers here which are used-->
|
27
|
+
<field name="input_double_register_0" type="DOUBLE"/>
|
28
|
+
<field name="input_double_register_1" type="DOUBLE"/>
|
29
|
+
</recipe>
|
30
|
+
<recipe key="out">
|
31
|
+
<field name="timestamp" type="DOUBLE"/>
|
32
|
+
<field name="target_q" type="VECTOR6D"/>
|
33
|
+
<field name="target_qd" type="VECTOR6D"/>
|
34
|
+
<field name="target_qdd" type="VECTOR6D"/>
|
35
|
+
<field name="target_current" type="VECTOR6D"/>
|
36
|
+
<field name="target_moment" type="VECTOR6D"/>
|
37
|
+
<field name="actual_q" type="VECTOR6D"/>
|
38
|
+
<field name="actual_qd" type="VECTOR6D"/>
|
39
|
+
<field name="actual_current" type="VECTOR6D"/>
|
40
|
+
<field name="joint_control_output" type="VECTOR6D"/>
|
41
|
+
<field name="actual_TCP_pose" type="VECTOR6D"/>
|
42
|
+
<field name="actual_TCP_speed" type="VECTOR6D"/>
|
43
|
+
<field name="actual_TCP_force" type="VECTOR6D"/>
|
44
|
+
<field name="target_TCP_pose" type="VECTOR6D"/>
|
45
|
+
<field name="target_TCP_speed" type="VECTOR6D"/>
|
46
|
+
<field name="actual_digital_input_bits" type="UINT64"/>
|
47
|
+
<field name="joint_temperatures" type="VECTOR6D"/>
|
48
|
+
<field name="actual_execution_time" type="DOUBLE"/>
|
49
|
+
<field name="robot_mode" type="INT32"/>
|
50
|
+
<field name="joint_mode" type="VECTOR6INT32"/>
|
51
|
+
<field name="safety_mode" type="INT32"/>
|
52
|
+
<field name="actual_tool_accelerometer" type="VECTOR3D"/>
|
53
|
+
<field name="speed_scaling" type="DOUBLE"/>
|
54
|
+
<field name="target_speed_fraction" type="DOUBLE"/>
|
55
|
+
<field name="actual_momentum" type="DOUBLE"/>
|
56
|
+
<field name="actual_main_voltage" type="DOUBLE"/>
|
57
|
+
<field name="actual_robot_voltage" type="DOUBLE"/>
|
58
|
+
<field name="actual_robot_current" type="DOUBLE"/>
|
59
|
+
<field name="actual_joint_voltage" type="VECTOR6D"/>
|
60
|
+
<field name="actual_digital_output_bits" type="UINT64"/>
|
61
|
+
<field name="runtime_state" type="UINT32"/>
|
62
|
+
<field name="output_bit_register_64" type="BOOL"/>
|
63
|
+
<field name="target_speed_fraction" type="DOUBLE"/>
|
64
|
+
|
65
|
+
<!-- field name="output_bit_registers0_to_31" type="UINT32"/-->
|
66
|
+
<!-- field name="output_bit_registers32_to_63" type="UINT32"/-->
|
67
|
+
|
68
|
+
<!-- field name="output_int_register_0" type="INT32"/-->
|
69
|
+
<!-- field name="output_int_register_1" type="INT32"/-->
|
70
|
+
<!-- field name="output_int_register_2" type="INT32"/-->
|
71
|
+
<!-- field name="output_int_register_3" type="INT32"/-->
|
72
|
+
<!-- field name="output_int_register_4" type="INT32"/-->
|
73
|
+
<!-- field name="output_int_register_5" type="INT32"/-->
|
74
|
+
<!-- field name="output_int_register_6" type="INT32"/-->
|
75
|
+
<!-- field name="output_int_register_7" type="INT32"/-->
|
76
|
+
<!-- field name="output_int_register_8" type="INT32"/-->
|
77
|
+
<!-- field name="output_int_register_9" type="INT32"/-->
|
78
|
+
<!-- field name="output_int_register_10" type="INT32"/-->
|
79
|
+
<!-- field name="output_int_register_11" type="INT32"/-->
|
80
|
+
<!-- field name="output_int_register_12" type="INT32"/-->
|
81
|
+
<!-- field name="output_int_register_13" type="INT32"/-->
|
82
|
+
<!-- field name="output_int_register_14" type="INT32"/-->
|
83
|
+
<!-- field name="output_int_register_15" type="INT32"/-->
|
84
|
+
<!-- field name="output_int_register_16" type="INT32"/-->
|
85
|
+
<!-- field name="output_int_register_17" type="INT32"/-->
|
86
|
+
<!-- field name="output_int_register_18" type="INT32"/-->
|
87
|
+
<!-- field name="output_int_register_19" type="INT32"/-->
|
88
|
+
<!-- field name="output_int_register_20" type="INT32"/-->
|
89
|
+
<!-- field name="output_int_register_21" type="INT32"/-->
|
90
|
+
<!-- field name="output_int_register_22" type="INT32"/-->
|
91
|
+
<!-- field name="output_int_register_23" type="INT32"/-->
|
92
|
+
|
93
|
+
<!-- field name="output_double_register_0" type="DOUBLE"/-->
|
94
|
+
<!-- field name="output_double_register_1" type="DOUBLE"/-->
|
95
|
+
<!-- field name="output_double_register_2" type="DOUBLE"/-->
|
96
|
+
<!-- field name="output_double_register_3" type="DOUBLE"/-->
|
97
|
+
<!-- field name="output_double_register_4" type="DOUBLE"/-->
|
98
|
+
<!-- field name="output_double_register_5" type="DOUBLE"/-->
|
99
|
+
<!-- field name="output_double_register_6" type="DOUBLE"/-->
|
100
|
+
<!-- field name="output_double_register_7" type="DOUBLE"/-->
|
101
|
+
<!-- field name="output_double_register_8" type="DOUBLE"/-->
|
102
|
+
<!-- field name="output_double_register_9" type="DOUBLE"/-->
|
103
|
+
<!-- field name="output_double_register_10" type="DOUBLE"/-->
|
104
|
+
<!-- field name="output_double_register_11" type="DOUBLE"/-->
|
105
|
+
<!-- field name="output_double_register_12" type="DOUBLE"/-->
|
106
|
+
<!-- field name="output_double_register_13" type="DOUBLE"/-->
|
107
|
+
<!-- field name="output_double_register_14" type="DOUBLE"/-->
|
108
|
+
<!-- field name="output_double_register_15" type="DOUBLE"/-->
|
109
|
+
<!-- field name="output_double_register_16" type="DOUBLE"/-->
|
110
|
+
<!-- field name="output_double_register_17" type="DOUBLE"/-->
|
111
|
+
<!-- field name="output_double_register_18" type="DOUBLE"/-->
|
112
|
+
<!-- field name="output_double_register_19" type="DOUBLE"/-->
|
113
|
+
<!-- field name="output_double_register_20" type="DOUBLE"/-->
|
114
|
+
<!-- field name="output_double_register_21" type="DOUBLE"/-->
|
115
|
+
<!-- field name="output_double_register_22" type="DOUBLE"/-->
|
116
|
+
<!-- field name="output_double_register_23" type="DOUBLE"/-->
|
117
|
+
</recipe>
|
118
|
+
</rtde_config>
|
data/lib/urua.rb
CHANGED
@@ -28,18 +28,35 @@ module URUA
|
|
28
28
|
opts['dash'] = UR::Dash.new(opts['ipadress']).connect rescue nil
|
29
29
|
end #}}}
|
30
30
|
|
31
|
+
def self::start_psi(opts)
|
32
|
+
opts['psi'] = UR::Psi.new(opts['ipadress']).connect rescue nil
|
33
|
+
end
|
34
|
+
|
31
35
|
def self::start_rtde(opts) #{{{
|
32
36
|
### Loading config file
|
33
37
|
conf = UR::XMLConfigFile.new opts['rtde_config']
|
34
38
|
output_names, output_types = conf.get_recipe opts['rtde_config_recipe_base']
|
35
39
|
opts['rtde'] = UR::Rtde.new(opts['ipadress']).connect
|
36
40
|
|
37
|
-
### Set Speed
|
41
|
+
### Set Speed
|
38
42
|
if opts['rtde_config_recipe_speed']
|
39
43
|
speed_names, speed_types = conf.get_recipe opts['rtde_config_recipe_speed']
|
40
44
|
opts['speed'] = opts['rtde'].send_input_setup(speed_names, speed_types)
|
41
45
|
opts['speed']['speed_slider_mask'] = 1
|
42
|
-
|
46
|
+
end
|
47
|
+
|
48
|
+
### Set register
|
49
|
+
if opts['rtde_config_recipe_inbit']
|
50
|
+
bit_names, bit_types = conf.get_recipe opts['rtde_config_recipe_inbit']
|
51
|
+
opts['inbit'] = opts['rtde'].send_input_setup(bit_names,bit_types)
|
52
|
+
end
|
53
|
+
if opts['rtde_config_recipe_inint']
|
54
|
+
int_names, int_types = conf.get_recipe opts['rtde_config_recipe_inint']
|
55
|
+
opts['inint'] = opts['rtde'].send_input_setup(int_names,int_types)
|
56
|
+
end
|
57
|
+
if opts['rtde_config_recipe_indoub']
|
58
|
+
doub_names, doub_types = conf.get_recipe opts['rtde_config_recipe_indoub']
|
59
|
+
opts['indoub'] = opts['rtde'].send_input_setup(doub_names,doub_types)
|
43
60
|
end
|
44
61
|
|
45
62
|
### Setup output
|
@@ -49,6 +66,17 @@ module URUA
|
|
49
66
|
if not opts['rtde'].send_start
|
50
67
|
puts 'Unable to start synchronization'
|
51
68
|
end
|
69
|
+
|
70
|
+
###Initialize all inputs
|
71
|
+
bit_names.each do |i|
|
72
|
+
opts['inbit'][i] = false
|
73
|
+
end
|
74
|
+
int_names.each do |i|
|
75
|
+
opts['inint'][i] = 0
|
76
|
+
end
|
77
|
+
doub_names.each do |i|
|
78
|
+
opts['indoub'][i] = 0.0
|
79
|
+
end
|
52
80
|
end #}}}
|
53
81
|
|
54
82
|
def self::protect_reconnect_run(opts) #{{{
|
@@ -56,22 +84,34 @@ module URUA
|
|
56
84
|
begin
|
57
85
|
yield
|
58
86
|
rescue UR::Dash::Reconnect => e
|
87
|
+
puts e.message
|
59
88
|
tries += 1
|
60
89
|
if tries < 2
|
61
90
|
URUA::start_dash opts
|
62
91
|
retry
|
63
92
|
end
|
93
|
+
rescue UR::Psi::Reconnect => e
|
94
|
+
puts e.message
|
95
|
+
tries += 1
|
96
|
+
if tries < 2
|
97
|
+
URUA::start_psi opts
|
98
|
+
retry
|
99
|
+
end
|
64
100
|
end
|
65
101
|
end #}}}
|
66
102
|
|
67
103
|
def self::ssh_start(opts) #{{{
|
68
|
-
|
104
|
+
if opts['certificate']
|
105
|
+
opts['ssh'] = Net::SSH.start(opts['ipadress'], opts['username'], :port => opts['sshport'], :keys => [ opts['certificate'] ])
|
106
|
+
else
|
107
|
+
opts['ssh'] = opts['password'] ? Net::SSH.start(opts['ipadress'], opts['username'], :port => opts['sshport'], password: opts['password']) : Net::SSH.start(opts['ipadress'], opts['username'], :port => opts['sshport'])
|
108
|
+
end
|
69
109
|
end #}}}
|
70
110
|
|
71
111
|
def self::download_program(opts,name) #{{{
|
72
112
|
counter = 0
|
73
113
|
begin
|
74
|
-
opts['ssh'].scp.download File.join(opts['url'],name)
|
114
|
+
opts['ssh'].scp.download! File.join(opts['url'],name)
|
75
115
|
rescue => e
|
76
116
|
counter += 1
|
77
117
|
URUA::ssh_start opts
|
@@ -102,9 +142,19 @@ module URUA
|
|
102
142
|
progs
|
103
143
|
end #}}}
|
104
144
|
|
145
|
+
def self::robotprogram_running?(opts)
|
146
|
+
opts['ps'].value == 'Playing'
|
147
|
+
end
|
148
|
+
|
105
149
|
def self::implementation_startup(opts) #{{{
|
150
|
+
opts['sshport'] || 22
|
151
|
+
|
106
152
|
opts['rtde_config'] ||= File.join(__dir__,'rtde.conf.xml')
|
107
153
|
opts['rtde_config_recipe_base'] ||= 'out'
|
154
|
+
opts['rtde_config_recipe_speed'] ||= 'speed'
|
155
|
+
opts['rtde_config_recipe_inbit'] ||= 'inbit'
|
156
|
+
opts['rtde_config_recipe_inint'] ||= 'inint'
|
157
|
+
opts['rtde_config_recipe_indoub'] ||= 'indoub'
|
108
158
|
|
109
159
|
Proc.new do
|
110
160
|
on startup do |opts|
|
@@ -113,6 +163,7 @@ module URUA
|
|
113
163
|
opts['dash'] = nil
|
114
164
|
opts['rtde'] = nil
|
115
165
|
opts['programs'] = nil
|
166
|
+
opts['psi'] = nil
|
116
167
|
|
117
168
|
# ProgramFile
|
118
169
|
opts['pf'] = opts['server'].types.add_object_type(:ProgramFile).tap{ |p|
|
@@ -123,10 +174,20 @@ module URUA
|
|
123
174
|
end
|
124
175
|
end
|
125
176
|
p.add_method :StartProgram do |node|
|
126
|
-
|
127
|
-
|
128
|
-
opts
|
129
|
-
|
177
|
+
unless URUA::robotprogram_running?(opts)
|
178
|
+
a = node.id.to_s.split('/')
|
179
|
+
URUA::protect_reconnect_run(opts) do
|
180
|
+
opts['dash'].load_program(a[-2])
|
181
|
+
opts['dash'].start_program
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
p.add_method :StartAsUrScript do |node|
|
186
|
+
unless URUA::robotprogram_running?(opts)
|
187
|
+
a = node.id.to_s.split('/')
|
188
|
+
URUA::protect_reconnect_run(opts) do
|
189
|
+
opts['psi'].execute_ur_script(URUA::download_program(opts, a[-2]+".script"))
|
190
|
+
end
|
130
191
|
end
|
131
192
|
end
|
132
193
|
}
|
@@ -144,17 +205,76 @@ module URUA
|
|
144
205
|
a.add_object(:ActualVoltage, opts['server'].types.folder).tap { |p| URUA::add_axis_concept p, :AxisVoltage }
|
145
206
|
a.add_object(:ActualMomentum, opts['server'].types.folder).tap { |p| p.add_variable :AxisMomentum }
|
146
207
|
}
|
208
|
+
# RegitsterType
|
209
|
+
reg = opts['server'].types.add_object_type(:RegType).tap {|r|
|
210
|
+
r.add_object(:Inputs, opts['server'].types.folder).tap {|i|
|
211
|
+
i.add_object(:Bitregister, opts['server'].types.folder).tap {|b|
|
212
|
+
64.upto(127) do |z|
|
213
|
+
b.add_variable_rw :"Bit#{z}" do |node,value,external|
|
214
|
+
if external
|
215
|
+
opts['inbit']["input_bit_register_" + z.to_s] = value
|
216
|
+
opts['rtde'].send(opts['inbit'])
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
}
|
221
|
+
i.add_object(:Intregister, opts['server'].types.folder).tap {|b|
|
222
|
+
0.upto(47) do |z|
|
223
|
+
b.add_variable_rw :"Int#{z}" do |node,value,external|
|
224
|
+
if external
|
225
|
+
opts['inint']["input_int_register_" + z.to_s] = value.to_i
|
226
|
+
opts['rtde'].send(opts['inint'])
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
}
|
231
|
+
i.add_object(:Doubleregister, opts['server'].types.folder).tap {|b|
|
232
|
+
0.upto(47) do |z|
|
233
|
+
b.add_variable_rw :"Double#{z}" do |node,value,external|
|
234
|
+
if external
|
235
|
+
opts['indoub']["input_double_register_" + z.to_s] = value.to_f
|
236
|
+
opts['rtde'].send(opts['indoub'])
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
}
|
241
|
+
}
|
242
|
+
r.add_object(:Outputs, opts['server'].types.folder).tap {|o|
|
243
|
+
o.add_object(:Bitregister, opts['server'].types.folder).tap {|b|
|
244
|
+
64.upto(127) do |z|
|
245
|
+
b.add_variable :"Bit#{z}"
|
246
|
+
end
|
247
|
+
}
|
248
|
+
o.add_object(:Intregister, opts['server'].types.folder).tap {|b|
|
249
|
+
0.upto(47) do |z|
|
250
|
+
b.add_variable :"Int#{z}"
|
251
|
+
end
|
252
|
+
}
|
253
|
+
o.add_object(:Doubleregister, opts['server'].types.folder).tap {|b|
|
254
|
+
0.upto(47) do |z|
|
255
|
+
b.add_variable :"Double#{z}"
|
256
|
+
end
|
257
|
+
}
|
258
|
+
}
|
259
|
+
}
|
260
|
+
|
147
261
|
|
148
262
|
# RobotObjectType
|
149
263
|
rt = opts['server'].types.add_object_type(:RobotType).tap { |r|
|
150
264
|
r.add_variables :SerialNumber, :RobotModel
|
151
265
|
r.add_object(:State, opts['server'].types.folder).tap{ |s|
|
152
266
|
s.add_variables :CurrentProgram, :RobotMode, :RobotState, :JointMode, :SafetyMode, :ToolMode, :ProgramState, :SpeedScaling, :Remote, :OperationalMode
|
153
|
-
s.add_variable_rw :Override
|
267
|
+
s.add_variable_rw :Override do |node,value,external|
|
268
|
+
if external
|
269
|
+
opts['speed']['speed_slider_fraction'] = value / 100.0
|
270
|
+
opts['rtde'].send(opts['speed'])
|
271
|
+
end
|
272
|
+
end
|
154
273
|
}
|
155
274
|
r.add_object(:SafetyBoard, opts['server'].types.folder).tap{ |r|
|
156
275
|
r.add_variables :MainVoltage, :RobotVoltage, :RobotCurrent
|
157
276
|
}
|
277
|
+
|
158
278
|
r.add_object(:Programs, opts['server'].types.folder).tap{ |p|
|
159
279
|
p.add_object :Program, opts['pf'], OPCUA::OPTIONAL
|
160
280
|
p.add_variable :Programs
|
@@ -172,8 +292,10 @@ module URUA
|
|
172
292
|
end
|
173
293
|
end
|
174
294
|
r.add_method :StartProgram do
|
175
|
-
URUA::
|
176
|
-
|
295
|
+
unless URUA::robotprogram_running?(opts)
|
296
|
+
URUA::protect_reconnect_run(opts) do
|
297
|
+
nil unless opts['dash'].start_program
|
298
|
+
end
|
177
299
|
end
|
178
300
|
end
|
179
301
|
r.add_method :StopProgram do
|
@@ -186,6 +308,13 @@ module URUA
|
|
186
308
|
opts['dash'].pause_program
|
187
309
|
end
|
188
310
|
end
|
311
|
+
r.add_method :RunUrScript, content: OPCUA::TYPES::STRING do |node, content|
|
312
|
+
unless URUA::robotprogram_running?(opts)
|
313
|
+
URUA::protect_reconnect_run(opts) do
|
314
|
+
opts['psi'].execute_ur_script(content)
|
315
|
+
end
|
316
|
+
end
|
317
|
+
end
|
189
318
|
r.add_method :PowerOn do
|
190
319
|
if opts['rm'].value.to_s != 'Running'
|
191
320
|
Thread.new do
|
@@ -232,7 +361,7 @@ module URUA
|
|
232
361
|
}
|
233
362
|
### populating the adress space
|
234
363
|
### Robot object
|
235
|
-
robot = opts['server'].objects.manifest(
|
364
|
+
robot = opts['server'].objects.manifest(File.basename(opts['namespace']), rt)
|
236
365
|
|
237
366
|
opts['sn'] = robot.find(:SerialNumber)
|
238
367
|
opts['model'] = robot.find(:RobotModel)
|
@@ -257,6 +386,50 @@ module URUA
|
|
257
386
|
opts['mo'] = st.find(:Remote)
|
258
387
|
opts['op'] = st.find(:OperationalMode)
|
259
388
|
|
389
|
+
### register
|
390
|
+
register = robot.manifest(:Register, reg)
|
391
|
+
inputs = register.find :Inputs
|
392
|
+
ibitreg = inputs.find :Bitregister
|
393
|
+
opts['b_bits'] = 64.upto(127).map{|b|
|
394
|
+
ib = ibitreg.find :"Bit#{b}"
|
395
|
+
ib.value = false
|
396
|
+
ib
|
397
|
+
}
|
398
|
+
iintreg = inputs.find :Intregister
|
399
|
+
opts['i_int'] = 0.upto(47).map{|b|
|
400
|
+
ii = iintreg.find :"Int#{b}"
|
401
|
+
ii.value = 0
|
402
|
+
ii
|
403
|
+
}
|
404
|
+
#extend it with other registers
|
405
|
+
idoubreg = inputs.find :Doubleregister
|
406
|
+
opts['i_doub'] = 0.upto(47).map{|b|
|
407
|
+
id = idoubreg.find :"Double#{b}"
|
408
|
+
id.value = 0.0
|
409
|
+
id
|
410
|
+
}
|
411
|
+
#Output register
|
412
|
+
outputs = register.find :Outputs
|
413
|
+
obitreg = outputs.find :Bitregister
|
414
|
+
opts['o_bit'] = 64.upto(127).map{|b|
|
415
|
+
ob = obitreg.find :"Bit#{b}"
|
416
|
+
ob.value = false
|
417
|
+
ob
|
418
|
+
}
|
419
|
+
ointreg = outputs.find :Intregister
|
420
|
+
opts['o_int'] = 0.upto(47).map{|b|
|
421
|
+
oi = ointreg.find :"Int#{b}"
|
422
|
+
oi.value = 0
|
423
|
+
oi
|
424
|
+
}
|
425
|
+
|
426
|
+
odoubreg = outputs.find :Doubleregister
|
427
|
+
opts['o_doub'] = 0.upto(47).map{|b|
|
428
|
+
od = odoubreg.find :"Double#{b}"
|
429
|
+
od.value = 0.0
|
430
|
+
od
|
431
|
+
}
|
432
|
+
|
260
433
|
### Axes
|
261
434
|
axes = robot.manifest(:Axes, ax)
|
262
435
|
aapf, avelf, acurf, avolf, amomf = axes.find :ActualPositions, :ActualVelocities, :ActualCurrents, :ActualVoltage, :ActualMomentum
|
@@ -288,9 +461,12 @@ module URUA
|
|
288
461
|
opts['af'] = aff.find :TCPForce
|
289
462
|
opts['afa'] = aff.find :Axis1, :Axis2, :Axis3, :Axis4, :Axis5, :Axis6
|
290
463
|
|
464
|
+
### Register
|
465
|
+
|
291
466
|
### Connecting to universal robot
|
292
467
|
URUA::start_rtde opts
|
293
468
|
URUA::start_dash opts
|
469
|
+
URUA::start_psi opts
|
294
470
|
|
295
471
|
### Manifest programs
|
296
472
|
opts['programs'] = robot.find(:Programs)
|
@@ -298,7 +474,7 @@ module URUA
|
|
298
474
|
opts['progs'] = []
|
299
475
|
opts['semaphore'] = Mutex.new
|
300
476
|
### check if interfaces are ok
|
301
|
-
raise if !opts['dash'] || !opts['rtde']
|
477
|
+
raise if !opts['dash'] || !opts['rtde'] || !opts['psi']
|
302
478
|
|
303
479
|
# Functionality for threading in loop
|
304
480
|
opts['doit_state'] = Time.now.to_i
|
@@ -308,6 +484,17 @@ module URUA
|
|
308
484
|
# Serious comment (we do the obvious stuff)
|
309
485
|
opts['sn'].value = opts['dash'].get_serial_number
|
310
486
|
opts['model'].value = opts['dash'].get_robot_model
|
487
|
+
rescue Errno::ECONNREFUSED => e
|
488
|
+
print 'ECONNREFUSED: '
|
489
|
+
puts e.message
|
490
|
+
rescue UR::Dash::Reconnect => e
|
491
|
+
URUA::start_dash opts
|
492
|
+
puts e.message
|
493
|
+
puts e.backtrace
|
494
|
+
rescue UR::Psi::Reconnect => e
|
495
|
+
URUA::start_psi opts
|
496
|
+
puts e.message
|
497
|
+
puts e.backtrace
|
311
498
|
rescue => e
|
312
499
|
puts e.message
|
313
500
|
puts e.backtrace
|
@@ -338,14 +525,12 @@ module URUA
|
|
338
525
|
# check every 10 seconds for new programs
|
339
526
|
progs = URUA::get_robot_programs(opts)
|
340
527
|
delete = opts['progs'] - progs
|
341
|
-
# puts 'Missing Nodes: ' + delete.to_s
|
342
528
|
delete.each do |d|
|
343
529
|
d = d[0..-5]
|
344
530
|
opts['prognodes'][d].delete!
|
345
531
|
opts['prognodes'].delete(d)
|
346
532
|
end
|
347
533
|
add = progs - opts['progs']
|
348
|
-
# puts 'New nodes: ' + add.to_s
|
349
534
|
add.each do |a|
|
350
535
|
a = a[0..-5]
|
351
536
|
opts['prognodes'][a] = opts['programs'].manifest(a, opts['pf'])
|
@@ -365,6 +550,13 @@ module URUA
|
|
365
550
|
opts['rc'].value = data['actual_robot_current']
|
366
551
|
opts['ss'].value = data['speed_scaling']
|
367
552
|
|
553
|
+
#register
|
554
|
+
|
555
|
+
#bitregister
|
556
|
+
# 64.upto(127).map{|r|
|
557
|
+
# opts[]
|
558
|
+
# }
|
559
|
+
|
368
560
|
# State objects
|
369
561
|
opts['rm'].value = UR::Rtde::ROBOTMODE[data['robot_mode']]
|
370
562
|
opts['sm'].value = UR::Rtde::SAFETYMODE[data['safety_mode']]
|
@@ -383,29 +575,32 @@ module URUA
|
|
383
575
|
URUA::split_vector6_data(data['actual_qd'],opts['as'], opts['asa']) # Actual TCP Speed
|
384
576
|
URUA::split_vector6_data(data['actual_qd'],opts['af'], opts['afa']) # Actual TCP Force
|
385
577
|
|
386
|
-
#
|
387
|
-
if opts['
|
388
|
-
opts['
|
389
|
-
opts['rtde'].send(opts['speed'])
|
578
|
+
#speed slider or override
|
579
|
+
if opts['ov'].value != (data['target_speed_fraction'] * 100).to_i
|
580
|
+
opts['ov'].value = (data['target_speed_fraction'] * 100).to_i
|
390
581
|
end
|
582
|
+
|
391
583
|
else
|
392
584
|
if Time.now.to_i - 10 > opts['doit_rtde']
|
393
585
|
opts['doit_rtde'] = Time.now.to_i
|
394
586
|
URUA::start_rtde opts
|
395
587
|
end
|
396
588
|
end
|
397
|
-
|
398
589
|
rescue Errno::ECONNREFUSED => e
|
399
|
-
|
590
|
+
print 'ECONNREFUSED: '
|
400
591
|
puts e.message
|
401
592
|
rescue UR::Dash::Reconnect => e
|
402
593
|
URUA::start_dash opts
|
594
|
+
puts e.message
|
595
|
+
puts e.backtrace
|
596
|
+
rescue UR::Psi::Reconnect => e
|
597
|
+
URUA::start_psi opts
|
598
|
+
puts e.message
|
599
|
+
puts e.backtrace
|
403
600
|
rescue => e
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
p e.message
|
408
|
-
p e.backtrace
|
601
|
+
puts e.message
|
602
|
+
puts e.backtrace
|
603
|
+
raise
|
409
604
|
end
|
410
605
|
end
|
411
606
|
end #}}}
|
data/server/devserver.conf
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
### OPC UA specific config
|
2
2
|
### --------------------------------------------------------------------------
|
3
|
-
namespace: https://centurio.work/
|
3
|
+
namespace: https://centurio.work/urwst51
|
4
4
|
|
5
5
|
### UR specific config
|
6
6
|
### --------------------------------------------------------------------------
|
7
|
-
ipadress: 192.168.1.
|
7
|
+
ipadress: 192.168.1.25
|
8
|
+
sshport: 22
|
8
9
|
username: ur
|
9
|
-
|
10
|
+
certificate: /home/mangler/Projects/urua/server/devserver.rsa
|
10
11
|
url: /programs
|
11
12
|
|
12
13
|
### UR simulation specific config
|
13
14
|
### --------------------------------------------------------------------------
|
14
15
|
### if no password, password has to entered when server is started
|
15
|
-
# ipadress:
|
16
|
-
# username:
|
16
|
+
# ipadress: 192.168.1.25
|
17
|
+
# username: ur
|
17
18
|
# url: /home/myusername/somedirectory/ursim-current/programs.UR10
|
@@ -0,0 +1,49 @@
|
|
1
|
+
-----BEGIN OPENSSH PRIVATE KEY-----
|
2
|
+
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
|
49
|
+
-----END OPENSSH PRIVATE KEY-----
|
data/server/uruaserver.conf
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
### OPC UA specific config
|
2
2
|
### --------------------------------------------------------------------------
|
3
|
-
namespace: https://centurio.work/
|
3
|
+
namespace: https://centurio.work/ur10
|
4
4
|
|
5
5
|
### UR specific config
|
6
6
|
### --------------------------------------------------------------------------
|
7
7
|
ipadress: 10.0.31.22
|
8
|
+
sshport: 22
|
8
9
|
username: root
|
9
10
|
password: easybot
|
10
11
|
url: /programs
|
data/tools/urua
CHANGED
@@ -43,7 +43,7 @@ if command == 'scaffold'
|
|
43
43
|
dir = File.join(__dir__,'..','server')
|
44
44
|
FileUtils.cp(File.join(dir,'uruaserver.rb'),'.')
|
45
45
|
Dir[File.join(dir,'*')].each do |f|
|
46
|
-
unless File.exist?(File.join(__dir__,File.basename(f)))
|
46
|
+
unless File.exist?(File.join(__dir__,File.basename(f))) || f =~ /\/dev/
|
47
47
|
FileUtils.cp(f,'.')
|
48
48
|
end
|
49
49
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: urua
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.99.
|
4
|
+
version: 0.99.5005
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Pauker
|
8
8
|
- Juergen eTM Mangler
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: tools
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-10-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: opcua
|
@@ -29,14 +29,14 @@ dependencies:
|
|
29
29
|
name: ur-sock
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - "
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '1.0'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - "
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '1.0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
@@ -46,6 +46,9 @@ dependencies:
|
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '0.5'
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: 0.5.9
|
49
52
|
type: :runtime
|
50
53
|
prerelease: false
|
51
54
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -53,6 +56,71 @@ dependencies:
|
|
53
56
|
- - "~>"
|
54
57
|
- !ruby/object:Gem::Version
|
55
58
|
version: '0.5'
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.5.9
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: net-ssh
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '5.2'
|
69
|
+
type: :runtime
|
70
|
+
prerelease: false
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '5.2'
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: net-scp
|
78
|
+
requirement: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: ed25519
|
92
|
+
requirement: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1'
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '1.2'
|
100
|
+
type: :runtime
|
101
|
+
prerelease: false
|
102
|
+
version_requirements: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - "~>"
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '1'
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1.2'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: bcrypt_pbkdf
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '1'
|
117
|
+
type: :runtime
|
118
|
+
prerelease: false
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '1'
|
56
124
|
description: OPC UA Server for Universal Robots. See https://github.com/fpauker/urua
|
57
125
|
email: florian.pauker@gmail.com
|
58
126
|
executables:
|
@@ -65,9 +133,11 @@ files:
|
|
65
133
|
- LICENSE
|
66
134
|
- README.md
|
67
135
|
- Rakefile
|
136
|
+
- lib/rtde.conf.xml
|
68
137
|
- lib/urua.rb
|
69
138
|
- server/devserver.conf
|
70
139
|
- server/devserver.rb
|
140
|
+
- server/devserver.rsa
|
71
141
|
- server/uruaserver.conf
|
72
142
|
- server/uruaserver.rb
|
73
143
|
- tools/urua
|
@@ -75,7 +145,7 @@ homepage: https://github.com/fpauker/urua
|
|
75
145
|
licenses:
|
76
146
|
- GPL-3.0
|
77
147
|
metadata: {}
|
78
|
-
post_install_message:
|
148
|
+
post_install_message:
|
79
149
|
rdoc_options: []
|
80
150
|
require_paths:
|
81
151
|
- lib
|
@@ -90,8 +160,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
160
|
- !ruby/object:Gem::Version
|
91
161
|
version: '0'
|
92
162
|
requirements: []
|
93
|
-
rubygems_version: 3.
|
94
|
-
signing_key:
|
163
|
+
rubygems_version: 3.2.22
|
164
|
+
signing_key:
|
95
165
|
specification_version: 4
|
96
166
|
summary: OPC UA Server for Universal Robots
|
97
167
|
test_files: []
|