はじめに
とりあえず前回までにRaspberryPi用の最小環境イメージを作成することができました。
今回は、いよいよROS環境入りのイメージを作成してみます。ビルドに必要なものは次のリポジトリにあります。
https://github.com/ros/meta-ros
見たところチュートリアルで見たYoctoの基本的な使い方と少しずれているようで、なんか気持ちが悪い気はします。まあでも、とりあえず最初は手順通りに行ってみようと思います。
手順
以下のリポジトリの説明に従って手順を進めていきます。
https://github.com/ros/meta-ros/wiki/OpenEmbedded-Build-Instructions
ホストに必要なツールをインストールします。また、ロケールの設定を行うように書かれていました。
sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \
build-essential chrpath socat cpio python python3-pip python3-pexpect \
xz-utils debianutils iputils-ping \
g++-multilib locales lsb-release python3-distutils time
sudo locale-gen en_US.utf8
どこかにプロジェクトディレクトリを作成します。
mkdir rpi-ros2
cd rpi-ros2
meta-rosをクローンします。さて、ここからの手順ですが、どうも最初のチュートリアルで行ったように、レイヤを追加してbitbake、という標準的な手順とは少し違っているようです。
git clone -b thud-draft https://github.com/ros/meta-ros.git
クローンしたリポジトリからmcfという拡張子のファイルを取り出し、プロジェクトディレクトリ直下のconfにコピーしています。
mkdir conf
cp meta-ros/files/*.mcf conf/.
mcfという独自プログラムに.mcfの設定ファイルを食わせ、各種設定を行うようです。 ここで選ぶ.mcfファイルによって、ROS1,2どちらのビルドを行うか、またROSディストリビューション名が決定するようです。
(個人的には、あまりこういう標準でない独自ツールを使うという設計は好きではありません。。)
meta-ros/scripts/mcf -f conf/ros2-dashing.mcf
次にビルドディレクトリを作ります。チュートリアルではoe-init-build-envに自動で作らせていましたが、今回は自分で作れということらしいです。プロジェクトディレクトリ直下のconfディレクトリへのリンクをbuild以下に作成しています。これは、bitbakeの仕様としてbuildディレクトリ以下の設定ファイルを読むためです。
mkdir build
cd build
ln -snf ../conf .
cd ..
環境変数などのセットアップを行います。まずは不要な環境変数を削除します。プロジェクトディレクトリ以下で次を実行します。
unset BDIR BITBAKEDIR BUILDDIR OECORELAYERCONF OECORELOCALCONF OECORENOTESCONF OEROOT TEMPLATECONF
source openembedded-core/oe-init-build-env
勝手にbuildディレクトリにcdさせられるのでプロジェクトディレクトリ以下に戻ります。
cd ..
最後に、最終生成物を入れるディレクトリを作ります。 マニュアルには別なディスクに作れと書いてあります。おそらくパフォーマンス向上のためで、遅くてよいのなら同じディスク上でも大丈夫だと思います。
mkdir -p /absolute/path/to/directory/on/separate/disk
次に、build/conf/local.confを設定します。まずはターゲットボードを設定します。 Raspberry Piは3しか対応していないような記述もあったような気もしましたが、一応大丈夫のようです。
MACHINE ??= "raspberrypi"
以下を適宜変更してlocal.confの末尾に追加します(パスは適宜変更)。 DL_DIR、SSTATE_DIRなどはキャッシュのようなものなので、プロジェクトディレクトリの上位に置いて使いまわすと次回移行のビルドが速くなるようです。
# ROS設定ファイルのバージョン
ROS_LOCAL_CONF_SETTINGS_VERSION = "1"
# 先程作成した最終生成物ディレクトリ
ROS_COMMON_ARTIFACTS = "/absolute/path/to/directory/on/separate/disk"
# ダウンロードしたアーカイブの保存場所
DL_DIR = "/home/xxx/yocto/downloads"
# ビルドの中間生成物の保存場所
SSTATE_DIR = "/home/xxx/yocto/sstate"
# ROSビルドの一時ファイルの保存場所
TMPDIR = "${ROS_COMMON_ARTIFACTS}/BUILD-${DISTRO}-${ROS_DISTRO}"
# 不明
TCLIBCAPPEND := ""
# ビルドの並列化数
BB_NUMBER_THREADS = "${@min(int(bb.utils.cpu_count()), 20)}"
PARALLEL_MAKE = "-j ${BB_NUMBER_THREADS}"
設定が完了したら、ビルドを開始します。かなり時間がかかります。
とりあえず、ROSの最も中核の部分のみが入ったROSを焼いてみます。
(roscoreと書いてありますが、ROS2の場合はどうなるのでしょうか。中核部分という意味なのか。)
cd /path/to/project_dir
source openembedded-core/oe-init-build-env
cd ..
bitbake core-image-ros-roscore
完成したら、SDカードに焼いてみます。果たして。
>git clone -b thud-draft https://github.com/ros/meta-ros.git
そのブランチは存在しないです。
ご指摘ありがとうございます。
記事が古くなっていそうなので、再度確認してみます。