30代エンジニアの備忘録のカバー画像

30代エンジニアの備忘録

組み込み開発・信号処理・プログラミングの技術メモと短編小説

📦 【ROS2入門⑦】パッケージ作成とcolconビルドシステム入門

シリーズ この記事は「ROS2入門シリーズ」の一部です。 シリーズ目次を見る

コードを書き始めた段階で、src/install/log の役割と colcon build → source install/setup.bash の流れを共有できる状態を目指します。複数パッケージを launch でまとめて起動する典型も含みます。正本は Creating a workspace と colcon ドキュメント です。2026年5月時点、Ubuntu 22.04 + ROS 2 Humble 想定です。


ROS 2 ワークスペースの構成とは?

ros2_ws/
├── src/        <- ソースコード(パッケージをここに置く)
├── build/      <- ビルド中間ファイル(自動生成)
├── install/    <- インストール先(sourceする)
└── log/        <- ビルドログ

ワークスペース構成
ワークスペース構成

ament_python パッケージの作成手順

cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python my_robot_pkg --node-name my_node

作成されるファイル構成:

my_robot_pkg/
├── my_robot_pkg/
│   ├── __init__.py
│   └── my_node.py
├── resource/my_robot_pkg
├── test/
├── package.xml     <- 依存関係定義
├── setup.cfg
└── setup.py        <- エントリーポイント定義
package.xml
<package format="3">
  <name>my_robot_pkg</name>
  <version>0.0.1</version>
  <description>My Robot Package</description>
  <maintainer email="[email protected]">Your Name</maintainer>
  <license>Apache-2.0</license>

  <buildtool_depend>ament_python</buildtool_depend>

  <!-- 使うメッセージ型のパッケージを追加 -->
  <depend>rclpy</depend>
  <depend>std_msgs</depend>
  <depend>geometry_msgs</depend>

  <export>
    <build_type>ament_python</build_type>
  </export>
</package>
setup.py(エントリーポイントと data_files)
import os
from glob import glob
from setuptools import setup

package_name = 'my_robot_pkg'

setup(
    name=package_name,
    version='0.0.1',
    packages=[package_name],
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
        # launchファイルをインストール成果物に含める
        (os.path.join('share', package_name, 'launch'),
         glob('launch/*.launch.py')),
    ],
    install_requires=['setuptools'],
    entry_points={
        'console_scripts': [
            'my_node = my_robot_pkg.my_node:main',
        ],
    },
)

ament_cmake(C++)パッケージの作成手順

ros2 pkg create --build-type ament_cmake my_cpp_pkg --node-name my_cpp_node
my_cpp_pkg/
├── include/my_cpp_pkg/
├── src/my_cpp_node.cpp
├── CMakeLists.txt
└── package.xml

colcon build の使い方と source の手順

cd ~/ros2_ws

# 全パッケージをビルド
colcon build

# 特定パッケージのみ(開発時はこちらが早い)
colcon build --packages-select my_robot_pkg

# Pythonパッケージはシンボリックリンクで即反映(超便利)
colcon build --packages-select my_robot_pkg --symlink-install

# ビルド後は必ず環境を読み込む
. install/setup.bash
colconビルドの流れ
colconビルドの流れ

launch ファイルで複数ノードを起動する方法

# launch/my_robot.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node


def generate_launch_description():
    return LaunchDescription([
        Node(
            package='my_robot_pkg',
            executable='camera_node',
            name='camera',
            output='screen',
            parameters=[{'fps': 30}],
        ),
        Node(
            package='my_robot_pkg',
            executable='controller_node',
            name='controller',
            output='screen',
        ),
    ])
# launchファイルで起動
ros2 launch my_robot_pkg my_robot.launch.py

パッケージ開発でつまずきやすい点

  • colcon build のあと、install/setup.bash を読み込んでから ros2 run/ros2 launch を実行する。
  • 別ターミナルのときも、同じワークスペースなら同名のファイルを読み込む。
  • ament_python では setup.py の console_scripts とソース配置の名前がずれると、実行ファイル名がリストに現れなくなる。
  • --symlink-install は開発中に効くオプション。CI では使わない、など運用により切り替えするチームもあります。

ROS 2 開発で役立つテクニック

ログレベルの設定
# ノード内で使い分ける
self.get_logger().debug('DEBUG: 詳細情報')
self.get_logger().info('INFO: 通常の情報')
self.get_logger().warn('WARN: 警告')
self.get_logger().error('ERROR: エラー')
パラメータの宣言と取得
def __init__(self):
    super().__init__('my_node')
    self.declare_parameter('max_speed', 1.0)
    self.declare_parameter('robot_name', 'my_robot')

    max_speed = self.get_parameter('max_speed').value
    robot_name = self.get_parameter('robot_name').value
    self.get_logger().info(f'{robot_name}: max_speed={max_speed}')

パッケージと colcon のまとめ

  • ros2 pkg create でパッケージ作成、colcon build でビルド
  • package.xml に依存関係、setup.py にエントリーポイントを記載
  • launchファイルで複数ノードを一括起動できる
  • --symlink-install でPython開発を効率化
  • 次回(シリーズ⑧)では RViz2 / rqt の可視化を扱う想定です