ROS Resources: Documentation | Support | Discussion Forum | Service Status | Q&A answers.ros.org

RMW-microxrcedds implementation


#1

Hi.

We have been working on an implementation of RMW using eProsima’s Micro XRCE-DDS.
We made this as part of OFERA project approach to embedded ROS 2.

In a nutshell, this approach consists on changing middleware implementation (from DDS to DDS-XRCE) and change the user API (using rclc) for cross-compile all the stack for the microcontroller. Currently, some tests have been done using NuttX over STM32.
Apart from that NuttX tests, this packages work on a Linux machine without issues and using either RCLCPP or RCLC, see the provided demos to further information.

The implementation consists of a set of new packages:




And modifications to the rclc.

All these packages work with the existing ROS 2 stack (rcl, rmw, typesupport…).
From these packages, rmw and typesupport have tests implemented.
All should compile using standard colcon tools in a ROS 2 environment, colcon build, colcon test.
You just need to add these repositories to your ROS 2 workspace.

For testing purposes, I have attached a file with all the required ROS 2 repositories and micro-ROS specific ones.

Once you cloned the repositories, these are the commands you may want to run to try it:

#Build All
colcon build --cmake-args -DBUILD_SHARED_LIBS=ON
#configure environment variables
. ~/ros2_ws/install/./local_setup.bash
#Run agent node
~/ros2_ws/install/uros_agent/lib/uros_agent/uros_agent udp 8888
#Run rclcpp demo publisher
~/ros2_ws/install/complex_msg_publisher_cpp/lib/complex_msg_publisher_cpp/complex_msg_publisher_cpp
#Run rclc demo publisher
~/ros2_ws/install/complex_msg_publisher_c/lib/complex_msg_publisher_c/complex_msg_publisher_c
#Run rclcpp demo subscriber
~/ros2_ws/install/complex_msg_subscriber_cpp/lib/complex_msg_subscriber_cpp/complex_msg_subscriber_cpp
#Run rclc demo subscriber
~/ros2_ws/install/complex_msg_subscriber_c/lib/complex_msg_subscriber_c/complex_msg_subscriber_c

Furthermore, you can run Micro ROS packages tests with:

colcon test --packages-select rosidl_typesupport_microxrcedds_c rosidl_typesupport_microxrcedds_c_tests rosidl_typesupport_microxrcedds_cpp rosidl_typesupport_microxrcedds_cpp_tests rosidl_typesupport_microxrcedds_test_msg rmw_microxrcedds

All these packages are work in progress and will be updated and extend API. Currently, only publish/subscribe API has been implemented.
Currently working on polishing a NuttX build system.


ROS2 Embedded SIG meeting
ROS2 Cross compilation
#2

Great work!

Could you give a run-down on the major differences between libraries you have produced and their equivalents from the github/ros2 organisation (where there are equivalents)? I’m thinking in particular of microROS/rclc.


#3

Hi @gbiggs.

The correspondence of the libraries with existing ones is:

microROS/rmw-microxrcedds <=> ros2/rmw_fastrtps
microROS/rosidl_typesupport_microxrcedds <=> ros2/rosidl_typesupport_fastrtps

microROS/micro-ROS-demos <=> ros2/demos
Not really sure about this last one. But, It is just a package with some dummy samples and different likewise “hello world” code.

microROS/micro-ROS-Agent does not have equivalent or similar in ROS 2.

Regarding RCLC. This is just a fork with small modifications. We have some issues with this package while using our cross-compiling toolchain and building on windows. The intention of this fork, besides enabling the compilation, is to expand its implementation to include more of the ROS 2 concepts, thinking on services or timers.
However, this rclc expansion could be stopped, as a few days ago I found that RCLC is listed on Crystal roadmap, https://index.ros.org/doc/ros2/Roadmap/, so ideally we will embrace that future RCLC.

Anybody knows something about that RCLC on the roadmap?.

Hopefully, this answers your questions.


#4

Hi, @BorjaOuterelo

eProsima’s Micro-XRCE-DDS(version 1.0.1) requires FastRTPS 1.7.0.
However, rmw_fastrtps is not currently in version 1.7.0.
If I use rmw-microxrcedds, can I use Micro-XRCE-DDS version 1.0.1 without problems?


#5

Hi @Kei.

rmw-microxrcedds depends on Micro XRCE-DDS Client v1.0.1.
micro-ROS Agent depends on Micro XRCE-DDS Agent v1.01, so the dependency with FastRTPS 1.7.0 is here, on the agent side.
This force you to use FastRTPS 1.7.0 on your ROS 2 workspace where you want the micro-ROS Agent running.

You can check that there is an ongoing pull request to upgrade ROS 2 repositories to that version:

From that you can get Dirk’s list of ros2.repos used for testing:
https://gist.githubusercontent.com/dirk-thomas/e377d8de1d8d7d41e15e1955a46f96c9/raw/dc498ab63c038df358bd2c0ccfad86dc0e0615cb/ros2.repos

Note the following changes in ros2.repos:

Fast-RTPS

Branch: release/1.7.0

rmw_fastrtps

Repo: https://github.com/eProsima/rmw_fastrtps.git
Branch : fastrtps-1.7.0

Hopefully, this clarifies a bit on the dependencies.

Although, on this repository specific to micro-ROS, there are lists of repositories for agent and client side:

If you have any other question, I will be glad to help.


#6

Thanks @BorjaOuterelo,

There are some problems (include path etc …) due to different submodule commit information of agent and commit information of FastRTPS release/1.7.0 branch, but I will leave an issue in eProsima’s Github.

Anyway, the information you gave me widened the possibilities I could! Thank you!


#7

It’s nice to see work on interfacing microcontrollers with a standard protocol.

From the current documentation of eProsima’s Micro-XRCE-DDS, only Windows and POSIX APIs (Linux, Nuttx, …) are supported. Are there plans to support the serial protocol on 8bit Arduinos and bare metal STM32?

Especially the ATmega328 with it’s 32KB flash and 2KB SRAM (that’s what I call an extremely resource constrained environment) would make a nice demonstration of the DDS-XRCE serial protocol.