2013年5月1日水曜日

catkin化はなかなか進んでいなさそう

まだ世間でもcatkin化は進んでいないですね。

hydraから大丈夫かな。

自分で使いたいパッケージをcatkin化して回ることになりそう。

catkin化する必要性は現時点では正直あまりないんですが、
自分の作るパッケージをcatkin化したいので、
依存するものはすべてcatkinになっていないといけないのです。

とりあえず2つ程catkin化しました。

USBカメラのノードとDynamixelのノードです。

uvc_camのほうにはpullリクエストも送ってみました。
dynamixelもissue投げたので取り込まれるといいな。

どっちも早くリリースまでいってほしい。

やっとcatkinに慣れてきました。

2013年4月30日火曜日

ROSで顔認識

OpenCVで顔認識プログラムやろうかと思ったのですが、
ROSにあったので使ってみたいと思います。

http://www.ros.org/wiki/face_detector

インストールは以下でできます。
$ sudo apt-get install ros-groovy-people

一応willowのスタックのようです。

ただしこれは単眼ではなく、ステレオカメラかRGBDカメラ(Kinect / Xtion)が必要です。
3次元位置を出せるみたいです。

今回は私はUSBカメラで顔の画面上の位置だけ出したかったので、
2次元のものを探したら、やっぱりありました。

http://www.ros.org/wiki/pi_face_tracker


これはROS By Exampleを書いている人たちのプロジェクトですね。

ドキュメントもしっかりしているので、これを使ってみます。

インストールはソースからやる必要があるみたいです。
catkin化されてないです。

インストール方法を簡単に書くとuvc_camパッケージのインストール

$ git clone https://github.com/ericperko/uvc_cam.git
$ rosdep install uvc_cam
$ rosmake uvc_cam

pi_vision スタックのインストール
$ svn co http://pi-robot-ros-pkg.googlecode.com/svn/trunk/pi_vision
4 rosdep install pi_vision
$ rosmake pi_vision

ビルドは多分、いろいろ古くてうまく行かないので、以下だけやるといいと思います。

 $ roscd pi_face_tracker
 $ make

基本的にはpythonのコードなのでビルドはいらないです。

で、USBカメラでの実行は以下のコマンドでUSBカメラのノードを上げて、


$ roslaunch ros2opencv uvc_cam.launch




$ roslaunch pi_face_tracker face_tracker_uvc_cam.launch 

でいいみたいです。

データセットのせいか、メガネがあると認識しづらいみたいです。
発見&追従です。



/roi
に sensor_msgs/RegionOfInterest
で座標が出ます。

OTLさん素顔公開です!!

2013年4月29日月曜日

catkinでのpythonのtestについて

catkinにはまだなれません。

catkin化したパッケージのテストについて調べたので書いてみます。
catkinはとにかくドキュメントが少なすぎて泣ける。

普段pythonしかコード書かないので、pythonのtestについてです。

catkinではpythonでのtestにnoseというフレームワークを基本的に使うみたいです。
unittestフレームワークを使ったコードはそのまま使えるので、
あまり意識しなくても大丈夫かも。

まず、テストファイルをこれまでと同様に準備します。

で、CMakeLists.txtに
catkin_add_nosetests(test/unit)

などと書きます。

noseではテストをパッケージにできるので、
test/unit以下にunittestのファイルと__init__.pyを置いておけば
すべて実行されるみたいです。

で、rostestのほうは、

add_rostest(test/***.test)

と書きます。
中身は今までどおり、rostestパッケージを使った書き方でよさそうです。

これで、

$ catkin_make run_tests
とすれば、すべてのパッケージのテストが実施されます。

$ cd WORKSPACE/build
$ make run_tests_PACKAGE_NAME

で、指定したパッケージだけのテストもできます。
いろんなソースとか調べた方法なので、もし、もっとちゃんとしたドキュメントとか
ご存知の方いたら教えてください。

2013年3月9日土曜日

ROS勉強オフ会開催中

今日はROS勉強オフ会開催中です!

Turtlebot2を買った強者が自宅に来ております。

ROSのインストールはできたけど、ロボットが動かないとか。

僕の読みでは原因はケーブルの差し忘れです。


5分後・・・・



動きました!

ROS_HOSTNAME/ROS_MASTER_URIの設定がおかしかったみたいです。

2013年2月22日金曜日

Robots for Humanity (IROS 2012 Video Track)

Willowの社長自ら解説するRobots for Humanityプロジェクトのビデオです。




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()
を記述する。

詳しくは
を参照。

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