えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

Raspbian + ROS2向けクロスコンパイル環境が完成したので公開します。

私は、Raspberry Pi OS (Raspbian) + ROS2の環境構築には結構時間をかけて取り組んでいます。

過去記事:ROS2-HumbleのRaspbian-Bullseye (32bit/64bit)向けビルドを公開しました。

最近ではRaspbian上でRviz2を動かせるようになり、ほとんどの依存関係は解消できるようになりました。


Raspbianにこだわっている理由としては、UbuntuがRaspberryPiには結構重く、他の人がRaspberryPi+Ubuntuで開発をしているものを見る感じでも使いづらいだろうなーと感じたからです。RaspbianだとVSCodeも使いやすいです。


最近は、私が公開しているRaspbian向けのROSインストーラである「rpi-bullseye-ros2」の使用報告もあり、GitHub Sponsor経由での支援も頂いています。

まだまだ途上ではありますが、必要とされていることを実感でき嬉しい限りです。

github.com

このパッケージは私も毎週のように使用しており定期的に改善を行っているので、改善提案などあればissueやpull requestを送っていただけるとありがたいです。


コンパイルが…遅い

ところで、皆さんはRaspberryPi向けにクロスコンパイルを行っていますか?

私は、半年前まではデスクトップPCでプログラムを作成して、完成したらランタイムのRaspberryPiでコンパイルをしていました。(その当時は、ROSもRaspberryPiでコンパイルしていました…)

RaspberryPiでコンパイルはやはり遅いのと、パッケージが大きすぎた場合にRAMによってはフリーズしてしまいます。

できれば高性能なコンピュータであらかじめコンパイルできると、大きなプロジェクトでも手軽にコンパイルできるのになーと思いクロスコンパイルツールの模索をしていました。

当初は同じARM64のJetson AGXでクロスコンパイル環境を作成しており、debian/bullseye環境のDockerコンテナを作成してワークスペースをマウント→コンパイルしていました。

bullseye環境上でコンパイルしたパッケージは、そのままUbuntu環境のJetsonでも動作します。

そのうち、Twitterで教えてもらったqemu-user-staticを使用してx86-64コンパイルするようになりました。

qemu-user-staticは、そのコンテナを実行した後のターミナル使用するDockerの環境がARMなどの別アーキテクチャになる魔法のようなコンテナです。

github.com

qemuと同様に命令変換コストがかかりますが、高性能なデスクトップコンピュータ(i9-12900KF)であればRaspberryPiの4.6倍の速度でコンパイルすることができます。

コンパイル速度比較

ちなみに、qemuありとなしではなしの方がありに比べて4倍の速度がありました。命令の変換コスト、高いですね…


ロスコンパイルツールの使用方法

これまでの知見をもとに、Dockerfileと実行スクリプトGitHubリポジトリを作成しました。

github.com

使用する際はFork推奨です。


rpi-bullseye-ros2-xcompileのインストール

現時点では、Dockerfileなどを書き換えやすいようにショートカットのみを作成しています。

git clone https://github.com/Ar-Ray-code/rpi-bullseye-ros2-xcompile
cd rpi-bullseye-ros2-xcompile
bash create_alias.bash
source ~/.bashrc

サンプルプロジェクトのダウンロード

サンプルプロジェクトをダウンロードします。

ROSで画像処理を行う際に必要な依存パッケージであるimage_commonを使用します。

mkdir -p ~/ros2_ws/src/
cd ~/ros2_ws/src
git clone https://github.com/ros-perception/image_common -b ros2

github.com

コンパイル

xcompile_rpi_ros2 [ros2用のワークスペース] [Docker内で実行するシェルスクリプト(オプション)]コンパイルできます。

aptで追加パッケージをインストールしないといけない場合やコンパイルオプションを変更したい場合は、以下のファイルを編集してください。

xcompile_rpi_ros2 ~/ros2_ws

コンパイルが正常に終わると、対象ワークスペース(ここでは ~/ros2_ws)に built_pkg_rpi_<unixtime>.zip が作成されています。コンパイル時のタイムスタンプが付いているので、上書きされません。

RaspberryPi上で使用したい場合はunzipして、展開後のsetup.bashを実行してパスを通すだけで使用できます。


Zenn Booksでのドキュメント化📕

現在、チュートリアル資料やクロスコンパイルのノウハウなどを含めたドキュメントをZenn Booksで作成中です。

タイトルは「RaspberryPi OSで始めるROS2」で、ほとんどの項目を無料公開にする予定です。


他の有料記事に負けない分量とクオリティを目指す予定なので、今しばらくお待ちください。