ROS – ROS パッケージの作成方法について

目次

概要

自作の ROS パッケージの作成方法について解説します。

パッケージ

ROS のすべてのプログラムはパッケージとして作成します。パッケージは以下の要件を満たす必要があります。

  • 1つのディレクトリが1つのパッケージを構成する
  • パッケージのメタ情報 が記載されたpackage.xml を含むこと
  • catkin 形式のパッケージは CMakeLists.txt を含むこと

パッケージのディレクトリ構成

パッケージのディレクトリ構成は以下のようになります。package.xml 以外は必要に応じて作成します。

<パッケージ名>
├── include: C++ のコードの場合にヘッダーファイルを置く
├── src: C++ のコードの場合にソースファイルを置く
├── scripts: Python のような実行可能のスクリプトを置く
├── launch: launch ファイルを置く
├── msg: .msg ファイルを置く
├── srv: .srv ファイルを置く
├── bin: C++ の場合にコンパイル済みのバイナリを置く
├── CMakeLists.txt
└── package.xml

パッケージを作成する

パッケージを構成するディレクトリは catkin ワークスペースの src 以下に置きます。パッケージの雛形は catkin_create_pkg コマンドで作成します。

cd ~/catkin_ws/src
catkin_create_pkg <パッケージ名> <依存ライブラリの一覧>

cd ~/catkin_ws/src
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

実行すると、以下のようなディレクトリ構成でパッケージの雛形が作成されます。

beginner_tutorials/
├── CMakeLists.txt
├── include
│   └── beginner_tutorials
├── package.xml
└── src

作成した package.xml や CMakeLists.txt は必要に応じて、適宜編集しましょう。

catkin_create_pkg

パッケージの雛形を作成する catkin_create_pkg コマンドについて解説します。

catkin_create_pkg <name> [options] <dependencies>
  • name: パッケージ名 (必須)
  • dependencies: catkin 形式のパッケージの場合、依存ライブラリの一覧 (空白区切りで複数指定可)
  • –meta: CMakeLists.txt は未編集のまま生成する
  • -s, –sys-deps: catkin で管理されていない依存ライブラリの一覧 (空白区切りで複数指定可)
  • -b, –boost-comps: 依存する Boost ライブラリのコンポーネントの一覧 (空白区切りで複数指定可)
  • -V, –pkg_version: 初版のバージョンを major.minor.patch 形式で指定する (例: 0.1.0)
  • -D, –description: 説明
  • -l, –license: ライセンスの種類
  • -a, –author: 作者
  • -m, –mentainer: メンテナ

mentainer はこのパッケージを管理している人、author はこのパッケージの作成に貢献した人を記載します。

package.xml

パッケージ名やバージョンなどのメタ情報は以下のタグで指定します。

  • name: パッケージ名 (必須)
  • version: パッケージのバージョンを major.minor.patch 形式で指定する (例: 0.1.0) (必須)
  • description: パッケージの説明 (必須)
  • maintainer: パッケージのメンテナ (必須)
  • license: パッケージのライセンス (例: MIT、BSD) (必須)
  • author: パッケージの作者
  • url: GitHub のレポジトリなどパッケージに関係する URL

パッケージの依存ソフトウェア、ライブラリは以下で指定します。

  • build_depend: このパッケージのビルド時に必要となるライブラリを指定する
  • build_export_depend: このライブラリのヘッダーをインクルードする際に必要となるライブラリを指定する
  • exec_depend: このパッケージの実行時に必要となるライブラリを指定する
  • test_depend: このライブラリのテストを実行するのに必要となるライブラリを指定する
  • buildtool_depend: このライブラリをビルドするのに必要なビルドツールを指定する。通常は catkin のみを指定する。
  • doc_depend: このライブラリのドキュメントを生成するのに必要となるライブラリを指定する
  • depend: build_depend、exec_depend 両方を指定する場合と同じ

build_export_depend は、このパッケージのヘッダ内で外部ライブラリのヘッダをインクルードしていた場合、このパッケージのヘッダを利用するにはそのライブラリが必要になります。このライブラリのビルドには必要なくとも、このライブラリが提供するヘッダを使用する際には必要となるライブラリはこのタグで指定します。

属性でバージョンの制約を指定できます。

  • version_lt=”VERSION”: 指定バージョン未満
  • version_lte=”VERSION”: 指定バージョン以下
  • version_eq=”VERSION”: 指定バージョン
  • version_gte=”VERSION”: 指定バージョン以上
  • version_gt=”VERSION”: 指定バージョンより上

<buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>

CMakeLists.txt

1 CMake のバージョンは 2.8.3 以上が必要です。

cmake_minimum_required(VERSION 2.8.3)

2 catkin 及びビルドに必要な catkin 形式のパッケージを指定します。

依存している catkin 形式のパッケージがない場合は catkin のみ必要です。

find_package(catkin REQUIRED)

依存している catkin 形式のパッケージがある場合は COMPONENTS のあとに記載します。

find_package(catkin REQUIRED COMPONENTS AAA BBB)

3 catkin_package() を呼び出します。

catkin_package() は catkin 形式のパッケージ固有の情報を生成する CMake マクロです。

catkin_package()

4 include ディレクトリを追加します。

以下を必要に応じて追加します。

  • このパッケージのインクルードディレクトリ
  • ${catkin_INCLUDE_DIRS}: find_package(catkin REQUIRED COMPONENTS [パッケージ]) で検索したパッケージの include ディレクトリのパス一覧が格納されている変数
  • find_package(catkin REQUIRED COMPONENTS [パッケージ]) ではなく、find_package() で検索したパッケージのインクルードディレクトリ
include_directories(
  ${catkin_INCLUDE_DIRS}
  include
)

5 ビルドターゲットを指定します。

ライブラリを生成する場合は

add_library(<ライブラリ名>
    <.cpp ファイルの一覧>
)

実行可能バイナリを生成する場合は

add_executable(<バイナリ名>
    <.cpp ファイルの一覧>
)

6 依存ライブラリをリンクする

target_link_libraries(<ライブラリまたはバイナリ名>
    <依存ライブラリのファイル名>
)

以下を必要に応じて追加します。

  • ${catkin_LIBRARIES}: find_package(catkin REQUIRED COMPONENTS [パッケージ]) で検索したパッケージのライブラリファイル名の一覧が格納されているパス
  • find_package(catkin REQUIRED COMPONENTS [パッケージ]) ではなく、find_package() で検索したパッケージのライブラリファイル名

参考

コメント

コメントする

目次