AR マーカーを使ったナビゲーション
ARマーカー
ARマーカーは,二次元のバーコードで白黒の正方形の格子模様からなり,カメラ画像で比較的簡単に認識できるため,AR(Augmented Reality)を出現させたり,ロボットのナビゲーションに使ったり様々な応用が可能です.
色認識より安定して検出できるため,ARマーカを使ってナビゲーション課題にトライしてもらいます.
ARマーカーライブラリのインストール
最初に仮想環境 roboenvを有効にしておきます.
source ./roboenv/bin/activate
そして以下を入力して,ARマーカーに関連したライブラリを含む opencv の拡張モジュールをインストールします.
pip install opencv-contrib-python
ARマーカーの生成
以下のプログラムでは,ARマーカーを生成しています. aruco.DICT_4X4_50 はARマーカの種類で,パターンが4x4ビットで,50種類のARマーカーです. (授業では ARマーカーを紙に印刷したものを配布することにしますので,以下は不要です.)
from cv2 import aruco
import matplotlib.pyplot as plt
#aruco辞書の生成
dict_aruco=aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
#IDを指定 (適当な整数)
marker_id=1
#マーカーサイズ
size_mark=100
#imgの作成
img=aruco.generateImageMarker(dict_aruco,marker_id,size_mark)
#表示
plt.imshow(img,cmap='gray')
ARマーカーの認識
以下のARマーカーを認識するクラスライブラリとサンプルプログラムをダウンロードして,実行してみてください.
- arcodet.py: クラスのファイル
- test_arco.py: クラスをテストするプログラム. USBカメラの画像に ARマーカーが映れば,そのIDとサイズ,中心座標を出力します.
python test_arco.py
モード(状態遷移)を利用したプログラム
ここまでのプログラムでは,センサーの値に応じて,すぐに振る舞いを変えるというようなものが多かったと思います.
while True:
sensor = センサー値を取得
if sensor>閾値:
action_A()
else:
action_B()
しかし,複雑になると,状態遷移という考え方でプログラムを書いていかなければなりません.例えば,赤と青のポールの間を往復するロボットを考えてみましょう.赤から青に向かっている間は青のポールを目指して動き,青に近づいたら赤のポールを目指して動くことになります.このようなプログラムはどのように書くことができるでしょうか?
ロボットに複雑な動きをさせるときに使う、最も一般的な方法は状態機械(state machine)を定義する方法です。状態機械は、いくつかの「状態」と「状態間の遷移」で構成されます。
上記の赤と青のポールの間を行き来するロボットの場合には,状態遷移図は以下のようになります.
このようなプログラムはどのように書けば良いでしょうか? 一つの方法として,以下のように書くことができます.
state = 0 # 0: 赤から青, 1: 青から赤
while True:
img = 画像取得()
赤色ポールの位置情報 = 赤色認識(img)
青色ポールの位置情報 = 青色認識(img)
if state==0:
青いポールを目指す()
if 距離を計算(青いポールの位置情報) < 閾値:
state = 1
elif state==1:
赤いポールを目指す()
if 距離を計算(赤いポールの位置情報) < 閾値:
state = 0
より複雑な状態遷移を行う場合には、さらにクラスを定義してプログラムを分割して書くことになりますが、大まかには、上記のような構造で状態に応じたプログラムが動き、状態遷移によって動くモードが変化するようになっていると考えるとよいでしょう。
課題
- ARマーカーが認識できることを上記のプログラムで試しましょう.
- マーカの場所まで移動
- a) カメラにマーカーが写っていない状態からスタート
- b) マーカーまで直進する(曲がったら進路を修正する)
- c) マーカーの手前まで来たら止まる.
- マーカをたよりに教室を移動する.
- 以下のように設けた2つのコースのうちのどちらかを走破する.
- カメラ,マーカーは何個使っても良い