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()
を記述する。
詳しくは
を参照。
という感じで、翻訳してみましたが、これだけ見ると嫌になってきますね。
しかし、これをある程度自動化してくれるスクリプトがあるようですので、
次回はそれを紹介します。
0 件のコメント:
コメントを投稿