ROS2 Control and Arduino Uno

asked 2022-06-01 12:00:34 -0500

KiD gravatar image


I am very much a newbie in both ROS and I was trying to make a fun project to get a bit more familiar. In my project I want to have communication between Raspberry PI and Arduino Uno.

I wanted to use ROS2 for the serial communication, but I realize that some of the popular ways to do it roserial, MicroRos ros2Arduino either do not have support for ROS2 or for Arduino UNO.

Then I fell upon ROS2 Control and got a bit fascinated. However reading the documentation I have a bit of a hard time to understand how to get things started. I think things will become clear automagically at some point, but in the meantime, do you think my project is possible at all using the ROS2 Control Framework?

edit retag flag offensive close merge delete


Is it possible? Yes. However, you won't be able to directly use ROS2 to communicate with your Arduino, but you'll need to google for solutions to transfer data from the Arduino UNO to a Raspberry Pi

Joe28965 gravatar image Joe28965  ( 2022-06-02 03:33:51 -0500 )edit

Thanks @Joe28965! I see, I think my understanding of ROS2 Control might have been wrong.

The way I thought it works is like this:

Imagine (for simplicity) that we have an arduino led that we want to turn on and off from Raspberry Pi using ROS2. We have a topic named "led" that takes values 1 and 0 ("on" and "off"). We have a hardware interface (in ROS2 Control) that knows how to deal with the serial communication for writing to an arduino. We also have a ROS2 publisher running in ROS2.

I thought our publisher would publish to the topic and ROS2 Control would handle the "translation" to the hardware communication. So every time we publish to a topic we would write to the Arduino serial port "automagically".

Is my understanding way off?

KiD gravatar image KiD  ( 2022-06-02 11:12:07 -0500 )edit

So to use the actual example of a diff drive, because it's a bit easier IMO.

ros2_control has a controller manager, a plugin and a hardware_interface. The controller manager simply only manages the other two. The plugin (in this case the diff drive controller) gets the values from cmd_vel and calculates the speed that each wheel should have.

You need to write the hardware interface, in there you need to add a vector and tell the diff drive controller to write the speeds for each wheel to that vector. You also add a vector and tell the diff drive controller that you will write the actual speeds to that vector (so it can calculate the odom for you).

The actual "knows how to deal with the serial communication" you need to add to the hardware interface yourself. ROS2 doesn't have a standard solution for it like ROS1 had ...(more)

Joe28965 gravatar image Joe28965  ( 2022-06-02 11:20:38 -0500 )edit

that (ran out of characters on my comment).

In ROS2, you will need to write the serial communication yourself. You can use ros2_control to do the conversion from cmd_vel to motor speeds and from encoder ticks to odom, but how you get that communication between the raspberry and arduino is something you need to do yourself.

Joe28965 gravatar image Joe28965  ( 2022-06-02 11:22:11 -0500 )edit

@Joe28965 thanks for a great comment, I was not aware of that difference between ROS1 and ROS2. So by using ros2_control, the Arduino would need only to send raw encoder ticks, and receive motor speed commands?

rosbotcom gravatar image rosbotcom  ( 2022-08-14 02:59:34 -0500 )edit