ar_track_alvarを用いたARタグの認識

目的

ロボットが外界の環境を感知するためには,センシング技術が必要不可欠です.しかしながら,刻々と変化する環境を観測したセンサから得られる情報は膨大ですので,意味のある情報を解析することは簡単ではありませんが,ROSではセンシング技術がオープンソースとして公開されています.今回はARタグ(QRコードと似ている2次元バーコード)を認識する非常に便利なar_track_alvar[1]を試します.このパッケージを利用することで,例えば物体の位置・姿勢を簡単に推定することができるようになります.

カメラキャリブレーション

実世界とカメラモデルを対応づけるために,カメラのパラメータを求めるカメラキャリブレーション(カメラ校正)という作業が必要です.カメラキャリブレーションの詳しい説明や方法については省略しますが,興味のある方は参考文献[2]を参照してください.ROSでは,カメラキャリブレーションを行うcamera_calibrationというパッケージが用意されています.こちらのパッケージを使用してカメラキャリブレーションを行いましょう.

キャリブレーションを行う前に,キャリブレーションシートを用意します.今回はcamera_calibrationパッケージのチュートリアルで公開されているファイルを使用します.こちらのファイルをA4サイズで印刷し,曲がらない剛体の板に貼ります.本講義では高い精度を求めないので下敷き等でも構いませんが,精度が必要となる場合には,力を加えてしなるような素材は避けた方が良いです.

準備ができたら,まずはカメラから画像を取得するノードを立ち上げます.

$ rosrun usb_cam usb_cam_node

上記のコマンドでエラーが発生した場合には、usb_camノードに与える引数を正常に起動することがあります。予め用意されているlaunchファイルを使用して正常に起動するか確認しましょう。

$ roslaunch usb_cam usb_cam-test.launch

上記のコマンドでも起動しない場合には、こちらのページを参考に引数を変えて起動してみましょう。

次にキャリブレーションを行うためのノードを立ち上げます.–sizeは白黒のマス目が交わる点の数(横x縦),–squareはマス目の長さ[m]です.なお,こちらのノードは/imageというトピック名で画像を購読するため,usb_cam_nodeが配信する画像データのトピックの名前を変更する必要があります.

$ rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0245 image:=/usb_cam/image_raw

正常に起動できた場合には、カメラから取得できた画像が表示されます。用意したキャリブレーションシートを撮影しましょう。シート全体を撮影すると、白黒のマス目が交わる交点に色付きの円が表示されます。この状態の画像が保存され、実空間のシートの交点の位置と、その交点に対応する画像座標を用いてカメラキャリブレーションを行います。精度の良いカメラキャリブレーションを行うためには、シートの位置や姿勢を変えた時の実空間と画像の対応点が多く必要です。シートを左右に動かすとXのバーが黄色から緑色になります。同様に、シートを上下に動かすとYのバーが緑色に、シートを前後に動かすとSizeのバーが緑色に、シートを傾けるとSkewのバーが緑色になります。下記の動画は,キャリブレーションを行った例です.

全ての項目が緑色になると、CALIBRATEというボタンが淡い緑色になりますのでクリックしてください。キャリブレーションが完了するとSAVEボタンが緑色になりますのでクリックしましょう。デフォルトでは、/tmp/calibrationdata.tar.gzにファイルが保存されるので,ホームディレクトリに移動して展開しましょう.

$ mkdir ~/calibrationdata
$ mv /tmp/calibrationdata.tar.gz ~/calibrationdata
$ cd calibrationdata
$ tar xzvf calibrationdata.tar.gz
ARタグの認識

次にar_track_alvarを用いてARタグを認識するために準備します.先ほど作成したcalibrationdataというディレクトリに移動し,ar_track.launchという名前でlaunchファイルを作成し,下記を入力しましょう.

<launch>
  <node pkg="tf" type="static_transform_publisher" name="map_to_camera" output="screen"
    args="0 0 0 0.785398163 0 0 map usb_cam 10" />

  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="camera_frame_id" value="usb_cam" />
    <param name="camera_info_url" type="string" value="file:///home/yuu/calibrationdata/ost.yaml" />
  </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="/usb_cam/image_raw" />
  <arg name="cam_info_topic" default="/usb_cam/camera_info" />
  <arg name="output_frame" default="/usb_cam" />

  <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)" />

  <node pkg="rviz" type="rviz" name="rviz"/>

</launch>

さらに,ハイライト部分を編集する必要があります.7行目のキャリブレーションデータのパスを編集しましょう.上記の通りに作業している場合には,アカウント名のみを編集するだけで済みます.次に,10行目のmarker_sizeはARタグの大きさ[cm]を表していますので,測定したARタグの大きさを入力しましょう.ARタグは自分で作成することもできますが,今回はこちらからダウンロードしたものを使用します.

上記のlaunchファイルでは,tfパッケージのstatic_transform_publisherノードにてフレームを作成,usb_cam_nodeにより画像取得,ar_track_alvarパッケージのindividualMarkersNoKinectノードにてARタグの認識,rvizの起動を同時に行ってます.それでは,launchファイルを実行します.

$ roslaunch ar_track.launch

実行するとrvizが起動しますので,下記の動画を参考に左側のDisplays=>addボタンをクリックし,Image,Marker,TFの項目を追加し,Image Topicに/usb_cam/image_rawを設定しましょう.その後,印刷したARタグを撮影すると,ARタグを表すボックスやフレームが表示されます.

参考文献
  1. ar_track_alvar package.
  2. 植芝 俊夫,岡谷 貴之,佐藤 智和,”カメラキャリブレーション”,情報処理学会研究報告コンピュータビジョンとイメージメディア(CVIM),2004-CVIM-148,2005.
課題

下記の課題を解きなさい.

  1. ノードやトピックの一覧を取得し,rqt_graphにてその関係を確認しなさい.
  2. トピック/tfを購読し,どのような情報が取得できるか確認しなさい.