ようこそ、 名無し ID:IZEUAQKL さん(ゲスト)

← ブログ一覧へ戻る
投稿日: 2026-03-31 / 投稿者: 管理者 / タグ: ROS2, Python, C++, ノード, チュートリアル

初めてのROS2ノード作成(Python編 / C++編)

投稿日: 2026-03-31 | カテゴリ: ROS2チュートリアル

ROS2の環境構築が完了したら、いよいよ実際にプログラムを動かしてみましょう。ROS2では、それぞれの役割を持った小さなプログラム単位を「ノード」と呼び、それらが通信し合うことでロボットシステム全体を構築します。

この記事では、ROS2開発で主流となる「Python」と「C++」の両方を使って、最小構成のノード(パッケージ)を作成し、ビルドして実行するまでの基本手順を解説します。

💡 前提条件: Ubuntu環境にROS2がインストールされており、基本的なターミナル操作ができることを前提としています。

Step 1: ワークスペースの作成

ROS2では、「ワークスペース」というディレクトリの中でパッケージを管理・ビルドします。

  1. ターミナルを開き、以下のコマンドでワークスペースとその中の src ディレクトリを作成します。
    mkdir -p ~/ros2_ws/src
  2. 作成した src ディレクトリに移動します。
    cd ~/ros2_ws/src

Step 2: パッケージの作成(Python編 / C++編)

目的に合わせて、PythonまたはC++でパッケージを作成します。ビルドタイプ(ament_pythonament_cmake)の指定が異なります。

  • Pythonパッケージを作成する場合:

    依存関係に rclpy を指定して作成します。

    ros2 pkg create --build-type ament_python my_py_pkg --dependencies rclpy
  • C++パッケージを作成する場合:

    依存関係に rclcpp を指定して作成します。

    ros2 pkg create --build-type ament_cmake my_cpp_pkg --dependencies rclcpp

※作成されたパッケージディレクトリの中にソースコード(.py または .cpp)を記述していくことになりますが、今回はパッケージの枠組み作成とビルドの流れにフォーカスします。

Step 3: パッケージのビルド(colcon build)

パッケージを作成(またはコードを記述)したら、ワークスペースのルートに戻ってビルドを行います。

  1. ワークスペースのルートディレクトリに移動します。
    cd ~/ros2_ws
  2. colcon コマンドを使用してビルドを実行します。
    colcon build
  3. 重要: ビルドが成功したら、作成したノードをシステムに認識させるために設定ファイルを読み込みます(オーバーレイ)。
    source install/setup.bash

Step 4: ノードの実行

セットアップが終われば、いよいよノードの実行です。ros2 run <パッケージ名> <実行ファイル名> の形式でコマンドを入力します。

自分でコードを書いたノードはもちろん、ROS2に標準で用意されているサンプルノード(turtlesimやデモノードなど)も同じコマンドで実行できます。

ノードがうまく動かない場合や、通信状態を確認したい場合は、ROS2のコマンド集ページで紹介している ros2 node listros2 topic list を活用してデバッグしてみましょう!

Step 5: 最小構成のPythonノードを実際に作る(Hello ROS 2)

ここからは「枠組み作成」だけで終わらせず、実行できる最小ノードを作ります。Pythonの場合は、パッケージ内に .py を置き、setup.py のエントリポイント(実行名)を設定します。

まず、パッケージ内にノードファイルを作成します(例: minimal_node.py)。

# 例: my_py_pkg の中にノードを追加する
cd ~/ros2_ws/src/my_py_pkg/my_py_pkg
nano minimal_node.py

中身は次のような最小構成でOKです(ログを1秒ごとに出すだけのノード)。

import rclpy
from rclpy.node import Node

class MinimalNode(Node):
    def __init__(self):
        super().__init__('minimal_node')
        self.timer = self.create_timer(1.0, self._on_timer)

    def _on_timer(self):
        self.get_logger().info('Hello ROS 2')

def main(args=None):
    rclpy.init(args=args)
    node = MinimalNode()
    try:
        rclpy.spin(node)
    finally:
        node.destroy_node()
        rclpy.shutdown()

if __name__ == '__main__':
    main()

次に setup.pyentry_points に実行名を追加します。これにより ros2 run で呼べるようになります。

# 例: setup.py を編集(my_py_pkg のルート)
cd ~/ros2_ws/src/my_py_pkg
nano setup.py

# entry_points の console_scripts に追記例
# 'minimal_node = my_py_pkg.minimal_node:main',

編集後、ワークスペースのルートでビルドして実行します。

cd ~/ros2_ws
colcon build
source install/setup.bash
ros2 run my_py_pkg minimal_node

ポイント: Pythonは「ファイルを置いただけ」では実行名が登録されません。setup.pyconsole_scripts と、colcon buildsource までがワンセットです。

Step 6: 最小構成のC++ノードを実際に作る(Hello ROS 2)

C++の場合は、src/.cpp を置き、CMakeLists.txt に「ビルドする実行ファイル」「依存ライブラリ」「インストール先」を書きます。

例として minimal_node.cpp を作成します。

cd ~/ros2_ws/src/my_cpp_pkg/src
nano minimal_node.cpp

中身は次のような最小構成です(1秒ごとにログを出します)。

#include <chrono>
#include "rclcpp/rclcpp.hpp"

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("minimal_cpp_node");
  auto timer = node->create_wall_timer(
    std::chrono::seconds(1),
    [node]() { RCLCPP_INFO(node->get_logger(), "Hello ROS 2"); }
  );
  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}

次に CMakeLists.txt にビルドルールを追記します(抜粋)。

# 例: my_cpp_pkg/CMakeLists.txt に追記(概念例)
add_executable(minimal_node src/minimal_node.cpp)
ament_target_dependencies(minimal_node rclcpp)
install(TARGETS minimal_node DESTINATION lib/${PROJECT_NAME})

編集後、ビルドして実行します。

cd ~/ros2_ws
colcon build
source install/setup.bash
ros2 run my_cpp_pkg minimal_node

ポイント: C++は install() を書かないと ros2 run から見えないことが多いです。「ビルドできる」だけでなく「インストールされる」かも意識しましょう。

Step 7: いちばん大事な理解:build と source(オーバーレイ)

ROS2のワークスペースで詰まりやすいポイントが 「ビルドはしたのに、ros2 run が見つけてくれない」です。多くの場合、原因は source install/setup.bash をしていないことです。

  • build: ソースコードをコンパイルし、実行ファイルやPythonのインストール先を生成する作業
  • source: いま開いているターミナルの環境変数に「このワークスペースの成果物がある場所」を反映する作業

新しいターミナルを開くと、source の効果は引き継がれません。ターミナルを開き直すたびに実行するか、頻繁に使うなら ~/.bashrc へ追記して自動化すると楽です。

# 毎回 source するのが面倒なら(例)
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

注意: 複数のワークスペースを使う場合、常に同じワークスペースをsourceすると混乱することがあります。チームの運用ルールに合わせてください。

Step 8: 動いているかを確認する最低限のデバッグ手順

「ノードが起動したか」「トピックが出ているか」を確認できるだけで、原因切り分けが一気に楽になります。開発初期は次の3点セットを覚えるのがおすすめです。

# 1) 起動中のノード一覧
ros2 node list

# 2) トピック一覧
ros2 topic list

# 3) トピックの中身を見る(例)
ros2 topic echo /turtle1/pose

もし ros2 topic echo で何も流れてこない場合は、そもそもPublisherが起動していないか、あるいは通信条件(QoSなど)が合っていない可能性があります。まずは ros2 node list でノードの起動確認から始めるのが安全です。

Step 9: よくあるつまずき(原因と対処)

  • Package が見つからない: colcon build 後に source install/setup.bash を実行しているか確認
  • Executable が見つからない: Pythonなら setup.pyconsole_scripts、C++なら install(TARGETS ...) の記述漏れを疑う
  • Pythonで ImportError: 依存関係(--dependencies)が不足している可能性。package.xmlsetup.py を再確認
  • ビルドが通らない: まずは colcon build --packages-select <パッケージ名> で対象だけをビルドしてログを読みやすくする
  • 起動はするが通信しない: トピック名の誤り、名前空間の違い、QoSの不一致が多い。まず ros2 topic list で事実確認

この「何を見れば良いか」が分かるだけで、ROS2の開発スピードは大きく変わります。最初はコマンドで状況を見える化し、次にコードの修正へ進む流れを習慣にしましょう。

次に学ぶと強くなるトピック

最小ノードが動いたら、次はROS2の「通信の種類」を押さえると一気にできることが増えます。

  • Topic: Publisher/Subscriber によるストリーム通信(センサーや状態値など)
  • Service: リクエスト/レスポンス型の同期通信(設定変更など)
  • Action: 長時間処理の進捗が取れる非同期通信(ナビゲーションなど)
  • Parameter: ノードの挙動を外部から切り替える仕組み

これらの確認コマンドは ROS2のコマンド集 に追加してあるので、手元で試しながら覚えていくのがおすすめです。