1万円台でAI搭載ロボットアームを自作

このサイトではAI搭載ロボットアームの自作をしながら、 AIやロボット制御の基礎が学べる教材を作っています。

まずは上の動画を見てみてください。

AIで物体の位置を検出してから、物体の位置の位置にアームを移動させ、物体をつかんでいます。


このシステムの特徴は

・ 材料は合計で1万円台で、全部Amazonで買えます。

・ ロボットアームの組み立ては、ドライバーとラジオペンチでできます。

・ 配線はピンを穴に差し込むだけで、半田付けは必要ありません。

・ パソコンに接続してPythonで動かせます。


誰でも気軽にAI搭載ロボットアームを自作できる時代になりました。

ぜひチャレンジをしてみてください。


部品一覧

名前

価格

画像

6自由度ロボットアームDIYキット

8000円

kit

20kg高トルク サーボモーター(※1)

1800円

motor

サーボモーター ドライバー

1000円

driver

Raspberry Pi Picoスターターキット

2000円

pico-kit

電源アダプター (6V 3A)

1900円

ac

ウェブカメラ (1080P)

4000円

camera

(※1) アームの根元から2番目のモーターは高い負荷がかかるので、20kg高トルク サーボモーターに換装しました。

時期により価格は変動しますが、全部で1万9千円くらいです。


AIでロボットアームを動かすまでの手順

1. 配線

2. ソフトのセットアップ

3. モーターの可動範囲の確認

4. ロボットアームの組み立て

5. 軸の角度の調整

6. カメラのキャリブレーション

7. アームの手先の位置の検出

8. AIで物体検出

9. 物体検出した位置にアームを移動


以下で各手順を説明します。


1. 配線

Raspberry Pi Picoとサーボモーター ドライバーは4本の線で接続します。

サーボモーター ドライバーには6Vの電源を供給します。

_images/pinout-1.png

モーターの茶(GND)、赤(V+)、オレンジ(PWM)の線をサーボモーター ドライバーの黒・赤・黄の端子に接続します。(左図)

モーターの線の色が黒(GND)、赤(V+)、白(PWM)の場合もあります。(右図)

motor-1

motor-2


モーターはアームの根元から手先に向かって J1, J2, J3, J4, J5, J6 と呼びます。

サーボモーター ドライバーのピンをブレッドボードに挿し、下から順にJ1~J6のモーターを接続します。

J2のモーターは高い負荷がかかるので、20kg高トルク サーボモーターに換装します。

J1-J6-1

J1-J6-2


配線をすべて終えるとこんな感じです。

サーボドライバの表側

サーボドライバの裏側

breadboard-1

breadboard-2


※ 一部のサーボドライバでは下図のようにV+のピンを接続する必要があります。

_images/jumper.png

2. ソフトのセットアップ

Raspberry Pi PicoはMicroPythonのアプリで制御します。

Raspberry Pi Picoにアプリを書き込むにはThonnyというソフトを使います。

セットアップの手順は下記のリンクをご覧ください。

1. GitHubからアプリをクローン

2. Pythonのパッケージのインストール

3. MicroPythonのダウンロード

4. Thonnyのインストール

5. MicroPythonのアプリをRaspberry Pi Picoに書き込み


3. モーターの可動範囲の確認

配線とソフトのセットアップが終わったらパソコンからサーボモーターを動かしてみます。

angle

servo

詳細は モーターの可動範囲の確認 をご覧ください。


4. ロボットアームの組み立て

組み立てはドライバーとラジオペンチでできます。

動画を作りましたのでご覧ください。


5. 軸の角度の調整

サーボモーターへの角度の指令値と軸の角度との対応付けをします。

アームの根元から順に軸を J1, J2, J3, J4, J5, J6 と言います。

以下の写真ではJ2, J3, J4の軸の角度は0度です。

arm-1

window-1

0ボタンをクリックして、0度の時のサーボモーターの角度を記憶しておきます。


以下の写真ではJ2の軸の角度は-90度です。

arm-2

window-2

-90ボタンをクリックして、-90度の時のサーボモーターの角度を記憶しておきます。

その他の軸も同様に基準となる軸の角度でのサーボモーターの角度を対応付けをさせます。

詳細は アームの角度の調整 をご覧ください。


軸の角度はアームの手先の位置や姿勢に直接影響するので重要です。

詳細は以下をご覧ください。

順運動学

軸の角度から手先の位置と姿勢を求める。

逆運動学

手先の位置と姿勢から軸の角度を求める。


6. カメラのキャリブレーション

このシステムには3種類の座標系があります。

_images/coordinate-system.png

カメラのキャリブレーションではカメラ座標系とスクリーン座標系の設定をします。

カメラ座標系

カメラ位置を原点とし、視線の方向がZ軸の座標系です。

スクリーン座標系

カメラで撮影した画像の座標系です。

画像の左上が原点で、右方向がX軸、下方向がY軸です。

ロボット座標系

ロボットの土台を原点とする座標系です。

ロボットに向かって手前がX軸、右方向がY軸、上方向がZ軸です。


キャリブレーションにはチェッカーボードのような板を使います。

_images/board.png

この板を様々な角度からカメラで撮影して、キャリブレーションをします。

詳細は カメラ キャリブレーション をご覧ください。


7. アームの手先の位置の検出

手先の位置の検出のために、OpenCVの ArUcoマーカー を使います。

ArUcoマーカーの作り方は ChArUcoボードとArUcoマーカーの印刷 をご覧ください。

ハンドの手先に2個と、ロボットの土台の板の上に3個のマーカーをつけています。

手先の2個のマーカーの中点が手先の位置になります。

_images/markers.png

カメラでマーカーを撮影すると、マーカーのカメラ座標とスクリーン座標が分かります。


板の上の3個のマーカーから、板の法線ベクトルが求まります。

_images/plane-normal.png

詳細は 平面の法線ベクトル をご覧ください。


板の法線ベクトルと手先のマーカーから、手先と板の距離が求まります。

手先が板に激突しないためと、板の上の物体をつかむために、手先と板の距離は重要です。

_images/plane-distance.png

詳細は 平面からの距離 をご覧ください。


8. AIで物体検出

システムにはお菓子の物体検出をするAIが入っています。

図の青い点はAIが検出した物体の位置です。

_images/ai.png

詳細は 物体検出 をご覧ください。


9. 物体検出した位置にアームを移動

AIが物体検出した座標はスクリーン座標です。

物体の位置にロボットアームを移動するにはスクリーン座標をロボット座標に変換する必要があります。

ロボット座標を指定して手先を移動させると、その位置での手先のカメラ座標とスクリーン座標が分かります。

下の写真のように複数の位置に手先を移動させ、ロボット座標とスクリーン座標のデータ対を作ります。

scr2arm1

scr2arm4

scr2arm7

scr2arm2

scr2arm5

scr2arm8

scr2arm3

scr2arm6

scr2arm8

データ対を使ってスクリーン座標をロボット座標への変換器が作れます。

詳細は スクリーン座標からロボット座標への変換 をご覧ください。


まとめ

ロボットアームを物体の位置まで移動させる処理は以下になります。

1. 物体検出のAIを使い物体のスクリーン座標を得る。

2. スクリーン座標からロボット座標へ変換する。

3. ロボット座標から軸の角度を逆運動学で求める。

4. 軸の角度からサーボモーターへの指令値を計算する。

5. Raspberry Pi Picoにサーボモーターへの指令値を送る。

6. Raspberry Pi Picoの中のMicroPythonのアプリがモーター ドライバーへ指令を送る。


Pythonのプログラムの一覧

ファイル名

説明

servo.py

モーターの可動範囲の確認

angle.py

アームの角度の調整

print.py

ChArUcoボードとArUcoマーカーの印刷

board.py

カメラ キャリブレーション

infer.py

物体検出

arm.py

スクリーン座標からロボット座標への変換