Note: This tutorial assumes that you have completed the previous tutorials: Creating a workspace for catkin.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

ROS パッケージを作る

Description: catkin を使った、新しい ROS パッケージの作り方

Keywords: catkin workspace package

Tutorial Level: BEGINNER

Next Tutorial: Building a ROS package

catkinパッケージの必須要素

ROSのcatkin形式のパッケージとしてパッケージを作るには、以下の必要条件を満たす必要があります:

  • パッケージは catkin compliant package.xmllファイルを含むこと

    • package.xmlファイルは、該当パッケージに関するメタ情報を提供します
  • catkinのパッケージはCMakeLists.txtを含まなければならない。Catkin メタパッケージは定型のCMakeLists.txtを保持していなければならない。

  • 1つのフォルダに1つのパッケージだけを構成する
    • これは入れ子状のネストしたパッケージや複数のパッケージが同じディレクトリを共有することが無いという意味です。

もっとも単純なパッケージの構成として可能なのは以下のようなディレクトリになります:

  • my_package/
      CMakeLists.txt
      package.xml

catkinワークスペース内のパッケージ群

catkinパッケージでの作業で推奨されるのはcatkin ワークスペースを使う方法ですが、スタンドアローン(standalone)でcatkinパッケージをビルドすることもできます。よくあるワークスペースは以下のようなものです:

  • workspace_folder/        -- ワークスペース
      src/                   -- ソース領域
        CMakeLists.txt       -- catkinから供給された最上位位置のCMakeファイル
        package_1/
          CMakeLists.txt     -- package_1用のCMakeLists.txtファイル
          package.xml        -- package_1用のパッケージマニフェスト
        ...
        package_n/
          CMakeLists.txt     -- package_n用のCMakeLists.txtファイル
          package.xml        -- Package manifest for package_n

このチュートリアルを続けて進める前に、Creating a workspace for catkinのチュートリアルに従って、空のcatkinワークスペースを作っておきましょう。

catkin形式のパッケージを作る

このチュートリアルは、新しくcatkinパッケージを作るためにcatkin_create_pkgスクリプトをどうやって使うか、そしてパッケージを作った後、それで何が出来るようになるかについて説明します。

まず、Creating a Workspace for catkin tutorialで作ったcatkinワークスペースのソースディレクトリに移動しましょう:

# このワークスペースはthe Creating a Workspace Tutorialで作成済みのはずです
$ cd ~/catkin_ws/src

ここでstd_msgs, roscpp, rospyに依存した新しいパッケージを'beginner_tutorials'という名前で作るために、catkin_create_pkgのスクリプトを使います:

$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

これでcatkin_create_pkgに添えた情報を元に部分的に記述を補完したpackage.xmlCMakeLists.txtを含んだbeginner_tutorialsフォルダを作っています。

catkin_create_pkgpackage_nameとそのパッケージが依存するライブラリのリストを要求します。

# これは例です。このままで実行しないこと。
# catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

catkin_create_pkgにはより高度な機能があり、詳細はcatkin/commands/catkin_create_pkgにあります。

パッケージの依存

First-order依存

前項で出てきたcatkin_create_pkgを使う時、いくつかの依存パッケージを指定しました。 これらのfirst-order依存(直接的な依存)について、rospackコマンドツールを使って紐解くことができます。

(Jan 9, 2013) バグが報告されており, 既にgroovyのrospackでは修正されているが, コンピュータ上に変更が反映されるまで少し時間がかかるでしょう. もしこれと似たような問題が次のコマンドによって現れる場合は, 次のコマンドを省略することができます.

$ rospack depends1 beginner_tutorials 
  • std_msgs
    rospy
    roscpp

上のように、rospackcatkin_create_pkgを実行した時の引数と同じものを、依存パッケージのリストとして羅列しているのがわかります。 作成したパッケージへの依存についてはpackage.xmlに記述されています。package.xmlの中身を確かめてみましょう:

$ roscd beginner_tutorials
$ cat package.xml
  • <package>
    ...
      <buildtool_depend>catkin</buildtool_depend>
      <build_depend>roscpp</build_depend>
      <build_depend>rospy</build_depend>
      <build_depend>std_msgs</build_depend>
    ...
    </package>

間接的依存

多くの場合、依存関係は依存パッケージのそれぞれの依存についても保持しています。たとえば、rospyは他のパッケージへの依存があります。

(Jan 9, 2013) バグが報告されており, 既にgroovyのrospackでは修正されているが, コンピュータ上に変更が反映されるまで少し時間がかかるでしょう. もしこれと似たような問題が次のコマンドによって現れる場合は, 次のコマンドを省略することができます.

$ rospack depends1 rospy
  • genpy
    rosgraph
    rosgraph_msgs
    roslib
    std_msgs

パッケージは極めて多くの間接的な依存を保持できます。幸いにもrospackは全てのネストされた依存を再帰的に特定することができます。

$ rospack depends beginner_tutorials
cpp_common
rostime
roscpp_traits
roscpp_serialization
genmsg
genpy
message_runtime
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
catkin
rospack
roslib
rospy

自分のパッケージをカスタマイズする

この項ではcatkin_create_pkgで生成されたそれぞれのファイルを、ファイルの要素の各行ごとに見ていきます。そして自分のパッケージでどうやってそれらをカスタマイズするのかについて説明します。

package.xmlをカスタマイズする

生成されたpackage.xmlが自分の新しいパッケージの中にあるはずです。そして、package.xmlを確認し、注視すべきタグにそれぞれ触れていきましょう。

descriptionタグ

まずdescriptionタグを更新します:

   5   <description>The beginner_tutorials package</description>

description部分を自由に変更しますが、パッケージのスコープがあたっている限りは、慣例的に、最初の文は短くしなければなりません。 一文でパッケージの説明を記述するのが難しい時は、分けて書く必要があるでしょう。

maintainerタグ

次はmaintainerタグです。

   7   <!-- One maintainer tag required, multiple allowed, one person per tag --> 
   8   <!-- Example:  -->
   9   <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
  10   <maintainer email="user@todo.todo">user</maintainer>

このmaintainerタグはpackage.xmlで必須で重要なタグです。このタグがあることで、このパッケージについて誰にコンタクトを取ればいいのかをパッケージ利用者が知ることができるからです。少なくとも1人のメンテナを記述するのが必須ですが、複数人設定することもできます。メンテナの名前はタグのbodyに設定しますが、emailのタグ属性もあり、ここにemailを設定しなければなりません。

   7   <maintainer email="you@yourdomain.tld">Your Name</maintainer>

licenseタグ

続いてlicenseタグです。これも以下のような要件があります:

  12   <!-- One license tag required, multiple allowed, one license per tag -->
  13   <!-- Commonly used license strings: -->
  14   <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  15   <license>TODO</license>

ライセンス形態を選んで、licenseタグに設定しなければなりません。一般的なオープンソースライセンスはSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3といったものです。これらのいくつかについて、Open Source Initiativeで詳細を読むことができます。このチュートリアルではBSDライセンスを使っていきます。ROSのコアコンポーネント群が以下のようにBSDを使っているからです:

   8   <license>BSD</license>

dependenciesタグ

このタグのセットはパッケージの依存についてについて記述します。dependenciesタグはbuild_depend, buildtool_depend, run_depend, test_dependに分けられています。これらのタグについてのより詳細な説明は、Catkin Dependenciesのドキュメントを参照してください。catkin_create_pkgの引数にstd_msgs, roscpp, rospyを渡したので、このパッケージの依存関係は以下のように見えているでしょう:

  27   <!-- The *_depend tags are used to specify dependencies -->
  28   <!-- Dependencies can be catkin packages or system dependencies -->
  29   <!-- Examples: -->
  30   <!-- Use build_depend for packages you need at compile time: -->
  31   <!--   <build_depend>genmsg</build_depend> -->
  32   <!-- Use buildtool_depend for build tool packages: -->
  33   <!--   <buildtool_depend>catkin</buildtool_depend> -->
  34   <!-- Use exec_depend for packages you need at runtime: -->
  35   <!--   <exec_depend>python-yaml</exec_depend> -->
  36   <!-- Use test_depend for packages you need only for testing: -->
  37   <!--   <test_depend>gtest</test_depend> -->
  38   <buildtool_depend>catkin</buildtool_depend>
  39   <build_depend>roscpp</build_depend>
  40   <build_depend>rospy</build_depend>
  41   <build_depend>std_msgs</build_depend>

catkinのデフォルトbuildtool_dependに加えて、自パッケージ用に列記したすべての依存関係はbuild_dependとして追加されています。この場合、指定したパッケージ依存の全てがビルドおよび実行時に利用可能としたいので、それぞれのパッケージついてrun_dependタグを同様に追加しておきます:

  12   <buildtool_depend>catkin</buildtool_depend>
  13 
  14   <build_depend>roscpp</build_depend>
  15   <build_depend>rospy</build_depend>
  16   <build_depend>std_msgs</build_depend>
  17 
  18   <exec_depend>roscpp</exec_depend>
  19   <exec_depend>rospy</exec_depend>
  20   <exec_depend>std_msgs</exec_depend>

最終版のpackage.xml

コメントや未使用タグを除いた、最終版のpackage.xmlは、ずっと簡潔なものになります。

   1 <?xml version="1.0"?>
   2 <package format="2">
   3   <name>beginner_tutorials</name>
   4   <version>0.1.0</version>
   5   <description>The beginner_tutorials package</description>
   6 
   7   <maintainer email="you@yourdomain.tld">Your Name</maintainer>
   8   <license>BSD</license>
   9   <url type="website">http://wiki.ros.org/beginner_tutorials</url>
  10   <author email="you@yourdomain.tld">Jane Doe</author>
  11 
  12   <buildtool_depend>catkin</buildtool_depend>
  13 
  14   <build_depend>roscpp</build_depend>
  15   <build_depend>rospy</build_depend>
  16   <build_depend>std_msgs</build_depend>
  17 
  18   <exec_depend>roscpp</exec_depend>
  19   <exec_depend>rospy</exec_depend>
  20   <exec_depend>std_msgs</exec_depend>
  21 
  22 </package>

CMakeLists.txtをカスタマイズする

ここまでで、メタ情報を含んでいるpackage.xmlを自分のパッケージ用に仕立て上げたので、次のチュートリアルに進む準備が出来ました。 catkin_create_pkg によって作られたCMakeLists.txtファイルについては、後に出てくる、ROSコードのビルドに関するチュートリアルで扱います。

次は: Building and using catkin packages in a workspace

Wiki: ja/catkin/Tutorials/CreatingPackage (last edited 2014-10-11 16:34:59 by Moirai)