エンコーダー付きDCモーターの回転数を取得する

エンコーダー付きDCモーターから回転数を取得する。モーターは前に書いたpololuの12Vモーター。
https://www.pololu.com/product/2824

モーターの配線に関する情報は上記にある。

モーターは四個あり、回転数の分解能を大きくするためには、各モーターがgpioを2本使う。合計8本。これをRaspberrypi3の本体から全部取るというのは、できなくなはないが、他に使う余裕はなくなってしまう。
そこで、MCP23S17チップを使って、GPIOの拡張をすることにした。配線は、記載の通りやれば良い。
http://ww1.microchip.com/downloads/jp/DeviceDoc/20001952C_JP.pdf
結構配線間違いで、時間を使ってしまった。MCP23S17はSPIポートを使う。ラズパイの設定で、使えるようにしなければならないのは当然である。MCP23017という兄弟のようなチップもあるが、こちらはI2Cポートを使う。I2Cポートはサーボモーターのためにとっておきたいし、SPIの方が一つ一つのデバイスとの絡みで更新速度が早いなどのメリットもある。
これで16ピン増やせた。
ロボットのシステムはJAVAで動かすので、pi4jのライブラリと、MCP23S17のサンプルを取ってくれば、難なく動く。A0,A1,A2をLOWにしておかなければならないことと、RESETをHIGHにしておかないと正常稼働しないのには注意。
MCP23S17の拡張16GPIOポートのうち、8個はこのモーター回転数のために使うが、残りは、距離センサーのために使う予定だ。

ディープラーニングでターゲットの数字を認識

ラズパイのカメラを経由し、ターゲットに書いてある数字をディープラーニングで学習させたシステムで認識させようとしている。それによって舞台上にある目標位置に、ロボットが自動的に移動できるようにしたいわけだ。
ロボットのシステムソフトはjavaで書いてるので、ロボットのopencvもjavaで動かしたいのだが、色々やってもうまくいかないので、opencvはC++で動かして、それをネットワーククライアントにして、javaのシステムの方にネットワークサーバーを動かしてカメラデータを把握することにした。
ただ、カメラの生データをネットワークで取得すると、時間がかかりすぎりので、クライアント側で、分割して、システムの入力データに合うように加工し、画像認識の28X28ピクセルデータにしてロボットのシステムに送るようにすれば早い。システム側で、その画像に目標とする数字が書いてあるかを認識するのだ。認識システムそのものは、ここにも記載したディープラーニングで学習させたニューラルネットワークにさせる。
 
左上の画像が、ラズパイとカメラ、右上が数字が書いてあるターゲット、左下が、その画像を縦横4分割した場合の画像セットである。下の左から三番目の画像に、数字の4が写っている。それをニューラルネットワークに通すと、だいたい、信頼性の低い形で8とかの認識結果を出すのだが、ターゲットのあるところは、4が最も信頼性がある数字として出してくる。でも、その信頼性はとても低い。4以外にしたのはこの黒い画像も写り込んでいるからだ。

ラズパイのカメラをopencvで制御する

すけるくんに目標追跡機能を持たせる必要がある。
基本的な戦略は、カメラデータを取得して、その中にある目標対象のパターンを読み取り、見える位置などを把握して、距離センサーで、接近していくというものだ。
カメラデータの取得をOpencvにやらせる。当初は、opencvをjavaで動かしたかったが、Raspiにjava用のopencvを入れようとすると、なぜか最終局面で失敗する。それでも、やれないことはなかったが、opencvのコンパイルにむやみやたらに時間がかかるので、その路線を放棄した。
C系の言語でいいわということになったら、一番安直に
http://blue-black.ink/?page_id=2214
の物を入れた。opencvで、ラズパイのカメラが確かに動くサンプルもついていた。記載の通りインストールすると、しっかりカメラデータをライブで取ってきていた。
Netbeansでコンパイルできるように、そのプロジェクト化をする。ただし、一ヶ所だけ、Makefileの中で変えないといけないところがある。
USERLAND_ROOT
を実際にそれがある場所に変更しなければならない。
それで、NeabeansのC/C++ プロジェクト化できる。
サンプルの中の
IplImageデータの中に、カメラで取得したデータ、RGBそれぞれ1バイトずつ入っているので、それを利用すればいい。
戦略としては、画面データを様々なパターンで分割して、どこに標識があるのかを見極めよう。そのために、ディープラーニングで得られたパターン認識力を使う。

「すけるくん」のプロトタイプ


この間、インフルエンザのA型になって外出ができなくて、家に閉じこもっていた。その時間を利用して、なんども組み立て直していた「すけるくん」を、基本的に作り上げた。まだ、声かけに対して言葉を返したり、前後左右、回転などの動きをしたりする機能だけしか持たせていない。
仕様を書いておこう。
モーター(4個):pololu社製(pololu-2824)、統合型直行エンコーダー搭載、50:1、メタルギアドモーター、37mm X54mm 、12vで使用、無負荷時回転数: 200 rpm、無負荷時電流: 300 mA、ストール時電流: 5 A、ストール時トルク: 12 kg-cm (エンコーダーは、現在は使っていないが、いずれ回転数の正確な把握のために使う予定)このモーターの前に、ダイセン社ロボサイトモーターを使ってみたが、トルクが174g-cmしかなく、5kg以上あるすけるくんをしっかりと動かすことができなかった。トルクは70倍になったことになる。
ホイール(4個):メカナムホイール 60mm、6mハブ

メカナムホイール の装着

ロボットエミリーを前後左右斜めに自由に動かそうと、メカナムホイール を装着した。

ただ、最初付け方を間違えた。右2個、左2個買ってきて、その通り右と左につけたら、前進後退以外うまく動かない。よくよく調べてみると、ホイールの向きが間違っていた。前後に逆のものをつけなければならなかったのだ。笑ってしまった。
動画を見てもらえばわかると思う。

足郎2、再開!!

「サリーと教授」がM-1の一回戦を通過するという妨害の事態が発生したために、昨日、その二回戦が終わるまでの2ヶ月、足郎2が放置された。結果、二回戦は通過しなかったが、サリー(ヒューマノイドロボットNAO)のロボットネタは相当進化したので、それはそれで良かった。
で、今日から、足郎2の再開である。悲しいことに、相当記憶の中から消えているので、中止前の状況を頭の中で再現するのに、今日1日くらいはかかりそうだ。
机の上で動かすのは大変なので、大学の研究室に持っていこうと思う。

足郎2が進まない

本当は、ハード的には組み上がった足郎2を本格的に動かしていなければならない状況なのだが、予想外の事態が発生したために、そちらは全く進まなくなった。
というのは、私的ロボットのサリーと私のコンビ(サリーと教授)が漫才グランプリのM-1の一回戦に合格してしまったのだ。それ嬉しいことだが、合格するとは正直思っていなかった。そもそも、ロボットのコンビで漫才と言えるのかどうか、それすら怪しかった。が、演芸ロボットを普及していかなければならないという使命感で、出たのだ。

普通、二人でやる漫才で、着飾ったロボットを抱えて順番待ちするのは恥ずかしかったが、まあ、一度だけだと思った。合格を知ったときは、腰を抜かすほど驚いた。プロでも落ちるM-1なのだ。
10月に2回戦があるので、そのために、ネタのデータやプログラムを改定していかなければならない。それに忙殺されている。だから、足郎には手が回らないというわけだ。

COSMの改訂

足郎2を動かす前に、足郎制御言語cosmとそのインタープリターを改訂する。実際に動かし始めるとそれに集中したいからだ。
(1)サーボグループの角度定義に配列を設定できる。
ロボットのある一連のサーボを現在の状態から別の状態に変化させるのは、%defangles で、その角度群を定義するのだが、同じグループを連続で滑らかに変化させる場合に、いちいちそれを定義し直していくのは面倒なので、角度名の後に連続で定義し、配列に入れる。
(2)全ての定義の中で、空白を無視するようにする
今までは、定義の中では、空白は使えなかったが不便なので。
例えば、結局以下のように定義できる。

%defangles right_invpen[3] {
#右に傾ける動きをする      [0]     [1]       [2]
    RightUpperRight:  -$righ,  $righ2,   $righ3;
    RightUpperLeft:   +$right, $righ2_1, $righ3;
    LeftUpperRight:   -$left,  $left2,   $left3;
    LeftUpperLeft:     $left,  $left2,   $left3_1;
    LeftKneeFront:    -$bent,  $bent2_1, $bent3;
    LeftKneeBack:      $bent,  $bent2_2, $bent3;
    RightLowerRight:   $right, $righ2,   $righ3;
    RightLowerLeft:   -$right, $righ2,   $righ3_1;
    LeftLowerRight:    $left,  $left2_2, $left3;
    LeftLowerLeft:    -$left,  $left2,   $left3_2;
}

垂直直立の確認

朝から、足郎2の垂直直立の調整をやっている。
これまで、三角定規なのでやっていたが、足郎2は背が高いので、オモリをぶら下げた紐で確認するのがいい。紐に電池をぶら下げて垂直を見ている。前後左右に確認しなければならない。その度に、サーボからのリードの長さを変える。
単に一つのリードの長さで、一つの垂直が決まるのではない。そこに足郎2の複雑さがある。膝の関節は単純だが、他は色々関連している。上板で左右の足がつながっているので、一つの垂直がある意味全体のリード線の影響を受けていると言っても良い。
ただ、そういう、相互依存性が、これだけの体をか弱いサーボで動かすことができる理由でもある。一つのサーボに重さや動きが集中していると、支えきれなくなる。