みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

YoctoでROS2に入門する(その1)

はじめに

ロボット制御のソフトウェアを開発するのにROSが有名である。

ROSはLinux上で動くミドルウェアとなっている。なのでYocto Projectでも使える。

Yocto Projectのためにmeta-rosというものが存在する。

環境構築も含めて全く触ったことがなかったので調べてみる。

環境構築

meta-rosのREADMEの「Getting Started」を読むと下記のようにある。

You may use the kas tool to clone the necessary git repositories and kick off the build.

とりあえずkas使ってビルドしとけ。ということらしい。

kas

kasは本ブログでも取り扱ったことがある

yamlに書いておくだけで必要なレイヤをすべて持ってきてビルドしてくれる。 local.confやbblayers.confも自動生成されるのでとっても便利。正直ビルドするだけならrepoより断然便利。

kas用のyamlファイルを管理するためだけにmeta-rosにはbuildブランチが存在する。

ビルド手順

詳しい手順はbuildブランチのREADME.mdに記載がある。

ビルド

実際にビルドしてみる。

meta-rosのbuildブランチ

下記でmeta-rosのbuildブランチを取得する。

$ mkdir ~/kas && cd ~/kas
$ git clone -b build https://github.com/ros/meta-ros

提供されているyamlファイル

meta-rosが提供しているkasのyamlファイルは次の3つの項目の組み合わせとなる

  • Yoctoバージョン
  • ROSバージョン
  • ターゲット(MACHINE)

提供されているファイルは以下となる。

ファイル名 Yocto ROS MACHINE
oeros-kirkstone-humble-jetson-agx-xavier-devkit.yml kirkstone humble jetson-agx-xavier-devkit
oeros-kirkstone-humble-jetson-orin-nano-devkit.yml kirkstone humble jetson-orin-nano-devkit
oeros-kirkstone-humble-qemux86-64.yml kirkstone humble qemux86-64
oeros-kirkstone-humble-raspberrypi4-64.yml kirkstone humble raspberrypi4-64
oeros-kirkstone-iron-qemux86-64.yml kirkstone iron qemux86-64
oeros-kirkstone-iron-raspberrypi4-64.yml kirkstone iron raspberrypi4-64
oeros-kirkstone-jazzy-qemux86-64.yml kirkstone jazzy qemux86-64
oeros-kirkstone-jazzy-raspberrypi4-64.yml kirkstone jazzy raspberrypi4-64
oeros-kirkstone-noetic-qemux86-64.yml kirkstone noetic qemux86-64
oeros-kirkstone-noetic-raspberrypi4-64.yml kirkstone noetic raspberrypi4-64
oeros-kirkstone-rolling-qemux86-64.yml kirkstone rolling qemux86-64
oeros-kirkstone-rolling-raspberrypi4-64.yml kirkstone rolling raspberrypi4-64
oeros-master-humble-qemux86-64.yml master humble qemux86-64
oeros-master-humble-raspberrypi4-64.yml master humble raspberrypi4-64
oeros-master-iron-qemux86-64.yml master iron qemux86-64
oeros-master-iron-raspberrypi4-64.yml master iron raspberrypi4-64
oeros-master-jazzy-qemux86-64.yml master jazzy qemux86-64
oeros-master-jazzy-raspberrypi4-64.yml master jazzy raspberrypi4-64
oeros-master-noetic-raspberrypi4-64.yml master noetic raspberrypi4-64
oeros-master-rolling-qemux86-64.yml master rolling qemux86-64
oeros-master-rolling-raspberrypi4-64.yml master rolling raspberrypi4-64
oeros-mickledore-humble-qemux86-64.yml mickledore humble qemux86-64
oeros-mickledore-humble-raspberrypi4-64.yml mickledore humble raspberrypi4-64
oeros-scarthgap-humble-qemux86-64.yml scarthgap humble qemux86-64
oeros-scarthgap-humble-raspberrypi4-64.yml scarthgap humble raspberrypi4-64
oeros-scarthgap-iron-qemux86-64.yml scarthgap iron qemux86-64
oeros-scarthgap-iron-raspberrypi4-64.yml scarthgap iron raspberrypi4-64
oeros-scarthgap-jazzy-qemux86-64.yml scarthgap jazzy qemux86-64
oeros-scarthgap-jazzy-raspberrypi4-64.yml scarthgap jazzy raspberrypi4-64
oeros-scarthgap-noetic-qemu86-64.yml scarthgap noetic qemu86-64
oeros-scarthgap-noetic-raspberrypi4-64.yml scarthgap noetic raspberrypi4-64
oeros-scarthgap-rolling-qemux86-64.yml scarthgap rolling qemux86-64
oeros-scarthgap-rolling-raspberrypi4-64.yml scarthgap rolling raspberrypi4-64

kas build

下記でダウンロードからbitbakeまでやってくれる。

$ mkdir ~/kirkstone && cd ~/kirkstone
$ kas build ~/kas/meta-ros/kas/oeros-kirkstone-humble-qemux86-64.yml

今回はkirkstone + humble + qemux86-64を選択した。

bitbakeのターゲットは、yamlの設定によってros-image-coreとなっている。

$ cat ~/kas/meta-ros/kas/ros2/humble.yml
header:
  version: 14

distro: "ros2"

repos:
  ros:
    url: "https://github.com/ros/meta-ros.git"
    path: "layers/meta-ros"
    layers:
      meta-ros-common:
      meta-ros2:
      meta-ros2-humble:

target:
  - ros-image-core

ビルド環境の確認

kasによって作成されたビルド環境を確認する。

レイヤ

kas shellを使用するとoe-init-build-envをしないでkas経由でbitbake関連のコマンドを実行することができる。

$ kas shell ~/kas/meta-ros/kas/oeros-kirkstone-humble-qemux86-64.yml -c 'bitbake-layers show-layers'
... (snip) ...
layer                 path                                      priority
==========================================================================
meta-filesystems      /home/ubuntu/kirkstone/build/../layers/meta-openembedded/meta-filesystems  5
meta-gnome            /home/ubuntu/kirkstone/build/../layers/meta-openembedded/meta-gnome  5
meta-initramfs        /home/ubuntu/kirkstone/build/../layers/meta-openembedded/meta-initramfs  5
meta-multimedia       /home/ubuntu/kirkstone/build/../layers/meta-openembedded/meta-multimedia  5
meta-networking       /home/ubuntu/kirkstone/build/../layers/meta-openembedded/meta-networking  5
meta-oe               /home/ubuntu/kirkstone/build/../layers/meta-openembedded/meta-oe  5
meta-perl             /home/ubuntu/kirkstone/build/../layers/meta-openembedded/meta-perl  5
meta-python           /home/ubuntu/kirkstone/build/../layers/meta-openembedded/meta-python  5
meta-webserver        /home/ubuntu/kirkstone/build/../layers/meta-openembedded/meta-webserver  5
meta-xfce             /home/ubuntu/kirkstone/build/../layers/meta-openembedded/meta-xfce  5
meta-ros-common       /home/ubuntu/kirkstone/build/../layers/meta-ros/meta-ros-common  10
meta-ros2             /home/ubuntu/kirkstone/build/../layers/meta-ros/meta-ros2  11
meta-ros2-humble      /home/ubuntu/kirkstone/build/../layers/meta-ros/meta-ros2-humble  12
meta                  /home/ubuntu/kirkstone/build/../layers/openembedded-core/meta  5

local.conf

kasによって出力されたlocal.confは必要最低限の記述しかない。

# common
DISTRO_FEATURES += "usrmerge"
IMAGE_FEATURES += "debug-tweaks"
INHERIT += "report-error"
INHERIT += "rm_work"
INHERIT_DISTRO:remove = "create-spdx"
WARN_QA:remove = "license-exists"
TEMPLATECONF = ""

MACHINE ??= "qemux86-64"
DISTRO ??= "ros2"
BBMULTICONFIG ?= ""

動作確認

下記のコマンドでQEMUを起動する。

$ kas shell ~/kas/meta-ros/kas/oeros-kirkstone-humble-qemux86-64.yml -c 'runqemu nographic'

QEMUのログインプロンプト

Robot Operating System 2 (ROS 2) with OpenEmbedded Linux 2.humble.2024-06-20.3-0 qemux86-64 ttyS0

qemux86-64 login: root
root@qemux86-64:~# cat /etc/os-release
ID=ros2
NAME="Robot Operating System 2 (ROS 2) with OpenEmbedded Linux"
VERSION="2.humble.2024-06-20.3-0 (humble)"
VERSION_ID=2.humble.2024-06-20.3-0
PRETTY_NAME="Robot Operating System 2 (ROS 2) with OpenEmbedded Linux 2.humble.2024-06-20.3-0 (humble)"
DISTRO_CODENAME="humble"
root@qemux86-64:~# uname -a
Linux qemux86-64 5.15.150-yocto-standard #1 SMP PREEMPT Mon Mar 11 14:54:28 UTC 2024 x86_64 GNU/Linux
root@qemux86-64:~#

ros2コマンド

root@qemux86-64:~# which ros2
/usr/bin/ros2

ros2コマンドが/usr/binに入っている。

まとめ

kasを使うと、簡単にYocto Project環境でROS2を使うことができた。 実際にはビルドシステムとしてPokyではなく、素のbitbakeとopenembedded-coreを使用しているので厳密にはYocto Project環境ではないが。