ROS環境でのArUcoマーカーによる空間認識

3月 9, 2022

ロボット開発をしていると実空間上でそのロボットの位置を把握したくなるときがあります. そうしたときロボットがどの程度ある基準点から離れているかカメラで計測できると便利です. その基準点としてのマーカーの一つにArUcoがあります.

ArUcoはオープンソースライブラリで, 一定のパターン化された四角形を検出するものです.
加えてカメラがキャリブレーションされていれば, カメラから見てそのArUcoマーカーがどの程度距離が離れているのか, どのくらいの角度で傾いているのかを推定することができます.
今回はROS上でのArUcoの利用方法を紹介していきます.

セットアップ

カメラ

今回はOAK-Dカメラを使用しました. USBカメラを使用しても良いのですが, キャリブレーションの手間が省けるのでOAK-Dカメラを今回は選択しました.

OAK-Dカメラのセットアップは以下のページを参照ください.

キャリブレーションには以下のサイトを参考にしてみてください.
OAK-Dカメラはキャリブレーション済みなので, 自分で行う手間を省けます.

aruco_detect

arucoマーカー認識用のROSパッケージをインストールします.

# install aruco_detect
sudo apt install ros-noetic-fiducials

ArUcoマーカーの生成

以下のコマンドで被認識物のarucoマーカーを生成します. PDFファイルが作成されるので, それをA4印刷しておきます.

# generate aruco markers
rosrun aruco_detect create_markers.py 100 112 fiducials.pdf

3Dプリントしてもarucoマーカーを認識することができます. 自立したarucoマーカーを作成してもよいでしょう.

デモ

以下のコマンドとgifはarucoマーカーを検出している様子です. 検出されたarucoマーカーは緑の枠で囲まれ, IDが付与されています. 奥行き, 横軸方向の距離検出がtransforms/transform/translation/z, xで行えています.

# launch rgb_publisher of depthai
roslaunch depthai_examples rgb_publisher.launch

# launch aruco detector
roslaunch aruco_detect aruco_detect.launch camera:=/rgb_publisher/color image:=image transport:=compressed

# show detected aruco marker positions
rostopic echo /fiducial_transforms

可視化には以下のコマンドを実行

roslaunch fiducial_slam fiducial_slam.launch
roslaunch fiducial_slam fiducial_rviz.launch
roslaunch fiducial_slam fiducial_slam.launch base_frame:=oak-d_frame
rostopic echo /fiducial_vertices

おわりに

今回はArUcoマーカーを使った空間認識について紹介しました. カメラを原点にした座標系を考えると, ArUcoマーカーのx, y, z座標や回転量を検出することができます. カメラさえあればこうした空間認識ができるので, ぜひ試してみてください!