.. uroa documentation master file, created by sphinx-quickstart on Wed Jun 15 20:23:57 2022. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. 1万円台でAI搭載ロボットアームを自作 ============================================================= このサイトではAI搭載ロボットアームの自作をしながら、 AIやロボット制御の基礎が学べる教材を作っています。 .. raw:: html まずは上の動画を見てみてください。 AIで物体の位置を検出してから、物体の位置の位置にアームを移動させ、物体をつかんでいます。 | このシステムの特徴は ・ 材料は合計で1万円台で、全部Amazonで買えます。 ・ ロボットアームの組み立ては、ドライバーとラジオペンチでできます。 ・ 配線はピンを穴に差し込むだけで、半田付けは必要ありません。 ・ パソコンに接続してPythonで動かせます。 | 誰でも気軽にAI搭載ロボットアームを自作できる時代になりました。 ぜひチャレンジをしてみてください。 | 部品一覧 ============= .. |kit| image:: ../img/parts/kit.png :width: 200pt :align: middle .. |motor| image:: ../img/parts/motor.png :width: 100pt :align: middle .. |driver| image:: ../img/parts/driver.png :width: 100pt :align: top .. |pico-kit| image:: ../img/parts/pico-kit.png :width: 200pt :align: middle .. |ac| image:: ../img/parts/ac.png :width: 100pt :align: middle .. |camera| image:: ../img/parts/camera.png :width: 100pt :align: middle ================================== ========= ================================== 名前 価格 画像 ================================== ========= ================================== 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でロボットアームを動かすまでの手順 =============================================== :ref:`wiring` :ref:`setup` :ref:`servo` :ref:`assembly` :ref:`angle` :ref:`calibration` :ref:`armarker` :ref:`AI` :ref:`screen2arm` | 以下で各手順を説明します。 | .. _wiring: 1. 配線 -------------------------- Raspberry Pi Picoとサーボモーター ドライバーは4本の線で接続します。 サーボモーター ドライバーには6Vの電源を供給します。 .. image:: ../img/wiring/pinout-1.png | モーターの茶(GND)、赤(V+)、オレンジ(PWM)の線をサーボモーター ドライバーの黒・赤・黄の端子に接続します。(左図) モーターの線の色が黒(GND)、赤(V+)、白(PWM)の場合もあります。(右図) .. |motor-1| image:: ../img/wiring/motor.png :width: 400 .. |motor-2| image:: ../img/wiring/wire.png :width: 200 ========= ========= |motor-1| |motor-2| ========= ========= | モーターはアームの根元から手先に向かって J1, J2, J3, J4, J5, J6 と呼びます。 サーボモーター ドライバーのピンをブレッドボードに挿し、下から順にJ1~J6のモーターを接続します。 J2のモーターは高い負荷がかかるので、20kg高トルク サーボモーターに換装します。 .. |J1-J6-1| image:: ../img/wiring/J1-J6-1.png :width: 400 .. |J1-J6-2| image:: ../img/wiring/J1-J6-2.png :width: 300 ========= ========= |J1-J6-1| |J1-J6-2| ========= ========= | 配線をすべて終えるとこんな感じです。 .. |breadboard-1| image:: ../img/wiring/breadboard-1.png :width: 400 .. |breadboard-2| image:: ../img/wiring/breadboard-2.png :width: 400 ==================== ==================== サーボドライバの表側 サーボドライバの裏側 ==================== ==================== |breadboard-1| |breadboard-2| ==================== ==================== | ※ 一部のサーボドライバでは下図のようにV+のピンを接続する必要があります。 .. image:: ../img/wiring/jumper.png :width: 150 | .. _setup: 2. ソフトのセットアップ -------------------------------------------------- Raspberry Pi PicoはMicroPythonのアプリで制御します。 Raspberry Pi Picoにアプリを書き込むにはThonnyというソフトを使います。 セットアップの手順は下記のリンクをご覧ください。 1. :ref:`gitclone` 2. :ref:`install` 3. :ref:`MicroPython` 4. :ref:`install_Thonny` 5. :ref:`write_app` | .. _servo: 3. モーターの可動範囲の確認 --------------------------------------------- 配線とソフトのセットアップが終わったらパソコンからサーボモーターを動かしてみます。 .. |angle| image:: ../img/angle.gif :width: 400 .. |servo| image:: ../img/servo.png :width: 200 ========= ========= |angle| |servo| ========= ========= 詳細は :ref:`servo2` をご覧ください。 | .. _assembly: 4. ロボットアームの組み立て ----------------------------------------------- 組み立てはドライバーとラジオペンチでできます。 動画を作りましたのでご覧ください。 .. raw:: html | .. _angle: 5. 軸の角度の調整 ---------------------------------------------------------------- .. |arm-1| image:: ../img/angle/arm-1.png :width: 300 .. |arm-2| image:: ../img/angle/arm-2.png :width: 300 .. |window-1| image:: ../img/angle/window-1.png :width: 200pt .. |window-2| image:: ../img/angle/window-2.png :width: 200pt サーボモーターへの角度の指令値と軸の角度との対応付けをします。 アームの根元から順に軸を J1, J2, J3, J4, J5, J6 と言います。 以下の写真ではJ2, J3, J4の軸の角度は0度です。 ============== ========== |arm-1| |window-1| ============== ========== 0ボタンをクリックして、0度の時のサーボモーターの角度を記憶しておきます。 | 以下の写真ではJ2の軸の角度は-90度です。 ============== ========== |arm-2| |window-2| ============== ========== -90ボタンをクリックして、-90度の時のサーボモーターの角度を記憶しておきます。 その他の軸も同様に基準となる軸の角度でのサーボモーターの角度を対応付けをさせます。 詳細は :ref:`angle2` をご覧ください。 | 軸の角度はアームの手先の位置や姿勢に直接影響するので重要です。 詳細は以下をご覧ください。 :doc:`forward-kinematics` 軸の角度から手先の位置と姿勢を求める。 :doc:`inverse-kinematics` 手先の位置と姿勢から軸の角度を求める。 | .. _calibration: 6. カメラのキャリブレーション --------------------------------------------------- このシステムには3種類の座標系があります。 .. image:: ../img/math/coordinate-system.png :width: 600 カメラのキャリブレーションではカメラ座標系とスクリーン座標系の設定をします。 カメラ座標系 カメラ位置を原点とし、視線の方向がZ軸の座標系です。 スクリーン座標系 カメラで撮影した画像の座標系です。 画像の左上が原点で、右方向がX軸、下方向がY軸です。 ロボット座標系 ロボットの土台を原点とする座標系です。 ロボットに向かって手前がX軸、右方向がY軸、上方向がZ軸です。 | キャリブレーションにはチェッカーボードのような板を使います。 .. image:: ../img/board.png :width: 600 この板を様々な角度からカメラで撮影して、キャリブレーションをします。 詳細は :ref:`calibration2` をご覧ください。 | .. _armarker: 7. アームの手先の位置の検出 ---------------------------------- 手先の位置の検出のために、OpenCVの **ArUcoマーカー** を使います。 ArUcoマーカーの作り方は :ref:`print` をご覧ください。 ハンドの手先に2個と、ロボットの土台の板の上に3個のマーカーをつけています。 手先の2個のマーカーの中点が手先の位置になります。 .. image:: ../img/markers.png :width: 500 カメラでマーカーを撮影すると、マーカーのカメラ座標とスクリーン座標が分かります。 | 板の上の3個のマーカーから、板の法線ベクトルが求まります。 .. image:: ../img/math/plane-normal.png :width: 400 詳細は :ref:`normal` をご覧ください。 | 板の法線ベクトルと手先のマーカーから、手先と板の距離が求まります。 手先が板に激突しないためと、板の上の物体をつかむために、手先と板の距離は重要です。 .. image:: ../img/math/plane-distance.png :width: 400 詳細は :ref:`distance` をご覧ください。 | .. _AI: 8. AIで物体検出 ----------------------------------------------- システムにはお菓子の物体検出をするAIが入っています。 図の青い点はAIが検出した物体の位置です。 .. image:: ../img/ai.png :width: 300 詳細は :ref:`AI2` をご覧ください。 | .. _screen2arm: 9. 物体検出した位置にアームを移動 ----------------------------------------- AIが物体検出した座標はスクリーン座標です。 物体の位置にロボットアームを移動するにはスクリーン座標をロボット座標に変換する必要があります。 ロボット座標を指定して手先を移動させると、その位置での手先のカメラ座標とスクリーン座標が分かります。 .. |scr2arm1| image:: ../img/screen2arm/1.png :width: 150 .. |scr2arm2| image:: ../img/screen2arm/2.png :width: 150 .. |scr2arm3| image:: ../img/screen2arm/3.png :width: 150 .. |scr2arm4| image:: ../img/screen2arm/4.png :width: 150 .. |scr2arm5| image:: ../img/screen2arm/5.png :width: 150 .. |scr2arm6| image:: ../img/screen2arm/6.png :width: 150 .. |scr2arm7| image:: ../img/screen2arm/7.png :width: 150 .. |scr2arm8| image:: ../img/screen2arm/8.png :width: 150 .. |scr2arm9| image:: ../img/screen2arm/9.png :width: 150 下の写真のように複数の位置に手先を移動させ、ロボット座標とスクリーン座標のデータ対を作ります。 ========== ========== ========== |scr2arm1| |scr2arm4| |scr2arm7| |scr2arm2| |scr2arm5| |scr2arm8| |scr2arm3| |scr2arm6| |scr2arm8| ========== ========== ========== データ対を使ってスクリーン座標をロボット座標への変換器が作れます。 詳細は :ref:`screen2arm2` をご覧ください。 | まとめ ================ ロボットアームを物体の位置まで移動させる処理は以下になります。 1. 物体検出のAIを使い物体のスクリーン座標を得る。 2. スクリーン座標からロボット座標へ変換する。 3. ロボット座標から軸の角度を逆運動学で求める。 4. 軸の角度からサーボモーターへの指令値を計算する。 5. Raspberry Pi Picoにサーボモーターへの指令値を送る。 6. Raspberry Pi Picoの中のMicroPythonのアプリがモーター ドライバーへ指令を送る。 | Pythonのプログラムの一覧 --------------------------------------- ========== =========================== ファイル名 説明 ========== =========================== servo.py :ref:`servo2` angle.py :ref:`angle2` print.py :ref:`print` board.py :ref:`camera_calibration` infer.py :ref:`AI2` arm.py :ref:`screen2arm2` ========== =========================== .. toctree:: :hidden: :titlesonly: self setup micropython thonny servo angle-calibration charuco-board object-detection xy-calibration .. toctree:: :hidden: :titlesonly: :caption: 数学 forward-kinematics inverse-kinematics plane .. toctree:: :hidden: :titlesonly: :caption: about about