2026-04-07 (更新: 2026-05-20)
📦 【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ビルドの流れ
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 の可視化を扱う想定です