AI画像認識でロボットアームに将棋駒を自動ピック&ドロップさせてみた!【Shogi Pick Robot】

このサイトはアフィリエイト広告を含みます
AI

はじめに

今回は「コスパ最強!? ロボットアームの作り方」シリーズの応用編として、AI画像認識を使った「Shogi Pick Robot」を製作しました。

PC画面でPICKする対象物とDROP位置をクリックすると、ロボットアームが自動でPICK & DROPを実行します。

まずは実際の動作をご覧ください。

動作概要

上カメラ画面からPICKする将棋駒をクリックします。

AI画像認識で位置を補正し、自動でPICKします。

上カメラ画面からDROP位置をクリックし、自動でDROPします。

Shogi Pick Robotについて

👇これまでのロボットアームシリーズはこちらにまとめています。
ロボットアームを初めて製作する方は、まずこちらからご覧ください。

コスパ最強!? ロボットアームの作り方_その①
自作ロボットアームの紹介ロボットアームを自作したい方向けに、Arduinoを使った6軸ロボットアームの作り方をまとめました。本記事では、初心者でも再現できる構成で・必要な部品・組み立て手順・プログラム制御・よくあるトラブル(サーボが震える/…

本記事は「コスパ最強!? ロボットアームの作り方」シリーズの発展企画です。

ロボットアーム本体の組み立て・基本回路・基本操作については過去シリーズで解説しているため、本記事ではロボットアームが基本動作できる状態を前提に、上カメラ・先端カメラ・AI画像認識・キャリブレーションを組み合わせた自動PICK & DROPシステムを紹介します。

今回製作したシステムでは、

  • 上カメラで盤面画像を取得
  • 駒位置をクリック
  • ロボットアームが対象付近まで移動
  • 先端カメラで位置補正
  • AIがピック可能か判定
  • 自動で将棋駒を掴む
  • 指定位置へドロップ
  • HOME位置へ自動復帰

までを2クリックで自動実行します。

以前の記事ではロボットアームを手動で操作していましたが、今回はクリックするだけで一連の動作が自動で完了します。


搭載しているモード

今回開発したシステムでは、用途に応じて以下の6つのモードを搭載しています。

① ピック&ドロップモード(連続モード)

クリックした対象物を連続でピック&ドロップするモードです。(動画のモードです。)

上カメラの画像で将棋駒をクリックすると、ロボットアームが対象物付近まで移動し、先端カメラとAI画像認識によって位置補正を行います。

その後、ピック可能と判定されると自動で将棋駒を掴みます。

PICK後は、対象物を保持したままHOLD_HOMEへ移動します。
その後、上カメラ画面でドロップ位置をクリックすると、その位置へ移動して駒を置き、最後にHOME位置へ戻ります。

HOME位置へ戻った後もプログラムは終了せず、そのまま次の対象物を搬送できます。

動画で紹介している動作は、この連続モードで実行しています。


② ピック&ドロップモード(開発・デバッグモード)

基本動作は連続モードと同じですが、動作は1回のみです。

また、AIがピック直前に認識した画像を保存します。

駒の認識が上手くできている時

駒の認識が上手くできていない時

保存した画像を見ることで、

  • AIがどの候補を将棋駒として認識したか
  • 黄色枠に対してどの位置を狙っていたか
  • Good Pick判定が妥当だったか

を後から確認できます。

開発時のデバッグや、AIモデルの精度評価に使用するモードです。


③ 上カメラキャリブレーションモード

上カメラの画像座標を、実際の盤面座標へ変換するためのモードです。

上カメラだけでは、画像上でクリックした位置と、実際の盤面上の位置は完全には一致しません。

そのため、あらかじめ測定ポイント7つを順番にクリックし、

  • 画像座標
  • 実際の盤面座標

を対応付けます。

取得したデータからアフィン変換行列を計算し、画像上でクリックした位置を実際の盤面座標へ変換できるようにしています。

キャリブレーションが完了すると、クリックした将棋駒の近くまでロボットアームを自動で移動できるようになります。

ただし、この時点では数mmから数十mm程度の誤差が残るため、最終的な位置合わせには先端カメラを使用しています。


④ 先端カメラキャリブレーションモード

先端カメラの基準位置(黄色枠:REF_X・REF_Y)を補正するためのモードです。

上カメラで対象物の近くまでは移動できますが、この時点ではまだ数mmから数十mm程度の誤差が残ります。

そこで、グリッパー先端に取り付けたカメラで将棋駒を近距離から撮影し、最後の位置補正に使用する基準位置をキャリブレーションします。

補正の仕方

まず、対象物を任意の測定位置に置き、上カメラ画面で対象物の中心をクリックします。
すると、ロボットアームが対象物付近まで自動で移動します。

その後、PS4コントローラーで実際にピックしやすい位置へ微調整し、先端カメラ画像上で対象物の中心をクリックします。

※PS4コントローラーによるロボットアームの操作方法は、後述の「⑤ AI学習データ取得モード」で紹介します。

これを盤面内のさまざまな位置で7回繰り返すことで、先端カメラの基準位置補正量を自動で計算します。

先端カメラキャリブレーションの解説

先端カメラではロボットアームの姿勢によって見え方が少しずつ変わります。

例えば、

  • アームを左へ伸ばした場合
  • 右へ伸ばした場合
  • 手前へ動かした場合

では、同じ将棋駒でも画像上の位置が微妙に変化します。

そのため、画面中央を常に基準にするのではなく、複数の測定ポイントでデータを取得し、ロボットアームの姿勢に応じて基準位置を補正する仕組みにしています。

現在は、ロボットアームの方位角(fai)とグリッパーの傾き(alpha)を使って、REF_X・REF_Yを自動補正しています。

これにより、盤面全体でより安定したピック動作を目指しています。


⑤ AI学習データ取得モード

PS4コントローラーを使用して、AIの教師データを収集するモードです。

AIの性能は、教師データの品質によって大きく変わります。

そこで、ロボットアームを手動操作しながら、効率よく教師データを登録できる専用モードを作成しました。

PS4コントローラーでは、以下のようにデータを登録できます。

  • □:対象物の候補画像を抽出
  • ○:対象物かつピック可能な位置の正解データ(黄色枠内で、かつ目視でもピックに適した位置)
  • △:対象物の正解データ(ピックはできない位置)
  • ×:不正解データ

これにより、短時間でAI学習用のデータを収集できるようになりました。

今回は、将棋駒を対象に100件程度の教師データを収集してAIモデルを作成しています。

(内訳の目安 ○:30件程度、△:30件程度、×:50件程度)

操作方法について

PS4コントローラーによる基本的な手動操作は、過去シリーズ「その⑦」で紹介した円筒座標系による操作をベースにしています。

コスパ最強!?ロボットアームの作り方_その⑦_プログラム更新
プログラムの改良についてこのサイトで以前紹介したロボットアーム制作の記事について、円筒座標系で制御できるようにプログラムを改良しましたので、紹介したいと思います。円筒座標系で制御できると人間の感覚に近いかたちで制御できるので、操作性が良くな…

Shogi Pick Robot v1.0では、この操作をベースに、操作量の調整やAI学習用ボタンなどを変更・追加しています。

また、PS4コントローラーはUSB有線接続で使用します。

学習データ取得手順

1.PS4コントローラーでロボットアームを対象物付近まで移動させる。

2.□ボタンを押す。(対象物の候補を自動生成)

3.上で生成された対象物の候補をユーザーが以下3つに分類し、データを登録する。

  • 対象物かつピック可能な位置の正解データ(黄色枠内で、かつ目視でもピックに適した位置)➡ ○ボタン押下
  • 対象物の正解データ(ピックはできない位置)➡ △ボタン押下
  • 対象物ではない不正解データ ➡ ×ボタン押下

⑥ AIモデル作成モード

収集した教師データから、LightGBMによるAIモデルを自動で作成するモードです。

教師データを取得した後、このモードを実行するだけで、

  1. 教師データの読み込み
  2. LightGBMによる学習
  3. AIモデルの生成
  4. 学習済みモデルの保存

までを実行し、自動でAIモデルを作成します。

そのため、ユーザーが学習処理のプログラムを直接編集しなくても、GUIからAIモデルを作成できます。

将棋駒以外の対象物についても、教師データを取得してAIモデル作成モードを実行できる構成にしています。
そのため、別の小物体への応用を試しやすい設計になっています。


システム構成

今回のシステムは以下のような構成になっています。

  • 上カメラ(盤面全体の認識)
  • 先端カメラ(最終位置補正)
  • Python
  • Arduino Uno
  • PCA9685
  • 以前の記事で製作したコスパ最強ロボットアーム
  • PS4コントローラー(先端カメラキャリブレーション・AI学習データ取得時に使用)

役割を大きく分けると、

Python

  • 上カメラ画像処理
  • 先端カメラ画像処理
  • AI画像認識
  • キャリブレーション
  • ロボットアームへの指令送信

Arduino

  • 逆運動学計算
  • サーボモーター制御
  • PICKシーケンス(駒を掴む)
  • DROPシーケンス(駒を置く)
  • HOME制御(元の位置に戻る)

という構成になっています。

画像処理など負荷の高い処理はPythonが担当し、Arduinoはロボットアーム制御に専念するよう役割を分担しています。

このように処理を分担することで、画像認識とロボット制御を安定して動作させることができました。


上カメラの設置

まずはエリア全体を撮影するために、上カメラを設置します。

このカメラは、

  • 作業エリア全体を撮影
  • マウスでクリックした位置を取得
  • ロボットアームが向かうおおよその座標を計算

するために使用します。

できるだけエリア全体が映るように、高い位置へ固定しています。

また、エリアに対してできるだけ真上から撮影することで、座標変換の誤差を小さくしています。

今回は以下のWebカメラとWebカメラ固定器具を使用しました。

Webカメラ:ロジクールC922n

上カメラは座標精度に影響するので、そこそこのお値段のWebカメラを使用しています。

1/4インチのネジ穴がついており、下で紹介するカメラ固定用のマウントに取り付けできます。

Amazon.co.jp: ロジクール Webカメラ C922n フルHD 1080P ストリーミング 撮影用 三脚 スタンド 付き オートフォーカス ステレオ マイク ウェブカメラ ウェブカム PC Mac ノートパソコン Zoom Skype 国内正規品 2年間メーカー保証 : パソコン・周辺機器
Amazon.co.jp: ロジクール Webカメラ C922n フルHD 1080P ストリーミング 撮影用 三脚 スタンド 付き オートフォーカス ステレオ マイク ウェブカメラ ウェブカム PC Mac ノートパソコン Zoom Sk…

カメラ固定用のマウント

1/4インチのオスネジがついており、上記Webカメラにそのまま取り付けられます。

また、水平方向に5cmほど延長できるジョイントもついているので、カメラの位置を調整しやすいです。

Amazon.co.jp: NEEWER 拡張可能なカメラデスクマウント ボールヘッド付き、17"-40" 調整可能なテーブルライトスタンド 1/4"ネジとCクランプ付き DSLR カメラ リングライト ライブストリーム Vlogに適用 最大荷重:6.6lb/3kg TL283 (赤) : 家電&カメラ
Amazon.co.jp: NEEWER 拡張可能なカメラデスクマウント ボールヘッド付き、17"-40" 調整可能なテーブルライトスタンド 1/4"ネジとCクランプ付き DSLR カメラ リングライト ライブストリーム Vlogに適用 最…

先端カメラの設置

グリッパー先端へもう一台Webカメラを取り付けています。

先端カメラは、対象物の近くまで移動した後、将棋駒だけを近距離から撮影するために使用しています。

上カメラでは盤面全体を見ることで位置を把握し、先端カメラでは最後の数mmから数十mmの誤差を補正するという役割分担になっています。

この2段階構成にすることで、上カメラだけでは残る位置誤差を、先端カメラでさらに補正できるようにしました。

先端カメラ:ロジクールC270n

Amazon.co.jp: ロジクール ウェブカメラ C270n HD 720P 小型 Webカメラ usbカメラ 自動光補正 カメラ ノイズリダクション マイク付 パソコン PC Windows Mac Chrome 国内正規品 : パソコン・周辺機器
Amazon.co.jp: ロジクール ウェブカメラ C270n HD 720P 小型 Webカメラ usbカメラ 自動光補正 カメラ ノイズリダクション マイク付 パソコン PC Windows Mac Chrome 国内正規品 : パソ…

先端カメラ取付部品

サーボ固定ホーン

Amazon.co.jp: Garosa サーボブラケット サーボモータパーツ サーボモーター 大きな回転 調整自由 アルミニウム合金 障害物回避機能 設置便利 ブラケットキット サーボブラケット ロングU字型ブラケット カップベアリングのインポート : おもちゃ
Amazon.co.jp: Garosa サーボブラケット サーボモータパーツ サーボモーター 大きな回転 調整自由 アルミニウム合金 障害物回避機能 設置便利 ブラケットキット サーボブラケット ロングU字型ブラケット カップベアリングの…

L字ブラケット

https://amzn.to/4vgHYv3

ダイソーの木材

幅90×高さ30×厚み15mmの木材を半分にカットして使用しています。

使用するネジ(ホームセンターで購入)

  • M2×6(木ネジ)
  • M3×10(木ネジ)
  • M3×10(小ネジ)

先端カメラの取り付け方法

①WEBカメラとサーボ固定ホーンの取り付け

WEBカメラの赤丸箇所にネジがあるので、一度、取り外します。

サーボ固定ホーン側にも、ネジ穴にちょうど良い寸法で、穴があるので、M2×6のネジで固定できます。(ネジはホームセンターにあるものを使用しました。)

②サーボ固定ホーンを木材に固定

事前にダイソーの木材(幅90×高さ30×厚み15mm)を半分にカットしておきます。

M3×10のネジを利用し、サーボ固定ホーンを木材に固定します。(丸枠箇所)

③L字ブラケットを木材に固定

M3×10のネジを利用し、L字ブラケットを木材に固定します。(丸枠箇所)

④ロボットアームにL字ブラケットを固定

事前に下から5番目のサーボを取り外します。

サーボ固定ホーンとL字ブラケットをM3×10ネジとナットを利用し、固定します。(赤丸箇所)

取り付け後の様子は画像のような形になります。

その後、サーボ5を再度、取り付けます。

(取り付け時は先にケーブルをくぐらせるのがコツです。)


AI画像認識(LightGBM)

対象物の認識には、LightGBMを使用しました。

一般的な画像認識ではCNNなどのディープラーニングを利用することが多いですが、今回は処理速度を重視し、特徴量ベースのLightGBMを採用しています。

高性能なGPUを前提としないため、比較的導入しやすい構成になっています。

今回のAIでは、

  • 面積
  • 縦横比
  • エッジ数
  • エッジ密度
  • 明るさ
  • 標準偏差
  • 基準位置からの距離

など複数の特徴量を利用して、「将棋駒であるか」、「ピック可能な位置かどうか」を判定しています。

さらに、候補が複数見つかった場合は、その中から最も可能性の高い候補を選択します。

この方式にすることで、高速かつ安定した画像認識を実現できました。


ピック&ドロップの流れ

ここまで紹介した各機能は、ピック&ドロップモードで一連の流れとして動作します。

処理の流れは以下のようになっています。

  1. 上カメラで盤面全体を撮影
  2. マウスで将棋駒をクリック
  3. 上カメラからロボット座標へ変換
  4. ロボットアームが対象付近まで移動(APPROACH)
  5. 先端カメラで将棋駒を検出
  6. AI画像認識(LightGBM)で将棋駒を判定
  7. 画像位置から位置補正を実施
  8. Good Pick判定(ピック可能な位置かAIで判定)
  9. 自動でPICK
  10. HOLD_HOMEへ移動(対象物を保持したままHOME姿勢へ移動)
  11. ドロップ位置をクリック
  12. 自動でDROP
  13. HOME位置へ復帰

これらの処理はすべて自動で実行されます。

ユーザーが行う操作は、

  • ピックする将棋駒をクリック
  • ドロップ位置をクリック

の2回だけです。


Good Pick判定

今回のシステムでは、

「将棋駒である」

だけでは自動でピックしません。

例えば、

  • グリッパーが駒の端を狙っている
  • 他の駒に近すぎる
  • 掴みにくい向きになっている

といった状態では、ピックに失敗する可能性があります。

そこで、

「本当に掴める位置か」

を判定するために、Good Pick判定を追加しました。

緑の○が将棋駒を認識

駒がつかめる範囲に来たら、Good Pick判定(判定OKならピック開始)

Good Pick判定もLightGBMを使用しています。

つまり今回のシステムでは、

  • 将棋駒判定(LightGBM)
  • Good Pick判定(LightGBM)

という2段階のAI判定を行っています。

Good PickでNGとなった場合は、そのままピックせず、別候補を探したり位置補正を行ったりすることで、成功率を向上させています。


開発で苦労したこと:グリッパーのガタ

今回の開発で最も苦労したのは、画像認識ではありませんでした。

一番苦労したのは、

グリッパーのガタ

です。

市販の安価なロボットアームは価格が非常に魅力的ですが、その反面、グリッパーの横方向に少し遊びがあります。

このガタが原因で、数mm単位のズレが発生していました。

そこで、

対策として、輪ゴムで軽くテンションを掛ける

という非常にシンプルな方法を試したところ、予想以上に効果がありました。

・グリッパーが閉じているとき

・グリッパーが開いているとき

高価な部品を追加することなく改善できたため、非常におすすめの方法です。

ただし、普通の輪ゴムでは見た目が良くないので、ダイソーのモノクロゴムバンドを買いました。

こちらであれば、グレーの輪ゴムがあるので、おすすめです。

・グレーの輪ゴム装着時

・ダイソーのモノクロバンド


精度評価

完成したシステムについて、実際に将棋盤上の複数の位置で将棋駒のピックを行い、成功率を確認しました。

今回は盤面内の9か所で、それぞれ3回ずつ、合計27回のピックを実施しています。

評価結果は以下の通りです。

  • 完全自動ピック成功:16 / 27(約59%)
  • 再検出操作込みピック成功:21 / 27(約78%)
  • 最終失敗:6 / 27(約22%)

※ここでの成功率は、将棋駒を実際に把持できたかを確認した「ピック成功率」です。DROPやHOME復帰までを含めた一連のPick & Drop成功率ではありません。

※失敗したケースでは、駒の少し上側・下側を狙って空振りするケースや、駒へ干渉するケースが確認されました。

今回のシステムは、市販の比較的安価なロボットアームとWebカメラを使用しています。

そのため、産業用ロボットのような高い再現性を持つものではありませんが、クリックするだけでここまで自動化できたことには十分満足しています。

また、今回開発したシステムでは、AI学習データを追加してモデルを再学習できるようにしています。

教師データを増やすことでAIによる対象物認識やGood Pick判定のミスを減らせる可能性があります。

さらに、キャリブレーションや機構の調整と組み合わせることで、今後もピック成功率を改善できる余地があると考えています。


プログラム販売について

今回開発したプログラムは、BOOTHにて販売しています。

販売内容は以下です。

  • Pythonプログラム一式
  • Arduinoプログラム
  • 学習済みAIモデル
  • 将棋駒用の参考初期学習データ(CSV)
  • 設定ファイル
  • キャリブレーション用データ
  • 導入マニュアル
  • キャリブレーション用シート(PDFデータ)

※同梱の初期学習データは、将棋駒用モデルの作成に使用したデータをベースにした参考データです。

Pythonプログラム一式には、以下の実行モードが含まれています。

  • ピック&ドロップモード(連続モード)
  • ピック&ドロップモード(開発・デバッグモード)
  • 上カメラキャリブレーションモード
  • 先端カメラキャリブレーションモード
  • AI学習データ取得モード
  • AIモデル作成モード

価格:1980円

購入先(BOOTHリンク)

BOOTH – 創作物の総合マーケット
BOOTH(ブース)とは、pixivと連携した、創作物の総合マーケットです。無料で簡単にショップを作成でき、商品の保管・発送代行サービスも提供しています!

※以前の記事で紹介したコスパ最強!?ロボットアームを製作済みの方向けの内容となります。

一から同じ仕組みを作ろうとすると、カメラ処理・AI学習・Arduino制御・キャリブレーションをそれぞれ実装する必要があります。

そうした開発時間を短縮したい方には、参考用・改造用としても使いやすい内容になっていると思います。


まとめ

今回は、市販の安価なロボットアームへ、

  • 上カメラ
  • 先端カメラ
  • AI画像認識(LightGBM)
  • キャリブレーション

を組み合わせ、

クリックするだけで将棋駒を自動でピック&ドロップできるシステムを製作しました。

今回の開発では、

  • 上カメラによる位置認識
  • 先端カメラによる位置補正
  • AIによる将棋駒認識
  • Good Pick判定
  • キャリブレーション機能
  • AI学習環境

までを一通り実装することができました。

また、AIモデルを再学習できる構成としているため、将棋以外の小物体への応用も想定しています。

今回の記事が、

「ロボットアームをAIで動かしてみたい」

という方の参考になれば幸いです。

最後までご覧いただき、ありがとうございました。

コメント

タイトルとURLをコピーしました