はじめに
ROS 2 Advent Calendar 2025 17日目の記事です。
こんにちは、Altairです。
ロボット開発に欠かせないROS 2 (Robot Operating System 2) ですが、環境構築(特にLinuxマシンの用意やセットアップ)がハードルになることがあります。
この記事では、Google Colab 上でROS 2 (Humble Hawksbill) の環境を構築し、Pythonを使って独自のパブリッシャー・サブスクライバーノードを作成・実行するまでの手順をまとめました。
ブラウザさえあれば、誰でも無料でROS 2の学習や検証が可能になります。
忙しい人用 サンプルコード
https://github.com/Altairu/ROS-2-on-Google-Colab
Google Colaboratoryとは
Google Colaboratory、通称Colab(コラボ) は、Googleが提供するJupyter Notebook環境をベースとしたクラウドサービスです。
これは、特別なセットアップなしに、ブラウザからPythonコードの実行、文書作成、そして共有を可能にする強力なツールです。主に機械学習やデータ分析の分野で利用され、特にGPUやTPUといった高性能なコンピューティングリソースを 無償(または低コスト) で利用できる点で大きな注目を集めています。
「ROS 2はロボットに載せるものなのに、なぜクラウドで動かす必要があるの?」そう思われるかもしれません。Colab上でROS 2を動かすことには、以下のような大きなメリットがあります。
-
セットアップの障壁がゼロに!
ROSのインストールは、OSのバージョン、依存関係、環境変数など、非常に手間がかかる作業です。Colabなら、!sudo apt install や !colcon build といったコマンドをノートブックに記述するだけで、環境構築が完了します。 -
環境の再現性が高い!
ROS環境をColabノートブックとして共有すれば、誰でも同じ環境を即座に再現できます。これは、チームでの開発や、チュートリアル作成、デモンストレーションに最適です。 -
高性能リソースの活用 !
ColabのGPU/TPU環境を利用すれば、大規模なシミュレーションや、TensorFlow/PyTorchと連携した AI処理 を、ローカルPCの性能を気にせずに実行できます。
今回は、このColabのUbuntu 22.04 LTS(Jammy Jellyfish)環境上に、ROS 2の最新LTSバージョンであるHumble Hawksbillをセットアップし、Pythonでシンプルなパブリッシャ/サブスクライバノードを作成・実行するまでをハンズオン形式で解説していきます!
実行環境
- Platform: Google Colaboratory
- OS: Ubuntu 22.04 LTS (Colabのベース)
- ROS 2 Distribution: Humble Hawksbill
1. ROS 2 Humbleのインストール
まずはColabのインスタンス(Ubuntu環境)にROS 2をインストールします。以下のコードをセルに入力して実行します。
# 1. 必要なツールのインストールとパッケージリストの更新
!sudo apt update
!sudo apt install -y locales curl gnupg2 lsb-release
# 2. ロケールの設定 (UTF-8)
import locale
!sudo locale-gen en_US en_US.UTF-8
!sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
# 3. ROS 2 GPGキーとリポジトリの追加
!curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
!sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null'
# 4. パッケージリストのクリーンアップと再更新(GPGキーエラー対策を含む)
!sudo rm -rf /var/lib/apt/lists/*
!sudo apt update
# 5. ROS 2 Humble Desktopのインストール(時間がかかります)
!sudo apt install -y ros-humble-desktop
print("ROS 2 Humble installed successfully.")
環境変数の設定とツールのインストール
インストール後、ROS 2のコマンドを使えるように環境変数を読み込み、ビルドツールである colcon などを導入します。
import os
# 環境設定ファイルの読み込みを .bashrc に追記
ros_distro = 'humble'
ros_setup_path = f'/opt/ros/{ros_distro}/setup.bash'
!echo "source {ros_setup_path}" >> ~/.bashrc
# rosdepの初期化と更新
!sudo apt install -y python3-rosdep
!sudo rosdep init
!rosdep update
# ビルドツール (colcon) 等のインストール
!sudo apt install -y python3-rosinstall-generator python3-vcstool python3-colcon-common-extensions
print("Environment setup complete.")
2. ワークスペースとパッケージの作成
開発を行うためのワークスペース (ros2_ws) を作成し、その中にPythonパッケージを作ります。
# ワークスペースディレクトリの作成
workspace_dir = os.path.expanduser('~/ros2_ws')
src_dir = os.path.join(workspace_dir, 'src')
os.makedirs(src_dir, exist_ok=True)
# srcディレクトリへ移動してパッケージを作成
os.chdir(src_dir)
# パッケージ作成コマンド (依存関係に rclpy と std_msgs を指定)
# ※Colab環境のPythonバージョンに合わせてパスを指定して実行
!source /opt/ros/humble/setup.bash && \
/usr/bin/python3.10 /opt/ros/humble/bin/ros2 pkg create my_python_pkg \
--build-type ament_python --dependencies rclpy std_msgs
3. ノードの実装 (Publisher & Subscriber)
作成したパッケージ内に、トピック通信を行う2つのノードを作成します。
Publisherノード (publisher_member_function.py)
一定間隔で "Hello ROS2" とカウント数を送信するノードです。
# ファイルパスの定義
package_dir = os.path.join(src_dir, 'my_python_pkg')
pub_file = os.path.join(package_dir, 'my_python_pkg', 'publisher_member_function.py')
# コードの中身
publisher_code = '''
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MinimalPublisher(Node):
def __init__(self):
super().__init__('minimal_publisher')
self.publisher_ = self.create_publisher(String, 'topic', 10)
timer_period = 0.5
self.timer = self.create_timer(timer_period, self.timer_callback)
self.i = 0
def timer_callback(self):
msg = String()
msg.data = 'Hello ROS2: %d' % self.i
self.publisher_.publish(msg)
self.get_logger().info('Publishing: "%s"' % msg.data)
self.i += 1
def main(args=None):
rclpy.init(args=args)
minimal_publisher = MinimalPublisher()
rclpy.spin(minimal_publisher)
minimal_publisher.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
'''
with open(pub_file, 'w') as f:
f.write(publisher_code)
!chmod +x {pub_file}
Subscriberノード (subscriber_member_function.py)
メッセージを受信してログに表示するノードです。
sub_file = os.path.join(package_dir, 'my_python_pkg', 'subscriber_member_function.py')
subscriber_code = '''
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MinimalSubscriber(Node):
def __init__(self):
super().__init__('minimal_subscriber')
self.subscription = self.create_subscription(
String,
'topic',
self.listener_callback,
10)
self.subscription
def listener_callback(self, msg):
self.get_logger().info('I heard: "%s"' % msg.data)
def main(args=None):
rclpy.init(args=args)
minimal_subscriber = MinimalSubscriber()
rclpy.spin(minimal_subscriber)
minimal_subscriber.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
'''
with open(sub_file, 'w') as f:
f.write(subscriber_code)
!chmod +x {sub_file}
setup.py の修正(エントリポイントの追加)
作成したノードを ros2 run で呼び出せるように setup.py を書き換えます。
setup_path = os.path.join(package_dir, 'setup.py')
with open(setup_path, 'r') as f:
content = f.read()
# entry_points の console_scripts に追記
entry_points_tag = "'console_scripts': ["
new_entries = """
'talker = my_python_pkg.publisher_member_function:main',
'listener = my_python_pkg.subscriber_member_function:main',"""
if entry_points_tag in content:
content = content.replace(entry_points_tag, entry_points_tag + new_entries)
with open(setup_path, 'w') as f:
f.write(content)
print("setup.py updated.")
4. ビルド
colcon build を使ってワークスペース全体をビルドします。
os.chdir(workspace_dir)
# ビルドの実行
!source /opt/ros/humble/setup.bash && colcon build --packages-select my_python_pkg
5. ノードの実行と動作確認
Colabのセルは通常ブロッキング処理(コマンドが終わるまで次に行かない)なので、ROSノードのように動き続けるプロセスを実行する際は工夫が必要です。
ここではPythonの subprocess モジュールと nohup を使い、バックグラウンドでノードを実行して、ログファイル経由で動作を確認します。
import subprocess
import time
# セットアップファイルのパス
install_setup = os.path.join(workspace_dir, 'install', 'setup.bash')
# ログファイル
pub_log = os.path.join(workspace_dir, 'publisher.log')
sub_log = os.path.join(workspace_dir, 'subscriber.log')
# ノード実行コマンドの作成 (nohupでバックグラウンド実行)
cmd_source = f"source /opt/ros/humble/setup.bash && source {install_setup}"
cmd_talker = f"nohup bash -c \"{cmd_source} && ros2 run my_python_pkg talker\" > {pub_log} 2>&1 &"
cmd_listener = f"nohup bash -c \"{cmd_source} && ros2 run my_python_pkg listener\" > {sub_log} 2>&1 &"
print("Starting nodes...")
# Publisher起動
subprocess.Popen(cmd_talker, shell=True)
# Subscriber起動
subprocess.Popen(cmd_listener, shell=True)
# 通信が行われるまで少し待機
time.sleep(5)
# ログを確認
print("\n--- Subscriber Log Output ---")
if os.path.exists(sub_log):
with open(sub_log, 'r') as f:
print(f.read())
else:
print("Log file not found.")
# プロセスの後処理(簡易的にkill)
!pkill -f talker
!pkill -f listener
print("Nodes stopped.")
実行結果の例
成功すると、以下のようなログが表示されます。
--- Subscriber Log Output ---
[INFO] [1763362058.102985636] [minimal_subscriber]: I heard: "Hello ROS2: 0"
[INFO] [1763362058.577665098] [minimal_subscriber]: I heard: "Hello ROS2: 1"
[INFO] [1763362059.076167434] [minimal_subscriber]: I heard: "Hello ROS2: 2"
...
まとめ
Google Colab上でROS 2 Humble環境を構築し、自作パッケージのビルドからノード間通信までを確認できました。GPUリソースなどを活用したROS 2の開発や、手軽なデモ環境としてColabは非常に有用です。
と言いたいんですが結構めんどくさいし時間かかるのでやっぱり実機のほうが好き。おすすめはしません。
.ipynbファイルを共有しておきます。参考にどうぞ
https://github.com/Altairu/ROS-2-on-Google-Colab