catkinのレポジトリを追加する
前回catkinのワークスペースを$HOME/ros_catkin_ws/hydroに作成しました。
ここにソースコードを追加してみます。
今回はgaraemon-catkin-sample-pkgというレポジトリを追加してみます。中には簡単なサンプルが入っているだけです。
$ cd ~/ros_catkin_ws/hydro/src
$ wstool set --git garaemon-catkin-sample-pkg https://github.com/garaemon/garaemon-catkin-sample-pkg.git
$ wstool update
wstoolというのはcatkinのワークスペース、つまり$HOME/ros_catkin_ws/hydro/srcを色々といじるときに使うコマンドです。
$ wstool -h
wstool is a command to manipulate ROS workspaces. wstool replaces its predecessor wstool.
Official usage:
wstool CMD [ARGS] [OPTIONS]
wstool will try to infer install path from context
Type 'wstool help' for usage.
help provide help for commands
init set up a directory as workspace
set add or changes one entry from your workspace config
merge merges your workspace with another config set
remove (rm) remove an entry from your workspace config, without deleting files
update (up) update or check out some of your config elements
info Overview of some entries
status (st) print the change status of files in some SCM controlled entries
diff (di) print a diff over some SCM controlled entries
wstool setはワークスペースに新しくレポジトリを追加するときのコマンドになっています。
なので、
$ wstool set --git garaemon-catkin-sample-pkg https://github.com/garaemon/garaemon-catkin-sample-pkg.git
はローカルではgaraemon-catkin-sample-pkgという名前のディレクトリでhttps://github.com/garaemon/garaemon-catkin-sample-pkg.gitをとってきてください、ちなみにgitですという意味です。
wstool setをしただけではまだコードはcloneされていません。そのためにはwstool updateを走らせる必要があります。
これは、ワークスペースにwstool setで追加したレポジトリを全部アップデートしてくれ、というコマンドです。
パッケージが追加されたことを確認してみましょう
$ ls ~/ros_catkin_ws/hydro/src
CMakeLists.txt garaemon-catkin-sample-pkg
$ rospack find catkin_roscpp_sample
/home/username/ros_catkin_ws/hydro/src/garaemon-catkin-sample-pkg/catkin_roscpp_sample
ここでrospackという新しいコマンドが出てきました。rospackはROSのパッケージに関する情報を提供するためのコマンドです。例えば、
$ rospack list
actionlib /opt/ros/hydro/share/actionlib
actionlib_msgs /opt/ros/hydro/share/actionlib_msgs
actionlib_tutorials /opt/ros/hydro/share/actionlib_tutorials
(中略)
voxel_grid /opt/ros/hydro/share/voxel_grid
xacro /opt/ros/hydro/share/xacro
xmlrpcpp /opt/ros/hydro/share/xmlrpcpp
rospack listコマンドを使うとパッケージの一覧が見えます。
rospack findはパッケージのパスを返します。
catkinのパッケージをコンパイルする
catkin_makeというコマンドを使います
$ cd ~/ros_catkin_ws/hydro
$ catkin_make
catkin_makeを実行するディレクトリに注意してください。wstoolは~/ros_catkin_ws/hydro/src以下で使いましたが、これはその一つ上です。
catkin_makeを実行するとsrcディレクトリと並列にbuild, develというディレクトリが出来ます。
$ ls ~/ros_catkin_ws/hydro
build devel src
このdevelというディレクトリの中にコンパイルしてできたライブラリやバイナリが置かれます。
コンパイルしてできたサンプルを実行する
今回チェックアウトしたレポジトリにはcatkin_roscpp_sampleとういパッケージが有ります。
これには二つのノードの間でtopicを利用した通信を行う最低限のサンプルが含まれています。
これを実行しましょう。
まず一つ目のターミナルで
$ roscore
と実行します。
2つ目のターミナルで
$ rosrun catkin_roscpp_sample hello_publisher
と実行します
最後に3つめのターミナルで
$ rosrun catkin_roscpp_sample hello_subscriber
と実行します。
そうすると3つめのターミナルに以下の様な出力が出るはずです
$ rosrun catkin_roscpp_sample hello_subscriber
[ INFO] [1390899414.971967414]: subscriber get message: Hello World!!
[ INFO] [1390899414.982323544]: subscriber get message: Hello World!!
[ INFO] [1390899414.992567862]: subscriber get message: Hello World!!
[ INFO] [1390899415.001686398]: subscriber get message: Hello World!!
[ INFO] [1390899415.011823428]: subscriber get message: Hello World!!
[ INFO] [1390899415.021833998]: subscriber get message: Hello World!!
...
ちなみに、プログラムを止めるにはCtrl-Cをしてください。ROSのプログラムは基本的にCtrl-Cで止めます。
ここでは二つ新しいコマンドが出てきています, roscoreとrosrunです
roscoreはROSの通信を管理してくれるマスターです。必ず立ち上げる必要があります。
一つのroscoreが一つのROSネットワークを作ります。
rosrunはいわば便利スクリプトです。
rosrun package executableでpackageというパッケージに含まれるexecutableを実行してくれという意味です。
つまり、rosrun catkin_roscpp_sample hello_publisher, rosrun catkin_roscpp_sample hello_subscriberの二つはcatkin_roscpp_sampleパッケージのhello_publisherとhello_subscriberという二つの実行ファイルを実行してくれ、という意味です。
しかし、いちいちプロセスを一つ一つあげていたのでは面倒です。そのため、複数のプロセスをまとめて立ち上げるためのコマンドが用意されています。
roslaunchでサンプルを実行する
複数のプロセスを一気に立ち上げるにはroslaunchというのを利用します。先ほど立ち上げたプログラムを全て終了した後に
$ roslaunch catkin_roscpp_sample sample.launch
と実行すると同じようにHello Worldという文字列がターミナルに見えます。
roslaunchはlaunchファイルと呼ばれるxmlにどのようなプロセスを立ち上げるかとずらーっと書いておいて、それでまとめてプロセスを立ち上げるコマンドです。
sample.launchの中身を見てみましょう
$ roscd catkin_roscpp_sample
$ less launch/sample.launch
<launch>
<node pkg="catkin_roscpp_sample"
type="hello_publisher"
name="publisher"
output="screen">
</node>
<node pkg="catkin_roscpp_sample"
type="hello_subscriber"
name="subscriber"
output="screen">
</node>
</launch>
<node>タグによって、立ち上げるプロセスを指定しています。pkg属性によって実行ファイルが含まれるパッケージ、type属性は実行ファイルの名前, name属性はROSのネットワークにおける名前、output属性は標準出力をどこにPIPEするかを指定しています。
さりげなく登場してるroscdというコマンドはとても便利です。roscd packageでpackageにcdするということです。
この系統のrosコマンドは、tab補完が効くので便利です。
サンプルの細かい中身は今後見ていきます。
まとめ
-
wstoolはcatkinのワークスペースをいじるコマンド -
catkin_makeはcatkinのパッケージをコンパイルする -
roscoreはネットワークのマスター -
rospackはパッケージの情報を見るコマンド -
rosrunは実行ファイルを実行するためのコマンド -
roslaunchはlaunchファイルでまとめてプロセスを立ち上げる。 -
roscdはパッケージにcdする -
Ctrl-CでROSのプログラムは終了させる