Meta ROS
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 meta-ros to rity-demo-image
In conf/local.conf
, change MACHINE
to your desired platform and comment out multilib-relevant configuration:
# 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:
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
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
Add
meta-ros
layers toconf/bblayers.conf
<absolute_path_to_rity-kirkstone>/src/poky/../meta-ros/meta-ros2 \
<absolute_path_to_rity-kirkstone>/src/poky/../meta-ros/meta-ros-common \
<absolute_path_to_rity-kirkstone>/src/poky/../meta-ros/meta-ros2-humble \
Add this to the bottom of
conf/local.conf
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
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:
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
.
Build image. Please refer to Build Image section for details.
Build ROS on Dunfell
Please run following command to download the meta-ros
layer:
git clone https://github.com/ros/meta-ros.git -b dunfell $PROJ_ROOT/src/meta-ros
Add ROS2 layer
Add
meta-ros
layers toconf/bblayers.conf
<absolute_path_to_rity-dunfell>/src/poky/../meta-ros/meta-ros2 \
<absolute_path_to_rity-dunfell>/src/poky/../meta-ros/meta-ros-common \
<absolute_path_to_rity-dunfell>/src/poky/../meta-ros/meta-ros2-galactic \
<absolute_path_to_rity-dunfell>/src/poky/../meta-ros/meta-ros-backports-gatesgarth \
<absolute_path_to_rity-dunfell>/src/poky/../meta-ros/meta-ros-backports-hardknott \
Add this to the bottom of
conf/local.conf
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 "
Build image. Please refer to Build Image section for details.
Add ROS1 layer
Add
meta-ros
layers toconf/bblayers.conf
<absolute_path_to_rity-dunfell>/src/poky/../meta-ros/meta-ros1 \
<absolute_path_to_rity-dunfell>/src/poky/../meta-ros/meta-ros-common \
<absolute_path_to_rity-dunfell>/src/poky/../meta-ros/meta-ros1-noetic \
<absolute_path_to_rity-dunfell>/src/poky/../meta-ros/meta-ros-backports-gatesgarth \
<absolute_path_to_rity-dunfell>/src/poky/../meta-ros/meta-ros-backports-hardknott \
Add this to the bottom of
conf/local.conf
ROS_DISTRO = "noetic"
EXTRA_IMAGE_FEATURES ?= "ros-implicit-workspace"
IMAGE_INSTALL:append = " ros-core "
Comment out the blacklisted
roslisp
andgenlisp
to avoid the building rejection
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)}"
Build image. Please refer to Build Image section for details.
Build Image
Please refer to Build from Source 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.
$ 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.
$ 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