ar_track_alvarを利用するとマーカーの位置、姿勢などを取得することができます。
ar_track_alvar - ROS Wiki
http://wiki.ros.org/ar_track_alvar
インストール
ar_track_alvar自体のインストールはapt-getでできます。
sudo apt-get install ros-indigo-ar-track-alvar
チュートリアル
今回はステレオカメラではなく、1つのカメラだけでマーカーの位置取得をします。
カメラキャリブレーション
ar_track_alvarはマーカーの位置取得にカメラのパラメーターを利用します。
よって、まずは使用するカメラのキャリブレーションを行なって、パラメータを作成します。
ます、camera_calibrationをインストールします。
sudo apt-get install ros-indigo-camera-calibration
次にキャリブレーション用のマーカーを紙に印刷します。
参考にしたURLにある、これとかでいいと思います。
camera_calibration/Tutorials/MonocularCalibrationの添付ファイル:check-108.pdf - ROS Wiki
http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration?action=AttachFile&do=view&target=check-108.pdf
カメラを接続してcamera_calibrationを実行します。
rosrun uvc_camera uvc_camera_node
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0245 image:=/image_raw
(上のURLにあるキャリブレーション用のマーカーをA4用紙に印刷した際には、オプションの数値はこのままでいいと思います。
オプションについて詳しくはこれに書いています。
camera_calibration - ROS Wiki
http://wiki.ros.org/camera_calibration
)
実行するとキャリブレーション用のウィンドウが出てくるので、"CALIBRATE"を押します。
キャリブレーション用のマーカーを画面に写します。
カラフルな線がマーカーの白と黒の境界に出てくると思います。
そのまま平行移動させたり、回転させたり、遠ざけたりして、動かしてください。
色々動かしていると、ウィンドウの"SAVE"がアクティブになると思うので、なったらクリックします。
/tmp以下を見ると、"calibrationdata.tar.gz"ができていると思います。
ウィンドウを終了させ、calibrationdata.tar.gzをhomeなどにコピーしてきて、展開します。
"oni.txt"がキャリブレーション結果のパラメータが入ったファイルです。
ここまでで参考にしたサイト
camera_calibration/Tutorials/MonocularCalibration - ROS Wiki
http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration
ROS勉強記録: camera_calibration(USBカメラのキャリブレーション)
http://ros-robot.blogspot.jp/2010/11/cameracalibrationusb.html
しかし、このキャリブレーションパラメータを使う時にはこのままではダメで、ymlファイルに直さなければいけません。
よって、ファイルの変換を行います。
変換を行う"camera_calibration_parsers"をインストールします。
sudo apt-get install ros-indigo-camera-calibration-parsers
変換を行います。
cp oni.txt oni.ini
rosrun camera_calibration_parsers convert ost.ini cal.yml
これでcal.ymlが出来ました。
マーカーの位置測定
これでやっと前準備は終わりです。
まず、マーカーを紙に印刷します。
ROS Wikiのar_track_alvarのページにある次のURLのPDFをダウンロードして、印刷してください。
ar_track_alvarの添付ファイル:markers0to8.png - ROS Wiki
http://wiki.ros.org/ar_track_alvar?action=AttachFile&do=view&target=markers0to8.png
ar_track_alvarの添付ファイル:markers9to17.png - ROS Wiki
http://wiki.ros.org/ar_track_alvar?action=AttachFile&do=view&target=markers9to17.png
下を"ar_track.launch"など適当な名前で保存してください。
<launch>
<node pkg="tf" type="static_transform_publisher" name="map_to_camera" output="screen" args="0 0 0 0.785398163 0 0 map camera 10" />
<node name="uvc_camera" pkg="uvc_camera" type="uvc_camera_node" output="screen" >
<param name="device" value="/dev/video0" />
<param name="width" value="640" />
<param name="height" value="480" />
<param name="fps" value="30"/>
<param name="frame_id" value="camera" />
<param name="camera_info_url" type="string" value="file://$(find PACKAGE_NAME)/cal.yml" />
</node>
<!--<node name="image_proc" pkg="image_proc" type="image_proc" output="screen" />-->
<node name="image_view" pkg="image_view" type="image_view" output="screen" >
<remap from="image" to="image_raw" />
</node>
<arg name="marker_size" default="5.5" />
<arg name="max_new_marker_error" default="0.08" />
<arg name="max_track_error" default="0.2" />
<arg name="cam_image_topic" default="/image_raw" />
<arg name="cam_info_topic" default="/camera_info" />
<arg name="output_frame" default="/camera" />
<node name="ar_track_alvar" pkg="ar_track_alvar" type="individualMarkersNoKinect" respawn="false" output="screen"
args="$(arg marker_size) $(arg max_new_marker_error) $(arg max_track_error) $(arg cam_image_topic) $(arg cam_info_topic) $(arg output_frame)" />
</launch>
10行目のvalueはcal.ymlの場所を指定するので、絶対パスを指定するか、パッケージ名をfindしてそこからの相対パスを指定するかどちらかを書きます。
実行すると、カメラ映像が出てくるので、そこにマーカーを写すと位置測定を行います。
しかし、表示するものを何も立ち上げていないため、現時点では何も見えません。
まずは簡単に、rostopicでtfを見てみます。
rostopic echo /tf
マーカーを動かすとPositionやRotationが見えると思います。
次にRvizでグラフィカルにtfを見ます。
rosrun rvix rvix
addでtfを指定して、マーカーを写すと下のように動きます。

これでおkです。
ar_track_alvar全体で参考にしたサイト
Detecting AR Tags with ROS on Odroid U3 - PX4 Autopilot Project
https://pixhawk.org/peripherals/onboard_computers/odroid_ros