💚

Bazel and ROS 2のインストールと動作確認

2024/08/25に公開

海洋ロボコンをやってた人です。

今回はBazel と ROS 2について調べたことと、動作確認についてのチップスを備忘録として記載していきます。

記事を書いた理由は以下です。

  • Bazelとは?を知る
  • ROS 2での利用も検討されているので、実際に使ってみたい


何かコメントあれば積極的に募集します。
また、適宜更新あれば追記します。

1. Bazel

「Bazel」は、Google開発のオープンソースビルドツールで動画からは「ベイゾル」と発音されています。
なので、私も本家に発音を合わせています。

Full Event | Bazel Day 2023 on Google Open Source Live

First things, What is Bazel?

Bazel is an open source build test tool used by orgnaizations of all sizes and technical complexity with a unique set of attributes and behaviros.

Bazel is highly scalable.
With Bazel, you can build large code bases very quickly using parallel execution, remote caching and remote execution.

1.1 Install

https://bazel.build/install/ubuntu?hl=ja

基本は上述の通りにインストールします。今回はUbuntu 22.04 LTSを使用してテストします(2024/08現在)

terminal
sudo apt install apt-transport-https curl gnupg -y
curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor >bazel-archive-keyring.gpg
sudo mv bazel-archive-keyring.gpg /usr/share/keyrings
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/bazel-archive-keyring.gpg] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list

sudo apt update && sudo apt install bazel
bazel --version  # bazel 7.3.1

1.2 Tutorial

bazelのバージョン確認までできたら、実際にテストコードを作成しbazelでビルド/実行してみます。
テストコードは以下を参照して作成しました、ありがとうございます。

https://note.com/npaka/n/n898f177e7a9e#e2COv

mkdir -p bazel_ws/hello_world
cd ~/bazel_ws/hello_world
bazel build //main:helloworld
bazel run //main:helloworld

実際にテストコードを走らせると上述のようになるはずです。

2. Bazel ROS 2 & Ignition

調べるとROS 2をBazelで使用するためのOSSは様々あります。

https://github.com/ApexAI/rules_ros

https://github.com/nicolov/ros-bazel

https://github.com/RobotLocomotion/drake-ros

このSecctionでは、BazelをROS 2で使用しようとしている利点およびコミュニティ、使い方についても記載していきます。

2.1 Comparing Colcon/CMake vs. Bazel

よく比較対象として挙げられるのがColcon/CMake vs. Bazelのようです。

以下でもBazel と ROS 2のビルドについて言及されています。

Bazel and ROS 2 – building large scale safety applications

上述動画内の06:30〜のComparingから引用して記載します。

Feature Colcon/CMake Bazel
Build Language Imperative macro language, different definitions
命令型のマクロ言語、異なる定義
Declarative, abstract definition of build
宣言的で抽象的なビルド定義
Build Tool Variety Various different build tools (CMakeLists.txt, setuptools, Make)
さまざまなビルドツール (CMakeLists.txt, setuptools, Make)
Full programming language (Starlark) for extension/customization
拡張・カスタマイズのためのプログラミング言語 (Starlark)
Programming Language Support C/C++ as (main) target language
C/C++を主なターゲット言語としてサポート
Multi-language support (Android/C/C++/Java/Python/C#/Go/Rust)
複数言語のサポート (Android/C/C++/Java/Python/C#/Go/Rust)
Caching Caching not safe, due to potentially missing dependencies
依存関係が欠けている可能性があるため、キャッシュが安全でない
(Almost) Hermetic build in sandboxes
ほぼ完全なサンドボックスビルド
Dependency Management Compile time and runtime dependency discovery
コンパイル時および実行時に依存関係を発見
Explicit (full) dependency tree
明示的な(完全な)依存関係ツリー

2.2 Others Community

またコニュニティとしての活動もあるようです。

Bazel は、make や cmake の代わりに使用できるオープンソースのビルドおよびテスト ツールです。Bazel はビルドの決定論に重点を置いており、高速で信頼性の高いビルド ツールとなっています。

Ignition リポジトリに Bazel ビルド サポートを追加するプロセスについて説明するとともに、bazel をビルド ツールとして使用する利点がいくつか紹介されています。

Ignition Community Meeting February 2022 — ROS 2 Control and Bazel Builds

gz-bazel

2.3 How to use Bazel ROS 2

せっかくなので、Bazelを使用したROS 2のサンプルプログラムも動かしてみましょう。
使用するのはApexAIのrules_rosを使用します。

ApexAIのrules_rosは.bazelversion == 6.5.0でないと動かないようなので、バージョン指定してインストールをします。

terminal
sudo apt update && sudo apt install bazel-6.5.0
git clone https://github.com/ApexAI/rules_ros.git
cd ~/bazel_ws/rules_ros
bazel build @rules_ros//examples/hello_world
bazel run @rules_ros//examples/hello_world

terminal
bazel build @rules_ros//examples/bazel_simple_example:publisher
bazel build @rules_ros//examples/bazel_simple_example:subscriber

キャッシュのクリアは直接削除するか、bazel cleanコマンドを使用する

terminal
bazel clean --expunge

sudo rm -r /home/ubuntu/.cache/bazel/_bazel_ubuntu/*

https://github.com/ApexAI/rules_ros/issues/9#issue-2235014396

となった場合は上述を参照してください。(これは私も解決できませんでした)

Python Interpreterの機能を追加する場合、therdpartyパッケージを追加するために以下を実行する必要があります。

terminal
bazel run @rules_ros//thirdparty/python:requirements_lock.update
bazel run @rules_ros//repos/config:repos_lock.update

元の ROS 2 リポジトリから知られている ros2.repos ファイルで指定された名前を持つ外部依存関係として利用する場合は以下を実行する必要があります。

terminal
bazel run @rules_ros//repos/config:repos_lock.update

他に以下でも動作確認ができたものは以下になります。

https://github.com/mvukov/rules_ros2/tree/main/examples

https://twitter.com/tasada038/status/1694301023027011788


以上です。
Likeいただけると大変励みになりますので、よろしくお願いいたします。

Discussion