Skip to content

Commit

Permalink
HotFix: update to support the latest version of the RosModelParser mo…
Browse files Browse the repository at this point in the history
…dule
  • Loading branch information
ipa-nhg committed May 26, 2021
1 parent 406149d commit 2a05f19
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 80 deletions.
3 changes: 3 additions & 0 deletions foxy/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,8 @@ For example:
[sudo] docker run -it haros_foxy:latest /haros_runner.sh sick_safetyscanners2 sick_safetyscanners2_node node . /root/ws https://github.com/SICKAG/sick_safetyscanners2
[sudo] docker run -it haros_foxy:latest /haros_runner.sh turtlesim turtlesim_node node . /root/ws https://github.com/ros/ros_tutorials foxy-devel
[sudo] docker run -it haros_foxy:latest /haros_runner.sh test_ros2 test_ros2 node . /root/ws https://github.com/ipa-nhg/test_ros2_code_extractor
```

29 changes: 19 additions & 10 deletions haros_runner.sh
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,11 @@ then
if [ $PYTHON_VERSION == "2" ]
then
python /ros_model_extractor.py --package "$1" --name "$2" --"${3}" --model-path "${4}" --ws "${5}">> extractor.log
cat extractor.log
#cat extractor.log
elif [ $PYTHON_VERSION == "3" ]
then
python3 /ros_model_extractor.py --package "$1" --name "$2" --"${3}" --model-path "${4}" --ws "${5}" --path-to-src "$path_to_src_code">> extractor.log
cat extractor.log
#cat extractor.log
else
echo "Python version not supported"
exit
Expand All @@ -85,11 +85,20 @@ else
echo "Python setup not found"
fi

echo "###########"
echo "~~~~~~~~~~~"
echo "Print of the model: $2.ros:"
echo "~~~~~~~~~~~"
cat "${4}"/"$2".ros
echo ""
echo "~~~~~~~~~~~"
echo "###########"


if [ ! -f "${4}"/"$2".ros ]; then
echo "~~~~~~~~~~~"
echo "The model couldn't be generated, the analisys failed. See the following report:"
cat extractor.log
echo "~~~~~~~~~~~"
else
echo "###########"
echo "~~~~~~~~~~~"
echo "Print of the model: $2.ros:"
echo "~~~~~~~~~~~"
cat "${4}"/"$2".ros
echo ""
echo "~~~~~~~~~~~"
echo "###########"
fi
141 changes: 71 additions & 70 deletions ros_model_extractor.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import argparse
import subprocess
from ros_model_generator.rosmodel_generator import RosModelGenerator
import ros_metamodels.ros_metamodel_core as RosModelMetamodel

import rospkg
#import ament_index_python
from haros.extractor import NodeExtractor, RoscppExtractor, RospyExtractor
Expand Down Expand Up @@ -69,6 +71,7 @@ def extract_node(self, name, node_name, pkg_name, ns, ws, rossystem):
if os.path.isfile(os.path.join(self.pkg.path, "CMakeLists.txt")):
parser.parse(os.path.join(self.pkg.path, "CMakeLists.txt"))
for target in parser.executables.values():
print("INFO: Found artifact: "+target.output_name)
if target.output_name == node_name:
for file_in in target.files:
full_path = file_in
Expand All @@ -86,20 +89,18 @@ def extract_node(self, name, node_name, pkg_name, ns, ws, rossystem):
for sf in node.source_files:
try:
if parser.parse(sf.path) is not None:
# ROS MODEL EXTRACT PRIMITIVES
# ROS MODEL EXTRACT PRIMITIVES
if node.language == "py":
node_name=node_name.replace(".py","")
RosModel = RosModelGenerator()
RosModel.setPackageName(self.pkg.name)
RosModel.setArtifactName(name)
RosModel.setNodeName(node_name)
roscomponent = ros_component(name, ns)
RosModel_node=RosModelMetamodel.Node(node_name)
try:
self.extract_primitives(node, parser, analysis, RosModel, roscomponent, pkg_name, node_name, name)
self.extract_primitives(node, parser, analysis, RosModel_node, roscomponent, pkg_name, node_name, name)
# SAVE ROS MODEL
model_str = RosModel.dump_ros_model(self.args.model_path+"/"+name+".ros")
except:
pass
ros_model = RosModelGenerator()
ros_model.create_model_from_node(self.pkg.name,name, RosModel_node)
model_str = ros_model.generate_ros_model(self.args.model_path+"/"+name+".ros")
except error:
print("The interfaces can't be extracted "+error)
else:
print("The model couldn't be extracted")
except:
Expand All @@ -109,90 +110,51 @@ def extract_node(self, name, node_name, pkg_name, ns, ws, rossystem):
if self.args.output:
print(model_str)

def extract_primitives(self, node, parser, analysis, RosModel, roscomponent, pkg_name, node_name, art_name):
gs = parser.global_scope
node.source_tree = parser.global_scope
def extract_primitives(self, node, parser, analysis, RosModel_node, roscomponent, pkg_name, node_name, art_name):
gs = parser.global_scope
node.source_tree = parser.global_scope
if os.environ.get("ROS_VERSION") == "1":
if node.language == "cpp":
#print(CodeQuery(gs).all_calls.get())
for call in (CodeQuery(gs).all_calls.where_name("SimpleActionServer").get()):
if len(call.arguments) > 0:
name = analysis._extract_action(call)
action_type = analysis._extract_action_type(call).split("_<",1)[0]
RosModel.addActionServer.append(name,action_type.replace("/","."))
roscomponent.add_interface(name,"actsrvs", pkg_name+"."+art_name+"."+node_name+"."+name)
RosModel_node.add_action_server(name,action_type.replace("/","."))
#roscomponent.add_interface(name,"actsrvs", pkg_name+"."+art_name+"."+node_name+"."+name)
for call in (CodeQuery(gs).all_calls.where_name("SimpleActionClient").get()):
if len(call.arguments) > 0:
name = analysis._extract_action(call)
action_type = analysis._extract_action_type(call).split("_<",1)[0]
RosModel.addActionClient.append(name,action_type.replace("/","."))
roscomponent.add_interface(name,"actcls", str(pkg_name)+"."+str(art_name)+"."+str(node_name)+"."+str(name))
RosModel_node.add_action_client.append(name,action_type.replace("/","."))
#roscomponent.add_interface(name,"actcls", str(pkg_name)+"."+str(art_name)+"."+str(node_name)+"."+str(name))
for call in (CodeQuery(gs).all_calls.where_name("advertise").where_result("ros::Publisher").get()):
if len(call.arguments) > 1:
name = analysis._extract_topic(call, topic_pos=0)
msg_type = analysis._extract_message_type(call)
queue_size = analysis._extract_queue_size(call, queue_pos=1)
RosModel.addPublisher(name, msg_type.replace("/","."))
roscomponent.add_interface(name,"pubs", pkg_name+"."+art_name+"."+node_name+"."+name)
RosModel_node.add_publisher(name, msg_type.replace("/","."))
#roscomponent.add_interface(name,"pubs", pkg_name+"."+art_name+"."+node_name+"."+name)
for call in (CodeQuery(gs).all_calls.where_name("subscribe").where_result("ros::Subscriber").get()):
if len(call.arguments) > 1:
name = analysis._extract_topic(call, topic_pos=0)
msg_type = analysis._extract_message_type(call)
queue_size = analysis._extract_queue_size(call, queue_pos=1)
RosModel.addSubscriber(name, msg_type.replace("/","."))
roscomponent.add_interface(name,"subs", pkg_name+"."+art_name+"."+node_name+"."+name)
RosModel_node.add_subscriber(name, msg_type.replace("/","."))
#roscomponent.add_interface(name,"subs", pkg_name+"."+art_name+"."+node_name+"."+name)
for call in (CodeQuery(gs).all_calls.where_name("advertiseService").where_result("ros::ServiceServer").get()):
if len(call.arguments) > 1:
name = analysis._extract_topic(call)
srv_type = analysis._extract_message_type(call)
RosModel.addServiceServer(name, srv_type.replace("/",".").replace("Request",""))
roscomponent.add_interface(name,"srvsrvs", pkg_name+"."+art_name+"."+node_name+"."+name)
RosModel_node.add_service_server(name, srv_type.replace("/",".").replace("Request",""))
#roscomponent.add_interface(name,"srvsrvs", pkg_name+"."+art_name+"."+node_name+"."+name)
for call in (CodeQuery(gs).all_calls.where_name("serviceClient").where_result("ros::ServiceClient").get()):
if len(call.arguments) > 1:
name = analysis._extract_topic(call)
srv_type = analysis._extract_message_type(call)
RosModel.addServiceClient(name, srv_type.replace("/",".").replace("Response",""))
roscomponent.add_interface(name,"srvcls", pkg_name+"."+art_name+"."+node_name+"."+name)
#ROS2
for call in (CodeQuery(gs).all_calls.get()):
if "Publisher" in str(call):
#print(call)
if len(call.arguments) > 1:
name = analysis._extract_topic(call, topic_pos=0)
msg_type = analysis._extract_message_type(call)
queue_size = analysis._extract_queue_size(call, queue_pos=1)
if name!="?" or msg_type!="?":
RosModel.addPublisher(name, msg_type.replace("/",".").replace(".msg",""))
roscomponent.add_interface(name,"pubs", pkg_name+"."+art_name+"."+node_name+"."+name)
for call in (CodeQuery(gs).all_calls.get()):
if "Subscription" in str(call):
#print(call)
if len(call.arguments) > 1:
name = analysis._extract_topic(call, topic_pos=0)
msg_type = analysis._extract_message_type(call)
queue_size = analysis._extract_queue_size(call, queue_pos=1)
if name!="?" or msg_type!="?":
RosModel.addSubscriber(name, msg_type.replace("/",".").replace(".msg",""))
roscomponent.add_interface(name,"subs", pkg_name+"."+art_name+"."+node_name+"."+name)
for call in (CodeQuery(gs).all_calls.get()):
if "Service" in str(call):
#print(call)
if len(call.arguments) > 1:
name = analysis._extract_topic(call, topic_pos=0)
srv_type = analysis._extract_message_type(call)
queue_size = analysis._extract_queue_size(call, queue_pos=1)
if name!="?" or srv_type!="?":
RosModel.addServiceServer(name, srv_type.replace("/",".").replace(".srv",""))
roscomponent.add_interface(name,"srvsrvs", pkg_name+"."+art_name+"."+node_name+"."+name)
for call in (CodeQuery(gs).all_calls.get()):
if "Client" in str(call):
#print(call)
if len(call.arguments) > 1:
name = analysis._extract_topic(call, topic_pos=0)
srv_type = analysis._extract_message_type(call)
queue_size = analysis._extract_queue_size(call, queue_pos=1)
if name!="?" or srv_type!="?":
RosModel.addServiceClient(name, srv_type.replace("/",".").replace(".srv",""))
roscomponent.add_interface(name,"srvcls", pkg_name+"."+art_name+"."+node_name+"."+name)
RosModel_node.add_service_client(name, srv_type.replace("/",".").replace("Response",""))
#roscomponent.add_interface(name,"srvcls", pkg_name+"."+art_name+"."+node_name+"."+name)

if node.language == "py":
msgs_list=[]
for i in parser.imported_names_list:
Expand All @@ -203,27 +165,66 @@ def extract_primitives(self, node, parser, analysis, RosModel, roscomponent, pkg
ns, name = analysis._extract_topic(call)
msg_type = analysis._extract_message_type(call, 'data_class', msgs_list)
queue_size = analysis._extract_queue_size(call )
RosModel.addPublisher(name, msg_type.replace("/","."))
RosModel_node.add_publisher(name, msg_type.replace("/","."))
roscomponent.add_interface(name,"pubs", pkg_name+"."+art_name+"."+node_name+"."+name)
for call in (CodeQuery(gs).all_calls.where_name(('Subscriber', 'rospy.Subscriber'))).get():
if len(call.arguments) > 1:
ns, name = analysis._extract_topic(call)
msg_type = analysis._extract_message_type(call, 'data_class', msgs_list)
queue_size = analysis._extract_queue_size(call )
RosModel.addSubscriber(name, msg_type.replace("/","."))
RosModel_node.add_subscriber(name, msg_type.replace("/","."))
roscomponent.add_interface(name,"subs", pkg_name+"."+art_name+"."+node_name+"."+name)
for call in (CodeQuery(gs).all_calls.where_name(analysis.all_rospy_names('service-def'))).get():
if len(call.arguments) > 1:
ns, name = analysis._extract_topic(call)
srv_type = analysis._extract_message_type(call, 'service_class', msgs_list)
RosModel.addServiceServer(name, srv_type.replace("/",".").replace("Request",""))
RosModel_node.add_service_server(name, srv_type.replace("/",".").replace("Request",""))
roscomponent.add_interface(name,"srvsrvs", pkg_name+"."+art_name+"."+node_name+"."+name)
for call in (CodeQuery(gs).all_calls.where_name(analysis.all_rospy_names('service-call'))).get():
if len(call.arguments) > 1:
ns, name = analysis._extract_topic(call)
srv_type = analysis._extract_message_type(call, 'service_class', msgs_list)
RosModel.addServiceClient(name, srv_type.replace("/",".").replace("Response",""))
RosModel_node.add_service_client(name, srv_type.replace("/",".").replace("Response",""))
roscomponent.add_interface(name,"srvcls", pkg_name+"."+art_name+"."+node_name+"."+name)
if os.environ.get("ROS_VERSION") == "2":
#ROS2
if node.language == "cpp":
for call in (CodeQuery(gs).all_calls.get()):
if "Publisher" in str(call):
#print(call)
if len(call.arguments) > 1:
name = analysis._extract_topic(call, topic_pos=0)
msg_type = analysis._extract_message_type(call)
queue_size = analysis._extract_queue_size(call, queue_pos=1)
if name!="?" or msg_type!="?":
RosModel_node.add_publisher(name, msg_type.replace("/",".").replace(".msg",""))
for call in (CodeQuery(gs).all_calls.get()):
if "Subscription" in str(call):
#print(call)
if len(call.arguments) > 1:
name = analysis._extract_topic(call, topic_pos=0)
msg_type = analysis._extract_message_type(call)
queue_size = analysis._extract_queue_size(call, queue_pos=1)
if name!="?" or msg_type!="?":
RosModel_node.add_subscriber(name, msg_type.replace("/",".").replace(".msg",""))
for call in (CodeQuery(gs).all_calls.get()):
if "Service" in str(call):
#print(call)
if len(call.arguments) > 1:
name = analysis._extract_topic(call, topic_pos=0)
srv_type = analysis._extract_message_type(call)
queue_size = analysis._extract_queue_size(call, queue_pos=1)
if name!="?" or srv_type!="?":
RosModel_node.add_service_server(name, srv_type.replace("/",".").replace(".srv",""))
for call in (CodeQuery(gs).all_calls.get()):
if "Client" in str(call):
#print(call)
if len(call.arguments) > 1:
name = analysis._extract_topic(call, topic_pos=0)
srv_type = analysis._extract_message_type(call)
queue_size = analysis._extract_queue_size(call, queue_pos=1)
if name!="?" or srv_type!="?":
RosModel_node.add_service_client(name, srv_type.replace("/",".").replace(".srv",""))

def parse_arg(self):
parser = argparse.ArgumentParser()
Expand Down

0 comments on commit 2a05f19

Please sign in to comment.