-
-
Notifications
You must be signed in to change notification settings - Fork 78
feat: initial ROS2 AsyncAPI contribution by SIEMENS AG #270
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
gramss
wants to merge
13
commits into
asyncapi:master
Choose a base branch
from
gramss:master
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
13 commits
Select commit
Hold shift + click to select a range
7872c4f
Initial ROS2 AsyncAPI contribution by SIEMENS AG. This was a team eff…
3d21380
Merge branch 'master' into master
asyncapi-bot f62254f
Merge branch 'asyncapi:master' into master
gramss a1e9876
feat: apply initial suggestions from Fran in the pull request
463fb3d
feat: update README with comments from the PR.
f6380c3
added message header definition and complete example
5e6bbc8
fix ros 2 typo
gramss 9654072
Update ros2/README.md
fmvilas 13162bf
Update ros2/README.md
fmvilas 766a870
Update ros2/README.md
fmvilas 167b15a
Update ros2/README.md
fmvilas 1c60da6
final touches to address gavanderhoorn concerns regarding different r…
d64de7a
add @amparo-siemens and me as codeowners of the ros2 binding
gramss File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -17,3 +17,4 @@ | |
| /pulsar/ @VisualBean | ||
| /sns/ @dpwdec @iancooper | ||
| /sqs/ @dpwdec @iancooper | ||
| /ros2/ @amparo-siemens @gramss | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,330 @@ | ||
| # ROS 2 Bindings | ||
|
|
||
| This document defines how to describe ROS 2-specific information in AsyncAPI. | ||
|
|
||
| It applies to all [distributions of ROS 2](https://docs.ros.org/en/rolling/Releases.html). | ||
|
|
||
| <a name="version"></a> | ||
|
|
||
| ## Version | ||
|
|
||
| Current version is `0.1.0`. | ||
|
|
||
| <a name="server"></a> | ||
|
|
||
| ## Server Binding Object | ||
|
|
||
| This object contains information about the server representation in ROS 2. | ||
| ROS 2 can use a vast variety of [middleware implementations](https://docs.ros.org/en/rolling/Installation/RMW-Implementations.html). This document focuses on DDS and Zenoh middleware implementations. | ||
| DDS-based ROS 2 implementations are per default decentralized with no central server, so the field `host` can be set to `none`. | ||
| For more information on DDS tuning, you can visit the [DDS Tuning Guide](https://docs.ros.org/en/rolling/How-To-Guides/DDS-tuning.html). | ||
| When using Zenoh, the `host` field specifies the Zenoh Router IP address. | ||
|
|
||
| ###### Fixed Fields | ||
|
|
||
| Field Name | Type | Description | ||
| ---|:---:|---| | ||
| `rmwImplementation` | string | Specifies the ROS 2 middleware implementation to be used. Valid values include the different [ROS 2 middleware vendors (RMW)](https://docs.ros.org/en/rolling/Concepts/Intermediate/About-Different-Middleware-Vendors.html) like `rmw_fastrtps_cpp` (Fast DDS) or `rmw_zenoh_cpp` (Zenoh). This determines the underlying middleware implementation that handles communication. | ||
| `domainId` | integer | All ROS 2 nodes use domain ID 0 by default. To prevent interference between different groups of computers running ROS 2 on the same network, a group can be set with a unique domain ID. [Must be a non-negative integer less than 232](https://docs.ros.org/en/rolling/Concepts/Intermediate/About-Domain-ID.html). | ||
|
|
||
| ### Examples | ||
|
|
||
| ```yaml | ||
| servers: | ||
| ros2: | ||
| host: none | ||
| protocol: ros2 | ||
| protocolVersion: humble | ||
| bindings: | ||
| ros2: | ||
| rmwImplementation: rmw_fastrtps_cpp | ||
| domainId: 0 | ||
| ``` | ||
|
|
||
|
|
||
| <a name="channel"></a> | ||
|
|
||
| ## Channel Binding Object | ||
|
|
||
| This object MUST NOT contain any properties. Its name is reserved for future use. | ||
|
|
||
| <a name="operation"></a> | ||
|
|
||
| ## Operation Binding Object | ||
|
|
||
| This object contains information about the ROS 2 node. | ||
|
|
||
| ###### Fixed Fields | ||
|
|
||
| Field Name | Type | Description | ||
| ---|:---:|---| | ||
| `role` | string | Specifies the ROS 2 type of the node for this operation. If the action is `send`, valid values for the role are: `publisher`, `action_client`, `service_client`. If the action is `receive`, valid values for the role are: `subscriber`, `action_server`, `service_server`. This defines how the node will interact with the associated topic, service or action. | ||
| `node` | string | The name of the ROS 2 node that implements this operation. | ||
| `qosPolicies` | [Quality of Service Policy Object](#QoSPolicyObject) | Quality of Service (QoS) for the topic. | ||
|
|
||
| <a name="QoSPolicyObject"></a> | ||
|
|
||
| ### Quality of Service Object | ||
| This object contains ROS 2 specific information about the Quality of Service policies. | ||
| More information here: https://docs.ros.org/en/jazzy/Concepts/Intermediate/About-Quality-of-Service-Settings.html#qos-policies | ||
|
|
||
| Field Name | Type | Description | ||
| ---|:---:|---| | ||
| `reliability` | string | One of `best_effort` or `reliable`. More information here: [ROS 2 QoS](https://docs.ros.org/en/jazzy/Concepts/Intermediate/About-Quality-of-Service-Settings.html#qos-policies) | ||
| `history` | string | One of `keep_last`, `keep_all` or `unknown`. More information here: [ROS 2 QoS](https://docs.ros.org/en/jazzy/Concepts/Intermediate/About-Quality-of-Service-Settings.html#qos-policies) | ||
| `durability` | string | One of `transient_local` or `volatile`. More information here: [ROS 2 QoS](https://docs.ros.org/en/jazzy/Concepts/Intermediate/About-Quality-of-Service-Settings.html#qos-policies) | ||
| `lifespan` | integer | The maximum amount of time between the publishing and the reception of a message without the message being considered stale or expired. `-1` means infinite. | ||
| `deadline` | integer | The expected maximum amount of time between subsequent messages being published to a topic. `-1` means infinite. | ||
| `liveliness` | string | One of `automatic` or `manual`. More information here: [ROS 2 QoS](https://docs.ros.org/en/jazzy/Concepts/Intermediate/About-Quality-of-Service-Settings.html#qos-policies) | ||
| `leaseDuration` | integer | The maximum period of time a publisher has to indicate that it is alive before the system considers it to have lost liveliness. `-1` means infinite. | ||
|
|
||
| ### Examples | ||
|
|
||
| ROS 2 subscriber example: | ||
|
|
||
| ```yaml | ||
| receiveCmdVel: | ||
| action: receive | ||
| channel: | ||
| $ref: "#/channels/CmdVel" | ||
| bindings: | ||
| ros2: | ||
| role: subscriber | ||
| node: /turtlesim | ||
| qosPolicies: | ||
| history: unknown | ||
| reliability: reliable | ||
| durability: volatile | ||
| lifespan: -1 | ||
| deadline: -1 | ||
| liveliness: automatic | ||
| leaseDuration: -1 | ||
| ``` | ||
|
|
||
| ROS 2 publisher example: | ||
| ```yaml | ||
| Pose: | ||
| action: receive | ||
| channel: | ||
| $ref: "#/channels/Pose" | ||
| bindings: | ||
| ros2: | ||
| role: publisher | ||
| node: /turtlesim | ||
| ``` | ||
|
|
||
| ROS 2 service server example: | ||
| ```yaml | ||
| SetPen: | ||
| action: receive | ||
| channel: | ||
| $ref: "#/channels/SetPenRequest" | ||
| reply: | ||
| channel: | ||
| $ref: "#/channels/SetPenReply" | ||
| bindings: | ||
| ros2: | ||
| role: service_server | ||
| node: /turtlesim | ||
| ``` | ||
|
|
||
gramss marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ROS 2 service client example: | ||
| ```yaml | ||
| SetPen: | ||
| action: send | ||
| channel: | ||
| $ref: "#/channels/SetPenRequest" | ||
| reply: | ||
| channel: | ||
| $ref: "#/channels/SetPenReply" | ||
| bindings: | ||
| ros2: | ||
| role: service_client | ||
| node: /node_client | ||
| ``` | ||
|
|
||
| ROS 2 action server example: | ||
| ```yaml | ||
| receiveRotateAbsolute: | ||
| action: receive | ||
| channel: | ||
| $ref: "#/channels/RotateAbsoluteRequest" | ||
| reply: | ||
| channel: | ||
| $ref: "#/channels/RotateAbsoluteReply" | ||
| bindings: | ||
| ros2: | ||
| role: action_server | ||
| node: /turtlesim | ||
| ``` | ||
|
|
||
| ROS 2 action client example: | ||
| ```yaml | ||
| RotateAbsolute: | ||
| action: send | ||
| channel: | ||
| $ref: "#/channels/RotateAbsoluteRequest" | ||
| reply: | ||
| channel: | ||
| $ref: "#/channels/RotateAbsoluteReply" | ||
| bindings: | ||
| ros2: | ||
| role: action_client | ||
| node: /teleop_turtle | ||
| ``` | ||
|
|
||
| <a name="message"></a> | ||
|
|
||
| ## Message Binding Object | ||
|
|
||
| While this object DOES NOT contain any ROS 2 specific properties, it is important to understand how to express the different [ROS 2 data types](https://design.ros2.org/articles/legacy_interface_definition.html#:~:text=to%20IDL%20types-,ROS%20type,string,-The%20mapping%20of) in [AsyncAPI message types and formats](https://www.asyncapi.com/docs/reference/specification/v3.0.0#dataTypeFormat:~:text=The%20formats%20defined%20by%20the%20AsyncAPI%20Specification%20are%3A). | ||
|
|
||
| ROS 2 Type | AsyncAPI Type | AsyncAPI Format | | ||
fmvilas marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ---|:---:|---| | ||
| bool | boolean | boolean | ||
| byte | string | octet | ||
| char | integer | uint8 | ||
| float32 | number | float | ||
| float64 | number | double | ||
| int8 | integer | int8 | ||
| uint8 | integer | uint8 | ||
| int16 | integer | int16 | ||
| uint16 | integer | uint16 | ||
| int32 | integer | int32 | ||
| uint32 | integer | uint32 | ||
| int64 | integer | int64 | ||
| uint64 | integer | uint64 | ||
| string | string | string | ||
| array | array | -- | ||
|
|
||
| It is important to understand that the message header of the AsyncAPI specification does not map with the message header in ROS 2. | ||
| For this reason, the AsyncAPI message header will be ignored. If you want to define the header of a message in ROS 2, you should put in the payload of the message. [Example](https://docs.ros.org/en/ros2_packages/rolling/api/point_cloud_interfaces/msg/CompressedPointCloud2.html): | ||
|
|
||
| ```yaml | ||
| channels: | ||
| PointCloud: | ||
| address: /pointCloud | ||
| messages: | ||
| CompressedPointCloud2: | ||
| $ref: "#/components/messages/CompressedPointCloud2" | ||
| components: | ||
| CompressedPointCloud2: | ||
| tags: | ||
| - name: msg | ||
| payload: | ||
| type: object | ||
| properties: | ||
| header: | ||
| $ref: "#/components/messages/std_msgs/header/payload" | ||
| height: | ||
| $ref: "#/components/messages/uint32/payload" | ||
| width: | ||
| $ref: "#/components/messages/uint32/payload" | ||
| fields: | ||
| $ref: "#/components/messages/sensor_msgs/PointField/payload" | ||
| is_bigendian: | ||
| $ref: "#/components/messages/bool/payload" | ||
| point_step: | ||
| $ref: "#/components/messages/uint32/payload" | ||
| row_step: | ||
| $ref: "#/components/messages/uint32/payload" | ||
| compressed_data: | ||
| $ref: "#/components/messages/uint8/payload" | ||
| is_dense: | ||
| $ref: "#/components/messages/bool/payload" | ||
| format: | ||
| $ref: "#/components/messages/string/payload" | ||
| ``` | ||
|
|
||
| ## Complete example: | ||
| From the AsyncAPI specification example it could be extracted that: | ||
| - It consist on a ROS 2 Jazzy application running with Fast DDS as RMW. | ||
| - `/turtlesim` node is a subscriber of the `/turtle1/cmd_vel` topic and its qos policies. | ||
| - The interface of the `/turtle1/cmd_vel` topic is `Twist` that has a nested type: `Vector3`. Both of them are part of the standard package `geometry_msgs`. | ||
| - `Vector3` has already the types converted to AsyncAPI types and formats (number and double), instead of using the ROS 2 types. | ||
| - There is one file (head-asyncapi.yaml) that references the different standard/custom packages. This packages contains the strucute of its messages. | ||
|
|
||
| ``` | ||
| ├── interfaces | ||
| │ ├── geometry_msgs.yaml | ||
| │ ├── std_msgs.yaml | ||
| │ ├── <custom_pkg_msgs>.yaml | ||
| │ └── .... | ||
| └── head-asyncapi.yaml | ||
| ``` | ||
|
|
||
| head-asyncapi.yaml | ||
|
|
||
| ```yaml | ||
| asyncapi: 3.0.0 | ||
| info: | ||
| title: Turtlesim example for ROS 2 | ||
| version: 1.0.0 | ||
|
|
||
| servers: | ||
| ros2: | ||
| host: none | ||
| protocol: ros2 | ||
| protocolVersion: jazzy | ||
| bindings: | ||
| ros2: | ||
| rmwImplementation: rmw_fastrtps_cpp | ||
| domainId: 0 | ||
|
|
||
| channels: | ||
| CmdVel: | ||
| address: /turtle1/cmd_vel | ||
| messages: | ||
| Twist: | ||
| $ref: ./interfaces/geometry_msgs.yaml#/components/messages/Twist | ||
|
|
||
| operations: | ||
| CmdVel: | ||
| action: receive | ||
| channel: | ||
| $ref: "#/channels/CmdVel" | ||
| bindings: | ||
| ros2: | ||
| role: subscriber | ||
| node: /turtlesim | ||
| qosPolicies: | ||
| history: unknown | ||
| reliability: reliable | ||
| durability: volatile | ||
| lifespan: -1 | ||
| deadline: -1 | ||
| liveliness: automatic | ||
| leaseDuration: -1 | ||
| ``` | ||
|
|
||
| ./interfaces/geometry_msgs.yaml | ||
| ```yaml | ||
| asyncapi: 3.0.0 | ||
| info: | ||
| title: geometry_msgs | ||
| version: 1.0.0 | ||
| components: | ||
| messages: | ||
| Twist: | ||
| tags: | ||
| - name: msg | ||
| payload: | ||
| type: object | ||
| properties: | ||
| linear: | ||
| $ref: "#/components/messages/Vector3/payload" | ||
| angular: | ||
| $ref: "#/components/messages/Vector3/payload" | ||
| Vector3: | ||
| payload: | ||
| properties: | ||
| x: | ||
| type: number | ||
| format: double | ||
| y: | ||
| type: number | ||
| format: double | ||
| z: | ||
| type: number | ||
| format: double | ||
| ``` | ||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.