2017年4月9日日曜日

第14回:再出発

<再出発に向けて>
会社をリタイアして暇で始めたこのブログですが、2017年始めから再びフルタイムで働き始めてしまったので、しばし中断しておりました。新しい会社には画像解析AIの達人がいっぱい居ることから、このGOPIGOに人工知能を載せてみようと思う様になりました。さあ、ブログの再出発です。

GOPIGOを購入した目的は、ロボットとしての高度な機能を持たせてみるところにありました。残念ながら、まだそのレベルには全く至って居ません。もともとは、Google APIなどを利用して、高度な機能を利用することを考ておりましたが、最近いろいろと学ぶことが多く、GOPIGOが載せているRaspberry PI3でも、高度な機能をアプリケーションとして搭載することが可能である事がわかってきました。
GOPIGOに載せたカメラは、人の顔を認識するためのものです。基本方針としては、OPENCVというソフトウエアを活用し、顔検出し、顔データを取り出し、CNN(Convolutional Neural Network)あたりで学習させることで良いのではないかと考ています。

<Micro SDカードの変更>
実は、Open CVを実装しようとして、壁にぶつかってしまったのです。
今までは、Dexter Industriesが販売するMicroSDカードを使っていました。これが8GBの容量があり、十分だろうとタカをくくっていたのですが、Open CV をインストールするだけで、ほとんど制限領域まで行ってしまう事がわかったのです。他にもいろいろな拡張を今後プランするため、泣きながら、16GBのMicroSDカードに変更することにしました。この16GBのMicroSDカードは、このブログの第3回「GOPIGOの頭脳であるRaspberry PIを使えるように」でOSをインストールまでしたもので、今まで遊んでいたものを再利用するということです。
ということは、今までインストールして使っていた環境をまた作り直さねばならないということです。まあ、復習を兼ねてやってみましょう。

<SSH接続の設定>
全くの基本ですが、パソコン(私の場合はMACBOOK)とGOPIGOの組み合わせは必須で、SSH接続は基本中の基本です。IPアドレスは、ディスプレイを付けて確認すると、今までと同じでした。
ところが、MicroSDカードを変えて同じパソコンからSSH接続を試みると、厳しく拒絶されます。これはセキュリティ上重要なことだとはわかりますが、結構接続は大変になりそうです。でも、最初の接続は割と簡単であったことを思い出しました。
そこで、別のパソコン(これもMACBOOK)からSSH接続を試みると、簡単に接続できました。
Raspberry Pi には、SSHサーバーが標準で動いているので、新MACBOOKから
$ ssh pi@IPアドレス
にて、接続できました。(パスワードも確認しておいた)

<FTP接続の設定>
これは、第6回に書いた内容を参照ください。
参考までに、
$ sudo apt-get update
$ sudo apt-get install vsftpd
$ sudo service vsftpd stop
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf-ORG
$ sudo vi /etc/vsftpd.conf
実際は、変更箇所は、
write_enable=YES #書き込み許可

しばらく、このような振り返りが続くと思いますが、
最近、孫(きよなり君)のために、以下のビデオを作りました。2歳なのに保育所を移ったのでかわいそうだったのです。GOPIGOが機関車トーマス君になり得るか?ご参考まで。





2016年12月8日木曜日

第13回:GOPIGOにカメラをつけてみた(2)

GOPIGOにカメラをつけていたので、このカメラからライブ画像を取り出そうと、情けないことに、しばらく悪戦苦闘していた。
ネットでいろいろ探してみても、MJPGを使うとかMotionを使うとか、いろいろ出ていて、WEBカメラを使う例は多いが、PiCameraの場合まずどうすれば良いのか?よくわからなかった。

結論としては、MJPG-Streamerで、とりあえずMACやIPHONEにローカルではあるが、ライブ的(多少カクカクしている)に簡易に表示できることがわかったので、このブログに書いておく。とりあえず、ローカルな実験範囲での報告である。

参考になったブログは、実はWEBカメラを使っているが、そのままPiCameraに使えたので、その点は参考になるだろう。MJPG-Streamerのインストールについては、このブログのままでOKだった。実際には、WEBカメラでも良いとわかったことから、別のブログも参照した。同じ事が書いてある。やったことは、以下だ。

$ sudo apt-get update
$ sudo apt-get install subversion libjpeg-dev imagemagick
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg- streamer
$ cd mjpg-streamer
$ make
先ほどのブログを参照して頂くのが、最も正しいと思うが、一応書いておいた。私の環境では、8080ポートを使っているので、そこがちょっと違うだけだ。
以下のコマンドを実施すれば、GOPIGOのPiCameraから、ライブストリーミングを出力する。
$ ./mjpg_streamer -i "./input_uvc.so -y" -o "./output_http.so -w ./www"
ライブストリーミングを見るには、IPアドレスが、192.168.3.6の場合は、私のMACでは以下で
http://192.168.3.6:8080/stream.html
ブログの通り、MJPGのデモ画面が表示され、その中にライブ画像が出てくる。
これも、ブログに丁寧に記述して頂いているとおり、
http://192.168.3.6:8080/stream_simple.html
とすれば、ライブ画像だけが表示される。Iphoneでも全く同じなので、これで、Iphoneで、同じ無線LANの範囲であれば、GOPIGOのPiCameraライブを見る事ができる。多少カクカクしているが、これだけ簡便に表示できるのであれば、監視カメラ的には十分かなと思う。
 いつものことながら、ブログの作者様には、感謝申し上げる。そういう意味でも、私も他の方々の便益になるようなブログを書いておこうと思う。

ライブで見てみた感じでは、1秒程遅れて、多少カクカクしているので、画像を見ながらリアルタイムにGOPIGOを制御するのは難しかろう、という印象だ。以下にテレビ画像をGOPIGOのカメラで写し、iphoneでストリーミングを見ているところをビデオ撮影してみた。少々カクカクしている様子も少しはわかるかと思う。









2016年11月25日金曜日

第12回:GOPIGOの頭脳であるRaspberry PIを使える様に(2)

以前から、SSH接続で進めて来たが、その際良く出てくる言葉としてVNCというものが有った。正直良く理解せずに居たが、一度トライしてみた。

私の今のGOPIGOの環境は、今までの経緯で様々なプログラムがインストールされてしまっているので、このブログをご覧になった方が同じ事をしても結果が同じかどうか私にはわからないが、Chrome ブラウザを使い、アドレス欄にxxx.xxx.xxx.xxx  要はGOPIGOのIPアドレスを入力してENTERするだけで、以下の画面がWEBブラウザに現れた。
ここの、Launch VNCをクリックして、画面上表示されているパスワードをそのまま入力してあげると、
なんと、GOPIGOをテレビに接続した時と同じ画面が、MAC book airのウエブブラウザの一画面として表示された。これがVNC接続なのか、と感心することしきり。画面は多少小さくはなっているが、HDMI接続でテレビに映した時と同じ操作ができる様だ。このウエブブラウザの中で、ターミナル画面も開ける事が確認できた。何も知らずにやってきて、無知というのは恐ろしいものだ、と変に感心してしまった。こんな画面が見れるのなら、テレビは不要ですがな。
でも、まあSSHが使えれば、それで十分かもしれない。VNCは、例えばCAMERA PREVIEWなど使って来た機能であるが、VNCの場合は画面に表示されない、とか制限も多い様だ。
ご参考まで。

2016年11月24日木曜日

第11回:GOPIGOをPYTHONで自律駆動させる(2)


<GOPIGOに動きながら状況を報告させる>
GOPIGOの自律駆動をさせたとき、プログラムでは状況をPRINTしていたので、ターミナル画面を見ると、状況がわかるのだが、実際は後で確認する程度にしか使えなかった。デバッグで使う程度だ。
前回、前々回とGOPIGOに発声機能を追加できたことから、PRINTの代わりに状況を言葉で発すれば、見ている人がよくわかると気がついた。

そこで、障害を検知した場合、右・左の判断について、GOPIGO自身がその場で声を出す事にした。このような使い方では、現状ではOPENJTALKは、反応が遅いので多分使う気にはならず、AquesTalkを自然と使う事になった。
プログラムは以下の通り。先回のプログラムを多少変更し、発声部分を追加した程度。

from gopigo import *
import time
from time import sleep
import subprocess

enable_servo()
servo(90)
distance_to_stop=20 #Distance from obstacle where the GoPiGo should stop
print "Press ENTER to start"
raw_input() #Wait for input to start
fwd() #Start moving

while True:
dist=us_dist(15) #Find the distance of the object in front
print "Dist:",dist,'cm'
if dist<distance_to_stop: #If the object is closer than the "distance_to_stop" distance, stop the GoPiGo
print "obstacle"
stop()
subprocess.call('/home/pi/aquestalkpi/aquestalkpi/AquesTalkPi "障害です。止まります。" | aplay', shell=True)

servo(20)
time.sleep(2)
dist=us_dist(15)
print "Right Dist:",dist,'cm'
a=dist
servo(160)
time.sleep(1)
dist=us_dist(15)
print "Left Dist:",dist,'cm'
b=dist
if a<=distance_to_stop and b<=distance_to_stop:
   servo(90)
   time.sleep(1.0)
   bwd()
   time.sleep(0.5)
   stop()
   print "I gave up and stop!"
   subprocess.call('/home/pi/aquestalkpi/aquestalkpi/AquesTalkPi "身動きとれません。止まります。" | aplay', shell=True)
       #Stop the GoPiGo
       
   break
elif a>b:
   if a>distance_to_stop:
       right_rot()
       time.sleep(0.3)
       stop()
       servo(90)
       time.sleep(1)
       print "go right"
       subprocess.call('/home/pi/aquestalkpi/aquestalkpi/AquesTalkPi "右に進みます。" | aplay', shell=True)
       fwd()
elif b>a: 
   if b>distance_to_stop:
       left_rot()
       time.sleep(0.3)
       stop()
       servo(90)
                        time.sleep(1)
                        print "go left"
                        subprocess.call('/home/pi/aquestalkpi/aquestalkpi/AquesTalkPi "左に進みます。" | aplay', shell=True)
                        fwd()

time.sleep(0.1)
dist=us_dist(15)
time.sleep(.1)
実際に動かしてみると、確かによくわかる。実にリアルな印象だ。GOPIGOがロボットらしくなってきたぞ。でも、こうやって動かしながらパッシブスピーカーから声を出しても、あまり良く聞こえないぞ。やっぱり、ちゃんとアクティブ型スピーカーでしっかり音を出さないと無理が多いと合点した。
ということで、単4電池駆動の同種スピーカーをアマゾンで注文したら、翌日届くというスピード感はすごいね。
あちらこちらのブログに、ミニプラグ出力は音質が悪いと散々書かれているが、これも鳴らしてみて合点した。パッシブスピーカーでは、全く分からなかったが、ノイジーだね。まあ、Gopigoで音楽を聴く訳ではなし、Gopigoの騒音との競争だから、十分かなという印象だね。以下のビデオを見て下さい。障害にぶつかる手前で止まり、左右の距離計測をして、遠い方へ走る様に設定したが、両方20cm以下の距離の場合はギブアップする様になってます。



2016年11月22日火曜日

第10回:GOPIGOにスピーカをつけてみた(2)

今回は付け足しの投稿だ。
前回、音声合成ソフトウエアとして、Aquestalkを使った。Aquestalkは商用ソフトであるが、個人使用は無料という範疇のソフトである。
よくよく、ネットで調べてみると、どうやらOpenJTalkというソフトがオープンであり、主流の様だ。そこで、急遽、OpenJTalkについても試してみた。

いろいろと試していると、やっぱりスピーカがパッシブ型なので、音が小さい事が気になって来た。

OpenJTalkについては、これもやはりいろいろとブログに参考になる情報があふれている。このブログに従ってOpenJTalkにトライした。
プログラムのインストール等は、このブログの通りで、スムースにできた。Aquestalkで作ったテキストファイルを読まして比較したかったので、ブログにあるPYTHONのプログラムを多少変更して、テキストファイルから読み込む様にした。
#coding: utf-8
import subprocess
from datetime import datetime

def jtalk(t):
    open_jtalk=['open_jtalk']
    mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic']
    htsvoice=['-m','/usr/share/hts-voice/mei/mei_normal.htsvoice']
    speed=['-r','0.7']
    outwav=['-ow','open_jtalk.wav']
    cmd=open_jtalk+mech+htsvoice+speed+outwav
    c = subprocess.Popen(cmd,stdin=subprocess.PIPE)
    c.stdin.write(t)
    c.stdin.close()
    c.wait()
    aplay = ['aplay','-q','open_jtalk.wav']
    wr = subprocess.Popen(aplay)

def say_datetime():
    d = datetime.now()
    text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
    jtalk(text)

if __name__ == '__main__':
    f=open('shaberu.txt','r')
    k=f.read()
    jtalk(k)
変えたのは、メインルーチンで、shaberu.txtファイルを読む形に変えただけだ。あ、そういえば、少し発声を遅くするために、speed 設定を1.0から0.7に変えたことも書いておく。ブログを書かれたkkoba84さん、有用な情報を有り難うございます。関数を使わさせて頂いております。

Aquestalkと同じファイルを読まして比較して、OpenJTalkは、レスポンスが遅いことが気になった。声の調子などは、女性の明るい声に変えることで、OpenJTalkの方が良いと思うが、OpenJTalkは起動してから5秒程しずかなので、何か間違ったのかと思ってしまう。また、人との掛け合いの間が抜けてしまうかもしれない。遅くなる理由が何かあるとは思うが、他人のプログラムを活用させて頂いている関係で、よく理由がわからない。
Aquestalkは商用プログラムなので、応答性能は重視して開発しているだろうから、こういう差が出るのかもしれない。まあ、両方使いながら、実用性を比較して行こう。

kkoba84さんが、時間を読み上げるPYTHONプログラムを公開されているので、「今何時?」と聞けば、時間を答える、という時間応答ロボットをまず作ってみたらどうか?と思った。でもその為には、マイクをつけないといけないね。次はそれだね。

2016年11月21日月曜日

第9回:GOPIGOにスピーカをつけてみた


前回は、カメラを付けてみた。
これは、最初の目的であるGoogleのAPIを使って、写真に写った文字を読み取らせるために付けたものだ。でも、やっぱり読み取った文字は、GOPIGOが自分でしゃべるのが自然だろう。 そこで、カメラに引き続き、今回はスピーカに挑戦することにした。

Raspberry PIはLINUXなので、スピーカとしてUSBタイプのスピーカを付けることもできるが、アマゾンで探してみてもとても大きな物しか見つからない。GOPIGOに付けるというよりはGOPIGOがスピーカにくっついているのもいただけない。もともとRaspberry PIに装備されているミニジャックを使うのが最も簡単だし、安く小さな物も買える様だ。

いろいろな商品が出ていて、選択に悩む程であるが、うまくできるがわからないので、とりあえず安いものとして、ヤザワ プラグインスピーカー VRS202W (アマゾンで589円とお安い)を選択して購入した。小さく平べったくってGOPIGOのシャーシーに載せるにはぴったりと思った。これは、つけてみてわかったことだが、アンプがついていないタイプなので、Raspberry PIのボリュームを最大にしてやっと静かな部屋で聞こえる程度のものだ。でも、最初の実験としては安いしこれで十分で、本当に大きな声が必要ならアンプ付きの同種の物に買い替えれば良いだけだ。丁度同じタイプで厚さが少し厚いだけの電池アンプ入りの物(ヤザワ アンプリファイドプラグインスピーカー VRS203W:アマゾンで854円:最初からこれを買えば良かったか??)がある。

<接続>
ステレオミニジャックに付けるだけなので、当たり前の領域かと思っていたが、意外と奥が深い。普通、Iphoneに使われている4極ミニジャックは、4極目はマイク入力になっている。ところが、回路図を見ると、Raspberry PIのステレオミニジャックの4極目は、何とビデオ信号出力になっている。上記スピーカは、3極ミニジャックなので、そのまま差すと、ビデオ信号出力をGNDにショートすることになり、あまり電気的には宜しくない状況を作り出す。ミニジャック分配ケーブルの様なものを使えってスピーカ側を使えばベストだな。世の中のブログを見ても、気にせず(知らずに)直につなげている人が多いので多分大丈夫なのだろうが、心配性の私としては一応これも買う事にしよう。
<しゃべらせる>
ここでも、やっぱりブログを参照した。便利な世の中だ。他の人のためになる事を書いてくれている人がたくさん居る。私のこのブログも、同じ事をする人が参考になるように書く事にしよう。
ミニジャックを使う事にしたので、設定は簡単だ。Raspberry PIは、基本設定が、HDMIかミニジャックの自動設定になっている。従って放っておいても単純にスピーカをつなげれば音は出るはずだ。SSHでGOPIGOに入り込んで、ブログの通りにスピーカーのテスト
$ speaker-test -t sine -f 800
をしてみると、確かにプーという音が小さいが聞こえる。
音量は
$ alsamixer
で調整できる。結局、設定できる最大に近い値にした。
そこで、ブログに書かれている通り、Aquestalkをトライする事にした。

$ wget http://www.a-quest.com/download/package/aquestalkpi-20130827.tgz
$ tar xzvf aquestalkpi-20130827.tgz
$ cd aquestalkpi
までは順調であった。
ところが、
$ ./AquesTalkPi "あいうえお漢字です。" | aplay
がうまく動かない。仕方が無いので、AquestalkPiのホームページを調べて、
$ ./AquesTalkPi 漢字も読めます | aplay
と引用符を省いてみたところ、ちゃんと発声した。何かブロガーの人と環境や設定が異なるのかもしれない。テキストファイル(shaberu.txt)を作りAquesTalkPiと同じディレクトリに置いたら、
$ ./AquesTalkPi  -f shaberu.txt | aplay
としても、ちゃんとそのとおりしゃべった。但し、漢字の読みが一律であったり、不自然な感じはある。でも、無料版はこんなものだろうね。

まあ、目的がGoogleのAPIを使おうというところなので、APIから返されるtextを読み上げられればそれでよいので、こんなところで十分かと思う。


2016年11月18日金曜日

第8回:GOPIGOにカメラをつけてみた


GOPIGOをPYTHONで超音波距離センサーを使って制御し動かす方法は大体わかったので、次の目標として「カメラ」をトライした。
その中で気づいたことだが、GOPIGOのキットに付属していたMicro SDカードの容量が、4GBの仕様だったはずが、現物を良ーく見てみると、何と8GBのMicro SDカードが使われていた。うれしかった。すぐに、領域拡張を行なった。これで、ディスク容量を極度に気にする必要が無くなったのは大変有り難く、このままいろいろなことにチャレンジできそうだ。

<カメラの購入>
そもそも、今回アメリカから直接購入したキットには、カメラは含まれていない。日本でも購入できる事がわかっていたので、オプションとして発注もしなかった。
アマゾンで、いろいろ探したところ、少し旧いが、5MpixelのPICAMERAの新品をセールで1600円で売っていたので、迷わず購入した。新しくV2と言われる8MpixelのPICAMERAが売られているので、在庫処分されたのだと思う。あまりお金をかけたくない私としては、お得な気分。

<カメラの接続>
久しぶりに、Raspberry PiをGOPIGOから取り出した。GOPIGO基板とはピンの列で接合されているので、何度も抜き差しするのは、問題がありそうだ。なるべく付け外しの回数を減らすように努力している。
Dexter Industriesのページにもビデオで取り付け方を説明しているが、ブログに懇切丁寧に基板への取り付け方を説明しているところがあって、参考にした。リボンケーブルの表と裏を間違わない様に。

<カメラの動作確認>
ちゃんと動くかどうか心配だったが、Raspberry PiのLearning resourceというページにカメラの動かし方が書いてあったので、その通りにしたら画面に表示された。少し黄色い印象があるが、結構精細な画面(リアルタイム)がHDMI経由のテレビに映し出された。一応、SSHで制御しながら、HDMI接続しているので、Raspberry PIには、Micro USB ACアダプターと HDMIケーブルが接続されている。

<カメラの設置とスチル写真の撮影>
スチル写真も、プログラムを作り、FTPでGOPIGOに送り、SSHでプログラムを走らせ、又、FTPでMACに持ってくる事ができた。少々面倒くさいが、確認の意味ではこんなものか。
そこで、カメラをどのようにGOPIGOに設置するか悩んだあげく、上の写真の様につけてみた。人の顔を狙いたいので、サーボにつけるのではなく、シャーシに少々角度をつけて設置した。GOPIGOの上側のシャーシには、小さな細長い穴が開いていて、これが、丁度PICAMERAのリボンケーブルの大きさに合っていることがわかったので、そこを通すようにした。これでは、サーボの超音波センサーあたりが邪魔になるのではないかと思ってスチル写真をとってみたが、特にサーボは写っておらず、かなり上向きにとられている事がわかる。Google-APIのブログでは、広角のカメラアダプタを着けたようであるが、まあとりあえずは、これくらいで良いのではないかと思う。やっぱり画像が黄色っぽい。

今回は、Dexter industriesやRaspberry Piのホームページに載っている内容を単に確認しているだけの内容だが、私は全く初めてなので、一歩一歩確認しながら進めている。実際にやってみないとわからないことも結構多い。
GoogleのAPIを使って、こういった画像をアップすれば、例えば画像に文字が含まれていると、その文字を読み取って(OCR機能)返してくれるはずだ。それを読み上げることができれば、単なるおもちゃの領域から別次元へと移行することができる。そういうところを狙うには、スピーカも要る。会話をさせようとすると、マイクも要る。少し、時間がかかりそうだが、ますます面白いことにトライしたい。段々とロボットらしくなってくるぞ。   しかし、電池がすぐ減るのには閉口する。