.. spelling:word-list:: multilib Noetic .. include:: /keyword.rst === ROS === ``meta-ros`` OpenEmbedded layers are designed to add support for the Robot Operating System (ROS) for embedded Linux systems based on Yocto. These instructions are for building ROS 2 Humble and ROS 1 Noetic using OpenEmbedded release series Dunfell (Yocto 3.1) or Kirkstone (Yocto 4.0) on |IOT-YOCTO|. An overview of OpenEmbedded/Yocto can be found in the `Yocto Project Overview and Concepts Manual `_. Additional information on ``meta-ros`` can be found in `Superflore OE Recipe Generation Scheme `_. .. important:: Users can only choose RO2 or ROS1 to install, we do not support both versions existing in the system at the same time Add ROS to Image ================ In ``conf/local.conf`` , change ``MACHINE`` to your desired platform and comment out multilib-relevant configuration: .. code-block:: # change MACHINE to your desired platform, default is i300a-pumpkin MACHINE ??= "genio-700-evk" # Define multilib target #require conf/multilib.conf #MULTILIBS = "multilib:lib32" #DEFAULTTUNE:virtclass-multilib-lib32 = "armv7athf-neon" # Video Encode on i300a is only supported in the 32-bits binaries #IMAGE_INSTALL:remove:i300a = "mtk-vpud" #IMAGE_INSTALL:append:i300a = "lib32-mtk-vpud" Build ROS on Kirkstone ---------------------- Please run following command to download the ``meta-ros`` layer: .. prompt:: bash git clone https://github.com/ros/meta-ros.git -b kirkstone $PROJ_ROOT/src/meta-ros If not already ``kirkstone`` Modify the compatible series in configuration file to ``kirkstone`` .. code-block:: vim src/meta-ros/meta-ros-common/conf/ros-distro/ros-distro.conf # change ROS_OE_RELEASE_SERIES to kirkstone, default is honister ROS_OE_RELEASE_SERIES = "kirkstone" Add ROS2 Layer ^^^^^^^^^^^^^^ 1. Add ``meta-ros`` layers to ``conf/bblayers.conf`` .. code-block:: /src/poky/../meta-ros/meta-ros2 \ /src/poky/../meta-ros/meta-ros-common \ /src/poky/../meta-ros/meta-ros2-humble \ 2. Add this to the bottom of ``conf/local.conf`` .. code-block:: ROS_DISTRO = "humble" EXTRA_IMAGE_FEATURES ?= "ros-implicit-workspace" IMAGE_INSTALL:append = " ros-core " # Add subsequent desired ROS2 packages as below: IMAGE_INSTALL:append = " demo-nodes-cpp " .. Note:: Currently we only support ROS2 on Kirkstone. .. Important:: You might get build failed log for `libcamera` similar to the following content .. code-block:: ERROR: Multiple versions of libcamera are due to be built ($PROJ_DIR/src/poky/../meta-ros/meta-ros2-humble/generated-recipes/libcamera/libcamera_0.1.0-1.bb $PROJ_DIR/src/poky/../meta-openembedded/meta-multimedia/recipes-multimedia/libcamera/libcamera.bb). Only one version of a given PN should be built in any given build. You likely need to set PREFERRED_VERSION_libcamera to select the correct version or don't depend on multiple versions. We are getting this error because both the recipes, `libcamera` from OpenEmbedded as well as the one provided by ROS2 share the same name and version. The best way forward for now is to change the name of this ROS2 recipe from ``libcamera`` to ``ros-libcamera``. The below steps work: .. code-block:: i. Navigate to your project directory # cd $PROJ_DIR/src/meta-ros/meta-ros2-humble/generated-recipes ii. Rename libcamera directory to ros-libcamera, also the recipe # mv libcamera ros-libcamera # cd ros-libcamera # mv libcamera_0.1.0-1.bb ros-libcamera.bb iii. Edit the recipe (`ros-libcamera.bb`) and rename ROS_CN and ROS_BPN from libcamera to ros-libcamera: # ROS_CN = "ros-libcamera" # ROS_BPN = "ros-libcamera" iv. Navigate to $PROJ_DIR/src/meta-ros/meta-ros2-humble/recipes-bbappends/ # mv libcamera ros-libcamera # cd ros-libcamera # mv libcamera_0.1.0-1.bbappend ros-libcamera.bbappend v. ROS2 package camera-ros (generated-recipes/camera-ros/camera-ros*.bb) depends on ros2 package libcamera. Rename ``libcamera`` to ``ros-libcamera``. If you want to add `libcamera` ROS2 package to the image, simply add ``IMAGE_INSTALL:append = " ros-libcamera "`` in ``conf/local.conf``. 3. Build image. Please refer to :ref:`Build Image ` section for details. Build ROS on Dunfell -------------------- Please run following command to download the ``meta-ros`` layer: .. prompt:: bash git clone https://github.com/ros/meta-ros.git -b dunfell $PROJ_ROOT/src/meta-ros Add ROS2 Layer ^^^^^^^^^^^^^^ 1. Add ``meta-ros`` layers to ``conf/bblayers.conf`` .. code-block:: /src/poky/../meta-ros/meta-ros2 \ /src/poky/../meta-ros/meta-ros-common \ /src/poky/../meta-ros/meta-ros2-galactic \ /src/poky/../meta-ros/meta-ros-backports-gatesgarth \ /src/poky/../meta-ros/meta-ros-backports-hardknott \ 2. Add this to the bottom of ``conf/local.conf`` .. code-block:: ROS_DISTRO = "galactic" EXTRA_IMAGE_FEATURES ?= "ros-implicit-workspace" IMAGE_INSTALL:append = " ros-core " # Add subsequent desired ROS2 packages as below: IMAGE_INSTALL:append = " demo-nodes-cpp " 3. Build image. Please refer to :ref:`Build Image ` section for details. Add ROS1 Layer ^^^^^^^^^^^^^^ 1. Add ``meta-ros`` layers to ``conf/bblayers.conf`` .. code-block:: /src/poky/../meta-ros/meta-ros1 \ /src/poky/../meta-ros/meta-ros-common \ /src/poky/../meta-ros/meta-ros1-noetic \ /src/poky/../meta-ros/meta-ros-backports-gatesgarth \ /src/poky/../meta-ros/meta-ros-backports-hardknott \ 2. Add this to the bottom of ``conf/local.conf`` .. code-block:: ROS_DISTRO = "noetic" EXTRA_IMAGE_FEATURES ?= "ros-implicit-workspace" IMAGE_INSTALL:append = " ros-core " 3. Comment out the blacklisted ``roslisp`` and ``genlisp`` to avoid the building rejection .. code-block:: vim src/meta-ros/meta-ros1-noetic/conf/ros-distro/include/noetic/ros-distro-recipe-blacklist.inc # Comment out the following lines #PNBLACKLIST[roslisp] ?= "${@bb.utils.contains('ROS_WORLD_SKIP_GROUPS', 'lisp', 'depends on sbcl for which there is no OE recipe', '', d)}" #PNBLACKLIST[genlisp] ?= "${@bb.utils.contains('ROS_WORLD_SKIP_GROUPS', 'lisp', 'depends on sbcl for which there is no OE recipe', '', d)}" 3. Build image. Please refer to :ref:`Build Image ` section for details. .. _build_image: Build Image ----------- Please refer to :doc:`/sw/yocto/get-started/build-code` to build the demo images of each board. .. note:: Various WARNING-s will be issued by Bitbake when building these images. They can be ignored. After a successful build of an image, it can be found under ``TMPDIR/deploy/images/MACHINE``. Image Sanity Testing ==================== ROS 2 Sanity Test ----------------- .. note:: Without a network connection, there's no output from ROS2 topic echo /chatter. .. code-block:: $ source /etc/profile.d/ros/setup.sh $ ros2 topic list /parameter_events /rosout $ (sleep 5; ros2 topic pub /chatter std_msgs/String "data: Hello world") & $ ros2 topic echo /chatter publisher: beginning loop publishing #1: std_msgs.msg.String(data='Hello world') data: Hello world publishing #2: std_msgs.msg.String(data='Hello world') data: Hello world ROS 1 Sanity Test ----------------- For now, only the barest minimum sanity testing is done on the images. .. code-block:: $ source /opt/ros/noetic/setup.sh $ roscore & ... started core service [/rosout] $ rosnode list /rosout $ rosnode info /rosout Node [/rosout] Publications: * /rosout_agg [rosgraph_msgs/Log] Subscriptions: * /rosout [unknown type] Services: * /rosout/get_loggers * /rosout/set_logger_level contacting node http://genio-700-evk:40943/ ... Pid: 967