Willowの社長自ら解説するRobots for Humanityプロジェクトのビデオです。
2013年2月22日金曜日
2013年2月10日日曜日
catkin化: スクリプトで楽をする編
みなさんcatkin化してますか?
catkinizeというcatkin化を助けてくれるスクリプトがあるので、これを使ってみましょう。
参考URL:
http://ros.org/wiki/catkin/migrating_from_rosbuild
githubにソースがあるのでそこから取ってきてインストールします。
移行するためのworkspaceをつくります。
ここではlight_curtainというOTLの自作packageの移行をするものとします。
ここにlight_curtain packageのソースをもってきて、catkinizeします。
catkinizeの引数はpathとバージョン番号です。
もし、stackならcatkinize_stackを使えばOK。もしPakcageの新規作成ならcatkin_create_pkgを使いましょう。
catkinizeがすべて自動でやってくれるわけではないので、手動で対応しなければなりません。
例えばpackage.xmlの依存関係はすべてコメントアウトされた状態にあります。
また、CMakeLists.txtもTODOで、手動で埋めるべき項目が記されています。
注意:catkinではすべてのCMakeプロジェクトが1つにまとめられます。そのためCMake上の変数やターゲット名は被らないようにしなければなりません。
以下にやることを原典を参考に書いておきますが、実際にはCMakeLists.txtをいじりながら、ビルド、実行、ができる状態まで編集しつつ、分からないところを調べる、という作業になります。
あと、ライブラリが自動でリンクされないので、以下のような感じに書くとcatkinで依存関係記述されたライブラリがリンクできます。
target_link_libraries(hogehoge_target ${catkin_LIBRARIES})
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
もし、stackならcatkinize_stackを使えばOK。もしPakcageの新規作成ならcatkin_create_pkgを使いましょう。
手動でチェック
catkinizeがすべて自動でやってくれるわけではないので、手動で対応しなければなりません。
例えばpackage.xmlの依存関係はすべてコメントアウトされた状態にあります。
また、CMakeLists.txtもTODOで、手動で埋めるべき項目が記されています。
注意:catkinではすべてのCMakeプロジェクトが1つにまとめられます。そのためCMake上の変数やターゲット名は被らないようにしなければなりません。
以下にやることを原典を参考に書いておきますが、実際にはCMakeLists.txtをいじりながら、ビルド、実行、ができる状態まで編集しつつ、分からないところを調べる、という作業になります。
- maintainerの項目がコメントアウトされた状態で入っている(authorと同じになっている)のでそれを確認してコメントイン。<maintainer email="hoge@hoge.com">のように、emailフィールドも入れた方がいいみたいです。
- dependenciesがbuild/run/testで分かれたので、確認してコメントイン。http://ros.org/wiki/catkin/package.xmlを読んで意味を理解しましょう。
- CMakeLists.txtが編集されているので、そこに書かれたTODOをちゃんとやる
- 自動的に変更された部分を確認して修正する
- 古いコメント部分を削除
- 生成するメッセージ、サービス、アクションをadd_**_filesに記入
- 古いincludeを削除
- catkin_packageマクロを埋める
- 変数名がユニークなものになるように変更
- 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
・stackという概念がなくなった。代わりにメタパッケージ(metapackage)が導入された(stack.xmlはpackage.xmlになる)
・CMakeLists.txtの内容が大幅に変わった
catkin化されたものをWetパッケージと呼ぶようなので覚えておくと良いと思います。
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パッケージと呼ぶようなので覚えておくと良いと思います。
変換の手順
- workspaceの作成
- 依存パッケージがcatkin化されているならば、既存プロジェクトをこのworkspaceに移動させる
- stackをメタパッケージに変換する。ただしunary stackは単なるpackageになる。
- stackの中にstackと同じ名前のcatkinパッケージを作成する(ros_comm/ros_commのようになる)
- 作成したメタパッケージのpackage.xmlのrun_dependタグに、stack内のパッケージ名を書く
- stack.xmlから必要な情報をpackage.xmlに移してstack.xmlを削除する。
- stackフォルダには、同名のメタパッケージと普通のパッケージだけが含まれる状態にする
- manifest.xmlを含むフォルダにて
- manifest.xmlをpackage.xmlにリネームする
- nameタグを追加。パッケージ名(フォルダ名)を入れる。
- CMakeLists.txtがなければcatkin_package()を呼ぶCMakeLists.txtを作る
- CMakeLists.txtの編集
- rosbuildコマンドをcatkinのものに置き換える(後述)
- バイナリがどうインストールされるかを記述する
- すべてのバイナリ(実行ファイル、ライブラリ)に対して
- メッセージヘッダの生成のためにadd_dependencies()を加える(例:geometry_msgs_gencpp)
- すべてのPython実行ファイルについて
- setup.pyではなくcmakeでインストールすること
- もし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になる。
そしてCMakeLists.txtに
catkin_python_setup()
を記述する。
詳しくは
を参照。
という感じで、翻訳してみましたが、これだけ見ると嫌になってきますね。
しかし、これをある程度自動化してくれるスクリプトがあるようですので、
次回はそれを紹介します。
登録:
投稿 (Atom)