ROSパッケージを作る
Simple Wiki Based Contents Management System
関心分野 >> Ros4Winのインストール >> ROSパッケージを作る

ROSパッケージを作る

Ros4WinでもオリジナルのROSと同様にcatkinシステムでROSノードの開発を行うことができます。
ROSでは、ROSパッケージとして'catkin形式'と呼ばれるパッケージを使用しています。catkin形式のパッケージとは、
  • catkinシステムに対応した package.xmlを含む
  • catkinシステムに対応した CMakeLists.txtを含む必要があります。また、ROSノードを開発するためのソースコードをためのディレクトリ(src. msg, srv, scripts等)を含んだものです。

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

catkin形式のパッケージを作成するには、catkin_create_pkgコマンドを使います。ここでは、C:\catkin_ws\srcの下に mytutというパッケージを作成します。
F:\>cd /d c:\catkin_ws\src
C:\catkin_ws\src> catkin_create_pkg mytut std_msgs rospy roscpp
Created file mytut\package.xml
Created file mytut\CMakeLists.txt
Created folder mytut\include\mytut
Created folder mytut\src
Successfully created files in c:\catkin_ws\src\mytut. Please adjust the values in package.xml.

c:\catkin_ws\src>
catkin_create_pkgコマンドを実行するとパケージ名(mytut)のディレクトリの下に includeとsrcの2つのディレクトリと雛形のCMakeLists.txtとpackage.xmlの2つのファイルが生成されます。上記の例では、作成したmytutは、std_msgs, rospy, roscppに依存したパッケージとなっています。

パッケージの依存関係を確認する

直接依存パッケージを調べる

ROSパッケージの依存関係の確認にも rospackコマンドを使用します。例えば、mytutの直接依存(First-order dependencies)を調べる場合には、下記のようなコマンドを入力します。
 c:\catkin_ws> rospack depends1 mytut
この場合には下のような出力を得ます。
roscpp
rospy
std_msgs
この依存関係は、パッケージのpackage.xml内に build_dependタグで記載されています。

間接依存パッケージを調べる

rospackコマンドでは、ROSパッケージの間接依存のパッケージも調べることができます。例えば、mytutの場合には、直接依存パッケージは、roscpp,rospy,std_msgsの3つでした。これらの各パッケージにも依存するパッケージが存在していますので、再帰的にすべての依存パッケージを調べてい場合には、下のように rospack depends を使用します。
c:\catkin_ws> rospack depends mytut
cpp_common
rostime
roscpp_traits
roscpp_serialization
catkin
genmsg
genpy
message_runtime
gencpp
geneus
gennodejs
genlisp
message_generation
rosbuild
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
ros_environment
rospack
roslib
rospy

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

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

catkin形式のROSパッケージでは、package.xmlというファイルにそのパッケージの作者、ライセンス、依存関係等が記載されています。先ほど作成したmytutパッケージのディレクトリ内にもpackage.xmlというファイルがあると思います。
ROSパッケージを新たに作成した場合やメンテナーなどの情報を変更する場合には、このpackage.xmlを編集しておく必要があります。
通常、package.xmlの 'descriptionタグ', 'maintainerタグ', 'licenseタグ', 'dependenciesタグ'を適切に設定するようにしてください。これは、自分がROSノードを再利用する場合に重要な情報となります。
descriptionタグ
descriptionタグは、パッケージの説明文になります。このタグの要素は自由に変更できますが、慣例として短く説明できる一文で記述するようにしてください。一文でパッケージの説明を記述することが難しい場合には、分けて書くようにしましょう。
ここで作成したmytutでは、下のように書くのもいいかもしれません。
 <description>mytut: My first tutorial  package(2019/01/28)</description>
maintainerタグ
maintainerタグは、このパッケージを誰が現在管理しているのかを記述します。このタグは、package.xmlでは必須で重要なタグです。すなわち、このタグによってパッケージについて不明な部分があった場合に、誰にコンタクトすればいいのかを知ることができます。通常、メンテナの名前はタグの要素部分に記入しますが、emailという属性がありますので、ここにコンタクト先のemailアドレスを設定しなければいけません。例えば、下のように記載します。
 <maintainer email="you@yourdomain.tld">Your Name</maintainer>
licenseタグ
licenseタグは、パッケージのソフトウェアのライセンスに関する情報を記載します。一般的なオープンソースライセンスは、BSD, MIT, Apache, GPL,LGPLといったものがあります。このタグもパッケージの情報としてはとても重要なものですので設定するようにしましょう。
オープンソースライセンスに関しては、Open Source Initiativeのサイトで詳細を知ることができます。このチュートリアルでは、BSDライセンスを使っていきます。
 <license>BSD</license>
dependenciesタグ
dependenciesタグは、パッケージの依存関係について記述します。このタグは、build_depend, buildtool_depend, run_depend, test_dependに分けられておりパッケージの生成時や実行時に依存するライブラリ、パッケージ、ツールなどの情報を記載しておきます。
これらのタグの詳細な説明は、Catkin Dependenciesのドキュメントを参照してください。
このチュートリアルでは、パッケージの生成時に catkin_create_packageの引数としてstd_msgs, rospy, roscppの3つを指定しましたので、package.xmlには下記のように記載されていると思います。
  <!-- The *depend tags are used to specify dependencies -->
  <!-- Dependencies can be catkin packages or system dependencies -->
  <!-- Examples: -->
  <!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
  <!--   <depend>roscpp</depend> -->
  <!--   Note that this is equivalent to the following: -->
  <!--   <build_depend>roscpp</build_depend> -->
  <!--   <exec_depend>roscpp</exec_depend> -->
  <!-- Use build_depend for packages you need at compile time: -->
  <!--   <build_depend>message_generation</build_depend> -->
  <!-- Use build_export_depend for packages you need in order to build against this package: -->
  <!--   <build_export_depend>message_generation</build_export_depend> -->
  <!-- Use buildtool_depend for build tool packages: -->
  <!--   <buildtool_depend>catkin</buildtool_depend> -->
  <!-- Use exec_depend for packages you need at runtime: -->
  <!--   <exec_depend>message_runtime</exec_depend> -->
  <!-- Use test_depend for packages you need only for testing: -->
  <!--   <test_depend>gtest</test_depend> -->
  <!-- Use doc_depend for packages you need only for building documentation: -->
  <!--   <doc_depend>doxygen</doc_depend> -->
  <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をカスタマイズする

ここまで、パッケージのメタ情報を記述したpackage.xmlを編集し、自分のパッケージ用に変更しました。これでROSノードのコードを書き始める準備ができたといっていいと思います。
catkin_create_pkgコマンドで生成されたもう一つのファイルであるCMakeLists.txtは、ROSノードのビルド時に具体的な依存ライブラリの指定やソースファイルなどを設定するために使用されます。ROSノードのビルド(生成)の手順書といっても良いファイルですので、具体的な説明は、次のROSパッケージのビルトのところで説明していきます。