forked from Archive/PX4-Autopilot
128 lines
5.1 KiB
Python
Executable File
128 lines
5.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Script to parse uORB message format to ROS msg format
|
|
Adapted from https://github.com/eProsima/px4_to_ros/blob/master/px4_to_ros2_PoC/px4_msgs/scripts/copy_and_rename.py
|
|
"""
|
|
|
|
import os
|
|
import re
|
|
import sys
|
|
from shutil import copyfile
|
|
|
|
__author__ = 'PX4 Development Team'
|
|
__copyright__ = \
|
|
'''
|
|
'
|
|
' Copyright (c) 2018 PX4 Development Team. All rights reserved.
|
|
'
|
|
' Redistribution and use in source and binary forms, or without
|
|
' modification, permitted provided that the following conditions
|
|
' are met:
|
|
'
|
|
' 1. Redistributions of source code must retain the above copyright
|
|
' notice, list of conditions and the following disclaimer.
|
|
' 2. Redistributions in binary form must reproduce the above copyright
|
|
' notice, list of conditions and the following disclaimer in
|
|
' the documentation and/or other materials provided with the
|
|
' distribution.
|
|
' 3. Neither the name PX4 nor the names of its contributors may be
|
|
' used to endorse or promote products derived from self software
|
|
' without specific prior written permission.
|
|
'
|
|
' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
' "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, NOT
|
|
' LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
' FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
' COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
' INCIDENTAL, SPECIAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
' BUT NOT LIMITED TO, OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
' OF USE, DATA, PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
' AND ON ANY THEORY OF LIABILITY, IN CONTRACT, STRICT
|
|
' LIABILITY, TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
' ANY WAY OUT OF THE USE OF THIS SOFTWARE, IF ADVISED OF THE
|
|
' POSSIBILITY OF SUCH DAMAGE.
|
|
'
|
|
'''
|
|
__credits__ = ['Nuno Marques <nuno.marques@dronesolution.io>']
|
|
__license__ = 'BSD-3-Clause'
|
|
__version__ = '0.1.0'
|
|
__maintainer__ = 'Nuno Marques'
|
|
__email__ = 'nuno.marques@dronesolution.io'
|
|
__status__ = 'Development'
|
|
|
|
input_dir = sys.argv[1]
|
|
output_dir = sys.argv[2]
|
|
|
|
|
|
def main():
|
|
print("----------------------- \033[1mmicroRTPS bridge uORB to ROS messages\033[0m -----------------------")
|
|
print("-------------------------------------------------------------------------------------------------------")
|
|
|
|
if not os.path.exists(os.path.abspath(output_dir)):
|
|
os.mkdir(os.path.abspath(output_dir))
|
|
else:
|
|
ros_msg_dir = os.path.abspath(output_dir)
|
|
msg_files = os.listdir(ros_msg_dir)
|
|
for msg in msg_files:
|
|
if msg.endswith(".msg"):
|
|
os.remove(os.path.join(ros_msg_dir, msg))
|
|
|
|
msg_list = list()
|
|
|
|
for filename in os.listdir(input_dir):
|
|
if '.msg' in filename:
|
|
msg_list.append(filename.rstrip('.msg'))
|
|
input_file = input_dir + filename
|
|
|
|
output_file = output_dir + \
|
|
filename.partition(".")[0].title().replace('_', '') + ".msg"
|
|
copyfile(input_file, output_file)
|
|
|
|
for filename in os.listdir(output_dir):
|
|
if '.msg' in filename:
|
|
input_file = output_dir + filename
|
|
|
|
fileUpdated = False
|
|
|
|
with open(input_file, 'r') as f:
|
|
lines = f.readlines()
|
|
newlines = []
|
|
alias_msgs = []
|
|
alias_msg_files = []
|
|
|
|
for line in lines:
|
|
for msg_type in msg_list:
|
|
if ('px4/' + msg_type + ' ') in line:
|
|
fileUpdated = True
|
|
line = line.replace(('px4/' + msg_type),
|
|
msg_type.partition(".")[0].title().replace('_', ''))
|
|
|
|
if re.findall('^' + msg_type + '[\s\[]', line.partition('#')[0]):
|
|
fileUpdated = True
|
|
line = line.replace(msg_type,
|
|
msg_type.partition(".")[0].title().replace('_', ''))
|
|
if '# TOPICS' in line:
|
|
fileUpdated = True
|
|
alias_msgs += line.split()
|
|
alias_msgs.remove('#')
|
|
alias_msgs.remove('TOPICS')
|
|
line = line.replace(line, '')
|
|
newlines.append(line)
|
|
|
|
for msg_file in alias_msgs:
|
|
with open(output_dir + msg_file.partition(".")[0].title().replace('_', '') + ".msg", 'w+') as f:
|
|
for line in newlines:
|
|
f.write(line)
|
|
|
|
if fileUpdated:
|
|
with open(input_file, 'w+') as f:
|
|
for line in newlines:
|
|
f.write(line)
|
|
|
|
print("--\t\t- Generated {} ROS message files in '{}'".format(len(os.listdir(output_dir)), os.path.abspath(output_dir)))
|
|
print("-------------------------------------------------------------------------------------------------------")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|