Skip to content

Commit 447afe8

Browse files
authored
Merge pull request #203 from ipa-nhg/LaunchFileGenerator
First preliminary draft for the launch file generator for ROS2
2 parents 3cff8e4 + a0da77a commit 447afe8

6 files changed

Lines changed: 526 additions & 5 deletions

File tree

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package de.fraunhofer.ipa.rossystem.generator
2+
3+
import com.google.inject.Inject
4+
import system.System
5+
6+
class CMakeListsCompiler {
7+
8+
@Inject extension GeneratorHelpers
9+
10+
11+
// def compile_CMakeLists_ROS1(RosSystem system, ComponentStack stack) '''«init_pkg()»
12+
//cmake_minimum_required(VERSION 2.8.3)
13+
//project(«IF stack===null»«system.name.toLowerCase»«ELSE»«system.name.toLowerCase»_«stack.name.toLowerCase»«ENDIF»)
14+
//
15+
//find_package(catkin REQUIRED)
16+
//
17+
//catkin_package()
18+
//
19+
//
20+
//### INSTALL ###
21+
//install(DIRECTORY launch
22+
// DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
23+
//)'''
24+
25+
def compile_CMakeLists_ROS2(System system) '''«init_pkg()»
26+
cmake_minimum_required(VERSION 3.5)
27+
projectsystem.name.toLowerCase»)
28+
29+
# Default to C++14
30+
if(NOT CMAKE_CXX_STANDARD)
31+
set(CMAKE_CXX_STANDARD 14)
32+
endif()
33+
34+
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
35+
add_compile_options(-Wall -Wextra -Wpedantic)
36+
endif()
37+
38+
find_package(ament_cmake REQUIRED)
39+
40+
### INSTALL ###
41+
install(DIRECTORY launch
42+
DESTINATION share/${PROJECT_NAME}
43+
)
44+
45+
ament_package()
46+
'''
47+
48+
49+
}
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package de.fraunhofer.ipa.rossystem.generator
2+
3+
import java.util.ArrayList
4+
import ros.ActionClient
5+
import ros.ActionServer
6+
import ros.Parameter
7+
import ros.Publisher
8+
import ros.ServiceClient
9+
import ros.ServiceServer
10+
import ros.Subscriber
11+
import system.System
12+
import java.util.List
13+
import ros.Node
14+
import ros.impl.PackageImpl
15+
import org.eclipse.emf.ecore.EObject
16+
import java.util.Set
17+
import java.util.HashSet
18+
import ros.Dependency
19+
import ros.PackageDependency
20+
import system.Component
21+
import system.RosNode
22+
import ros.impl.AmentPackageImpl
23+
24+
class GeneratorHelpers {
25+
26+
boolean PackageSet
27+
28+
AmentPackageImpl package_impl
29+
List<CharSequence> PkgsList
30+
String Pkg
31+
RosNode node
32+
33+
def void init_pkg(){
34+
PackageSet=false
35+
}
36+
37+
def <String> getPkgsDependencies (System rossystem){
38+
PkgsList = new ArrayList()
39+
for (component: rossystem.components){
40+
init_pkg()
41+
node = component as RosNode
42+
Pkg = node.compile_pkg.toString()
43+
if (!PkgsList.contains(Pkg)){
44+
PkgsList.add(Pkg)
45+
}
46+
return PkgsList;
47+
}
48+
49+
}
50+
51+
def compile_pkg(RosNode component)
52+
'''«IF !(component.from===null)»«component.from.getPackage_node.name»«ENDIF»'''
53+
54+
// def PackageImpl get_pkg(ComponentInterface component) {
55+
// if (component.fromRosNode!==null){
56+
// return getPackage_node(component.fromRosNode)
57+
// } else if(!component.rospublisher.empty){
58+
// return getPacakge_fromObject(component.rospublisher.get(0).publisher)
59+
// } else if (!component.rossubscriber.empty){
60+
// return getPacakge_fromObject(component.rossubscriber.get(0).subscriber)
61+
// } else if (!component.rosserviceclient.empty){
62+
// return getPacakge_fromObject(component.rosserviceclient.get(0).srvclient)
63+
// } else if (!component.rosserviceserver.empty){
64+
// return getPacakge_fromObject(component.rosserviceserver.get(0).srvserver)
65+
// } else if (!component.rosactionclient.empty){
66+
// return getPacakge_fromObject(component.rosactionclient.get(0).actclient)
67+
// } else if (!component.rosactionserver.empty){
68+
// return getPacakge_fromObject(component.rosactionserver.get(0).actserver)
69+
// } else if (!component.rosparameter.empty){
70+
// return getPacakge_fromObject(component.rosparameter.get(0).parameter)
71+
// }
72+
// }
73+
//
74+
// def getPacakge_fromObject (EObject object){
75+
// package_impl = object.eContainer.eContainer.eContainer as PackageImpl;
76+
// return package_impl;
77+
// }
78+
//
79+
// def getPackage_pub(Publisher publisher){
80+
// package_impl = publisher.eContainer.eContainer.eContainer as PackageImpl;
81+
// return package_impl;
82+
// }
83+
// def getPackage_sub(Subscriber subscriber){
84+
// package_impl = subscriber.eContainer.eContainer.eContainer as PackageImpl;
85+
// return package_impl;
86+
// }
87+
// def getPackage_srvserv(ServiceServer serviceserver){
88+
// package_impl = serviceserver.eContainer.eContainer.eContainer as PackageImpl;
89+
// return package_impl;
90+
// }
91+
// def getPackage_srvcli(ServiceClient serviceclient){
92+
// package_impl = serviceclient.eContainer.eContainer.eContainer as PackageImpl;
93+
// return package_impl;
94+
// }
95+
// def getPackage_actserver(ActionServer actionserver){
96+
// package_impl = actionserver.eContainer.eContainer.eContainer as PackageImpl;
97+
// return package_impl;
98+
// }
99+
// def getPackage_actclient(ActionClient actionclient){
100+
// package_impl = actionclient.eContainer.eContainer.eContainer as PackageImpl;
101+
// return package_impl;
102+
// }
103+
// def getPackage_rosparam (Parameter param){
104+
// package_impl = param.eContainer.eContainer.eContainer as PackageImpl;
105+
// return package_impl;
106+
// }
107+
def getPackage_node (Node node){
108+
package_impl = node.eContainer.eContainer as AmentPackageImpl;
109+
return package_impl;
110+
}
111+
112+
//Launch files generators
113+
// def check_ns(ComponentInterface component){
114+
// if (component.hasNS){
115+
// return component.get_ns();
116+
// }else {
117+
// return "";
118+
// }
119+
// }
120+
// def boolean hasNS(ComponentInterface component){
121+
// if(!component.nameSpace.nullOrEmpty){
122+
// return true;
123+
// }else{
124+
// return false
125+
// }
126+
// }
127+
// def String get_ns(ComponentInterface component){
128+
// return component.nameSpace.replaceFirst("/","");
129+
// }
130+
//
131+
// def compile_pkg_type(ComponentInterface component)
132+
//'''«IF !(component.fromRosNode===null) »«component.fromRosNode.getPackageType_node»«ELSEIF !PackageSet && !component.rospublisher.empty»«FOR Rospublisher:component.rospublisher»«IF !PackageSet»«Rospublisher.publisher.getPackageType_pub()»«ENDIF»«ENDFOR»«ELSEIF !PackageSet && !component.rossubscriber.empty»«FOR Rossubscriber:component.rossubscriber»«IF !PackageSet»«Rossubscriber.subscriber.getPackageType_sub()»«ENDIF»«ENDFOR»«ELSEIF !PackageSet && !component.rosserviceserver.empty»«FOR Rosserviceserver:component.rosserviceserver»«IF !PackageSet»«Rosserviceserver.srvserver.getPackageType_srvserv()»«ENDIF»«ENDFOR»«ELSEIF !PackageSet && !component.rosserviceclient.empty»«FOR Rosserviceclient:component.rosserviceclient»«IF !PackageSet»«Rosserviceclient.srvclient.getPackageType_srvcli()»«ENDIF»«ENDFOR»«ELSEIF !PackageSet && !component.rosparameter.empty»«FOR Rosparameter:component.rosparameter»«IF !PackageSet»«Rosparameter.parameter.getPackageType_rosparam()»«ENDIF»«ENDFOR»«ELSEIF !PackageSet && !component.rosactionserver.empty»«FOR RosActionSever:component.rosactionserver»«IF !PackageSet»«RosActionSever.actserver.getPackageType_actserver()»«ENDIF»«ENDFOR»«ELSEIF !PackageSet && !component.rosactionclient.empty»«FOR RosActionClient:component.rosactionclient»«IF !PackageSet»«RosActionClient.actclient.getPackageType_actclient()»«ENDIF»«ENDFOR»«ENDIF»'''
133+
//
134+
// def getPackageType_pub(Publisher publisher){
135+
// return publisher.eContainer.eContainer.eContainer as PackageImpl;
136+
// }
137+
// def getPackageType_sub(Subscriber subscriber){
138+
// return subscriber.eContainer.eContainer.eContainer as PackageImpl;
139+
// }
140+
// def getPackageType_srvserv(ServiceServer serviceserver){
141+
// return serviceserver.eContainer.eContainer.eContainer as PackageImpl;
142+
// }
143+
// def getPackageType_srvcli(ServiceClient serviceclient){
144+
// return serviceclient.eContainer.eContainer.eContainer as PackageImpl;
145+
// }
146+
// def getPackageType_actserver(ActionServer actionserver){
147+
// return actionserver.eContainer.eContainer.eContainer as PackageImpl;
148+
// }
149+
// def getPackageType_actclient(ActionClient actionclient){
150+
// return actionclient.eContainer.eContainer.eContainer as PackageImpl;
151+
// }
152+
// def getPackageType_rosparam (Parameter param){
153+
// return param.eContainer.eContainer.eContainer as PackageImpl;
154+
// }
155+
// def getPackageType_node (Node node){
156+
// return node.eContainer.eContainer as PackageImpl;
157+
// }
158+
159+
160+
}
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
package de.fraunhofer.ipa.rossystem.generator
2+
3+
import system.RosNode
4+
import ros.RosPackage
5+
import ros.Artifact
6+
import system.System
7+
import ros.AmentPackage
8+
import ros.impl.AmentPackageImpl
9+
10+
class LaunchFileCompiler_ROS2 {
11+
12+
13+
def compile_toROS2launch(System system) '''
14+
from launch import LaunchDescription
15+
from launch_ros.actions import Node
16+
17+
def generate_launch_description():
18+
ld = LaunchDescription()
19+
20+
«FOR component:system.components»
21+
«(component as RosNode).name» = Node(
22+
package="«((component as RosNode).from.eContainer.eContainer as AmentPackageImpl).name»",
23+
executable="«((component as RosNode).from.eContainer as Artifact).name»",
24+
name="«(component as RosNode).name»"
25+
)
26+
27+
«ENDFOR»
28+
29+
«FOR component:system.components»
30+
ld.add_action(«(component as RosNode).name»)
31+
«ENDFOR»
32+
33+
return ld
34+
'''
35+
36+
// def void compile_list_of_ROS2components(RosSystem system, ComponentStack stack) {
37+
// components_tmp_.clear;
38+
// Ros2components.clear;
39+
// if (stack === null){
40+
// components_tmp_ = system.rosComponent;
41+
// } else {
42+
// components_tmp_ = stack.rosComponent;
43+
// }
44+
// for(ComponentInterface component:components_tmp_){
45+
// if (component.compile_pkg_type.toString.contains("AmentPackage")){
46+
// Ros2components.add(component);
47+
// }
48+
// }
49+
// }
50+
//
51+
// def check_ns(ComponentInterface component){
52+
// if (component.hasNS){
53+
// return component.get_ns();
54+
// }else {
55+
// return "";
56+
// }
57+
// }
58+
//
59+
// def List<String> InterfaceDef(String name, String type){
60+
// ListInterfaceDef = new ArrayList()
61+
// ListInterfaceDef.add(name.replace("/","_"))
62+
// ListInterfaceDef.add(name)
63+
// ListInterfaceDef.add(type)
64+
// return ListInterfaceDef
65+
// }
66+
//
67+
// def boolean hasNS(ComponentInterface component){
68+
// if(!component.nameSpace.nullOrEmpty){
69+
// return true;
70+
// }else{
71+
// return false
72+
// }
73+
// }
74+
// def String get_ns(ComponentInterface component){
75+
// return component.nameSpace.replaceFirst("/","");
76+
// }
77+
//
78+
// def String compile_remappings_str(ComponentInterface component) {
79+
// var remap_str = "";
80+
// val NS = component.check_ns();
81+
// for (rosPublisher : component.rospublisher) {
82+
// if (!((prefix(NS)+rosPublisher.name).equals(compile_topic_name(rosPublisher.publisher, NS)))) {
83+
// remap_str += "\t(\"" + rosPublisher.publisher.name + "\", \"" + rosPublisher.name + "\"),\n";
84+
// }
85+
// }
86+
// for (rosSubscriber : component.rossubscriber) {
87+
// if (!((prefix(NS)+rosSubscriber.name).equals(compile_topic_name(rosSubscriber.subscriber, NS)))) {
88+
// remap_str += "\t(\"" + rosSubscriber.subscriber.name + "\", \"" + rosSubscriber.name + "\"),\n";
89+
// }
90+
// }
91+
// for (rosServiceServer : component.rosserviceserver) {
92+
// if (!((prefix(NS)+rosServiceServer.name).equals(compile_service_name(rosServiceServer.srvserver, NS)))) {
93+
// remap_str += "\t(\"" + rosServiceServer.srvserver.name + "\", \"" + rosServiceServer.name + "\"),\n";
94+
// }
95+
// }
96+
// for (rosServiceClient : component.rosserviceclient) {
97+
// if (!((prefix(NS)+rosServiceClient.name).equals(compile_service_name(rosServiceClient.srvclient, NS)))) {
98+
// remap_str += "\t(\"" + rosServiceClient.srvclient.name + "\", \"" + rosServiceClient.name + "\"),\n";
99+
// }
100+
// }
101+
// for (rosActionServer : component.rosactionserver) {
102+
// if (!((prefix(NS)+rosActionServer.name).equals(compile_action_name(rosActionServer.actserver, NS)))) {
103+
// remap_str += "\t(\"" + rosActionServer.actserver.name + "\", \"" + rosActionServer.name + "\"),\n";
104+
// }
105+
// }
106+
// for (rosActionClient : component.rosactionclient) {
107+
// if (!((prefix(NS)+rosActionClient.name).equals(compile_action_name(rosActionClient.actclient, NS)))) {
108+
// remap_str += "\t(\"" + rosActionClient.actclient.name + "\", \"" + rosActionClient.name + "\"),\n";
109+
// }
110+
// }
111+
// if (!remap_str.empty) {
112+
// remap_str = ",\nremappings=[\n" + remap_str.substring(0,remap_str.length-2) + "]\n";
113+
// }
114+
// return remap_str;
115+
// }
116+
//
117+
// def String compile_parameters_str(EList<RosParameter> rosParameters) {
118+
// param_count = rosParameters.length;
119+
// var param_str = "";
120+
// for (rosParameter : rosParameters) {
121+
// val param_count=param_count--;
122+
// if (rosParameter.parameter.type instanceof ParameterStructTypeImpl) {
123+
// param_str += compile_struct_str(rosParameter.value, rosParameter.parameter.name);
124+
// } else {
125+
// param_str += "{ \"" + rosParameter.parameter.name + "\" : " + get_param_value(rosParameter.value, rosParameter.parameter.name);
126+
// }
127+
// if (param_count > 1){
128+
// param_str +=" },\n"
129+
// } else {
130+
// param_str +=" }\n";
131+
// }
132+
// }
133+
// return param_str;
134+
// }
135+
//
136+
// def String compile_struct_str(ParameterValue value, String name) {
137+
// var param_str = "";
138+
// var elem_count = (value as ParameterSequenceImpl).eContents.length;
139+
//
140+
// for (elem : ((value as ParameterSequenceImpl).eContents)) {
141+
// var member = ((elem as ParameterStructImpl).eContents.get(0) as ParameterStructMemberImpl);
142+
// val param_val = get_param_value(member.getValue(), name + "/" + member.getName());
143+
// if (param_val.startsWith("{")) {
144+
// param_str += param_val;
145+
// } else {
146+
// param_str += "{ \"" + name + "/" + member.getName() + "\" : " + param_val;
147+
// }
148+
// elem_count--;
149+
// if (elem_count > 0){
150+
// param_str +=" },\n"
151+
// }
152+
// }
153+
// return param_str;
154+
// }
155+
//
156+
// def String get_param_value(ParameterValue value, String name) {
157+
// var param_val = "";
158+
// if (value instanceof ParameterStringImpl) {
159+
// param_val = "\"" + (value as ParameterStringImpl).getValue() + "\"";
160+
// } else if (value instanceof ParameterIntegerImpl) {
161+
// param_val = (value as ParameterIntegerImpl).getValue().toString;
162+
// } else if (value instanceof ParameterDoubleImpl) {
163+
// param_val = (value as ParameterDoubleImpl).getValue().toString;
164+
// } else if (value instanceof ParameterBooleanImpl) {
165+
// param_val = (value as ParameterBooleanImpl).isValue().toString;
166+
// } else if (value instanceof ParameterSequenceImpl) {
167+
// var elem_count = (value as ParameterSequenceImpl).eContents.length;
168+
// if ((value as ParameterSequenceImpl).eContents.get(0) instanceof ParameterStructImpl) {
169+
// param_val = compile_struct_str(value, name);
170+
// } else {
171+
// param_val += "[";
172+
// for (elem : (value as ParameterSequenceImpl).eContents) {
173+
// param_val += get_param_value(elem as ParameterValue, name);
174+
// elem_count--;
175+
// if (elem_count > 0){
176+
// param_val +=", "
177+
// }
178+
// }
179+
// param_val += "]";
180+
// }
181+
// }
182+
// return param_val;
183+
// }
184+
}

0 commit comments

Comments
 (0)