ANNarchy iCub Interface 1.1.1
Loading...
Searching...
No Matches
Special_Features.py
1"""
2 Copyright (C) 2022 Torsten Fietzek; Helge Ülo Dinkelbach
3
4 Special_Features.py is part of the iCub ANNarchy interface
5
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 The iCub ANNarchy interface is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this headers. If not, see <http://www.gnu.org/licenses/>.
18 """
19
20import os
21import xml.etree.ElementTree as ET
22from typing import Tuple
23from xml.dom import minidom
24
25from .iCub.iCub_Interface import ANNiCub_wrapper
26from .iCub.Joint_Writer import PyJointWriter
27from .iCub.Joint_Reader import PyJointReader
28from .iCub.Kinematic_Writer import PyKinematicWriter
29from .iCub.Kinematic_Reader import PyKinematicReader
30from .iCub.Skin_Reader import PySkinReader
31from .iCub.Visual_Reader import PyVisualReader
32
33
34def _text_to_list(liststring):
35 l_x = liststring.strip('[]').replace('\'', '').replace(' ', '')
36 if len(l_x) == 0:
37 return list(l_x)
38
39 return [int(x) for x in l_x.split(",")]
40
41
42def create_robot_interface_file(filename_config: str, filename_interface: str = "./robot_interface.py"):
43 """Create file with interface init code.
44
45 Parameters
46 ----------
47 filename_config :
48 filename of XML config file
49 filename_interface :
50 filename of created interface file (Default value = "./robot_interface.py")
51
52 Returns
53 -------
54
55 """
56
57 file_template = {}
58
59 file_template["comment_file"] = "\"\"\" Generated file for ANNarchy-iCub-interface usage. \"\"\"\n\n"
60 file_template["import_const"] = "\nimport ANN_iCub_Interface.Vocabs as iCub_Constants\n"
61 file_template["import_interface"] = "from ANN_iCub_Interface.iCub import iCub_Interface"
62 file_template["create_instance"] = "{0[var]}{0[count]} = {0[mod]}.{0[type]}()\n"
63 file_template["args_dict"] = "args_{var}{count} = {cont}\n"
64 file_template["comment_mod"] = "## Create and initialize {mod} instances.\n"
65 file_template["instance_init"] = "{var}{count}.init(iCub, **args_{var}{count})\n\n"
66 file_template["instance_init_grpc"] = "{var}{count}.init_grpc(iCub, **args_{var}{count})\n\n"
67
68 file_data = []
69 file_data.append(file_template["comment_file"])
70 file_data.append(file_template["import_const"])
71 file_data.append("## Create main interface wrapper class\n")
72 file_data.append(file_template["create_instance"].format({'var': "iCub", "count": "", "mod": "iCub_Interface", "type": "ANNiCub_wrapper"}) + "\n\n")
73
74 # Read from XML
75 if os.path.isfile(filename_config):
76 tree = ET.parse(filename_config)
77 robot = tree.getroot()
78
79 if robot is not None:
80 # init joint reader
81 jreader = []
82 for idx, jread in enumerate(robot.iter('JReader')):
83 args = {"name": jread.attrib['name']}
84 grpc = False
85 no_error_jread = True
86 if jread.find('part') is None:
87 print(args['name'], "Element part is missing")
88 no_error_jread = False
89 else:
90 args['part'] = jread.find('part').text
91 if jread.find('sigma') is None:
92 print(args['name'], "Element sigma is missing")
93 no_error_jread = False
94 else:
95 args['sigma'] = float(jread.find('sigma').text)
96 if jread.find('popsize') is None:
97 if jread.find('n_pop') is None:
98 print(args['name'], "Element popsize is missing")
99 no_error_jread = False
100 else:
101 args['n_pop'] = int(jread.find('n_pop').text)
102 else:
103 args['n_pop'] = int(jread.find('popsize').text)
104 if jread.find('ini_path') is None:
105 print(args['name'], "Element ini_path is missing")
106 no_error_jread = False
107 else:
108 args['ini_path'] = jread.find('ini_path').text
109 if not jread.find('ip_address') is None:
110 args['ip_address'] = jread.find('ip_address').text
111 if not jread.find('port') is None:
112 args['port'] = int(jread.find('port').text)
113 grpc = True
114 if jread.find('deg_per_neuron') is not None:
115 args['degr_per_neuron'] = float(jread.find('deg_per_neuron').text)
116
117 if no_error_jread:
118 jreader.append(file_template["create_instance"].format({'var': "jreader", "count": idx, "mod": "Joint_Reader", "type": "PyJointReader"}))
119 jreader.append(file_template["args_dict"].format(var="jreader", count=idx, cont=str(args)))
120 if grpc:
121 jreader.append(file_template["instance_init_grpc"].format(count=idx, var="jreader"))
122 else:
123 jreader.append(file_template["instance_init"].format(count=idx, var="jreader"))
124 else:
125 print("Skipped Joint Reader '" + jread.attrib['name'] + "' init due to missing element")
126
127 if len(jreader) > 0:
128 file_data.append(file_template["comment_mod"].format(mod="Joint Reader"))
129 file_template["import_interface"] += ", Joint_Reader"
130 file_data.extend(jreader)
131 file_data.append("\n")
132
133 # init joint writer
134 jwriter = []
135 for idx, jwrite in enumerate(robot.iter('JWriter')):
136 args = {"name": jwrite.attrib['name']}
137 grpc = False
138 no_error_jwrite = True
139 if jwrite.find('part') is None:
140 print(args['name'], "Element part is missing")
141 no_error_jwrite = False
142 else:
143 args['part'] = jwrite.find('part').text
144 if jwrite.find('popsize') is None:
145 if jwrite.find('n_pop') is None:
146 print(args['name'], "Element popsize is missing")
147 no_error_jwrite = False
148 else:
149 args['n_pop'] = int(jwrite.find('n_pop').text)
150 else:
151 args['n_pop'] = int(jwrite.find('popsize').text)
152 if jwrite.find('speed') is None:
153 print(args['name'], "Element speed is missing")
154 no_error_jwrite = False
155 else:
156 args['speed'] = float(jwrite.find('speed').text)
157 if jwrite.find('ini_path') is None:
158 print(args['name'], "Element ini_path is missing")
159 no_error_jwrite = False
160 else:
161 args['ini_path'] = jwrite.find('ini_path').text
162 if not jwrite.find('ip_address') is None:
163 args['ip_address'] = jwrite.find('ip_address').text
164 if not jwrite.find('port') is None:
165 args['port'] = int(jwrite.find('port').text)
166 if not jwrite.find('mode') is None:
167 args['mode'] = jwrite.find('mode').text
168 if not jwrite.find('blocking') is None:
169 args['blocking'] = eval(jwrite.find('blocking').text.capitalize())
170 if not jwrite.find('joint_select') is None:
171 args['joints'] = _text_to_list(jwrite.find('joint_select').text)
172 grpc = True
173 elif not jwrite.find('joints') is None:
174 args['joints'] = _text_to_list(jwrite.find('joints').text)
175 grpc = True
176 if jwrite.find('deg_per_neuron') is not None:
177 args['degr_per_neuron'] = float(jwrite.find('deg_per_neuron').text)
178
179 if no_error_jwrite:
180 jwriter.append(file_template["create_instance"].format({'var': "jwriter", "count": idx, "mod": "Joint_Writer", "type": "PyJointWriter"}))
181 jwriter.append(file_template["args_dict"].format(var="jwriter", count=idx, cont=str(args)))
182 if grpc:
183 jwriter.append(file_template["instance_init_grpc"].format(count=idx, var="jwriter"))
184 else:
185 jwriter.append(file_template["instance_init"].format(count=idx, var="jwriter"))
186
187 if len(jwriter) > 0:
188 file_data.append(file_template["comment_mod"].format(mod="Joint Writer"))
189 file_template["import_interface"] += ", Joint_Writer"
190 file_data.extend(jwriter)
191 file_data.append("\n")
192
193 # init visual reader
194 vreader = []
195 for idx, vread in enumerate(robot.iter('VisReader')):
196 args = {"name": vread.attrib['name']}
197 grpc = False
198 no_error_vread = True
199 if vread.find('eye') is None:
200 print(args['name'], "Element eye is missing")
201 no_error_vread = False
202 else:
203 args['eye'] = vread.find('eye').text
204 if (vread.find('fov_width') is None) or (vread.find('fov_height') is None):
205 print(args['name'], "Element fov_width or fov_height is missing")
206 no_error_vread = False
207 else:
208 args['fov_width'] = float(vread.find('fov_width').text)
209 args['fov_height'] = float(vread.find('fov_height').text)
210 if (vread.find('img_width') is None) or (vread.find('img_height') is None):
211 print(args['name'], "Element img_width or img_height is missing")
212 no_error_vread = False
213 else:
214 args['img_width'] = int(vread.find('img_width').text)
215 args['img_height'] = int(vread.find('img_height').text)
216 if vread.find('fast_filter') is None:
217 print(args['name'], "Element fast_filter is missing")
218 no_error_vread = False
219 else:
220 args['fast_filter'] = eval(vread.find('fast_filter').text.capitalize())
221 if vread.find('ini_path') is None:
222 print(args['name'], "Element ini_path is missing")
223 no_error_vread = False
224 else:
225 args['ini_path'] = vread.find('ini_path').text
226 if not vread.find('ip_address') is None:
227 args['ip_address'] = vread.find('ip_address').text
228 if not vread.find('port') is None:
229 args['port'] = int(vread.find('port').text)
230 grpc = True
231 if no_error_vread:
232 vreader.append(file_template["create_instance"].format({'var': "vreader", "count": idx, "mod": "Visual_Reader", "type": "PyVisualReader"}))
233 vreader.append(file_template["args_dict"].format(var="vreader", count=idx, cont=str(args)))
234 if grpc:
235 vreader.append(file_template["instance_init_grpc"].format(count=idx, var="vreader"))
236 else:
237 vreader.append(file_template["instance_init"].format(count=idx, var="vreader"))
238 else:
239 print("Skipped Visual Reader init due to missing element")
240
241 if len(vreader) > 0:
242 file_data.append(file_template["comment_mod"].format(mod="Visual Reader"))
243 file_template["import_interface"] += ", Visual_Reader"
244 file_data.extend(vreader)
245 file_data.append("\n")
246
247 # init tactile reader
248 sreader = []
249 for idx, sread in enumerate(robot.iter('TacReader')):
250 args = {"name": sread.attrib['name']}
251 grpc = False
252 no_error_sread = True
253 if sread.find('arm') is None:
254 print(args['name'], "Element arm is missing")
255 no_error_sread = False
256 else:
257 args['arm'] = sread.find('arm').text
258 if sread.find('normalize') is None:
259 print(args['name'], "Element norm is missing")
260 no_error_sread = False
261 else:
262 args['norm'] = eval(sread.find('normalize').text.capitalize())
263 if sread.find('ini_path') is None:
264 print(args['name'], "Element ini_path is missing")
265 no_error_sread = False
266 else:
267 args['ini_path'] = sread.find('ini_path').text
268 if not sread.find('ip_address') is None:
269 args['ip_address'] = sread.find('ip_address').text
270 if not sread.find('port') is None:
271 args['port'] = int(sread.find('port').text)
272 grpc = True
273 if no_error_sread:
274 sreader.append(file_template["create_instance"].format({'var': "sreader", "count": idx, "mod": "Skin_Reader", "type": "PySkinReader"}))
275 sreader.append(file_template["args_dict"].format(var="sreader", count=idx, cont=str(args)))
276 if grpc:
277 sreader.append(file_template["instance_init_grpc"].format(count=idx, var="sreader"))
278 else:
279 sreader.append(file_template["instance_init"].format(count=idx, var="sreader"))
280 else:
281 print("Skipped Skin Reader '" + sread.attrib['name'] + "' init due to missing element")
282
283 if len(sreader) > 0:
284 file_data.append(file_template["comment_mod"].format(mod="Skin Reader"))
285 file_template["import_interface"] += ", Skin_Reader"
286 file_data.extend(sreader)
287 file_data.append("\n")
288
289 # init kinematic reader
290 kreader = []
291 for idx, kread in enumerate(robot.iter('KinReader')):
292 args = {"name": kread.attrib['name']}
293 grpc = False
294 no_error_kread = True
295 if kread.find('part') is None:
296 print(args['name'], "Element part is missing!")
297 no_error_kread = False
298 else:
299 args['part'] = kread.find('part').text
300 if kread.find('version') is None:
301 print(args['name'], "Element version is missing!")
302 no_error_kread = False
303 else:
304 args['version'] = float(kread.find('version').text)
305 if kread.find('ini_path') is None:
306 print(args['name'], "Element ini_path is missing!")
307 no_error_kread = False
308 else:
309 args['ini_path'] = kread.find('ini_path').text
310 if kread.find('offline_mode') is None:
311 print(args['name'], "Standard value for element 'offline_mode' is used.")
312 args['offline_mode'] = False
313 else:
314 args['offline_mode'] = eval(kread.find('offline_mode').text.capitalize())
315 if not kread.find('ip_address') is None:
316 args['ip_address'] = kread.find('ip_address').text
317 if not kread.find('port') is None:
318 args['port'] = int(kread.find('port').text)
319 grpc = True
320 if no_error_kread:
321 kreader.append(file_template["create_instance"].format({'var': "kreader", "count": idx, "mod": "Kinematic_Reader", "type": "PyKinematicReader"}))
322 kreader.append(file_template["args_dict"].format(var="kreader", count=idx, cont=str(args)))
323 if grpc:
324 kreader.append(file_template["instance_init_grpc"].format(count=idx, var="kreader"))
325 else:
326 kreader.append(file_template["instance_init"].format(count=idx, var="kreader"))
327 else:
328 print("Skipped Kinematic Reader '" + kread.attrib['name'] + "' init due to missing element")
329
330 if len(kreader) > 0:
331 file_data.append(file_template["comment_mod"].format(mod="Kinematic Reader"))
332 file_template["import_interface"] += ", Kinematic_Reader"
333 file_data.extend(kreader)
334 file_data.append("\n")
335
336 # init kinematic writer
337 kwriter = []
338 for idx, kwrite in enumerate(robot.iter('KinWriter')):
339 args = {"name": kwrite.attrib['name']}
340 grpc = False
341 no_error_kwrite = True
342 if kwrite.find('part') is None:
343 print(args['name'], "Element part is missing")
344 no_error_kwrite = False
345 else:
346 args['part'] = kwrite.find('part').text
347 if kwrite.find('version') is None:
348 print(args['name'], "Element version is missing")
349 no_error_kwrite = False
350 else:
351 args['version'] = float(kwrite.find('version').text)
352 if kwrite.find('ini_path') is None:
353 print(args['name'], "Element ini_path is missing")
354 no_error_kwrite = False
355 else:
356 args['ini_path'] = kwrite.find('ini_path').text
357 if not kwrite.find('ip_address') is None:
358 args['ip_address'] = kwrite.find('ip_address').text
359 if not kwrite.find('port') is None:
360 args['port'] = int(kwrite.find('port').text)
361 grpc = True
362 if no_error_kwrite:
363 kwriter.append(file_template["create_instance"].format({'var': "kwriter", "count": idx, "mod": "Kinematic_Writer", "type": "PyKinematicWriter"}))
364 kwriter.append(file_template["args_dict"].format(var="kwriter", count=idx, cont=str(args)))
365 if grpc:
366 kwriter.append(file_template["instance_init_grpc"].format(count=idx, var="kwriter"))
367 else:
368 kwriter.append(file_template["instance_init"].format(count=idx, var="kwriter"))
369 else:
370 print("Skipped Kinematic Writer '" + kwrite.attrib['name'] + "' init due to missing element")
371
372 if len(kwriter) > 0:
373 file_data.append(file_template["comment_mod"].format(mod="Kinematic Writer"))
374 file_template["import_interface"] += ", Kinematic_Writer"
375 file_data.extend(kwriter)
376 file_data.append("\n")
377
378 else:
379 print("Failed to read XML-file")
380 else:
381 print("Not a valid XML-Filepath given!")
382
383 # Write to python file
384 file_data.insert(2, file_template["import_interface"] + "\n\n\n")
385 with open(filename_interface, "w", encoding="utf-8") as file:
386 file.writelines(file_data)
387
388
389'''
390# Global loading/ saving methods for whole interface configuration
391'''
392
393# initialize interface for a robot configuration defined in a XML-file
394def init_robot_from_file(iCub: ANNiCub_wrapper, xml_file: str) -> Tuple[bool, dict]:
395 """Init iCub interface with the modules given in the xml-file
396
397 Parameters
398 ----------
399 xml_file : str
400 filename of the xml-config-file
401
402 Returns
403 -------
404 Tuple[bool, str]
405 Returns a bool value representing the success of the init and a dicionary containing the module names for each module type
406 """
407 name_dict = {}
408
409 if os.path.isfile(xml_file):
410 tree = ET.parse(xml_file)
411 robot = tree.getroot()
412
413 if robot is not None:
414 # init joint reader
415 for jread in robot.iter('JReader'):
416 args = {'name': jread.attrib['name']}
417 grpc = False
418 no_error_jread = True
419 if jread.find('part') is None:
420 print("Element part is missing")
421 no_error_jread = False
422 else:
423 args['part'] = jread.find('part').text
424 if jread.find('sigma') is None:
425 print("Element sigma is missing")
426 no_error_jread = False
427 else:
428 args['sigma'] = float(jread.find('sigma').text)
429 if jread.find('popsize') is None:
430 if jread.find('pop_size') is None:
431 if jread.find('n_pop') is None:
432 print("Element popsize is missing")
433 no_error_jread = False
434 else:
435 args['n_pop'] = int(jread.find('n_pop').text)
436 else:
437 args['n_pop'] = int(jread.find('pop_size').text)
438 else:
439 args['n_pop'] = int(jread.find('popsize').text)
440 if jread.find('ini_path') is None:
441 print("Element ini_path is missing")
442 no_error_jread = False
443 else:
444 args['ini_path'] = jread.find('ini_path').text
445 if jread.find('ip_address') is not None:
446 args['ip_address'] = jread.find('ip_address').text
447 if jread.find('port') is not None:
448 args['port'] = int(jread.find('port').text)
449 grpc = True
450 if jread.find('deg_per_neuron') is not None:
451 args['degr_per_neuron'] = float(jread.find('deg_per_neuron').text)
452
453 if no_error_jread:
454 reader = PyJointReader()
455 if grpc:
456 if not reader.init_grpc(iCub, **args):
457 print("Init Joint Reader '" + jread.attrib['name'] + "' failed!")
458 else:
459 if not reader.init(iCub, **args):
460 print("Init Joint Reader '" + jread.attrib['name'] + "' failed!")
461 else:
462 print("Skipped Joint Reader '" + jread.attrib['name'] + "' init due to missing element")
463
464 # init joint writer
465 for jwrite in robot.iter('JWriter'):
466 args = {'name': jwrite.attrib['name']}
467 grpc = False
468 no_error_jwrite = True
469 if jwrite.find('part') is None:
470 print("Element part is missing")
471 no_error_jwrite = False
472 else:
473 args['part'] = jwrite.find('part').text
474 if jwrite.find('popsize') is None:
475 if jwrite.find('pop_size') is None:
476 if jwrite.find('n_pop') is None:
477 print("Element n_pop is missing")
478 no_error_jwrite = False
479 else:
480 args['n_pop'] = int(jwrite.find('n_pop').text)
481 else:
482 args['n_pop'] = int(jwrite.find('pop_size').text)
483 else:
484 args['n_pop'] = int(jwrite.find('popsize').text)
485 if jwrite.find('speed') is not None:
486 args['speed'] = float(jwrite.find('speed').text)
487 if jwrite.find('ini_path') is None:
488 print("Element ini_path is missing")
489 no_error_jwrite = False
490 else:
491 args['ini_path'] = jwrite.find('ini_path').text
492 if jwrite.find('ip_address') is not None:
493 args['ip_address'] = jwrite.find('ip_address').text
494 if jwrite.find('port') is not None:
495 args['port'] = int(jwrite.find('port').text)
496 if jwrite.find('mode') is not None:
497 args['mode'] = jwrite.find('mode').text
498 if jwrite.find('blocking') is not None:
499 args['blocking'] = eval(jwrite.find('blocking').text.capitalize())
500 if jwrite.find('joint_select') is not None:
501 args['joints'] = _text_to_list(jwrite.find('joint_select').text)
502 grpc = True
503 elif jwrite.find('joints') is not None:
504 args['joints'] = _text_to_list(jwrite.find('joints').text)
505 grpc = True
506 if jwrite.find('deg_per_neuron') is not None:
507 args['deg_per_neuron'] = float(jwrite.find('deg_per_neuron').text)
508
509 if no_error_jwrite:
510 writer = PyJointWriter()
511 if grpc:
512 if not writer.init_grpc(iCub, **args):
513 print("Init Joint Writer '" + jwrite.attrib['name'] + "' failed!")
514 else:
515 if not writer.init(iCub, **args):
516 print("Init Joint Writer '" + jwrite.attrib['name'] + "' failed!")
517 else:
518 print("Skipped Joint Writer '" + jwrite.attrib['name'] + "' init due to missing element")
519
520 # init visual reader
521 for vread in robot.iter('VisReader'):
522 args = {'name': vread.attrib['name']}
523 grpc = False
524 no_error_vread = True
525 if vread.find('eye') is None:
526 print("Element eye is missing")
527 no_error_vread = False
528 else:
529 args['eye'] = vread.find('eye').text
530 if vread.find('fov_width') is not None:
531 args['fov_width'] = float(vread.find('fov_width').text)
532 if vread.find('fov_height') is not None:
533 args['fov_height'] = float(vread.find('fov_height').text)
534 if vread.find('img_width') is not None:
535 args['img_width'] = int(vread.find('img_width').text)
536 if vread.find('img_height') is not None:
537 args['img_height'] = int(vread.find('img_height').text)
538 if vread.find('fast_filter') is not None:
539 args['fast_filter'] = eval(vread.find('fast_filter').text.capitalize())
540 if vread.find('ini_path') is None:
541 print("Element ini_path is missing")
542 no_error_vread = False
543 else:
544 args['ini_path'] = vread.find('ini_path').text
545 if vread.find('ip_address') is not None:
546 args['ip_address'] = vread.find('ip_address').text
547 if vread.find('port') is not None:
548 args['port'] = int(vread.find('port').text)
549 grpc = True
550 if no_error_vread:
551 vreader = PyVisualReader()
552 if grpc:
553 if not vreader.init_grpc(iCub, **args):
554 print("Init Visual Reader '" + vread.attrib['name'] + "' failed!")
555 else:
556 if not vreader.init(iCub, **args):
557 print("Init Visual Reader '" + vread.attrib['name'] + "' failed!")
558 else:
559 print("Skipped Visual Reader init due to missing element")
560
561 # init tactile reader
562 for sread in robot.iter('TacReader'):
563 args = {'name': sread.attrib['name']}
564 grpc = False
565 no_error_sread = True
566 if sread.find('arm') is None:
567 print("Element arm is missing")
568 no_error_sread = False
569 else:
570 args['arm'] = sread.find('arm').text
571 if sread.find('normalize') is None:
572 if sread.find('norm_data') is None:
573 if sread.find('norm') is None:
574 print("Element norm is missing")
575 no_error_sread = False
576 else:
577 args['norm'] = eval(sread.find('norm').text.capitalize())
578 else:
579 args['norm'] = eval(sread.find('norm_data').text.capitalize())
580 else:
581 args['norm'] = eval(sread.find('normalize').text.capitalize())
582 if sread.find('ini_path') is None:
583 print("Element ini_path is missing")
584 no_error_sread = False
585 else:
586 args['ini_path'] = sread.find('ini_path').text
587 if sread.find('ip_address') is not None:
588 args['ip_address'] = sread.find('ip_address').text
589 if sread.find('port') is not None:
590 args['port'] = int(sread.find('port').text)
591 grpc = True
592 if no_error_sread:
593 sreader = PySkinReader()
594 if grpc:
595 if not sreader.init_grpc(iCub, **args):
596 print("Init Skin Reader '" + sread.attrib['name'] + "' failed!")
597 else:
598 if not sreader.init(iCub, **args):
599 print("Init Skin Reader '" + sread.attrib['name'] + "' failed!")
600 else:
601 print("Skipped Skin Reader '" + sread.attrib['name'] + "' init due to missing element")
602
603 # init kinematic reader
604 for kread in robot.iter('KinReader'):
605 args = {'name': kread.attrib['name']}
606 grpc = False
607 no_error_kread = True
608
609 if kread.find('part') is None:
610 print("Element part is missing")
611 no_error_kread = False
612 else:
613 args['part'] = kread.find('part').text
614 if kread.find('version') is None:
615 print("Element version is missing")
616 no_error_kread = False
617 else:
618 args['version'] = float(kread.find('version').text)
619 if kread.find('ini_path') is None:
620 print("Element ini_path is missing")
621 no_error_kread = False
622 else:
623 args['ini_path'] = kread.find('ini_path').text
624 if kread.find('offline_mode') is not None:
625 args['offline_mode'] = eval(kread.find('offline_mode').text.capitalize())
626
627 if kread.find('ip_address') is not None:
628 args['ip_address'] = kread.find('ip_address').text
629 if kread.find('port') is not None:
630 args['port'] = int(kread.find('port').text)
631 grpc = True
632
633 if no_error_kread:
634 kreader = PyKinematicReader()
635 if grpc:
636 if not kreader.init_grpc(iCub, **args):
637 print("Init Kinematic Reader '" + kread.attrib['name'] + "' failed!")
638 else:
639 if not kreader.init(iCub, **args):
640 print("Init Kinematic Reader '" + kread.attrib['name'] + "' failed!")
641 else:
642 print("Skipped Kinematic Reader '" + kread.attrib['name'] + "' init due to missing element")
643
644 # init kinematic writer
645 for kwrite in robot.iter('KinWriter'):
646 args = {}
647 grpc = False
648 no_error_kwrite = True
649 if kwrite.find('part') is None:
650 print("Element part is missing")
651 no_error_kwrite = False
652 else:
653 args['part'] = kwrite.find('part').text
654 if kwrite.find('version') is None:
655 print("Element version is missing")
656 no_error_kwrite = False
657 else:
658 args['version'] = float(kwrite.find('version').text)
659 if kwrite.find('ini_path') is None:
660 print("Element ini_path is missing")
661 no_error_kwrite = False
662 else:
663 args['ini_path'] = kwrite.find('ini_path').text
664 if kwrite.find('ip_address') is not None:
665 args['ip_address'] = kwrite.find('ip_address').text
666 if kwrite.find('port') is not None:
667 args['port'] = int(kwrite.find('port').text)
668 grpc = True
669
670 if no_error_kwrite:
671 kwriter = PyKinematicWriter()
672 if grpc:
673 if not kwriter.init_grpc(iCub, **args):
674 print("Init Kinematic Writer '" + kwrite.attrib['name'] + "' failed!")
675 else:
676 if not kwriter.init(iCub, **args):
677 print("Init Kinematic Writer '" + kwrite.attrib['name'] + "' failed!")
678 else:
679 print("Skipped Kinematic Writer '" + kwrite.attrib['name'] + "' init due to missing element")
680
681 name_dict["Joint_Reader"] = iCub._get_jreader_dict().keys()
682 name_dict["Joint_Writer"] = iCub._get_jwriter_dict().keys()
683 name_dict["Skin_Reader"] = iCub._get_sreader_dict().keys()
684 name_dict["Visual_Reader"] = iCub._get_vreader_dict().keys()
685 name_dict["Kinematic_Reader"] = iCub._get_kreader_dict().keys()
686 name_dict["Kinematic_Writer"] = iCub._get_kwriter_dict().keys()
687
688 return True, name_dict
689 else:
690 print("Failed to read XML-file")
691 return False, name_dict
692 else:
693 print("Not a valid XML-Filepath given!")
694 return False, name_dict
695
696# save robot robot configuration as XML-file
697def save_robot_to_file(iCub: ANNiCub_wrapper, xml_file: str, description: str = ""):
698 """Save robot configuration to xml-config file
699
700 Parameters
701 ----------
702 xml_file : str
703 filename for the xml-config-file
704 description : str
705 optional description added as comment in the robot section. Defaults to "".
706
707 Returns
708 -------
709
710 """
711 root = ET.Element("robot")
712 root.append(ET.Comment(description))
713
714 for name, module in iCub._get_jreader_dict().items():
715 jreader = ET.SubElement(root, "JReader", attrib={"name": name})
716 jread_param = module._get_parameter()
717 for key, value in jread_param.items():
718 ET.SubElement(jreader, key.decode('utf-8')).text = value.decode('utf-8')
719
720 for name, module in iCub._get_jwriter_dict().items():
721 jwriter = ET.SubElement(root, "JWriter", attrib={"name": name})
722 jwrite_param = module._get_parameter()
723 for key, value in jwrite_param.items():
724 ET.SubElement(jwriter, key.decode('utf-8')).text = value.decode('utf-8')
725
726 for name, module in iCub._get_vreader_dict().items():
727 vreader = ET.SubElement(root, "VisReader", attrib={"name": name})
728 vread_param = module._get_parameter()
729 for key, value in vread_param.items():
730 ET.SubElement(vreader, key.decode('utf-8')).text = value.decode('utf-8')
731
732 for name, module in iCub._get_sreader_dict().items():
733 sreader = ET.SubElement(root, "TacReader", attrib={"name": name})
734 sread_param = module._get_parameter()
735 for key, value in sread_param.items():
736 ET.SubElement(sreader, key.decode('utf-8')).text = value.decode('utf-8')
737
738 for name, module in iCub._get_kreader_dict().items():
739 kreader = ET.SubElement(root, "KinReader", attrib={"name": name})
740 kread_param = module._get_parameter()
741 for key, value in kread_param.items():
742 ET.SubElement(kreader, key.decode('utf-8')).text = value.decode('utf-8')
743
744 for name, module in iCub._get_kwriter_dict().items():
745 kwriter = ET.SubElement(root, "KinWriter", attrib={"name": name})
746 kwrite_param = module._get_parameter()
747 for key, value in kwrite_param.items():
748 ET.SubElement(kwriter, key.decode('utf-8')).text = value.decode('utf-8')
749
750 xml_file_string = minidom.parseString(ET.tostring(root, 'utf-8')).toprettyxml(indent=" ")
751 with open(xml_file, "w", encoding="utf-8") as files:
752 files.write(xml_file_string)
create_robot_interface_file(str filename_config, str filename_interface="./robot_interface.py")
Tuple[bool, dict] init_robot_from_file(ANNiCub_wrapper iCub, str xml_file)
save_robot_to_file(ANNiCub_wrapper iCub, str xml_file, str description="")