29このサイトについて本サイトは舞台に立てるロボットを目指して、私が取り組んでいるプロセスを、主として記憶のために書き連ねているものです。ロボット作りすけるくんの課題あるテレビ番組のオーディションが夜にあって、それに向けて、またその場で浮かび上がった課題を記しておく。移動する際、振動が発生する理由は、モーターを取り付ける金具が、振動するためだと思う。そこで、モーターをさらに固定するアルミ板を当てる必要がある。(2)音声デバイスのカード番号、デバイス番号が適当に変わるので、プログラムで読み取って出力時に自動的に指定するようにすべきだ。(3)エンコーダーによる回転の把握を、より細かくして、その粗さからくる四つのモータの停止位置の微妙な差をより小さくすべきだ。ロボット作りすけるくんver.2の本体作り終わるすけるくんの最初のバージョンを抜本的に組み直した。春休みのおかげで、ほぼ引きこもりで作業してきた。主な変更点は次の通り。(1)衝撃にも壊れにくくする(2)前後左右に超音波距離センサーを動かすことができる(SPIでデータ取得)(3)エンコーダーで4個のモーターの回転数を独立にカウントできる(SPIでデータ取得)(4)新基盤の上に制御ボードを配置、部品を圧縮配置(5)6電池を廃止し、12V(X4)のみにした、外部電源は24Vのまま(6)非接触型DCDCコンバータを並列にして、5V電源の容量を増大させた以上に伴い、その他、細かい仕様の変更を行った。音声出力は、12.5X12.5のまま。音声認識マイクもそのまま。ロボット作り二つのデバイスを、二つのMCP23S17で同時に制御するその動画をyoutubeにアップしました。https://youtu.be/u_VU2cOFWVYデバイスアドレスを0、1に区別することで、一つのSPIチャンネルで別々に制御できることが確かめられた。ロボット作りCで書いた距離センサモジュールをjavaから呼び出す4つの距離センサは、Cで制御し、4つのモータのエンコーダーからの回転数取得はjavaで制御しなければならない事情を先に書いた。そこで、2つのMCP23S17を使って、それぞれを距離センサとエンコーダ処理用にする戦略をとることにした。一つのSPI0チャンネルに、上記の二つのMCP23S17をバスでぶら下げることにする。デバイスの識別は、A0,A1,A2端子を1、0で区別すればいい(8個区別出来る)。基本的に、0番と1番のデバイスにする。距離センサはCプログラムで制御するのだが、ロボットの方は、javaで制御システムが書かれているので、センサのCプログラムは、ライブラリ化(libdistance.so)して、jna経由で、javaから直接そのライブラリを使うようにすればいい。そのようなファイルやディレクトリはありません」というエラーが出る。(4.5.1)とraspberrypiの何らかの相性が悪いという判断をした。同じ状況で、linux(ubuntu16.04)では、ちゃんと動くのだから。これは間違っているかもしれない。私の能力の範囲での結論はそうなのだ。去年ちゃんとraspberrypi上で動いたjna.jarを持ってきて、それでセットしたらちゃんと動いた。一つ、こちらは大したことはないのだが、wiringPiのライブラリもちゃんとくっつけて、libdistance.soを作成しないと、wiringPiの関数が見つからないと怒られる!プログラムをいかに掲載する。distance.cは以下のようになる。(int)distance;}これをコンパイルするためには次のようにする。-lwiringPi最後に、wiringPiのライブラリをくっつけているところ大事。いうのも、これをつけなくても、コンパイル自身は難なく通ってしまうから、実行時に叱られる。ldconfigとかする。../XXXはlibdistance.soをおく場所である。/etc/ld.so.conf.dの設定ファイルに、そのパスを書いておき、ldconfigを実行するとかする。}}こちらは特に問題はないだろう。ロボット作りMCP23S17を使って、US-015の距離センサーを動かすロボットに四個の距離センサーをつけたい。四方の距離をいつでも測りたいというわけだ。US-015は、音波を発信してその跳ね返り時間で距離を測る。音を出すトリガとエコーを受け取る2つのgpioを消費する。八個のgpioを直接ラズパイのポートから取るというのは勿体なさすぎる。そこで、spiモジュールを使って、ラズパイのgpioを拡張してそこから取りたい。モーターの回転数をMCP23S17経由で取るというのは成功した。JAVAのpi4jを使って。距離センサーは、同じようにpi4jでやろうとしたのだが、うまくいかない。超音波の発信と受信は、微妙な時間のタイミングで行われるので、どうもpi4jのライブラリとの相性が悪いと思った。そこで止むを得ず、CのWiringPiライブラリで動かすことにした。https://youtu.be/1zhjbX62gA8ただ、問題はある。モータ制御との整合性だ。モーターは、JAVAで、距離センサーは、Cというのは、何しろ一つのMCP23S17なので、見るからにうまくいきそうにない。両方Cで書くしかないが、モータの方はピンの値の変化をpi4jの割り込みで取っているので、それを割り込みを使わないでやれるようなCのプログラムを書かなければならない。それが面倒だ距離センサのプログラムを以下に掲載しておく。ロボット作りエンコーダー付きDCモーターの回転数を取得するエンコーダー付きDCモーターから回転数を取得する。モーターは前に書いたpololuの12Vモーター。https://www.pololu.com/product/2824モーターの配線に関する情報は上記にある。モーターは四個あり、回転数の分解能を大きくするためには、各モーターがgpioを2本使う。これを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を実際にそれがある場所に変更しなければならない。プロジェクト化できる。サンプルの中のIplImageデータの中に、カメラで取得したデータ、RGBそれぞれ1バイトずつ入っているので、それを利用すればいい。戦略としては、画面データを様々なパターンで分割して、どこに標識があるのかを見極めよう。そのために、ディープラーニングで得られたパターン認識力を使う。ロボット作り「すけるくん」のプロトタイプこの間、インフルエンザのA型になって外出ができなくて、家に閉じこもっていた。その時間を利用して、なんども組み立て直していた「すけるくん」を、基本的に作り上げた。声かけに対して言葉を返したり、前後左右、回転などの動きをしたりする機能だけしか持たせていない。このモーターの前に、ダイセン社ロボサイトモーターを使ってみたが、トルクが174g-cmしかなく、5kg以上あるすけるくんをしっかりと動かすことができなかった。トルクは70倍になったことになる。最初付け方を間違えた。右2個、左2個買ってきて、その通り右と左につけたら、前進後退以外うまく動かない。調べてみると、ホイールの向きが間違っていた。前後に逆のものをつけなければならなかったのだ。動画を見てもらえばわかると思う。