OGIMOノート~家族のためのモノづくり~

OGIMOテックノート ~家族のためのモノづくり~

重度障害の息子を持つ父親エンジニアの備忘録。自作の電子工作おもちゃ/リハビリ器具/ロボット関係の製作記録、思った事を残していきます

分身ロボットで更なる身体拡張 OriHimeジェスチャーコントローラ製作

f:id:motokiinfinity8:20200327005005j:plainf:id:motokiinfinity8:20200327005011j:plain

製作動機

単身赴任中、家族と遠く離れた寂しさを解消するために導入した
分身ロボットOriHime

ogimotokin.hatenablog.com


分身ロボットOriHimeにはカメラが内蔵されており、
操作者はスマホに表示されたカメラ映像を見ながら、
遠く離れた相手と相手と音声会話ができます。
その大きな特徴の一つに、
操作者のスマホ(コントローラ)から分身ロボットの首や手を動かせる機能
があります。


これにより、何気ない会話の中に
「ばんざい」「なんでやねん」
など物理アクションを混ぜる事で
コミュニケーションを盛り上げたり、その人がそこにいる存在感、
更には「その人らしさ」を増幅させる効果があります!


OriHimeの手はシンプルなコミュニケーション用途のため、
物を持ったり、押したりはできません。

しかし、先日にSNS上にて、
「自宅から出れない子供が、
 自宅からOriHimeで学校クリスマス会に参加し、
  その際にOrIhime腕で無理やり楽器を鳴らそうとする」

様子を見て、更なる分身ロボットの可能性を感じました!


これを使えば、

外出できない子供・友人らと一緒に
遠隔で楽器セッションや一緒に遊んだりできるかもしれない!

その可能性を広げてみたいと考え、
我が家にある分身ロボットを使ってた
『OriHimeのモーションをトリガにして、
 いろんな機器を操作できる能力拡張ユニット』

を自作してみました。



開発ポイント

・短期間での開発実証のため、
 コミュニケーション手段としてOriHimeを活用
・OriHimeはレンタル品のため改造不可。
 拡張ユニットは外付けを前提とする
・拡張ユニットの操作は
 「OriHimeの操作コントローラのみ」で実現させる


製作物

OriHimeの手の動きに応じて、
「福祉用スイッチ機器」や「自作タンバリン演奏マシン」などを操作できる
ジェスチャーコントローラユニット



出来る事① 腕を上げる事で2種類のスイッチ機器をONにできる
出来る事② 右腕に連動して自作演奏アームを上下に自由に動かせる
出来る事③ 腕の動きを検出して、専用自走タンク台車をコントロール

■動画① 2種類のスイッチ機器を電源ONに


■動画② 専用打楽器ハンドでマスタースレーブ動作


■動画③ 自走タンクをジェスチャーで操作



これにより、従来の分身ロボットOriHimeでは出来なかった
スイッチ機器の操作重たいモノを動かす事
OriHImeのモーション操作のみで実現できます!

更に、自作の打楽器演奏アームを使えば、OriHImeの腕の動きに連動させる事も!

ogimotokin.hatenablog.com


本来はスレーブである分身ロボットがマスターとなって
更にその分身スレーブ機器を操作する

という新しい概念!


これを進化させれば、市販品(OriHime)の機能はそのままで、
その外側を自分たちがやりたい事に合わせて機能を後付け出来るので、
介護福祉の世界で最近注目されている
「ハッカブル」
という世界観
にもマッチする気がします。

※ちなみに、こちらはあくまで非公式の個人的な取り組みです。



システム構成

全体のシステム構成は以下になります。
f:id:motokiinfinity8:20200402231548j:plain

OriHime自体は改造不可の市販品であるため、
いわゆるラズパイ等の様にユーザーが自由にプログラム制御できる信号線(GPIO)が存在しません。
なので、代わりに加速度センサーを「腕角度検出ユニット」として、
ユーザ操作有無を判別に使うというGPIO代わりとして使ってます。
その出力系として、福祉業界で一般的に使われている
スイッチ機器(3.5mmモノラルジャック)を
2つ制御する想定のジェスチャーコントローラにしました。

※この考え方はいろんな市販機器をハックするのに使えそうです。


もう少しハードウェア情報を詳細化した図が以下になります。

f:id:motokiinfinity8:20200402231602j:plain

加速度センサーとしては、一般的に使われているTDK(旧Invesense)のMPU-6050を使いました。
それをOriHimeの腕に付けるためのバンド風外装をFusion360で設計、3Dプリンタで作成しました。

加速度センサーとしては、一般的に使われているTDK(旧Invesense)のMPU-6050を使いました。
それをOriHimeの腕に付けるためのバンド風外装をFusion360で設計、3Dプリンタで作成しました。


操作意図の検出バリエーションを増やすため、「腕を前に上げた場合」と「腕を水平に上げた場合」を区別する事を考えました。
検討の結果、腕を上げる方向は Pitch、水平/前の方向は Roll を見る事で両者を判別できそうです。

f:id:motokiinfinity8:20200402231607j:plain


これらの加速度センサー×2の情報からユーザー意図を推定
(例えば、右手が90度上がったら電源ONの命令をしたと解釈)して、
機器操作に反映させます。


機器操作はもっともシンプルな手段は「スイッチ機器の電源ON」で、
マイコンのGPIOからフォトカプラ(フォトリレー)経由でスイッチ回路を短絡させてやります。
しかし、これだけでは、例えば「使い方②」の様なマスタースレーブ制御はできないため、
更にUART等の制御信号を外部機器に繋げられる配慮も入れます。
(今回は、接続配線を減らすため、3.5mmステレオケーブルの空きピンをUART TX信号として
打楽器ハンドとシリアル片通信を実現させました)



ソフトウェア

ポイントは角度の算出方法です。
一般的に、加速度センサーは誤差蓄積や温度影響によるズレ(温度ドリフト)影響があるので、
そこから姿勢角データを抜き出すのにはノウハウがいります。
ただ、MPU-6050の場合、姿勢角(ROLL/PITCH)を DMPと呼ばれるIC内部のハードウェア回路を使って呼び出す事ができます。

ogimotokin.hatenablog.com

今回もDMPを使って、姿勢角を算出しようとしましたたが、、、
右側センサの姿勢角は取得できるが、
左側センサの姿勢角が取得できない。

どうやら、2つのMPU-6050が存在しているとDMP用ライブラリがうまく動かない様です。。。


仕方がないので、今回は以下の記事で使った様に、
加速度から愚直にソフトウェアで角度計算をするスタイルを取りました。

ogimotokin.hatenablog.com

void get_angle_from_imu(){
    float left_acc_x, left_acc_y, left_acc_z;
    float right_acc_x,  right_acc_y,  right_acc_z;
    int i;
    //  send MPU6050_L_ADDR
    //  send start address
    Wire.beginTransmission(MPU6050_L_ADDR);
    Wire.write(MPU6050_AX);
    Wire.endTransmission();  
    //  request 14bytes (int16 x 7)
    Wire.requestFrom(MPU6050_L_ADDR, 14);

    //  get 14bytes
    short int AccX, AccY, AccZ;
    AccX = Wire.read() << 8;  AccX |= Wire.read();
    AccY = Wire.read() << 8;  AccY |= Wire.read();
    AccZ = Wire.read() << 8;  AccZ |= Wire.read();

    //  X/Y方向を反転
    AccX = AccX * -1.0;
    AccY = AccY * -1.0;

    // 取得した加速度値を分解能で割って加速度(G)に変換する
    left_acc_x = AccX / 16384.0; //FS_SEL_0 16,384 LSB / g
    left_acc_y = AccY / 16384.0;
    left_acc_z = AccZ / 16384.0;

    // 加速度からセンサ対地角を求める
    for(i=3; i>=0; i--){
      left_angle_tmp[0][i+1] = left_angle_tmp[0][i];
      left_angle_tmp[1][i+1] = left_angle_tmp[1][i];
    }
    left_angle_tmp[0][0] = atan2(left_acc_x, left_acc_z) * 360 / 2.0 / PI * -1;
    left_angle_tmp[1][0] = atan2(left_acc_y, left_acc_z) * 360 / 2.0 / PI;

    //5値の平均値を取得する
    left_angle[0] = (left_angle_tmp[0][0]+left_angle_tmp[0][1]+left_angle_tmp[0][2]+left_angle_tmp[0][3]+left_angle_tmp[0][4])/5;
    left_angle[1] = (left_angle_tmp[1][0]+left_angle_tmp[1][1]+left_angle_tmp[1][2]+left_angle_tmp[1][3]+left_angle_tmp[1][4])/5;

    //  send MPU6050_R_ADDR
    //  send start address
    Wire.beginTransmission(MPU6050_R_ADDR);
    Wire.write(MPU6050_AX);
    Wire.endTransmission();  
    //  request 14bytes (int16 x 7)
    Wire.requestFrom(MPU6050_R_ADDR, 14);

    //  get 14bytes
    AccX = Wire.read() << 8;  AccX |= Wire.read();
    AccY = Wire.read() << 8;  AccY |= Wire.read();
    AccZ = Wire.read() << 8;  AccZ |= Wire.read();

    // 取得した加速度値を分解能で割って加速度(G)に変換する
    right_acc_x = AccX / 16384.0; //FS_SEL_0 16,384 LSB / g
    right_acc_y = AccY / 16384.0;
    right_acc_z = AccZ / 16384.0;

    // 加速度からセンサ対地角を求める
    for(i=3; i>=0; i--){
      right_angle_tmp[0][i+1] = right_angle_tmp[0][i];
      right_angle_tmp[1][i+1] = right_angle_tmp[1][i];
    }
    
    right_angle_tmp[0][0] = atan2(right_acc_x, right_acc_z) * 360 / 2.0 / PI;	//pitch
    right_angle_tmp[1][0] = atan2(right_acc_y, right_acc_z) * 360 / 2.0 / PI;	//roll
    //right_angle_tmp[1][0] = atan2(right_acc_x, right_acc_y) * 360 / 2.0 / PI;

    //5値の平均値を取得する
    right_angle[0] = (right_angle_tmp[0][0]+right_angle_tmp[0][1]+right_angle_tmp[0][2]+right_angle_tmp[0][3]+right_angle_tmp[0][4])/5;
    right_angle[1] = (right_angle_tmp[1][0]+right_angle_tmp[1][1]+right_angle_tmp[1][2]+right_angle_tmp[1][3]+right_angle_tmp[1][4])/5;   
}

最後に

イカーの方々であれば、
「GPIO制御可能なコミュニケーションロボを別途作ったらよいのでは?」
とか
スマホで操作できる別機器にすればいいのでは?」
などと思うかもしれません。

もちろんその手段も当然ありだと思います。


ただ、特に非メイカーの人たちに
遠隔機器を操作してもらう上で鍵になるのは、
「接続しやすさ(トラブル回避)」

「操作コントローラの使いやすさ」
だと自分の経験から感じています。

例えば、Skype等のテレワークで良くある事なのですが
機器トラブルなどでうまく接続できない場合、
特に遠隔だと相手が近くにいないのでトラブル対応の誘導が難しい。
(トラブルが起きると、それがトラウマになってすぐに使われなくなってしまう…)

なので、それを避けるため、
遠隔通信は実績のあるOriHImeなどの市販品を使い、
手元部のみ個人製作物で拡張するという手段を取りました。 

更に、
「OrIHimeユーザーにとっては普段慣れた操作I/Fのままで拡張機器を操作できる方が
受け入れられやすのでは?」

という操作IFの親和性を試す意味もこめて、
ジェスチャーという既存コントローラをそのまま使えるスタイルを取ってみました。


モニター募集(緩く)

先日の「楽器演奏アーム」に加えて、
この「OriHime用ジェスチャコントローラ」
ニーズがありそうならば
追加開発/キット化も視野にいれてみたいと思っています。

もしご興味ある方、製作相談等があれば、
Twitterアカウント(@ogimotoki)へ直接DMを頂けると嬉しいです!