ロボットアームを視線で操作します。「Tobii Eye Tracker 5」で目の動きを読み取り、アーム操縦用のWebアプリを操作しています。
視線で物を掴んだり離したり
視線操作で、てまりを箱の中に入れてみました。
軽作業のシミュレーションです。
身体に重度の障害があっても、目さえ動けば仕事ができる仕組みを作れればと思います。
ちなみに、別の操作UIを用いて、足で操作することもできます。
ユニバーサル社会で役立つデザインや技術の研究
ロボットアームを視線で操作します。「Tobii Eye Tracker 5」で目の動きを読み取り、アーム操縦用のWebアプリを操作しています。
視線操作で、てまりを箱の中に入れてみました。
軽作業のシミュレーションです。
身体に重度の障害があっても、目さえ動けば仕事ができる仕組みを作れればと思います。
ちなみに、別の操作UIを用いて、足で操作することもできます。
ロボットアームに取り付けたカメラの視野が狭かったため、超広角カメラに取り換えました。アーム周囲の様子が分かり、格段に操縦しやすくなりました。
ELPの広角 170度魚眼レンズWebカメラを購入。
基板むき出しで、ロボット組み込みやすいネジ穴も空いています。
ロボットアームにカメラを固定したいと思います。
装着用のカメラケースをモデリングして3Dプリントします。
フィラメントは強度のあるPLA炭素繊維を使っています。
なかなかピッタリの形状にならず、何度もプリントしました。
プリントしたカメラケースにカメラをはめ、4か所ネジ止めします。
その後、アームハンド部分の穴にカメラケースを差し込みます。
既にカメラケースは固定されて動きませんが、念のためアームハンドの裏からネジで止めます。
アームハンドにカメラが付きました。
サーボモーターの脇からレンズをのぞかせています。
さすが画角170度。横にあるものも映り込みます。
これだけ広く映っていれば、アームをどちらの方向へ動かせばよいか把握できるため、操縦しやすくなりました。
あわせて操縦画面のUIを、視線操作できるように改修しています。
ロボットアームにWebカメラを装着しました。遠隔でPC画面を見ながら操縦できます。ただし、画角の狭いカメラだと、操縦が難しいです。
ロボットアームにカメラを付け、アームの視界を操縦画面から確認できるようにしました。
子供がカメラ映像を見ながら、てまりを掴んで遊んでいます。
装着したのはロジクールのウェブカメラ「C270」です。
購入時、1,000円くらいでした。(今Amazonで見たら7,000円)
テレワーク需要で値上がりしましたが、本来は安価で、電子工作にも気軽に使えるWebカメラです。
「C270」はオートフォーカスではありません。
アームハンドの先に焦点が合わないため、分解してカメラの焦点を調整します。
写真の歯車みたいなところを回すと焦点を調整できます。
ロボットアームとカメラの接着は、 3MのVHB両面テープを使いました。
接着力も強く、はがすこともできるので便利です。
両面テープでアームにカメラを接着しました。
アーム操縦画面を改修して、カメラ映像を読み込むようにしました。
子供にテストパイロットをお願いしたところ、カメラの画角が60度で狭いため、操縦は難しいようでした。
やはり、操縦のしやすさを考えると、超広角170度くらいのカメラに付け替えたほうが良さそうです。
調整したサインスマートの3軸ロボットアームを使い、たけのこの里を食べます。操作はスマホで指一本。うまく掴んで食べられるでしょうか?
ロボットアームで、たけのこの里を掴んで食べました。
身体障害者(手首は動くけど肩は上がらない人)が、自分の好きなタイミングでお菓子を食べるシミュレーションです。
スマホを使い、指一本で操縦できます。
操作画面とアーム制御のコードは以前作ったものを流用しています。
(servo3は無いため削除)
アームでいろいろなものを掴んでいる場合、しっかりアルコール消毒をしましょう。
コロナ第3波も来ているようなので・・・。
24時間介助を必要とする障害者が、ソーシャルディスタンスを保てない問題を抱えていました。
ロボットアームを自身で操作して、介助時間を少しでも減らすのも良いかもしれません。
介助者が遠隔でアームを操作して、ソーシャルディスタンスを保つという方法もあるでしょう。
こんな時代だから、技術導入が進めばと思います。
サインスマートの3軸ロボットアームを使用中、テーブルの上のものを掴めないことに気づきました。真ん中のサーボモーターの初期位置が問題なので、調整します。
テーブルの上に置いたてまりを掴んでみます。
あれ?
アームが90度から下がらず、手が届きません。
サーボモーターの可動域を変えないといけないようです。
まずはプログラムで、アーム真ん中のサーボモーターの角度を0度にします。
私の場合はobnizでサーボモーターを0度にしました。コードは最後に記載します。
サーボモーターの角度が0度になったら、下の写真のネジを4か所外します。
サーボモーターの角度を変えられるようになったら、アームを折り曲げた状態で、ネジを止めなおします。
再度、てまりを掴めるか試します。
問題ないようです。
これでロボットアームを使う最低限の準備が整いました。
ロボットアームに組み込まれたサーボモーターを、確認・調整する操作画面は、下記のコードとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
<html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script> <script src="https://unpkg.com/obniz@3.4.0/obniz.js" crossorigin="anonymous"></script> <style media="screen"> table { max-width: 600px; } th { width: 20vw; padding: 3vh 3vw; text-align: center; } td { width: 75vw; padding: 3vh 3vw; } [type="range"] { width: 100%; } </style> </head> <body> <div id="obniz-debug"></div> <main> <table> <tr> <th>旋回 = <span id="servo1Val"></span></th> <td><input type="range" id="servo1" value="90" max="180" min="0"></td> </tr> <tr> <th>上下 = <span id="servo2Val"></span></th> <td><input type="range" id="servo2" value="90" max="180" min="0"></td> </tr> <tr> <th>掴み = <span id="servo3Val"></span></th> <td><input type="range" id="servo3" value="0" max="180" min="0"></td> </tr> </table> </main> <script> var obniz = new Obniz("obniz_ID"); obniz.onconnect = async function () { var servo1 = obniz.wired("ServoMotor", {gnd:0,vcc:1,signal:2}), servo2 = obniz.wired("ServoMotor", {gnd:3,vcc:4,signal:5}), servo3 = obniz.wired("ServoMotor", {gnd:6,vcc:7,signal:8}); $("#servo1").change(function() { servo1.angle($(this).val()); $("#servo1Val").text($(this).val()); }); $("#servo2").change(function() { servo2.angle($(this).val()); $("#servo2Val").text($(this).val()); }); $("#servo3").change(function() { servo3.angle($(this).val()); $("#servo3Val").text($(this).val()); }); } </script> </body> </html> |
サインスマートの3軸ロボットアームが自立しません。自立させるため三脚に取り付けようと思います。三脚とアームを接続するクイックシューを3Dプリントしました。
サインスマートのロボットアームの底には、何かと接続できるように穴がたくさん空いています。
穴の位置やサイズを計測して、三脚用のクイックシューをモデリングします。
フィラメントはPLA炭素繊維を使い、クイックシューを3Dプリントしました。
ある程度負荷がかかるパーツなので、強度が大事です。
クイックシューとあわせて、8mmボルトも印刷。
強度が心配な場合、ボルトは金属製のものを購入しても良いでしょう。
ボルトをクイックシューの裏側から挿します。
三脚に取り付け。ピッタリです。
クイックシューの6つの突起を、アームの底にある穴に挿します。
さらにボルトで固定します。
これで、そう簡単にはズレません。
最後にクイックシュー付きアームを、三脚に装着します。
三脚に装着するメリットは、いくつかあります。
台に合わせて高さ調整ができること。
角度微調整が出来ること。
折りたたんで持ち運びできること・・・など。
実際に三脚に装着した状態で、アームを動かしても、ブレずに安定していました。
サインスマートのロボットアームを動くようにします。動力のサーボモーター「MG995」にobniz Boradをつなぎます。初代「obniz Board」の場合、別電源なしで動作するようです。
はじめに「obniz Board 1Y」を、ロボットアームの「MG995」につなぎました。
obniz Boardは、IoTを簡単に実現できるマイコンボードで、「1Y」が付くバージョンは乾電池で1年使うこともできる設計です。
「1Y」をロボットアームに使うには、少し無駄があるかもしれません。
「obniz Board 1Y」でロボットアームを操作中、ボードの液晶が真っ白になり、頻繁に再起動してしまいます。
アームが止まってしまい、使えません。
たぶん、サーボモーター「MG995」の電流不足でしょう。
obniz公式ページにある「ioから直接電源供給を確認したサーボモーター一覧」には、「MG995」が載っていません。
サーボモーターは別電源を用意する必要がありそうです。
別電源の用意が大変なので、試しに初代「obniz Board」に交換してみました。
すると、問題なく動きます!
ioピンからの直接電源供給は、簡単でありがたいです。
写真左手前が「obniz Board 1Y」。右奥が「obniz Board」です。
やはり、サーボモーター「MG995」だと、力強いです。
試しに掴んだてまりが潰れそう。
今度は調理用の測りを掴んでみました。
最大計測1kgを超えて、測れません。
1kg以上の握力があれば、掴めるものも多いでしょう。
これでサインスマートのロボットアームを最低限動かせるようになりました。
次にロボットアームの土台を作ります。(今は仮で、モバイルバッテリーを重石にしてますが不安定です。)
SunFounder(写真左)からサインスマート(写真右)のロボットアームに乗り換えようと思います。しかしトラブルはつきものです。
しばらくSunFounder社のロボットアームを実験に使っていました。
使用中、1つ大きな問題がありました。
ハンド部分を動かし、物を掴んだり離したりしているうちに、ネジがゆるんでいきます。
ネジの問題か、組み立ての問題か不明ですが、検証には十分役立ったので、もう少し丈夫なロボットアームに交換したいと思います。
金属製の丈夫さ、サーボモーターのパワー、可動部分は3軸で十分。
この3つの理由で、サンスマート社のロボットアームを選びました。
Amazonの評価はあまり良くなく、冒険です。
商品のアームは、紙袋、プチプチ、ラップに巻かれて届きました。
箱に入ってないんですね。
開封すると、サーボモーターとアームを接続するプラスチックが破損していました。
やっぱり、あの梱包はまずいですね。
そして金属製のアームですが、負荷のかかるところはプラスチックということを知りました。
破損しているプラスチックパーツを3Dプリントしようとも思いましたが、パーツには精密さが必要で、家庭用のFDM3Dプリンターでは難しそうです。
下手にいじる前に返品することにしました。
返品は意外と簡単で、自宅までクロネコヤマトが取りに来てくれます。
助かります。
そしてこりずに再購入しました。
返品申し込みと再購入をして24時間後、クロネコヤマトさんが新品のお届けと、破損していたアームの回収に来てくれました。
この社会システムはすごい・・・。
さっそくサインスマートのロボットアームの動作確認をしました。
最近はロボットアームを制作しています。ふと、ロボットアームでモルモットに遠隔でエサをあげたくなりました。コロナの影響で、動物との触れ合いもリモートになるかもしれません。
ロボットアームで、モルモットにエサをあげてみます。
ネット経由で操作できるため、離れた場所でもエサをあげられます。
上野動物園にモルモットと触れ合えるコーナーがありました。
しかし、コロナの影響で長期休止中です。(2020年11月現在)
動物とのふれあいも、リモートを考える時代かもしれません。
もしかしたら動物的には、子供たちにべたべた触られるより、ストレスが減って良いかもしれません。
機械を介してエサをあげるのは楽しいのか?
そう考えたとき、上野動物園のクマのエサやりを思い出しました。
ベルトコンベアを回して、遠隔でクマにエサを届ける体験です。息子たちが喜んで、お金を投じたのを思い出しました。
どちらかというと、ベルトコンベアを動かすことが楽しいようです。
エサあげはミッションで、メカの操縦が目的だとすると、例えリモートで映像を見ながらエサをあげても、アームを操作できるのは楽しいでしょう。
前回までスマホ操作でしたが、一度PCのマウス操作に変えています。
最終段階で、視線操作に変えようと思います。
遠隔操作可能なIoTロボットアームを作っています。前回作ったスマホ操作画面をもっと改善します。4つの関節を持つアームを、指一本で操作できるようにしました。
ロボットアームの操作の様子です。
片手、一本指で操作しています。
アームで掴んだてまりを箱に入れてみました。
大幅にスマホの操作画面を改修しました。
ロボットアームを見ながら操作できるよう、スマホ画面は見ないで操作するUIとします。
そうすると、タッチパッドのようなUIになりました。
画面キャプチャでは分かりませんが、格段に操作しやすくなっています。
指一本で操作でき、タップで物を掴んだり、離したりします。
ロボットアームを組み立てた長男に、操縦を試してもらいました。
操縦2回目でコツをつかみ、10秒かからずに、てまりを箱に入れています。
・・・ゲーム慣れしてるからか、私よりうまいです。
操作画面と、ロボットアームを制御するObniz用のコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
<html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script> <script src="https://unpkg.com/obniz@3.4.0/obniz.js" crossorigin="anonymous"></script> <style media="screen"> body { margin: 0; padding: 0; background-color: #000; } #pad { position: absolute; top: 0; right: 0; bottom: 0; left: 0; margin: auto; overflow: scroll; border: #999 solid 1px; width: 360px; height: 360px; margin: auto; } #pad::-webkit-scrollbar { display:none; } #controller{ width: 1080px; height: 1080px; background-size: 30px 30px; margin: 0 auto; background-image: radial-gradient(#444 15%, #222 20%); background-position: center; text-align: center; font-size: 45px; line-height: 960px; color: #999; } </style> </head> <body> <div id="obniz-debug"></div> <main> <div id="pad"> <div id="controller"> + </div> </div> </main> <script> var obniz = new Obniz("obniz_ID"), $pad = $("#pad"), isGrab = false; obniz.onconnect = async function () { var servo1 = obniz.wired("ServoMotor", {gnd:0,vcc:1,signal:2}), servo2 = obniz.wired("ServoMotor", {gnd:3,vcc:4,signal:5}), servo3 = obniz.wired("ServoMotor", {gnd:6,vcc:7,signal:8}), servo4 = obniz.wired("ServoMotor", {gnd:9,vcc:10,signal:11}); var setPad = function() { $pad.scrollTop(320); $pad.scrollLeft(360); }; setPad(); $pad.scroll(function() { var x = Math.round($(this).scrollLeft() / 4); var y = Math.round($(this).scrollTop() / 4); servo1.angle(180-x); servo2.angle(180-y); servo3.angle(60-y); }); $pad.on('click', function() { if(isGrab){ servo4.angle(30); }else{ servo4.angle(90); } isGrab = !isGrab; }); var reset = function(){ isGrab = false; servo1.angle(90); servo2.angle(90); servo3.angle(0); servo4.angle(0); }; reset(); } </script> </body> </html> |
※サーボモーターをどの角度で組み立てたかにより、angleに入れる数字は変わります。