Arquivos
ardrone_autonomy/scripts/CreateNavdataFormat.py
T
Mike Hamer ca5fadf778 Added custom messages and handling code
We now have the ability to access any of the navdata structs which are
sent back by the drone. Still to do is to enable/disable the drone
sending based on whether we're interested in receiving the message.
2012-11-21 12:53:33 +01:00

113 linhas
3.3 KiB
Python

import re
from mako.template import Template
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' :('std_msgs::UInt32','uint32_t'),
'uint16_t' :('std_msgs::UInt16','uint16_t'),
'uint8_t' :('std_msgs::UInt8','uint8_t'),
'int32_t' :('std_msgs::Int32','int32_t'),
'int16_t' :('std_msgs::Int16','int16_t'),
'int8_t' :('std_msgs::Int8','int8_t'),
'float64_t' :('std_msgs::Float64','float64_t'),
'float32_t' :('std_msgs::Float32','float32_t'),
'matrix33_t' :('ardrone_autonomy::matrix33','ardrone_autonomy::matrix33'),
'vector31_t' :('ardrone_autonomy::vector31','ardrone_autonomy::vector31'),
'vector21_t' :('ardrone_autonomy::vector21','ardrone_autonomy::vector21'),
'screen_point_t' :('ardrone_autonomy::vector21','ardrone_autonomy::vector21'),
'velocities_t' :('ardrone_autonomy::vector31','ardrone_autonomy::vector31'),
'char' :('std_msgs::UInt8','char'),
'bool_t' :('std_msgs::Int32','bool_t')}
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*/+-]+)\])?\s*;(.*)',structcontents.groups('inside')[0])
members = [(t,n,s) for (b,t,n,s,c) in allmembers if 'Deprecated' not in c and '//' not in b]
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\n')
for (t,n,s) in members:
dt = ros_datatypes[t][0]
dt = dt.rpartition('::')[2].lower()
if s!='':
f.write('{0}[] {1}\n'.format(dt,n))
else:
f.write('{0} {1}\n'.format(dt,n))
print 'Generating C Source'
items = []
for (struct_type, struct_name, members) in structs:
item = {}
item['struct_name'] = struct_name
item['members'] = []
for (c_type,name,size) in members:
member = {}
member['name'] = name
member['c_type'] = c_type
member['include'] = ros_datatypes[c_type][0]
member['ros_type'] = ros_datatypes[c_type][1]
member['array_size'] = size if size!='' else None
item['members'].append(member)
items.append(item)
template = Template(filename='NavdataMessageDefinitionsTemplate.c');
with open('../src/NavdataMessageDefinitions.h','w') as f:
f.write(template.render(structs=items))
print 'You should now run `rosmake ardrone_autonomy` to build the custom messages.'