初めてのROS2ノード作成(Python編 / C++編)
ROS2の環境構築が完了したら、いよいよ実際にプログラムを動かしてみましょう。ROS2では、それぞれの役割を持った小さなプログラム単位を「ノード」と呼び、それらが通信し合うことでロボットシステム全体を構築します。
この記事では、ROS2開発で主流となる「Python」と「C++」の両方を使って、最小構成のノード(パッケージ)を作成し、ビルドして実行するまでの基本手順を解説します。
Step 1: ワークスペースの作成
ROS2では、「ワークスペース」というディレクトリの中でパッケージを管理・ビルドします。
- ターミナルを開き、以下のコマンドでワークスペースとその中の
srcディレクトリを作成します。
mkdir -p ~/ros2_ws/src - 作成した
srcディレクトリに移動します。
cd ~/ros2_ws/src
Step 2: パッケージの作成(Python編 / C++編)
目的に合わせて、PythonまたはC++でパッケージを作成します。ビルドタイプ(ament_python か ament_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)
パッケージを作成(またはコードを記述)したら、ワークスペースのルートに戻ってビルドを行います。
- ワークスペースのルートディレクトリに移動します。
cd ~/ros2_ws colconコマンドを使用してビルドを実行します。
colcon build- 重要: ビルドが成功したら、作成したノードをシステムに認識させるために設定ファイルを読み込みます(オーバーレイ)。
source install/setup.bash
Step 4: ノードの実行
セットアップが終われば、いよいよノードの実行です。ros2 run <パッケージ名> <実行ファイル名> の形式でコマンドを入力します。
自分でコードを書いたノードはもちろん、ROS2に標準で用意されているサンプルノード(turtlesimやデモノードなど)も同じコマンドで実行できます。
ノードがうまく動かない場合や、通信状態を確認したい場合は、ROS2のコマンド集ページで紹介している ros2 node list や ros2 topic list を活用してデバッグしてみましょう!
Step 5: 最小構成のPythonノードを実際に作る(Hello ROS 2)
ここからは「枠組み作成」だけで終わらせず、実行できる最小ノードを作ります。Pythonの場合は、パッケージ内に .py を置き、setup.py のエントリポイント(実行名)を設定します。
まず、パッケージ内にノードファイルを作成します(例: minimal_node.py)。
cd ~/ros2_ws/src/my_py_pkg/my_py_pkg
nano minimal_node.py
中身は次のような最小構成でOKです(ログを1秒ごとに出すだけのノード)。
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.py の entry_points に実行名を追加します。これにより ros2 run で呼べるようになります。
cd ~/ros2_ws/src/my_py_pkg
nano setup.py
# entry_points の console_scripts に追記例
# 'minimal_node = my_py_pkg.minimal_node:main',
編集後、ワークスペースのルートでビルドして実行します。
colcon build
source install/setup.bash
ros2 run my_py_pkg minimal_node
ポイント: Pythonは「ファイルを置いただけ」では実行名が登録されません。setup.py の console_scripts と、colcon build → source までがワンセットです。
Step 6: 最小構成のC++ノードを実際に作る(Hello ROS 2)
C++の場合は、src/ に .cpp を置き、CMakeLists.txt に「ビルドする実行ファイル」「依存ライブラリ」「インストール先」を書きます。
例として minimal_node.cpp を作成します。
nano minimal_node.cpp
中身は次のような最小構成です(1秒ごとにログを出します)。
#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 にビルドルールを追記します(抜粋)。
add_executable(minimal_node src/minimal_node.cpp)
ament_target_dependencies(minimal_node rclcpp)
install(TARGETS minimal_node DESTINATION lib/${PROJECT_NAME})
編集後、ビルドして実行します。
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 へ追記して自動化すると楽です。
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
注意: 複数のワークスペースを使う場合、常に同じワークスペースをsourceすると混乱することがあります。チームの運用ルールに合わせてください。
Step 8: 動いているかを確認する最低限のデバッグ手順
「ノードが起動したか」「トピックが出ているか」を確認できるだけで、原因切り分けが一気に楽になります。開発初期は次の3点セットを覚えるのがおすすめです。
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.pyのconsole_scripts、C++ならinstall(TARGETS ...)の記述漏れを疑う - Pythonで ImportError: 依存関係(
--dependencies)が不足している可能性。package.xmlとsetup.pyを再確認 - ビルドが通らない: まずは
colcon build --packages-select <パッケージ名>で対象だけをビルドしてログを読みやすくする - 起動はするが通信しない: トピック名の誤り、名前空間の違い、QoSの不一致が多い。まず
ros2 topic listで事実確認
この「何を見れば良いか」が分かるだけで、ROS2の開発スピードは大きく変わります。最初はコマンドで状況を見える化し、次にコードの修正へ進む流れを習慣にしましょう。
次に学ぶと強くなるトピック
最小ノードが動いたら、次はROS2の「通信の種類」を押さえると一気にできることが増えます。
- Topic: Publisher/Subscriber によるストリーム通信(センサーや状態値など)
- Service: リクエスト/レスポンス型の同期通信(設定変更など)
- Action: 長時間処理の進捗が取れる非同期通信(ナビゲーションなど)
- Parameter: ノードの挙動を外部から切り替える仕組み
これらの確認コマンドは ROS2のコマンド集 に追加してあるので、手元で試しながら覚えていくのがおすすめです。