Building micro-ROS agent and ping pong demo by hand

You can follow https://micro.ros.org/docs/tutorials/core/first_application_linux/ to build micro-ROS agent. It’s easier and simpler than by hand. But it might be too abstracted.

This page describe how to build micro-ROS by hand instead.

micro_ros_agent

Agent itself is easier one to build.

$ colcon graph --packages-up-to micro_ros_agent
microcdr                              +         *  ......
rosidl_cli                             + * . .**.**......
rosidl_typesupport_interface            + * . *.*.**.....
rosidl_adapter                           + * *...........
rosidl_runtime_c                          + * *****..*...
rosidl_parser                              + *******.....
rosidl_runtime_cpp                          +    ***.*...
rosidl_cmake                                 +*******....
rosidl_generator_c                            +  *  * ...
rosidl_typesupport_introspection_c             +  * **...
rosidl_typesupport_microxrcedds_c               +  ***...
rosidl_generator_cpp                             +  * ...
rosidl_typesupport_introspection_cpp              + **...
rosidl_typesupport_microxrcedds_cpp                +**...
rosidl_default_generators                           + ***
rosidl_default_runtime                               +**.
builtin_interfaces                                    + *
micro_ros_msgs                                         +*
micro_ros_agent                                         +

To build it you run the following commad:

$ colcon build --packages-up-to micro_ros_agent

And run it.

$ ros2 run micro_ros_agent micro_ros_agent udp4 --port 8888

micro-ros demo app

The tutorial shows you how to build and run ping command from PC. This one is a bit tricky to build because you need to rebuild the type support for Micro XRCE-DDS and all the messages application needs (builtin_interface, std_msgs, and others)

Rebuild type support

Dependency on rosidl_default_generators

Ament does a good job of collecting all typesuppot and rebuilds interfaces and messages. Because of the plugin system nature of ROS IDL, interfaces and messages doesn’t depend on a specific typesupport. Instead, they depends on rosidl_default_generators for Humble, and rosidl_core_generators for Rolling.

$ grep buildtool_depend {common_interfaces/std_msgs,rcl_interfaces/builtin_interfaces}/package.xml
common_interfaces/std_msgs/package.xml:  <buildtool_depend>ament_cmake</buildtool_depend>
common_interfaces/std_msgs/package.xml:  <buildtool_depend>rosidl_default_generators</buildtool_depend>
rcl_interfaces/builtin_interfaces/package.xml:  <buildtool_depend>ament_cmake</buildtool_depend>
rcl_interfaces/builtin_interfaces/package.xml:  <buildtool_depend>rosidl_core_generators</buildtool_depend>
$ grep buildtool_depend {common_interfaces/std_msgs,rcl_interfaces/builtin_interfaces}/package.xml                    
common_interfaces/std_msgs/package.xml:  <buildtool_depend>ament_cmake</buildtool_depend>
common_interfaces/std_msgs/package.xml:  <buildtool_depend>rosidl_default_generators</buildtool_depend>
rcl_interfaces/builtin_interfaces/package.xml:  <buildtool_depend>ament_cmake</buildtool_depend>
rcl_interfaces/builtin_interfaces/package.xml:  <buildtool_depend>rosidl_core_generators</buildtool_depend>

Thus, if you reuse rosidl_default_generators from the base distribution, the type system plugins won’t get build.

$ colcon graph --packages-up-to builtin_interfaces
builtin_interfaces  +

Make sure to have rosidl_defaults and rosidl_typesupport_microxrcedds_c in your dependency chain.

$ (cd src; git clone https://github.com/ros2/rosidl_defaults)
$ colcon graph --packages-up-to builtin_interfaces
rosidl_cli                             + * . .**.**....
rosidl_typesupport_interface            + * . *.*.**...
rosidl_adapter                           + * *.........
rosidl_runtime_c                          + * *****..*.
rosidl_parser                              + *******...
rosidl_runtime_cpp                          +    ***.*.
rosidl_cmake                                 +*******..
rosidl_generator_c                            +  *  * .
rosidl_typesupport_introspection_c             +  * **.
rosidl_typesupport_microxrcedds_c               +  ***.
rosidl_generator_cpp                             +  * .
rosidl_typesupport_introspection_cpp              + **.
rosidl_typesupport_microxrcedds_cpp                +**.
rosidl_default_generators                           + *
rosidl_default_runtime                               +*
builtin_interfaces                                    +
$ colcon graph --packages-up-to std_msgs
microcdr                              +         *  .....
rosidl_cli                             + * . .**.**.....
rosidl_typesupport_interface            + * . *.*.**....
rosidl_adapter                           + * *..........
rosidl_runtime_c                          + * *****..*..
rosidl_parser                              + *******....
rosidl_runtime_cpp                          +    ***.*..
rosidl_cmake                                 +*******...
rosidl_generator_c                            +  *  * ..
rosidl_typesupport_introspection_c             +  * **..
rosidl_typesupport_microxrcedds_c               +  ***..
rosidl_generator_cpp                             +  * ..
rosidl_typesupport_introspection_cpp              + **..
rosidl_typesupport_microxrcedds_cpp                +**..
rosidl_default_generators                           + **
rosidl_default_runtime                               +**
builtin_interfaces                                    +*
std_msgs                                               +

static vs shared

Because Micro XRCE-DDS is targeting embedded system, it defaults to build static libaries instead of shared libraries which other ROS2 components usually built to.

ag 'find_package\(ament_cmake(_ros| )' src/**/CMakeLists.txt
  :
src/rosidl_typesupport_microxrcedds/rosidl_typesupport_microxrcedds_c/CMakeLists.txt
19:find_package(ament_cmake REQUIRED)

Building static type support for PC doesn’t seem to be supported. Instead, set BUILD_SHARED_LIBS to ON.

$ colcon build --packages-up-to builtin_interfaces --cmake-args -DBUILD_SHARED_LIBS=ON

or, if you have colcon-mixin

$ colcon build --packages-up-to builtin_interfaces --mixin shared

After the build, make sure you have libbuiltin_interfaces__rosidl_typesupport_microxrcedds_c.so under install/lib/.

Building ping pong

If you can successfuly build the type system, it should be straightforward to build the demo.

$ colcon graph --packages-up-to micro_ros_demos_rclc
microcdr                              +  *       *   .........*.........
rosidl_cli                             +  * . .**..**...................
rosidl_typesupport_interface            +  * . *.*..**..................
microxrcedds_client                      +                    *        *
rosidl_adapter                            + * *.........................
rosidl_runtime_c                           + * ******..*.............*..
rosidl_parser                               + ****.***..................
rosidl_runtime_cpp                           +     ***.*................
rosidl_cmake                                  +***.****.......*.....*...
rosidl_generator_c                             +   *  * ...... ....*....
rosidl_typesupport_introspection_c              + * * **................
rosidl_typesupport_microxrcedds_c                +   ***......*.........
micro_ros_utilities                               +                    *
rosidl_generator_cpp                               +  * ...... .... . . 
rosidl_typesupport_introspection_cpp                + **................
rosidl_typesupport_microxrcedds_cpp                  +**......*.........
rosidl_default_generators                             + ****** **** * * 
rosidl_default_runtime                                 +******.****.*.*.
builtin_interfaces                                      +  *** *..*.****
micro_ros_msgs                                           +    *        .
unique_identifier_msgs                                    +*    . .. . .
action_msgs                                                +    * *. . .
complex_msgs                                                +          *
rcl_interfaces                                               +       * *
rmw_microxrcedds                                              +        *
std_msgs                                                       + * *****
example_interfaces                                              +  * * *
geometry_msgs                                                    +  * **
test_msgs                                                         +*    
rclc                                                               + * *
sensor_msgs                                                         + **
rclc_parameter                                                       + *
visualization_msgs                                                    +*
micro_ros_demos_rclc                                                   +
$ ros2 run micro_ros_demos_rclc ping_pong

or

$ build/micro_ros_demos_rclc/ping_pong/src/ping_pong-build/ping_pong

or

install/lib/micro_ros_demos_rclc/ping_pong/ping_pong