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

Add ROS2 documentation #379

Merged
merged 10 commits into from
Dec 17, 2024
64 changes: 64 additions & 0 deletions docs/icub-ergocub_ros2/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# Using `iCub` and `ergoCub` with ROS 2

!!! note
This documentation is dedicated to explain how to control `iCub` and `ergoCub` **real robots** using ROS 2, not the simulated models of those robots.
pattacini marked this conversation as resolved.
Show resolved Hide resolved

!!! info
As the last supported **ROS 1** distribution (ROS Noetic Ninjemys) is reaching its End of Life (EOL) on May 2025, with the distro release [`v2024.11.1`](../sw_versioning_table/2024.11.1.md) ROS 1 support was deprecated.

## Overwiew

All the YARP [Network Wrapper Server (NWS) and Network Wrapper Client (NWC)](https://www.yarp.it/latest//group__nws__and__nwc__architecture.html) devices that use ROS 2 can be found under [`yarp-devices-ros2`](https://github.com/robotology/yarp-devices-ros2) repository.

`yarp-devices-ros2` contains the devices and utilities for YARP-ROS 2 compatibility. The devices are in the form of NWS/NWC that read and/or write information from ROS 2 topics and make them available via the YARP API. Starting from the distro [`v2024.11.1`](../sw_versioning_table/2024.11.1.md), it can be compiled within the robotology-superbuild by enabling the `ROBOTOLOGY_USES_ROS2` CMake option .
pattacini marked this conversation as resolved.
Show resolved Hide resolved

## Publishing `iCub/ergoCub`'s joints state: the `controlBoard_nws_ros2` module
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps we should explain that this just applies to real robots, while we could have a different section for simulated robots?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean the entire documentation or a specific paragraph?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At least the paragraph it seems to me that it only applies to real robot, right? I am not sure about the rest of the documentation, but if also the rest it does only apply to real robots and not simulated ones, I think it may be worth mentioning it.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe I'm wrong, but after reading the entire page I added it seems that it could be applied to both real and simulated robots. The only difference between the two it's the usage of controlBoard_nws_ros2 since in simulation it is required to modify the urdf for passing the proper XML to the yri plugin (cc @Nicogene)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The only difference between the two it's the usage of controlBoard_nws_ros2 since in simulation it is required to modify the urdf for passing the proper XML to the yri plugin (cc @Nicogene)

Exactly. I may be wrong, but I am not sure this is step that is obvious for the target reader of this documentation (for example, I am afraid it would not be obvious that how "yarprobotinterface --enable_tags "(enable_ros2)" needs to be translated in the case of simulated robots, see also robotology/gz-sim-yarp-plugins#163 .

So either we document this, or we just clearly state that the documentation is just targeting real robots.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As far as I understand, the enable/disable_tags are not available for simulation models yet (correct me if I'm wrong). If it's so, I prefer to specify that the documentation refers to the real robots.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes they are not supported in gz-sim at the moment, any solution is fine for me.


### Modules description

`controlBoard_nws_ros2` is the controlBoard network wrapper server for ROS 2. As per the `controlBoard_nws_yarp`, this device can be used to publish the joint position information on ROS 2 topics instead of YARP ports. The device uses the [yarpDeviceParamParserGenerator](https://yarp.it/latest/group__yarpDeviceParamParserGenerator.html) and [here](https://yarp.it/latest/classControlBoard__nws__ros2__ParamsParser.html) there is the list of the required parameters.
pattacini marked this conversation as resolved.
Show resolved Hide resolved

### Using `controlBoard_nws_ros2`

The NWS/NWC for YARP and ROS 2 are organized into separate wrappers. In this way, it is possible to attach multiple wrappers to the same device, so a `controlBoard_nws_yarp` for YARP and a `controlBoard_nws_ros2` for ROS 2, and include them to the same configuration file used to launch the yarprobotinterface.
pattacini marked this conversation as resolved.
Show resolved Hide resolved

#### ergoCub

All ergoCub robots have the configuration files to enable this module under [robots-configuration](https://github.com/robotology/robots-configuration) repository. The way to activate them is to run the yarprobotinterface of the robot with the following option:
pattacini marked this conversation as resolved.
Show resolved Hide resolved

```sh
yarprobotinterface --enable_tags "(enable_ros2)"
```

#### iCub

For iCub robots, instead, the module can be activated using an `xml` file, for example this `alljoints-mc_nws_ros2.xml`:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE devices PUBLIC "-//YARP//DTD yarprobotinterface 3.0//EN" "http://www.yarp.it/DTD/yarprobotinterfaceV3.0.dtd">

<device xmlns:xi="http://www.w3.org/2001/XInclude" name="alljoints-mc_nws_ros2" type="controlBoard_nws_ros2">
<param name="node_name"> icub_cb_node </param>
<param name="topic_name"> /joint_states </param>
<action phase="startup" level="15" type="attach">
<param name="device"> alljoints-mc_remapper </param>
</action>
<action phase="shutdown" level="20" type="detach" />
</device>
```

!!! warning
Not all iCub configuration files have been modified to support ROS 2. If you didn't find those files within your robot name folder under `robots-configuration`, please don't hesitate to open an issue [here](https://github.com/robotology/robots-configuration/issues).
pattacini marked this conversation as resolved.
Show resolved Hide resolved

With this kind of file, the positions of all the joints specified in the `alljoints-mc_remapper` are published on the `/joint_states` ROS 2 topic.

More in particular, this file is meant to be used as part of the same `yarprobotinterface` with which you launch the robot. To include it among the devices that you launch with it, you should modify the `icub_all.xml` (or any file that is launched with your `yarprobotinterface` when you launch the robot) to include the line:
pattacini marked this conversation as resolved.
Show resolved Hide resolved

```xml
<xi:include href="wrappers/motorControl/alljoints-mc_nws_ros2.xml" />
```

## xcub-moveit2

[`xcub-moveit2`](https://github.com/icub-tech-iit/xcub-moveit2) contains ROS 2 packages to control a YARP-based robot (iCub/ergoCub) with MoveIt2 platform. Check it out [here](https://github.com/icub-tech-iit/xcub-moveit2/blob/master/README.md) for more details.
40 changes: 0 additions & 40 deletions docs/icub_ros/index.md

This file was deleted.

2 changes: 1 addition & 1 deletion docs/icub_sw.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
- [`Standard Calibration Types`](./robot_calibration_types/standard_calibration_types.md)
- [`iCub 3 Calibration Types`](./robot_calibration_types/icub3_calibration_types.md)
- [`Configure IP on a setup for ETH boards`](./configure_static_ip/configure-static-ip.md)
- [`Using iCub with ROS`](./icub_ros/index.md)
- [`Using iCub or ergoCub with ROS 2`](./icub-ergocub_ros2/index.md)
- [`iCub Force Control`](./icub_force_control/icub-force-control.md)
- [`Sensor Interfaces`](./robot_sensors/index.md)
- [`Tactile Sensors`](./tactile_sensors/index.md)
2 changes: 1 addition & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ nav:
- Encoders and Joint limits (manual): icub_testing/encoders_manual.md
- Configure IP on a setup for ETH boards:
- Configure IP on a setup for ETH boards: configure_static_ip/configure-static-ip.md
- Using iCub with ROS: icub_ros/index.md
- Using iCub or ergoCub with ROS 2: icub-ergocub_ros2/index.md
- iCub Force Control: icub_force_control/icub-force-control.md
- Sensor interfaces:
- Summary: robot_sensors/index.md
Expand Down
Loading