6自由度ロボットアームDIYキットが8000円でAmazonで売っていたので、
これを使ってAI搭載ロボットアームを自作しました。
Raspberry Pi Picoからサーボモーター ドライバーに指令を送ってモーターを制御しています。
アームの軸の角度計算やAI(物体検出)は、Windowsパソコンでしています。
パソコンからRaspberry Pi Picoへは、USB仮想COMで指令を送っています。
このシステムの特徴は
- 材料は合計で1万円台で、全部Amazonで買えます。
- ロボットアームの組み立ては、ドライバーとラジオペンチでできます。
- 配線はピンを穴に差し込むだけで、半田付けは必要ありません。
- パソコンに接続してPythonで動かせます。
この記事ではAIで物体検出をした位置に、ロボットアームを移動させるまでの大まかな仕組みを説明します。
自作の具体的な手順は以下のサイトをご覧ください。
uroa.jp
部品一覧
名前 | 価格 | 画像 |
---|---|---|
6自由度ロボットアームDIYキット | 8000円 | |
20kg高トルク サーボモーター(※1) | 1800円 | |
サーボモーター ドライバー | 1000円 | |
Raspberry Pi Picoスターターキット | 2000円 | |
電源アダプター (6V 3A) | 1900円 | |
ウェブカメラ (1080P) | 4000円 |
(※1) アームの根元から2番目のモーターは高い負荷がかかるので、20kg高トルク サーボモーターに換装しました。
時期により価格は変動しますが、全部で1万9千円くらいです。
AIでロボットアームを動かすまでの手順
以下で各手順を説明します。
配線
Raspberry Pi Picoとサーボモーター ドライバーは4本の線で接続します。
サーボモーター ドライバーには6Vの電源を供給します。
モーターの茶(GND)、赤(V+)、オレンジ(PWM)の線をサーボモーター ドライバーの黒・赤・黄の端子に接続します。(左図) モーターの線の色が黒(GND)、赤(V+)、白(PWM)の場合もあります。(右図)
モーターはアームの根元から手先に向かって J1, J2, J3, J4, J5, J6 と呼びます。
サーボモーター ドライバーのピンをブレッドボードに挿し、下から順にJ1~J6のモーターを接続します。
J2のモーターは高い負荷がかかるので、20kg高トルク サーボモーターに換装します。
配線をすべて終えるとこんな感じです。
サーボドライバの表側 | サーボドライバの裏側 |
---|---|
※ 一部のサーボドライバでは下図のようにV+のピンを接続する必要があります。
ソフトのセットアップ
Raspberry Pi PicoはMicroPythonのアプリで制御します。
Raspberry Pi Picoにアプリを書き込むにはThonnyというソフトを使います。
セットアップの内容は以下になります。
- GitHubからアプリをクローン
- Pythonのパッケージのインストール
- MicroPythonのダウンロード
- Thonnyのインストール
- MicroPythonのアプリをRaspberry Pi Picoに書き込み
詳細は uroa.jp をご覧ください。
モーターの可動範囲の確認
配線とソフトのセットアップが終わったらパソコンからサーボモーターを動かしてみます。
ロボットアームを組み立てるときは、アームが可動範囲を中心に動作するように気をつける必要があります。
ロボットアームの組み立て
組み立てはドライバーとラジオペンチでできます。
動画を作りましたので参考にしてください。
軸の角度の調整
サーボモーターへの角度の指令値と軸の角度との対応付けをします。
アームの根元から順に軸を J1, J2, J3, J4, J5, J6 と言います。
以下の写真ではJ2, J3, J4の軸の角度は0度です。
0ボタンをクリックして、0度の時のサーボモーターの角度を記憶しておきます。
以下の写真ではJ2の軸の角度は-90度です。
-90ボタンをクリックして、-90度の時のサーボモーターの角度を記憶しておきます。
その他の軸も同様に基準となる軸の角度でのサーボモーターの角度を対応付けをさせます。
軸の角度と、アームの手先の位置と傾きは、以下のように一方から他方を求められる関係にあります。
- 順運動学
- 軸の角度から手先の位置と傾きを求める。
- 逆運動学
- 手先の位置と傾きから軸の角度を求める。
カメラのキャリブレーション
このシステムには3種類の座標系があります。
カメラのキャリブレーションではカメラ座標系とスクリーン座標系の設定をします。
- カメラ座標系
- カメラ位置を原点とし、視線の方向がZ軸の座標系です。
- スクリーン座標系
- カメラで撮影した画像の座標系です。
画像の左上が原点で、右方向がX軸、下方向がY軸です。 - ロボット座標系
- ロボットの土台を原点とする座標系です。
ロボットに向かって手前がX軸、右方向がY軸、上方向がZ軸です。
キャリブレーションにはチェッカーボードのような板を使います。
この板を様々な角度からカメラで撮影して、キャリブレーションをします。
アームの手先の位置の検出
手先の位置の検出のために、OpenCVの ArUcoマーカー を使います。
ハンドの手先に2個と、ロボットの土台の板の上に3個のマーカーをつけています。
手先の2個のマーカーの中点が手先の位置になります。
カメラでマーカーを撮影すると、マーカーのカメラ座標とスクリーン座標が分かります。
板の上の3個のマーカーから板の平面の方程式が求まります。
平面の方程式から平面(板)と手先の距離が計算できます。
手先が板に激突しないためと、板の上の物体をつかむために、板と手先の距離は重要です。
物体検出
アプリにはお菓子の物体検出をするAIが入っています。
図の青い点はAIが検出した物体の位置です。
物体検出した位置にアームを移動
AIが物体検出した座標はスクリーン座標です。
物体の位置にロボットアームを移動するには、スクリーン座標からロボット座標に変換する必要があります。
ロボット座標を指定して手先を動かすと、その位置での手先のカメラ座標とスクリーン座標が分かります。
下の写真のように複数の位置に手先を移動させると、ロボット座標とスクリーン座標のデータ対が作れます。
このデータ対を使って、スクリーン座標からロボット座標への変換器が作れます。
まとめ
以上で、AIで検出した物体の位置に、ロボットアームを移動させる仕組みができました。
まとめると以下になります。
1. 物体検出のAIを使い物体のスクリーン座標を得る。
2. スクリーン座標からロボット座標へ変換する。
3. ロボット座標から軸の角度を逆運動学で求める。
4. 軸の角度からサーボモーターへの指令値を求める。
5. パソコンからRaspberry Pi Picoへ、USB仮想COMを使って指令値を送る。
6. Raspberry Pi Picoの中のMicroPythonのアプリがモーター ドライバーへ指令を送る。
わたし自身はアマチュア電子工作レベルで、電気や機械のプロではないです。
まちがいなどがあれば、コメント欄に書かれるかTwitterに連絡をお願いします。
Twitterでアプリの更新のお知らせもしていきます。
teatime77
ここまで読んでいただき、ありがとうございました。