.. 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