Migrating Interfaces

Messages, services, and actions are collectively called interfaces in ROS 2.

Interface definitions

Message files must end in .msg and must be located in the subfolder msg. Service files must end in .srv and must be located in the subfolder srv. Actions files must end in .action and must be located in the subfolder action.

These files might need to be updated to comply with the ROS Interface definition. Some primitive types have been removed and the types duration and time which were builtin types in ROS 1 have been replaced with normal message definitions and must be used from the builtin_interfaces package. Also some naming conventions are stricter than in ROS 1. There is additional information in the conceptual article.

Building interfaces

The way in which interfaces are built in ROS 2 differs substantially from ROS 1. Interfaces can only be built from packages containing a CMakeLists.txt. If you are developing a pure Python package, then the interfaces should be placed in a different package containing only the interfaces (which is best practice anyway). See the custom interfaces tutorial for more information.

Migrating interface package to ROS 2

In your package.xml:

  • Add <buildtool_depend>rosidl_default_generators</buildtool_depend>.

  • Add <exec_depend>rosidl_default_runtime</exec_depend>.

  • Add <member_of_group>rosidl_interface_packages</member_of_group>

  • For each dependent message package, add <depend>message_package</depend>.

In your CMakeLists.txt:

  • Enable C++17

set(CMAKE_CXX_STANDARD 17)
  • Add find_package(rosidl_default_generators REQUIRED)

  • For each dependent message package, add find_package(message_package REQUIRED) and replace the CMake function call to generate_messages with rosidl_generate_interfaces.

This will replace add_message_files and add_service_files listing of all the message and service files, which can be removed.