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