カメラキャリブレーション及びArUcoマーカー検出の説明
カメラキャリブレーションはカメラパラメータ(「内部パラメータ : 画角や光軸の位置などの情報」と「外部パラメータ : 位置や姿勢の情報」の2つのパラメータを合わせたもの)を推定する技術です。これによって、カメラのレンズの歪み・ズレの補正や、3次元でのカメラの位置や姿勢の推定ができます。 ArUcoマーカーはカメラや物体の位置・姿勢を推定するための正方形のマーカーです。ArUcoマーカー検出はArUcoマーカーの検出を行うための技術です。カメラキャリブレーションとArUcoマーカー検出の組み合わせによって高精度な3次元位置・姿勢の推定を行うことができます。
ROS2でカメラキャリブレーション・ArUcoマーカー検出を行う目的
次回以降、ロボットアームを扱う予定ですが、その位置と姿勢の検出を行うためにカメラキャリブレーションとArUcoマーカー検出を行います。ROS2を用いる目的は、他のロボット制御プログラムと併用することでROS2に含まれるロボット用ライブラリの多大な恩恵を受けることです。

ROS2-Humbleのインストール
KR260上のUbuntuにてROS2-Humbleのインストールを行います。 インストール済みの場合はスキップしてください。
適当なディレクトリでターミナルを開く。 次のコマンドでUTF-8をサポートするロケールがあることを確認。
$ locale
ロケールがUTF-8をサポートしていない場合は、次のコマンドを実行してUTF-8をサポートするロケールを生成。
$ sudo apt update && sudo apt install locales $ sudo locale-gen en_US en_US.UTF-8 $ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 $ export LANG=en_US.UTF-8
ロケール生成後、再度設定を確認。
$ locale
Ubuntu ユニバース リポジトリが有効になっていることを確認。
$ apt-cache policy | grep universe
次のような出力が得られる。
500 http://us.archive.ubuntu.com/ubuntu jammy/universe amd64 Packages release v=22.04,o=Ubuntu,a=jammy,n=jammy,l=Ubuntu,c=universe,b=amd64
上記のような出力が得られない場合は、次のコマンドでUbuntu ユニバース リポジトリを有効化。
$ sudo apt install software-properties-common $ sudo add-apt-repository universe
ROS2のGPGキーをaptで認証し、ROS2のリポジトリをソースリストに追加。
$ sudo apt update && sudo apt install curl gnupg lsb-release $ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/``` ros-archive-keyring.gpg $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
apt のパッケージリスト及びパッケージを更新。
$ sudo apt update $ sudo apt upgrade
ROS2-Humbleのフルバージョンをインストール。 ROS公式ページだと-full が付いていないが、付けないと一部のパッケージがインストールされないので注意。
$ sudo apt install ros-humble-desktop-full
キャリブレーション・マーカー検出用のROS2ライブラリのインストール
次のコマンドでKR260のUbuntu上にインストールします(参考文献[1])。
$ sudo apt install python3-colcon-common-extensions $ sudo apt install ros-humble-usb-cam $ sudo apt install ros-humble-launch-testing-ament-cmake $ sudo apt install ros-humble-image-pipeline $ sudo apt install ros-humble-camera-calibration-parsers $ sudo apt install ros-humble-camera-info-manager $ mkdir -p ~/airobot_ws/src $ cd ~/airobot_ws/src $ git clone https://github.com/JMU-ROBOTICS-VIVA/ros2_aruco $ git clone https://github.com/AI-Robot-Book/chapter5/ $ cd ros2_aruco/ros2_aruco/ros2_aruco $ wget https://raw.githubusercontent.com/JMU-ROBOTICS-VIVA/ros2_aruco/foxy/ros2_aruco/ros2_aruco/transformations.py $ cd ~/airobot_ws/ $ colcon build
キャリブレーション・マーカー検出の実行
以降、コマンドはKR260のUbuntuデスクトップ環境にて実行します。 あらかじめUbuntuデスクトップ環境を有効化しておいてください。
チェッカーボードの画像が必要になるので、あらかじめ用意してください。 (筆者はhttps://venuschjp.blogspot.com/2015/02/opencv.html からお借りしました)
次のコマンドによりカメラのROS2ノードを立ち上げ、カメラを使用可能な状態にします(参考文献[1])。
$ source /opt/ros/humble/setup.bash $ source ~/airobot_ws/install/setup.bash $ ros2 run usb_cam usb_cam_node_exe
新規のターミナルを開いて、次のコマンドを実行することでカメラキャリブレーションを行います
$ source /opt/ros/humble/setup.bash $ source ~/airobot_ws/install/setup.bash $ ros2 run camera_calibration cameracalibrator --size 7x9 --square 0.020 --ros-args --remap image:=/image_raw
図2の様な画面が表示されます。

チェッカーボードがカメラに映るようにカメラを動かして、カメラ座標のデータを集めてください。 十分なデータが集まるとCALIBRATEのボタンがクリックできるようになるので、クリックしてキャリブレーションを行ってください。 キャリブレーション終了後にSAVEを押して得られたカメラパラメータを保存します。 次のコマンドで /tmp/calibration.tar.gzが出来上がっていることを確認してください。 この中に保存されたカメラパラメータが含まれています。
$ ls /tmp/ | grep calibration
次のコマンドで保存されたデータをデフォルトのカメラパラメータとして使用できるようにします。
$ cd /tmp/ $ tar -xvzf calibration.tar.gz $ cp calibration/ost.yaml ~/.ros/camera_info/default_cam.yaml
マーカー検出の前に、先程同様カメラを使用可能な状態にします(既に実行されている場合はスキップ)。
$ source /opt/ros/humble/setup.bash $ source ~/airobot_ws/install/setup.bash $ ros2 run usb_cam usb_cam_node_exe
新規ターミナルにて次のコマンドを実行してArUcoマーカー画像を作成します。
$ ros2 run ros2_aruco aruco_generate_marker --id 1
先程のコマンドの--id の引数を変えることでマーカーのIDを変更して新しいマーカーを作成できます。 筆者はこの方法で7枚の画像を作成しました。
$ ros2 run ros2_aruco aruco_generate_marker --id 2
次のコマンドでArUcoマーカーを検出します
$ source /opt/ros/humble/setup.bash $ source ~/airobot_ws/install/setup.bash $ ros2 run opencv_ros2 aruco_node_tf
検出に成功すると図3のような画面が表示されます。

感想
今回はKR260とROS2によるカメラキャリブレーション&ArUcoマーカー検出を行いました! これを利用すればロボットの位置・姿勢の推定ができるのでロボティクスに役立てることができます! それでは、また次回お会いしましょう!See you next time!
参考文献
[1] ROS2とPythonで作って学ぶAIロボット入門 https://www.amazon.co.jp/dp/4065289564
※ GitHubページ : https://github.com/AI-Robot-Book

ブログ
AMDによる設計およびデバッグ手法のブログ、およびアヴネット社員によるAMD製品を用いた開発チャレンジのブログです。

Kria
Kria SOMはアダプティブSoCデバイスを搭載しており、スマートカメラやエンベデッドビジョンなどに最適です。
AMD製品に関連する技術ブログ
- エンジニアブログの再開およびテクニカルウェビナーのご案内
- 初心者のためのPython & Numpy入門
- KR260でIntel RealSenseを動かしてみた!
- Vitis HLSで足し算IPを作ってみた!(プログラミング編)
- KD240でモータ制御してみた!
- KR260でデジタル信号処理してみた! (3)
- KR260でデジタル信号処理してみた! (2)
- KR260でデジタル信号処理してみた! (1)
- KR260でロボットアームを動かしてみた! (2)
- KR260でロボットアームを動かしてみた! (1)
- KR260でROS2を使ってキャリブレーション&マーカー検出してみた!
- KR260とPynqでAIカメラを動かしてみた!
- KR260でROS2 Perception Stack Applicationを動かしてみた!【2】
- KR260でROS2 Perception Stack Applicationを動かしてみた!
- Kria SOMでTPM2.0を動かしてみた!
- VivadoでKR260のハードウェアデザインを作って動かしてみた!
- ROS2 Multi-Node Communications via TSNを動かしてみた!
- AIBOX-ReIDを動かしてみた!