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化はぜひ取り上げたいですね。

2012年11月27日火曜日

TurtleBot2もらったぞ!

iHeartRoboticsをご存知でしょうか?
iHeartEngineeringでTurtleBotの販売などを手がけております。

そこのBillさんとはROSを通じて友達になりまして、
似たようなソフトを作ったり、趣味が合います。)
以前ROSのTシャツやらグッズをもらったりしました。

そしてなんと、今回出たばかりのTurtleBot2を貰いました!
うおーー!!!
他にもいろんなキットももらっちゃいました!

我が家の使い古されたルンバとのツーショット。
色が同じで兄弟みたい。

はるばる名古屋まで会いに来てくれたので、そのまま
名古屋のミッドランドスクエアというビルのオープンスペースで
二人でセットアップ&動かして遊んでました。
最高に楽しかったです。動画です↓(音声お聞き苦しくてすみません)


TurtleBot1や、ルンバはオドメトリ性能があまりよくなく、自律移動はやっとこさ、
って感じでしたが、オドメトリ性能が向上したということなので、
バリバリ家の中を走り回らせそうです!

私はドキュメントの日本語化、ソフト開発などやりまくります。
日本のみなさんも安心して、ぜひTurtleBot2買って、
日本で、世界で一緒に遊びましょう!

Thanks!! iHeartRobotics!! Bill!!!

2012年11月25日日曜日

rosserialを使ってArduinoとROSで通信する

みなさんArduino使っていますか?
イタリア製のいかしたマイコンです。
mbedのほうがオシャレな気がしますが、
まだまだArduinoのほうが強い気がします。

ArduinoとROSを通信させたいときに便利なrosserial_arduinoを紹介します。

rosserial_arduinoは以下のメリットがあります。

  • ArduinoのスケッチをROSライクに書ける
  • ArduinoとROSのインタフェースで通信できる

まあ、要するにマイコンとPCのプロトコルをいちいち決めるのがめんどくさいときに楽できますよ、ってことです。

ちなみにrosserialはシリアル通信でROSをおしゃべりするための汎用的なライブラリで、rosserial_arduinoは、そのArduino用ライブラリになります。

PCとはjava/pythonで接続します。


チュートリアルはこちら。

http://ros.org/wiki/rosserial_arduino/Tutorials/Arduino%20IDE%20Setup
http://ros.org/wiki/rosserial_arduino/Tutorials/Hello%20World

インストール

sudo apt-get install ros-fuerte-rosserial

でもいいんですが、これだと最新のArduino IDE(1.0以降)で動きません。
なので、最新版をソースから使うのがいいです。
(groovyではそのまま動くと思います。)


hg clone https://kforge.ros.org/rosserial/hg rosserial
rosdep install rosserial_arduino
rosmake rosserial_arduino


そしたらそれを以下のコマンドでインストールします。<sketchbook>はArduino IDEをインストールしたパスで置き換えてくださいね。


roscd rosserial_arduino/libraries
cp -r ros_lib <sketchbook>/libraries/

するとArduinoのサンプルにros_libというのが出るので、
これで遊べます。

ExampleからHelloWorldを選択して、ダウンロードしてみてください。

実行

まずroscoreを上げます。


roscore


次にマイコンとシリアル通信するPCのソフトを上げます。

rosrun rosserial_python serial_node.py /dev/ttyUSB0


するとすでにArduinoがROSをしゃべっているので、確認しましょう。
rostopic echo chatter



Publish/Subscribeができるようです。サービスはまだないのかな?

2012年11月19日月曜日

Interactive Markersを使おう(2):作って仕組みを理解する

では引き続きInteractive Markersです。

今回は簡単なサンプルを書いて、仕組みを理解しましょう。

http://www.ros.org/wiki/rviz/Tutorials/Interactive%20Markers%3A%20Writing%20a%20Simple%20Interactive%20Marker%20Server


roscreate-pkg im_tutorials roscpp interactive_markers
cd im_tutorials
以下をsrc/simple_marker.cppとして保存。


#include <ros/ros.h>

#include <interactive_markers/interactive_marker_server.h>

void processFeedback(
    const visualization_msgs::InteractiveMarkerFeedbackConstPtr &feedback )
{
  ROS_INFO_STREAM( feedback->marker_name << " is now at "
      << feedback->pose.position.x << ", " << feedback->pose.position.y
      << ", " << feedback->pose.position.z );
}

int main(int argc, char** argv)
{
  ros::init(argc, argv, "simple_marker");

  // create an interactive marker server on the topic namespace simple_marker
  interactive_markers::InteractiveMarkerServer server("simple_marker");

  // create an interactive marker for our server
  visualization_msgs::InteractiveMarker int_marker;
  int_marker.header.frame_id = "/base_link";
  int_marker.name = "my_marker";
  int_marker.description = "Simple 1-DOF Control";

  // create a grey box marker
  visualization_msgs::Marker box_marker;
  box_marker.type = visualization_msgs::Marker::CUBE;
  box_marker.scale.x = 0.45;
  box_marker.scale.y = 0.45;
  box_marker.scale.z = 0.45;
  box_marker.color.r = 0.5;
  box_marker.color.g = 0.5;
  box_marker.color.b = 0.5;
  box_marker.color.a = 1.0;

  // create a non-interactive control which contains the box
  visualization_msgs::InteractiveMarkerControl box_control;
  box_control.always_visible = true;
  box_control.markers.push_back( box_marker );

  // add the control to the interactive marker
  int_marker.controls.push_back( box_control );

  // create a control which will move the box
  // this control does not contain any markers,
  // which will cause RViz to insert two arrows
  visualization_msgs::InteractiveMarkerControl rotate_control;
  rotate_control.name = "move_x";
  rotate_control.interaction_mode =
      visualization_msgs::InteractiveMarkerControl::MOVE_AXIS;

  // add the control to the interactive marker
  int_marker.controls.push_back(rotate_control);

  // add the interactive marker to our collection &
  // tell the server to call processFeedback() when feedback arrives for it
  server.insert(int_marker, &processFeedback);

  // 'commit' changes and send to all clients
  server.applyChanges();

  // start the ROS main loop
  ros::spin();
}



CMakeLists.txtに


rosbuild_add_executable(simple_marker src/simple_marker.cpp)

を追加。

で、
make
bin/simple_marker

roscore

rosrun rviz rviz

前回のチュートリアルでやった、Interactive MarkersのUpdate Topicを/simple_marker/updateにセット。
で、トップメニューのInteractを選択すると以下のように矢印が出るはず。


矢印をドラッグするとマーカーが動いて、コンソールにメッセージが出ます。

visualization_msgs::InteractiveMarkerControl::MOVE_AXISをvisualization_msgs::InteractiveMarkerControl::ROTATE_AXISに変えて、コンパイル&実行してみましょう。

矢印が輪っかに変わりました。


ここでソースをおさらいします。
やっていることは、
  • InteractiveMarkerServerを作る
  • InteractiveMarkerを作り、そこにMarker(見た目)とコントローラをセットする
  • InteractiveMarkerをInteractiveMarkerServerにコールバックと共に登録する。
コールバックにはvisualization_msgs::InteractiveMarkerFeedbackConstPtrが渡されるのでこれを使ってやりたいことを実現する。コールバックにはboost::functionが渡せるようです。

2012年11月16日金曜日

Interactive Markersを使おう(1):とりあえず動かす

ひさびさにチュートリアルをやりましょう。

今回はInteractive Markersです。

rvizはご存知の通り、基本的にビューワで、ロボットの状態を一方的に表示します。
(目的地など、一部入力も可能ですが)

Interactive Markersはrvizに、ユーザからのさまざまな入力を受け付ける機能を追加します。

こちらにチュートリアルがあるので見て行きましょう。


なにはともあれ、とにかくプログラムを実行しましょう。

まずはroscore。
roscore

で、サンプルの実行。

rosrun interactive_marker_tutorials basic_controls


で、肝心のrvizを立ち上げます。
rosrun rviz rviz



以下の画像を参考にrvizの設定をしてください。



  • fixed frameを'/base_link'に
  • 左下のAddを押してInteractive Markersを加える
  • そのトピックを'/basic_controls/update'にセット

するとメニューの'Interact'を置くと↑図のように矢印が出てきますので、さわって遊びましょう。

位置姿勢を入力するさまざまなサンプルが表示されます。



basic_controlsをC-cで落として、pongを試しましょう。


rosrun interactive_marker_tutorials pong


として、InteractiveMarkersのUpdate Topicを/pong/updateにします。

すると以下のようなピンポンゲームをrviz上で遊べてしまいます!
バーをマウスでドラッグするとピンポン玉(円柱です)が動き出します。
うまくバーで跳ね返しましょう。



2012年11月2日金曜日

ROS界隈のニュース

ごぶさたしております。

生存確認代わりに最近のROSっぽいところのニュースと所感を書いておきます。
ここの読者からすると今更感がたっぷりなニュースです。

TexaiからBeamへ!

Willow GarageからスピンアウトしたSuitable Technologies inc.が作ったテレプレゼンスロボットが公開されました。Beamです。


特徴は17インチの巨大モニターだと思います。
操作者の存在感を出すにはそれくらい必要なんですかね。

RethinkRoboticsのBaxter発表!

そしてなんといってもBaxterですよね。
約200万円という価格が特徴ですね。



で、ROSは?

ということで、これらとROSって何か関係あるのか?
ってことなんですけど、まさにこの2つのロボットはどっちもROSを使っているんです。
(Beamは言うまでもないですが、BaxterはROSメーリスにROSベースのSDKの人材募集していましたから間違いないでしょう)

しかし、両者ともROSへの言及は全くといっていいほどありません。
そして、これらのロボットは全くオープンじゃないです。
(そのうちSDKくらいは出してくるかもしれませんが)

ROSはもうおもちゃじゃなく、製品に確実に乗ってきています。

ROSはもう表に出ず、裏方でこっそり使われるというフェーズになったように感じます。
今後もたぶん、ROSはますます影を潜め、そして、どんどん浸透していくでしょう。

日本としてはなんか怖いような、でも同じく苦境にあるアメリカに是非大成功して欲しいような、そんな今日この頃です。