ラベル Groovy の投稿を表示しています。 すべての投稿を表示
ラベル Groovy の投稿を表示しています。 すべての投稿を表示

2013年2月10日日曜日

catkin化: スクリプトで楽をする編

みなさんcatkin化してますか?
catkinizeというcatkin化を助けてくれるスクリプトがあるので、これを使ってみましょう。

参考URL:
http://ros.org/wiki/catkin/migrating_from_rosbuild

githubにソースがあるのでそこから取ってきてインストールします。

$ git clone https://github.com/ros-infrastructure/catkinize
$ cd catkinize
$ sudo python setup.py install


移行するためのworkspaceをつくります。
ここではlight_curtainというOTLの自作packageの移行をするものとします。

$ mkdir light_curtain_ws/src
$ cd light_curtain_ws
$ catkin_make
$ source devel/setup.bash


ここにlight_curtain packageのソースをもってきて、catkinizeします。

$ cd src
$ git clone https://github.com/OTL/light_curtain.git
$ catkinize light_curtain 0.1.0

catkinizeの引数はpathとバージョン番号です。
もし、stackならcatkinize_stackを使えばOK。もしPakcageの新規作成ならcatkin_create_pkgを使いましょう。

手動でチェック


catkinizeがすべて自動でやってくれるわけではないので、手動で対応しなければなりません。
例えばpackage.xmlの依存関係はすべてコメントアウトされた状態にあります。
また、CMakeLists.txtもTODOで、手動で埋めるべき項目が記されています。

注意:catkinではすべてのCMakeプロジェクトが1つにまとめられます。そのためCMake上の変数やターゲット名は被らないようにしなければなりません。

以下にやることを原典を参考に書いておきますが、実際にはCMakeLists.txtをいじりながら、ビルド、実行、ができる状態まで編集しつつ、分からないところを調べる、という作業になります。
  1. maintainerの項目がコメントアウトされた状態で入っている(authorと同じになっている)のでそれを確認してコメントイン。<maintainer email="hoge@hoge.com">のように、emailフィールドも入れた方がいいみたいです。
  2. dependenciesがbuild/run/testで分かれたので、確認してコメントイン。http://ros.org/wiki/catkin/package.xmlを読んで意味を理解しましょう。
  3. CMakeLists.txtが編集されているので、そこに書かれたTODOをちゃんとやる
  4. 自動的に変更された部分を確認して修正する
  5. 古いコメント部分を削除
  6. 生成するメッセージ、サービス、アクションをadd_**_filesに記入
  7. 古いincludeを削除
  8. catkin_packageマクロを埋める
  9. 変数名がユニークなものになるように変更
  10. pythonスクリプトがあるならその対応
・・・とやることいっぱいです。

また、


超はまったのが、dynamic_reconfigureで、
dynamic_reconfigure.parameter_generatorじゃなく、
dynamic_reconfigure.parameter_generator_catkin
にしないといけないところでした。

ともかく、すべてを理解してからじゃないととても無理だと思います。
package.xml, CMakeLists.txtの新しいフォーマットの理解をしましょう。
ともかく、1回やれば大体分かると思いますので、簡単なものからやってみるといいでしょう。


あと、ライブラリが自動でリンクされないので、以下のような感じに書くとcatkinで依存関係記述されたライブラリがリンクできます。

target_link_libraries(hogehoge_target ${catkin_LIBRARIES})

うーん、思ったより大変だった。
参考になるか分かりませんが、groovy化したlight_curtainをおいて置きます。


つっこみ、修正等あればgithubにて教えてください。

2013年2月9日土曜日

catkin化: 何をすればいいか理解する編

groovyから正式採用されたビルドシステムcatkin。
fuerteまではrosbuildというシステムを使っていた人がほとんどだと思いますが、
Groovyからはcatkinが標準になりました。

今回はすでにrosbuildで作っているパッケージをcatkin化する方法を見ていきます。

参考URL
http://ros.org/wiki/catkin/migrating_from_rosbuild

これまでとの違い

・manifest.xmlがpackage.xmlに変更
・stackという概念がなくなった。代わりにメタパッケージ(metapackage)が導入された(stack.xmlはpackage.xmlになる)
・CMakeLists.txtの内容が大幅に変わった

用語

これまでのrosbuildを使ったパッケージをDryパッケージ、
catkin化されたものをWetパッケージと呼ぶようなので覚えておくと良いと思います。

変換の手順

  1. workspaceの作成
  2. 依存パッケージがcatkin化されているならば、既存プロジェクトをこのworkspaceに移動させる
  3. stackをメタパッケージに変換する。ただしunary stackは単なるpackageになる。
    1. stackの中にstackと同じ名前のcatkinパッケージを作成する(ros_comm/ros_commのようになる)
    2. 作成したメタパッケージのpackage.xmlのrun_dependタグに、stack内のパッケージ名を書く
    3. stack.xmlから必要な情報をpackage.xmlに移してstack.xmlを削除する。
    4. stackフォルダには、同名のメタパッケージと普通のパッケージだけが含まれる状態にする
  4. manifest.xmlを含むフォルダにて
    1. manifest.xmlをpackage.xmlにリネームする
    2. nameタグを追加。パッケージ名(フォルダ名)を入れる。
    3. CMakeLists.txtがなければcatkin_package()を呼ぶCMakeLists.txtを作る
  5. CMakeLists.txtの編集
    1. rosbuildコマンドをcatkinのものに置き換える(後述)
    2. バイナリがどうインストールされるかを記述する
  6. すべてのバイナリ(実行ファイル、ライブラリ)に対して
    1. メッセージヘッダの生成のためにadd_dependencies()を加える(例:geometry_msgs_gencpp)
  7. すべてのPython実行ファイルについて
    1. setup.pyではなくcmakeでインストールすること
  8. もしpythonのpackageを含んでいるならば、setup.pyを作成し、catkin_python_setup()をCMakeLists.txtに記述する。
catkinワークスペースは以下のような配置になる。catkin_makeを使ったとき、バイナリはbuildフォルダに作られる。
my_workspace/
  build/  <-- created by catkin_make
  devel/  <-- created by catkin_make
  src/
    package_1/
      package.xml
      CMakeLists.txt
      src/
        code.cpp
        ...
    package_2/
      package.xml
      CMakeLists.txt
      src/
        code.cpp
        ...
    ...

もしcleanしたいときはbuild/とdevel/は削除してもよい。これらは自動で作成される。

これまでmanifest.xmlで管理されていた、ライブラリのエクスポート情報などは、CMakeで管理されるようになる
詳しくは
参照。

rosbuildで使われていたマクロはCMakeの標準的な記述、もしくはcatkin独自の記述に変更される。詳しくは
参照。

CMakeのマクロ対応表


Build Macros
rosbuild
catkin
rosbuild_init()
remove
rosbuild_add_library(...)
add_library(...)
rosbuild_add_executable(...)
add_executable(...)
rosbuild_add_compile_flags(...)
set_target_properties(target PROPERTIES COMPILE_FLAGS new_flags)
rosbuild_remove_compile_flags(...)
set_target_properties(target PROPERTIES COMPILE_FLAGS new_flags)
rosbuild_add_link_flags(...)
set_target_properties(target PROPERTIES LINK_FLAGS new_flags
rosbuild_remove_link_flags(...)
set_target_properties(target PROPERTIES LINK_FLAGS new_flags)
rosbuild_add_boost_directories(...); rosbuild_link_boost(target components)
find_package(Boost REQUIRED COMPONENTS components); include_directories(${Boost_INCLUDE_DIRS}); target_link_libraries(target ${Boost_LIBRARIES})
rosbuild_add_openmp_flags(...)
find_package(OpenMP), then do other stuff
rosbuild_invoke_rospack(...)
DO NOT DO THIS
rosbuild_find_ros_package(...)
DO NOT DO THIS
rosbuild_find_ros_stack()
DO NOT DO THIS
rosbuild_check_for_sse(...)
look around online and find an example of how to find SSE
rosbuild_include(package module)
include(module) (might require some initial work to find the path to the module)
rosbuild_add_lisp_executable()
no support for this currently
rosbuild_add_swigpy_library(target lib src1 src2)
?
Test Macros
rosbuild
catkin
rosbuild_add_gtest(...)
catkin_add_gtest(...)
rosbuild_add_gtest_labeled
?
rosbuild_add_gtest_future
?
rosbuild_add_gtest_build_flags
use set_target_properties on test target
rosbuild_add_pyunit
migrate to catkin_add_nosetests(...)
rosbuild_add_pyunit_labeled
?
rosbuild_add_pyunit_future
?
rosbuild_add_rostest
?
rosbuild_add_rostest_labeled
?
rosbuild_add_rostest_future
?
rosbuild_add_roslaunch_check
?
rosbuild_declare_test
add_dependencies(tests <test-target>)
rosbuild_count_cores
?
rosbuild_check_for_display
?
rosbuild_check_for_vm
?
Message / service macros
rosbuild
catkin
rosbuild_add_generated_msgs(...)
add_message_files(DIRECTORY msg FILES ...)
rosbuild_add_generated_srvs(...)
add_service_files(DIRECTORY srv FILES ...)
rosbuild_genmsg()
generate_messages() (once per CMakeLists.txt)
rosbuild_gensrv()
generate_messages() (once per CMakeLists.txt)
Listing the message files is useful as adding removing files will trigger an automatic reconfigure by cmake.
Version macros
rosbuild
catkin
rosbuild_get_stack_version
obsolete
rosbuild_get_package_version
obsolete
Data Macros
rosbuild
catkin
rosbuild_download_data(url filename [md5sum])
?
rosbuild_download_test_data
download_test_data
rosbuild_untar_file
?
Special targets
rosbuild
catkin
rosbuild_premsgsrvgen
?
rosbuild_precompile
?
rosbuild_make_distribution
?
Actionlib
rosbuild
catkin
include(${actionlib_msgs_PACKAGE_PATH}/cmake/actionbuild.cmake)
Remove this, Add actionlib_msgs to find_package call
genaction()
add_action_files(DIRECTORY msg FILES ...)


Pythonについて

catkinはPythonのdistuilsというライブラリを利用する。もしpackage内でpython packageやscriptを使っているならばsetup.pyを加える必要がある。
標準的な配置(src/package_name/)を使っているならば以下の様なsetup.pyになる。

   1 #!/usr/bin/env python
   2 
   3 from distutils.core import setup
   4 from catkin_pkg.python_setup import generate_distutils_setup
   5 
   6 d = generate_distutils_setup(
   7    scripts=['bin/myscript'],
   8    packages=['PYTHON_PACKAGE_NAME'],
   9    package_dir={'': 'src'}
  10 )
  11 
  12 setup(**d)
そしてCMakeLists.txtに
catkin_python_setup()
を記述する。

詳しくは
を参照。

という感じで、翻訳してみましたが、これだけ見ると嫌になってきますね。
しかし、これをある程度自動化してくれるスクリプトがあるようですので、
次回はそれを紹介します。

2013年1月1日火曜日

Groovyリリース

あけましておめでとうございます。

元日にGroovyリリース来ました!
willowに休日はなかったのか。

http://www.ros.org/news/2012/12/ros-groovy-galapagos-released.html

Groovyは正式にcatkin(rosbuildを使わず、cmakeの仕組みでビルド)化され、
慣れ親しんだroscreate-pkgがなくなる、など大きな変更があります。



Ubuntu Users: Please make sure to use the Python tools from apt and not pip. The pip based installs tend to go out of date and not get updated with the rest of the system.



とありますので、upgradeする人は、pipで入れていたPythonツール群(rosdepなど)は削除したほうが良さそうです。

主な変更は

・コードのGitHubへの移動
・catkin化(stackの削除:metapackageの導入)
・リリースシステムbloomの導入
・rqtの導入(WxからQtへの移行)

くらいですかね。

ビルドシステムが変更されたため、ベーシックなチュートリアルから変更されていますので、このブログの過去記事がまた役に立たなくなりましたのでご注意ください。

catkin化はぜひ取り上げたいですね。