Skip to content
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

Feature/ros2 #183

Merged
merged 123 commits into from
Oct 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
4313729
Basic README for ROS2
gabryelreyes Aug 6, 2024
2ded94f
doc: Added WSL setup for ROS2 Jazzy
nhjschulz Aug 6, 2024
0dd536c
DOC: ROS2 Jazzy setup instrcuction added
nhjschulz Aug 6, 2024
9d7549d
Doc: ROS2 Webots install added
nhjschulz Aug 6, 2024
285f41b
added plantuml target deployment diagram and component diagram for uR…
hoeftjch Aug 6, 2024
b5ed4cc
added ros2 background, workspace component diagrams and integration t…
hoeftjch Aug 6, 2024
fd69190
ROS2: Describe Webots ROS 2 installation under WSL
nhjschulz Aug 7, 2024
b43fddb
Added basic Turtle application
gabryelreyes Aug 7, 2024
a80346f
Added Turtle application to the PIO environments
gabryelreyes Aug 7, 2024
d0ec811
Added Doxyfiles fro TurtleTarget and TurtleSim
gabryelreyes Aug 7, 2024
58def71
Updated CI workflows
gabryelreyes Aug 7, 2024
e080302
Fixed path for the next line to work
gabryelreyes Aug 7, 2024
d14ab51
DOC: Add link to Webots ROS2 controller package setup
nhjschulz Aug 7, 2024
fa02037
Added information on the turtle_teleop_key interface
gabryelreyes Aug 7, 2024
8fa1ab9
Added rosgraph
gabryelreyes Aug 7, 2024
1acde44
Added documentation on the Micro XRCE-DDS Agent
gabryelreyes Aug 7, 2024
5cd5a30
Improved agent documentation
gabryelreyes Aug 9, 2024
116702b
Fixed missing includes.
gabryelreyes Aug 7, 2024
63c86cb
Fixed compatibility between Windows and Linux API
gabryelreyes Aug 7, 2024
35bb655
Expanded documentation on Webots installation
gabryelreyes Aug 7, 2024
93a4c67
Prefer using an inline function instead of a macro
gabryelreyes Aug 9, 2024
348bdc4
Fixed review findings
gabryelreyes Aug 9, 2024
18cb819
Fixed create dir path
gabryelreyes Aug 9, 2024
bec6787
ROS2 DOC: Extend webots documentation
nhjschulz Aug 8, 2024
f743324
DOC: ROS2 Webots documentation update
nhjschulz Aug 9, 2024
447ffcf
DOC: ROS2 Webots Build and Launch description added
nhjschulz Aug 12, 2024
a332e20
Typo fixes
nhjschulz Aug 12, 2024
477aa74
Micro ROS setup in APPTurtle (#146)
gabryelreyes Aug 13, 2024
7a2a083
enable turtleSim build with external micro-ROS library
singrph Aug 14, 2024
21593f8
added docu to create and include micro-ROS library
singrph Aug 14, 2024
5705cde
undo update of table of contents
singrph Aug 14, 2024
6b6d15a
moved my_custom_toolchain.cmake and my_custom_colcon.meta to subfolder
singrph Aug 14, 2024
db30584
ArduinoNative: Add IPAddress class
nhjschulz Aug 14, 2024
8872055
Fix link to ROS2 Jazzy installation guide
nhjschulz Aug 15, 2024
5c3f48a
Reduced spin time of uROS
gabryelreyes Aug 14, 2024
7fc5dfe
integrated SerialMuxProt
gabryelreyes Aug 14, 2024
331da80
Basic turtle behavior
gabryelreyes Aug 14, 2024
d5d6137
Improved documentation on turtle speeds
gabryelreyes Aug 16, 2024
861fc0a
Changed steps/s into mm/s
gabryelreyes Aug 19, 2024
64887d9
Use incoming speed
gabryelreyes Aug 19, 2024
227fb2d
Send linear and angular speeds to RU
gabryelreyes Aug 19, 2024
2d86291
Added milli conversion factor
gabryelreyes Aug 20, 2024
152d90f
Issue #54: Use IPAddress class instead of string
nhjschulz Aug 18, 2024
d86d7f6
Spelling improvements in comments of IPAddress.
nhjschulz Aug 18, 2024
07477a5
IPAddress: Fix case in file include
nhjschulz Aug 18, 2024
e54c81e
IPAddress: Added missing final in Network::getIp
nhjschulz Aug 19, 2024
d5391e0
IPAddress: Replaced raw() with operator uint32_t which matched ESP32 …
nhjschulz Aug 20, 2024
9e5c019
Changes required for using static lib
gabryelreyes Aug 13, 2024
ee3f04b
Fixed missing includes
gabryelreyes Aug 20, 2024
b4c2763
Use custom transport
gabryelreyes Aug 20, 2024
89fe8fc
Ignore local libmicroros
gabryelreyes Aug 20, 2024
cf0275e
Removed redundant linker flag
gabryelreyes Aug 20, 2024
1b428ec
Renamed argument to size for clarity
gabryelreyes Aug 20, 2024
18e1b38
Added file structure for WiFIUDP
gabryelreyes Aug 20, 2024
3354571
Added typedef to locator struct
gabryelreyes Aug 20, 2024
9618883
Mark arguments as not used. Suppress clangtidy check, as method decla…
gabryelreyes Aug 20, 2024
f73cd7d
CI Check occurs after building. May speed check process
gabryelreyes Aug 20, 2024
b122c8f
Build and check in the same workflow to utilize compiled software dur…
gabryelreyes Aug 20, 2024
2de8f87
Revert "CI Check occurs after building. May speed check process"
gabryelreyes Aug 20, 2024
d109924
Added receive function with timeout to WiFiUdp and debugging output.
gabryelreyes Aug 20, 2024
b399ac9
Added check for socket timeout using errno and removed log message on…
hoeftjch Aug 27, 2024
343c73f
Removed typedef, this type was originally introduced in microros_plat…
hoeftjch Aug 27, 2024
d3005cf
Issue #54: Use IPAddress class instead of string
nhjschulz Aug 18, 2024
cabddf4
Spelling improvements in comments of IPAddress.
nhjschulz Aug 18, 2024
e2d8dcf
IPAddress: Fix case in file include
nhjschulz Aug 18, 2024
984468f
IPAddress: Added missing final in Network::getIp
nhjschulz Aug 19, 2024
6b99bcc
IPAddress: Replaced raw() with operator uint32_t which matched ESP32 …
nhjschulz Aug 20, 2024
ff393d1
Changes required for using static lib
gabryelreyes Aug 13, 2024
3abf236
Changed buffer size to private constant; used yoda style checks; remo…
hoeftjch Aug 27, 2024
8d81321
removed dublicate declaration of micro_ros_agent_locator in MicroRosC…
hoeftjch Aug 28, 2024
79f5c29
removed unused header from custrom transport implementation
hoeftjch Aug 28, 2024
6dffb4b
Changed ros support structure to class member
hoeftjch Aug 29, 2024
96b6d3c
Bugfix: Added manual simulation sime step to enable busy waits in ROS…
hoeftjch Aug 29, 2024
f8e99ea
Add --cwd <dir> option for setting working directory
nhjschulz Aug 29, 2024
13ee46f
ROS: Improved webots deployment diagram
nhjschulz Aug 30, 2024
ebac74b
Style: Change custom transport functions to C++ style.
nhjschulz Aug 30, 2024
4b69906
Updated documentation with setup and build instructions for native an…
hoeftjch Aug 30, 2024
31f4c54
Fixed library dependencies
gabryelreyes Sep 3, 2024
1a3bac1
Updated Remote Control SMP channels from RU
gabryelreyes Sep 3, 2024
6e4d99b
Updated applications to correspond the SMP channels
gabryelreyes Sep 3, 2024
80546d9
Updated Applications list
gabryelreyes Sep 12, 2024
02d9a13
Use BlueAndi/ArduinoNative library for common sim components
gabryelreyes Sep 12, 2024
d237046
Extracted UDP into own library
gabryelreyes Sep 12, 2024
6dc7163
Added missing header
gabryelreyes Sep 12, 2024
19fc4a6
Added check_os script for applications that only run in certain opera…
gabryelreyes Sep 12, 2024
5d88132
Fixed library dependency
gabryelreyes Sep 12, 2024
9040d99
WString based on std:string instead of char buffers
gabryelreyes Sep 12, 2024
d982bc5
Moved WString to BlueAndi/ArduinoNative
gabryelreyes Sep 12, 2024
68f04b3
Moved WiFi native to its own library
gabryelreyes Sep 12, 2024
cfb70d5
Renamed UDPNative
gabryelreyes Sep 13, 2024
5b50bbd
Fixed library dependencies
gabryelreyes Sep 13, 2024
4e7bb40
AppTurtle: Improve doc regarding micro-ros lib linking.
nhjschulz Sep 24, 2024
99650b6
WEBOTS_HOME was not correct set for linux and MacOS.
BlueAndi Oct 15, 2024
a20cd78
ROS2 Jazzy url fixed and note added regarding optional installation p…
BlueAndi Oct 15, 2024
70d196e
Add wsl update command to enforce that a already installed wsl is up-…
BlueAndi Oct 15, 2024
7d0687c
Improve uROS setup.
BlueAndi Oct 15, 2024
c9c7efc
Set environment variables for Webots home directory, the Webots contr…
BlueAndi Oct 15, 2024
60fd838
Short explanation for running DCS in Webots added.
BlueAndi Oct 15, 2024
621a7ec
Helpful debug info added.
BlueAndi Oct 15, 2024
564161a
Typo fixed
BlueAndi Oct 15, 2024
30d6c61
Review findings fixed.
BlueAndi Oct 16, 2024
4c1992c
Updated Python and Platformio to latest versions
gabryelreyes Oct 17, 2024
8932b7c
Using original micro-ros library
gabryelreyes Oct 17, 2024
1445ced
Revert "Using original micro-ros library"
gabryelreyes Oct 17, 2024
1e372cf
Use specific versions of Ubuntu and Python
gabryelreyes Oct 17, 2024
62939c9
Divide between MQTT settings and Micro-ROS agent settings. Don't use …
BlueAndi Oct 18, 2024
a2edd73
Configuration key fixed.
BlueAndi Oct 18, 2024
24d7bcc
Typo fixed.
BlueAndi Oct 18, 2024
4676c78
Micro-ROS agent connection retry mechanism implemented. Additional re…
BlueAndi Oct 20, 2024
00101e1
UDP client now member of the custom ROS transport class.
BlueAndi Oct 20, 2024
895ea9f
Fixed doxygen warning.
BlueAndi Oct 20, 2024
930db35
const removed from tthis to be able to use UDP client.
BlueAndi Oct 20, 2024
5c1dd61
Doxygen fixed.
BlueAndi Oct 20, 2024
bb02876
Small bugfixes.
BlueAndi Oct 20, 2024
a903a40
Obsolete variable usage replaced.
BlueAndi Oct 20, 2024
59c53f5
localhost is not supported for the Micro-ROS agent address, therefore…
BlueAndi Oct 21, 2024
ab60ab7
rclc return values are now checked and logged.
BlueAndi Oct 21, 2024
eefe291
Typo fixed.
BlueAndi Oct 21, 2024
7283112
MicroRos Library: Disable internal connection retries
nhjschulz Oct 22, 2024
ad0e4b7
MircoRosTransport: Add C++ methods
nhjschulz Oct 22, 2024
c398256
CustomRosTransport: Review Feedback
nhjschulz Oct 22, 2024
c6213a1
Upgrade to ArduinoJSON v7.2.0
BlueAndi Oct 22, 2024
c98a65f
Use JSON const objects continuously.
BlueAndi Oct 22, 2024
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
40 changes: 28 additions & 12 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
# The introduction just shows some useful informations.
intro:
# The type of runner that the job will run on.
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
# Steps represent a sequence of tasks that will be executed as part of the job.
steps:
- run: echo "The job was automatically triggered by a ${{ github.event_name }} event."
Expand All @@ -27,7 +27,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.9'
python-version: '3.12.3'
cache: 'pip'
cache-dependency-path: .github/workflows/requirements.txt

Expand All @@ -38,11 +38,15 @@ jobs:
# Build all targets
build:
# The type of runner that the job will run on.
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
needs: intro
strategy:
matrix:
environment: ["ConvoyLeaderTarget", "ConvoyFollowerTarget", "RemoteControlTarget", "SensorFusionTarget"]
environment: ["ConvoyLeaderTarget",
"ConvoyFollowerTarget",
"RemoteControlTarget",
"SensorFusionTarget",
"TurtleTarget"]

# Steps represent a sequence of tasks that will be executed as part of the job.
steps:
Expand All @@ -52,7 +56,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.9'
python-version: '3.12.3'
cache: 'pip'
cache-dependency-path: .github/workflows/requirements.txt

Expand All @@ -63,14 +67,17 @@ jobs:
- name: Compile ${{ matrix.environment }} firmware
run: platformio run --environment ${{ matrix.environment }}

- name: Perform static checks on ${{ matrix.environment }}
run: platformio check --environment ${{ matrix.environment }} --fail-on-defect=medium --fail-on-defect=high

# Perform static checks and test
check:
# The type of runner that the job will run on.
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
needs: intro
strategy:
matrix:
environment: ["ConvoyLeaderTarget", "ConvoyFollowerTarget", "RemoteControlTarget", "SensorFusionTarget", "Test"]
environment: ["Test"]

steps:
- name: Checkout repository
Expand All @@ -79,7 +86,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.9'
python-version: '3.12.3'
cache: 'pip'
cache-dependency-path: .github/workflows/requirements.txt

Expand All @@ -93,7 +100,7 @@ jobs:
# Perform tests
test:
# The type of runner that the job will run on.
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
needs: intro

steps:
Expand All @@ -103,7 +110,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.9'
python-version: '3.12.3'
cache: 'pip'
cache-dependency-path: .github/workflows/requirements.txt

Expand All @@ -117,11 +124,20 @@ jobs:
# Build documentation
doc:
# The type of runner that the job will run on.
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
needs: intro
strategy:
matrix:
environment: ["ConvoyLeaderTarget", "ConvoyFollowerTarget", "ConvoyLeaderSim", "ConvoyFollowerSim", "RemoteControlTarget", "RemoteControlSim", "SensorFusionTarget", "SensorFusionSim"]
environment: ["ConvoyLeaderTarget",
"ConvoyFollowerTarget",
"ConvoyLeaderSim",
"ConvoyFollowerSim",
"RemoteControlTarget",
"RemoteControlSim",
"SensorFusionTarget",
"SensorFusionSim",
"TurtleTarget",
"TurtleSim"]

steps:
- name: Checkout repository
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/requirements.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
platformio==6.1.15
platformio
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@
lib/Webots
webots/worlds/*.wbproj
webots/worlds/*.jpg
doc/doxygen/*/*
doc/doxygen/*/*
lib/libmicroros
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ It provides different kind of exclusive applications, used for educational purpo
* Convoy Leader Robot - Based on odometry information, it leads the followers to follow like a lemming trail.
* Convoy Follower Robot - It follows the leader by mainly reacting on the received information.
* Remote Control - Receives commands and motor speeds from an external source through MQTT.
* APPTurtle - A [ROS2](https://docs.ros.org/en/jazzy/index.html) Robot controller that uses Twist messages like the ROS2 TurtleSim demo.

## Table of content

Expand Down Expand Up @@ -51,6 +52,7 @@ The simulation is based on the open source robot simulator *Webots*. The applica
1. Install the native compiler toolchain:
* Linux
* Install the gcc toolchain, depended on your distribution.
* Install libmosquitto-dev, depended on your distribution.
* Windows
* Install the [MSYS2](https://www.msys2.org) toolchain.
* Open MSYS2 shell.
Expand Down Expand Up @@ -105,6 +107,7 @@ In a similar way, not providing a WiFi configuration will force the target into
| RemoteControl | No | Yes | RemoteControl | Yes |
| SensorFusion | No | Yes | SensorFusion | Yes |
| Test | Yes | No | N/A | No |
| Turtle | No | Yes | RemoteControl | Yes (ROS2 + Micro-ROS Agent) |

# Documentation

Expand Down
4 changes: 4 additions & 0 deletions data/config/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,9 @@
"x": "0",
"y": "0",
"heading": "0"
},
"microROSAgent": {
"host": "127.0.0.1",
"port": "8888"
}
}
82 changes: 82 additions & 0 deletions doc/ROS2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# ROS 2 and micro-ROS

ROS 2 is a powerful framework for developing robot applications, while micro-ROS extends ROS 2 capabilities to microcontrollers, enabling robotics applications on a wider range of hardware.

## Table of Contents

- [What is ROS 2?](#what-is-ros-2)
- [What is micro-ROS?](#what-is-micro-ros)
- [What has improved since ROS 1](#what-has-improved-since-ros-1)
- [What is micro-ROS?](#what-is-micro-ros)
- [micro-ROS Project Components](#what-is-micro-ros)
- [Webots Integration](#webots-integration)
- [Installation Steps](#installation-steps)

## What is ROS 2?

ROS 2 is the second major version of the Robot Operating System (ROS), an open-source framework to build complex robot applications.

Key features of ROS 2 include:
- Distributed Computing: Nodes can be distributed across multiple machines.
- Real-Time Capabilities: Improved support for real-time systems.
- Cross-Platform: Runs on various operating systems, including Linux, Windows, and macOS.
- Modularity: Encourages modularity and reusability of code.

## What has improved since ROS 1

Major advancements from ROS (1) include improved real-time capability, more generic Data Distribution Service (DDS) than previously used TCPROS/UDPROS protocols.

List of key differences and new features:
- Middleware: ROS 2 uses DDS for better performance and QoS.
- Real-Time Support: ROS 2 offers enhanced real-time capabilities.
- Cross-Platform: ROS 2 supports multiple operating systems and RTOS.
- Distributed Computing: ROS 2 enables distributed node execution.
- QoS: ROS 2 provides extensive QoS settings.
- Lifecycle Management: ROS 2 introduces lifecycle management for nodes.
- API Stability: ROS 2 emphasizes stable and versioned APIs.
- Security: ROS 2 includes initial security features.
- Development Tools: ROS 2 builds on the ROS 1 ecosystem with new tools.

## What is micro-ROS?

micro-ROS brings ROS 2 to microcontrollers, allowing developers to run ROS 2 applications on resource-constrained devices. This extension enables the integration of microcontrollers into ROS 2 networks, making it possible to create more complex and distributed robotic systems.

Key features of micro-ROS include:
- [Small Footprint](https://micro.ros.org/docs/concepts/benchmarking/memo_prof/): Optimized for microcontrollers with limited resources.
- [Real-Time Capabilities](https://micro.ros.org/docs/concepts/rtos/): Supports real-time operation on microcontrollers.
- [ROS 2 Compatibility](https://micro.ros.org/docs/overview/ROS_2_feature_comparison/): Fully compatible with ROS 2, allowing seamless integration with larger ROS 2 systems. See
- [Cross-Platform](https://micro.ros.org/docs/overview/hardware/): Supports a variety of microcontroller platforms and RTOS (Real-Time Operating Systems).

## External micro-ROS build system

micro-ROS supports a variety of external build system beyond the micro_ros_setup tool such as PlatformIO [micro_ros_platformio](https://github.com/micro-ROS/micro_ros_platformio/). The following component diagram depi

![uros_ws](http://www.plantuml.com/plantuml/proxy?cache=no&src=https://raw.githubusercontent.com/BlueAndi/DroidControlShip/feature/ROS2/doc/ROS2/uml/micro-ros_build_system.puml)

## ROS 2 in DCS

This section describes the integration of micro-ROS in the existing workspace, extending it by implementing a ROS 2 node and the micro-ROS stack. The goal is to connect the ZumoComSystem with the DDS network using DDS-XRCE, making the robot controllable via ROS messages to mimic turtle graphics drawing using the robot.

### Component Deployment

The following diagram illustrates the component deployment of micro-ROS in the DroidControlSystem.

![turtle_sim](http://www.plantuml.com/plantuml/proxy?cache=no&src=https://raw.githubusercontent.com/BlueAndi/DroidControlShip/feature/ROS2/doc/ROS2/uml/turtle_sim.plantuml)

## Installation Steps

1. [WSL with Ubuntu](./setup/wsl.md)
2. [ROS2 Jazzy](./setup/ROS2_Jazzy.md)
3. [Webots](./setup/Webots.md)
4. [micro-ROS Native](./setup/microROS_Native.md)
5. [micro-ROS Agent](./setup/Agent.md)

## Execution Steps

### Webots Simulation

[Webots simulation](./webots/webots.md).

### Target

[Target](./setup/Target.md)
94 changes: 94 additions & 0 deletions doc/ROS2/interface/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# TurtleSim turtle_teleop_key message interface

## turtle_teleop_key

The `turtle_teleop_key` executable is part of the `turtlesim` package, and its used to send commands to the `turtlesim` for it to move.
It is launched using the following command:

```bash
ros2 run turtlesim turtle_teleop_key
```

This will per default spawn an new Node with the name `teleop_turtle`, which has the following interfaces:

```yaml
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Service Servers:
/teleop_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
/teleop_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/teleop_turtle/get_parameters: rcl_interfaces/srv/GetParameters
/teleop_turtle/list_parameters: rcl_interfaces/srv/ListParameters
/teleop_turtle/set_parameters: rcl_interfaces/srv/SetParameters
/teleop_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Service Clients:

Action Servers:

Action Clients:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
```

This information can be found by running the command while the node is running on a separate terminal:

```bash
ros2 node info /teleop_turtle
```

Relevant for this project is the Publisher to the topic `/turtle1/cmd_vel` which uses the type `geometry_msgs/msg/Twist`. Note that `turtle_teleop_key` publishes to the topic on button press, not periodically.

## geometry_msgs/msg/Twist Topic Type

The `geometry_msgs/msg/Twist` topic type is defined as:

```yaml
# This expresses velocity in free space broken into its linear and angular parts.

Vector3 linear
float64 x
float64 y
float64 z
Vector3 angular
float64 x
float64 y
float64 z
```

This information can be found by running the command:

```bash
ros2 interface show geometry_msgs/msg/Twist
```

## turtlesim/action/RotateAbsolute Action

The `turtlesim` has `RotateAbsolute` action server. To learn more about actions see [here](https://docs.ros.org/en/jazzy/Tutorials/Beginner-CLI-Tools/Understanding-ROS2-Actions/Understanding-ROS2-Actions.html). This Action has the following interface/type:

```bash
# The desired heading in radians
float32 theta
---
# The angular displacement in radians to the starting position
float32 delta
---
# The remaining rotation in radians
float32 remaining
```

This information can be found by running the command:

```bash
ros2 interface show turtlesim/action/RotateAbsolute
```

The section of this message above the first --- is the structure (data type and name) of the goal request. The next section is the structure of the result. The last section is the structure of the feedback.

## rqt_graph

Using `rqt_graph`, the following topic graph is generated:

![topic_graph](./rosgraph.png)
Binary file added doc/ROS2/interface/rosgraph.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading