Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ jobs:
required-ros-distributions: humble
- uses: ros-tooling/action-ros-ci@v0.3
with:
package-name: rossdl_cmake rossdl_test
package-name: rossdl_cmake rossdl_simple_test system_a system_b application_1 application_2 application_3
target-ros2-distro: humble

4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ It starts from a file like this:
```
---
rossdl_test:
FromGitRepo: "https://github.com/jane-doe/project_example.git:branch"
fromGitRepo: "https://github.com/jane-doe/project_example.git:branch"
artifacts:
image_filter:
node: "image_filter"
Expand Down Expand Up @@ -55,7 +55,7 @@ Just place a definition file in your package, add this to CMakeLists:

```
rossdl_generate_code(${PROJECT_NAME}
"description.sdl"
"description.ros2"
${dependencies}
)
```
Expand Down
3 changes: 2 additions & 1 deletion rossdl_cmake/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ install(

install(
FILES
tests/description.sdl
tests/description.ros2
tests/description.rossystem
tests/Nodes.hpp.test
tests/Nodes.cpp.test
tests/system_1.launch.py.test
Expand Down
6 changes: 5 additions & 1 deletion rossdl_cmake/bin/sdl_generator_cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ def main(argv=sys.argv[1:]):
description='Generate ROS 2 System Code.',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)

parser.add_argument(
'--package',
required=True,
help='The current package')
parser.add_argument(
'--description-file',
required=True,
Expand All @@ -41,7 +45,7 @@ def main(argv=sys.argv[1:]):

args = parser.parse_args(argv)

generate_cpp(args.description_file,
generate_cpp(args.package, args.description_file,
args.header_out_file, args.source_out_file)


Expand Down
28 changes: 26 additions & 2 deletions rossdl_cmake/bin/sdl_generator_launch
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,34 @@ def main(argv=sys.argv[1:]):
description='Generate ROS 2 System Code.',
formatter_class=argparse.ArgumentDefaultsHelpFormatter)

parser.add_argument(
'--package',
required=True,
help='The current package')
parser.add_argument(
'--description-file',
required=True,
help='The location of the file containing the description')
parser.add_argument(
'--artifacts',
nargs='+',
# required=True,
help='The resource containing the artifact descriptions')
parser.add_argument(
'--local-artifacts',
nargs='+',
# required=True,
help='The location of the file containing the artifact descriptions')
parser.add_argument(
'--systems',
nargs='+',
# required=True,
help='The resource containing the system descriptions')
parser.add_argument(
'--local-systems',
nargs='+',
# required=True,
help='The location of the file containing the system descriptions')
parser.add_argument(
'--launch-out-file',
required=True,
Expand All @@ -41,8 +65,8 @@ def main(argv=sys.argv[1:]):

args = parser.parse_args(argv)

generate_system(args.description_file,
args.launch_out_file, args.system)
generate_system(args.package, args.description_file,
args.launch_out_file, args.system, args.artifacts, args.local_artifacts, args.systems, args.local_systems)


if __name__ == '__main__':
Expand Down
9 changes: 4 additions & 5 deletions rossdl_cmake/cmake/rossdl_generate_code.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ macro(rossdl_generate_code description_file)
endif()
endforeach()

file(READ ${_abs_file} ARTIFACTS_DESCRIPTION)
ament_index_register_resource(rossdl_artifact_descriptions CONTENT ${ARTIFACTS_DESCRIPTION})

set(RESOURCE_CPP ${ROSSDL_CMAKE_PATH}/share/rossdl_cmake/resources/nodes.cpp.em)
set(RESOURCE_HPP ${ROSSDL_CMAKE_PATH}/share/rossdl_cmake/resources/nodes.hpp.em)

Expand All @@ -73,6 +76,7 @@ macro(rossdl_generate_code description_file)
OUTPUT ${_source_out_file} ${_header_out_file}
COMMAND ros2
ARGS run rossdl_cmake sdl_generator_cpp
--package ${PROJECT_NAME}
--description-file ${_abs_file}
--header-out-file ${_header_out_file}
--source-out-file ${_source_out_file}
Expand All @@ -93,9 +97,4 @@ macro(rossdl_generate_code description_file)
RUNTIME DESTINATION lib/${PROJECT_NAME}
)

install(FILES
${_abs_file}
DESTINATION share/${PROJECT_NAME}
)

endmacro()
60 changes: 51 additions & 9 deletions rossdl_cmake/cmake/rossdl_generate_system.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -67,29 +67,71 @@ macro(rossdl_generate_system description_file system)
string(REGEX REPLACE ":([^:]*)$" "/\\1" _abs_file "${_code_tuple}")
set(_launch_out_file ${CMAKE_CURRENT_BINARY_DIR}/launch/${system}.launch.py)

file(READ ${_abs_file} ROSSDL_SYSTEM_DESCRIPTION)
ament_index_register_resource(rossdl_system_descriptions CONTENT ${ROSSDL_SYSTEM_DESCRIPTION})

ament_index_get_resources(ROSSDL_ARTIFACTS rossdl_artifact_descriptions)
ament_index_get_resources(ROSSDL_SYSTEMS rossdl_system_descriptions)

if(ROSSDL_ARTIFACTS)
set(ROSSDL_ARTIFACTS_NO_VOID ${ROSSDL_ARTIFACTS})
endif()
if(NOT ROSSDL_ARTIFACTS)
set(ROSSDL_ARTIFACTS_NO_VOID "None")
endif()

if(ROSSDL_SYSTEMS)
set(ROSSDL_SYSTEMS_NO_VOID ${ROSSDL_SYSTEMS})
endif()
if(NOT ROSSDL_SYSTEMS_NO_VOID)
set(ROSSDL_SYSTEMS_NO_VOID "None")
endif()

if(NOT ${PROJECT_NAME} IN_LIST ROSSDL_ARTIFACTS)
file(GLOB ROSSDL_LOCAL_ARTIFACTS_NO_VOID "${CMAKE_CURRENT_SOURCE_DIR}/*.ros2")
endif()
if(NOT ROSSDL_LOCAL_ARTIFACTS_NO_VOID)
set(ROSSDL_LOCAL_ARTIFACTS_NO_VOID "None")
endif()

if(NOT ${PROJECT_NAME} IN_LIST ROSSDL_SYSTEMS)
file(GLOB ROSSDL_LOCAL_SYSTEMS_NO_VOID "${CMAKE_CURRENT_SOURCE_DIR}/*.rossystem")
endif()
if(NOT ROSSDL_LOCAL_SYSTEMS_NO_VOID)
set(ROSSDL_LOCAL_SYSTEMS_NO_VOID "None")
endif()

message(STATUS "ROSSDL_ARTIFACT_NO_VOID: " ${ROSSDL_ARTIFACTS_NO_VOID})
message(STATUS "ROSSDL_LOCAL_ARTIFACTS_NO_VOID: " ${ROSSDL_LOCAL_ARTIFACTS_NO_VOID})
message(STATUS "ROSSDL_SYSTEMS_NO_VOID: " ${ROSSDL_SYSTEMS_NO_VOID})
message(STATUS "ROSSDL_LOCAL_SYSTEMS_NO_VOID: " ${ROSSDL_LOCAL_SYSTEMS_NO_VOID})

add_custom_command(
OUTPUT ${_launch_out_file}
COMMAND ros2
ARGS run rossdl_cmake sdl_generator_launch
ARGS run rossdl_cmake sdl_generator_launch
--package ${PROJECT_NAME}
--description-file ${_abs_file}
--artifacts ${ROSSDL_ARTIFACTS_NO_VOID}
--local-artifacts ${ROSSDL_LOCAL_ARTIFACTS_NO_VOID}
--systems ${ROSSDL_SYSTEMS_NO_VOID}
--local-systems ${ROSSDL_LOCAL_SYSTEMS_NO_VOID}
--launch-out-file ${_launch_out_file}
--system ${system}
DEPENDS ${_abs_file} ${RESOURCE_LAUNCH}
COMMENT "Generating launcher for ROS 2 System: ${system}"
VERBATIM
)
add_custom_target(run ALL
DEPENDS ${_launch_out_file})

add_custom_target(file_toucher
COMMAND ${CMAKE_COMMAND} -E touch_nocreate ${_abs_file})

add_custom_target(${PROJECT_NAME}_run ALL
DEPENDS ${_launch_out_file} file_toucher)

install(FILES
${_launch_out_file}
DESTINATION share/${PROJECT_NAME}/launch
)

install(FILES
${_abs_file}
DESTINATION share/${PROJECT_NAME}
)


endmacro()
37 changes: 21 additions & 16 deletions rossdl_cmake/resources/launcher.py.em
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,26 @@
# generated code does not contain a copyright notice

@{
from rossdl_cmake import get_system_to_generate
from rossdl_cmake import get_package_name
from rossdl_cmake import get_system_nodes
from rossdl_cmake import get_system_remappings
from rossdl_cmake import get_system_parameters
from rossdl_cmake import expand_subsystems

system_name = get_system_to_generate(locals())
data = locals()['data']
package_name = get_package_name(data)
system_info = data[package_name]['systems'][system_name]

remappings = get_system_remappings(data[package_name], system_name)
parameters = get_system_parameters(data[package_name], system_name)
system_name = locals()['system']
package_name = locals()['package']
systems_data = locals()['systems_data']
arfifacts = locals()['artifacts']

system_info = systems_data[package_name]['systems'][system_name]

expand_subsystems(system_info, systems_data)

remappings = get_system_remappings(system_info, arfifacts)
parameters = get_system_parameters(system_info, arfifacts)
}@

from launch_ros.actions import ComposableNodeContainer, LoadComposableNodes
from launch_ros.actions import LoadComposableNodes
from launch_ros.descriptions import ComposableNode
from launch import LaunchDescription
from launch_ros.actions import Node
Expand Down Expand Up @@ -53,8 +57,7 @@ def generate_launch_description():
target_container=container_name,
composable_node_descriptions=[
@{
system = get_system_to_generate(locals())
system_nodes = get_system_nodes(locals(), system)
system_nodes = get_system_nodes(system_info)
}@
@[for node in system_nodes]@
@{
Expand All @@ -70,16 +73,18 @@ node_name = node[0]
@(remap),
@[ end for] ],
parameters=[{
@[ for parameter in parameters[node_name]]@
@[ if node_name in list(parameters)]@
@[ for parameter in parameters[node_name]]@
@{
param_key = parameter[0]
param_value = parameter[1]
}@[ if isinstance(param_value, str)]@
}@[ if isinstance(param_value, str)]@
'@(param_key)': '@(param_value)',
@[ else]@
@[ else]@
'@(param_key)': @(param_value),
@[ end if]@
@[ end for] }],
@[ end if]@
@[ end for]@
@[ end if]@ }],
),
@[end for]@
])
Expand Down
20 changes: 10 additions & 10 deletions rossdl_cmake/resources/nodes.cpp.em
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@
@{
from rossdl_cmake import get_header_guard
from rossdl_cmake import get_message_headers
from rossdl_cmake import get_package_name
from rossdl_cmake import get_node_names
from rossdl_cmake import get_class_names_from_node
from rossdl_cmake import get_publishers_name_type_from_node
from rossdl_cmake import get_subscriptions_name_type_from_node
from rossdl_cmake import get_qos_from_node_topic
from rossdl_cmake import get_parameters_info

header_guard = get_header_guard(locals())
package_name = get_package_name(locals())
node_names = get_node_names(locals())
arfifacts = locals()['artifacts']
package_name = locals()['package']

node_names = get_node_names(package_name, arfifacts)

node_class_names = []
for node_name in node_names:
Expand All @@ -23,7 +23,7 @@ for node_name in node_names:
}@

@{
msg_headers = get_message_headers(locals())
msg_headers = get_message_headers(package_name, arfifacts)
}@
@[for header_file in msg_headers]@
#include "@(header_file)"
Expand All @@ -40,8 +40,8 @@ using std::placeholders::_1;

@[for node_name in node_class_names]@
@{
publishers_info = get_publishers_name_type_from_node(locals(), node_name[0])
subscribers_info = get_subscriptions_name_type_from_node(locals(), node_name[0])
publishers_info = get_publishers_name_type_from_node(package_name, arfifacts, node_name[0])
subscribers_info = get_subscriptions_name_type_from_node(package_name, arfifacts, node_name[0])
}@
@(node_name[1])Base::@(node_name[1])Base(const rclcpp::NodeOptions & options)
: Node("@(node_name[0])", options)
Expand All @@ -50,17 +50,17 @@ subscribers_info = get_subscriptions_name_type_from_node(locals(), node_name[0])
@(publisher_info[0])_ = create_publisher<@(publisher_info[1])>(
std::string(get_fully_qualified_name()) + "/@(publisher_info[0])",
@{
qos = get_qos_from_node_topic(locals(), node_name[0], publisher_info[0])
qos = get_qos_from_node_topic(package_name, arfifacts, node_name[0], publisher_info[0])
}@ @(qos));
@[ end for]@
@[ for subscriber_info in subscribers_info]@
@(subscriber_info[0])_ = create_subscription<@(subscriber_info[1])>(
std::string(get_fully_qualified_name()) + "/@(subscriber_info[0])",
@{qos = get_qos_from_node_topic(locals(), node_name[0], subscriber_info[0])}@
@{qos = get_qos_from_node_topic(package_name, arfifacts, node_name[0], subscriber_info[0])}@
@(qos),
std::bind(&@(node_name[1])Base::@(subscriber_info[0])_callback, this, _1));
@[ end for]@
@{parameters = get_parameters_info(locals(), node_name[0])}@
@{parameters = get_parameters_info(package_name, arfifacts, node_name[0])}@
@[ for parameter in parameters]@
@[ if parameter[1] == "std::string"]
declare_parameter("@(parameter[0])", @(parameter[1])("@(parameter[2])"));
Expand Down
16 changes: 8 additions & 8 deletions rossdl_cmake/resources/nodes.hpp.em
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,17 @@
@{
from rossdl_cmake import get_header_guard
from rossdl_cmake import get_message_headers
from rossdl_cmake import get_package_name
from rossdl_cmake import get_node_names
from rossdl_cmake import get_class_names_from_node
from rossdl_cmake import get_publishers_name_type_from_node
from rossdl_cmake import get_subscriptions_name_type_from_node

header_guard = get_header_guard(locals())
package_name = get_package_name(locals())
node_names = get_node_names(locals())

arfifacts = locals()['artifacts']
package_name = locals()['package']

header_guard = get_header_guard(package_name)
node_names = get_node_names(package_name, arfifacts)
node_class_names = []
for node_name in node_names:
node_class_names.append((node_name, get_class_names_from_node(node_name)))
Expand All @@ -27,7 +28,7 @@ for node_name in node_names:
#include <typeinfo>

@{
msg_headers = get_message_headers(locals())
msg_headers = get_message_headers(package_name, arfifacts)
}@
@[for header_file in msg_headers]@
#include "@(header_file)"
Expand All @@ -46,13 +47,13 @@ public:

protected:
@{
publishers_info = get_publishers_name_type_from_node(locals(), node_name[0])
publishers_info = get_publishers_name_type_from_node(package_name, arfifacts, node_name[0])
}@
@[ for publisher_info in publishers_info]@
rclcpp::Publisher<@(publisher_info[1])>::SharedPtr @(publisher_info[0])_;
@[ end for]@
@{
subscribers_info = get_subscriptions_name_type_from_node(locals(), node_name[0])
subscribers_info = get_subscriptions_name_type_from_node(package_name, arfifacts, node_name[0])
}@
@[ for subscriber_info in subscribers_info]@
rclcpp::Subscription<@(subscriber_info[1])>::SharedPtr @(subscriber_info[0])_;
Expand Down Expand Up @@ -110,4 +111,3 @@ subscribers_info = get_subscriptions_name_type_from_node(locals(), node_name[0])
} // namespace @(package_name)

#endif // @(header_guard)

Loading