Arquivos
ardrone_autonomy/scripts/CreateNavdataFormat.py
T
2012-11-14 14:36:24 +01:00

91 linhas
2.6 KiB
Python

import re
PATH_NAVDATA_KEYS = '../ARDroneLib/Soft/Common/navdata_keys.h'
PATH_NAVDATA_COMMON = '../ARDroneLib/Soft/Common/navdata_common.h'
keys = []
r_keys = re.compile(r'''
^\s*[^#]?\s*?
(NAVDATA_OPTION(?:_DEMO)?)
\s*\(\s*
((?P<structure>\w+))
\s*,\s*
((?P<name>\w+))
\s*,\s*
((?P<tag>\w+))
\s*\)\s*$
''', re.X)
print 'Parsing Navdata Struct Names'
with open(PATH_NAVDATA_KEYS,'r') as navdata_keys:
for line in navdata_keys:
matches = re.search(r_keys,line)
if matches:
print '-- '+matches.group('name')
keys.append(matches.group('structure','name','tag'))
contents = ''
with open(PATH_NAVDATA_COMMON,'r') as navdata_common:
contents = navdata_common.read()
ros_datatypes = {'uint32_t':'uint32',
'uint16_t':'uint16',
'uint8_t' :'uint8',
'int32_t':'int32',
'int16_t':'int16',
'int8_t' :'int8',
'float64_t':'float64',
'float32_t':'float32',
'matrix33_t':'ardrone_autonomy::matrix33',
'vector31_t':'ardrone_autonomy::vector31',
'vector21_t':'ardrone_autonomy::vector21',
'velocities_t':'ardrone_autonomy::vector31',
'char':'uint8',
'bool_t':'int32'}
structs = []
print 'Parsing Navdata Struct Contents'
for (struct,name,_) in keys:
members = []
rg = re.compile(r'''
.*?
typedef\s*struct\s*_?'''+struct+r'''\s*\{
(?P<inside>.*)
\}\s*\w*?\s*'''+struct+r'''\s*;
.*?
''',re.X|re.DOTALL|re.MULTILINE)
structcontents = re.search(rg,contents)
if structcontents:
print '-- '+name
allmembers = re.findall(r'\s*(\w+(?:\s*?\*)?)\s*(\w+)\s*(?:\[(\w+)\])?\s*;(.*)',structcontents.groups('inside')[0])
members = [(t,n,s) for (t,n,s,c) in allmembers if 'Deprecated' not in c]
structs.append((struct,name,members))
print 'Saving Custom ROS Message Definitions'
for (struct,name,members) in structs:
with open('../msg/'+name+'.msg','w') as f:
f.write('Header header\n')
f.write('float64 drone_time')
for (t,n,s) in members:
dt = ros_datatypes[t]
if s!='':
f.write('{0}[] {1}\n'.format(dt,n))
else:
f.write('{0} {1}\n'.format(dt,n))
print 'Saving Struct Preprocessor File'
with open('../src/NavdataMessageDefinitions.h','w') as f:
for (struct,name,members) in structs:
f.write('NavdataStructStart({0},{1})\n'.format(struct,name))
for (t,n,s) in members:
dt = ros_datatypes[t]
if s!='':
f.write('NavdataStructArray({0},{1},{2},{3},{4},{5})\n'.format(struct,name,t,dt,s,n))
else:
f.write('NavdataStructMember({0},{1},{2},{3},{4})\n'.format(struct,name,t,dt,n))
f.write('NavdataStructEnd({0},{1})\n\n'.format(struct,name))
print 'You should now run `rosmake ardrone_autonomy` to build the custom messages.'