SSブログ

SpotMicro(mini) その28 ーリモコン そうだIphoneを使おう (その4)ー [ROBOT]

ということでリモコンプログラムがとりあえずできた。


現状のソースをなんと惜しげもなく(恥ずかしげもなく)公開する




#
#
import socket
import ImageFile
import Image
import ui
import io
import base64
import ui
import time

def onAction(sender):
	bt=sender.title
	
	cmds={
		'歩':'stp','座':'sit','立':'std','伏':'lie',
		'前':'fwd','停':'sto','後':'bck','左':'lft',
		'央':'ctr','右':'rgt'}


	soc.send(bytes(cmds[bt],'utf-8'))
		
def addButton(_title,x,y,_height):
	btn = ui.Button(title=_title)
	btn.bounds=(0,0,_height,_height)
	btn.font=('',30)
	btn.background_color='#f0f0f0'
	btn.flex =''
	btn.center=(x,y)
	btn.action=onAction
	return btn
	

soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
soc.connect(("192.168.11.129",11320))


v=ui.View()
v.title='SpotMicro Control'
v.name='SpotMicro Control'
v.background_color='#aaaaaa'
iv = ui.ImageView()
v.present(style='fullscreen',orientations=['landscape'])


iv.flex='LRB'
iv.ackground_color='yellow'
iv.bounds=(0,0,400,300)
iv.center=(v.width/2,150)
LeftAllign=60

btnHeight=40
RightAllign = v.width-btnHeight
BottomAllign = v.height-btnHeight/2

btnStp= addButton('歩',LeftAllign,btnHeight*1,btnHeight)
btnSit= addButton('座',LeftAllign,btnHeight*2.5,btnHeight)
btnLay= addButton('伏',LeftAllign,btnHeight*4,btnHeight)
btnFwd= addButton('前',RightAllign,btnHeight*1,btnHeight)
btnBan= addButton('停',RightAllign,btnHeight*2.5,btnHeight)
btnBck= addButton('後',RightAllign,btnHeight*4,btnHeight)
btnCtr= addButton('央',v.width/2,BottomAllign, btnHeight)
btnLft= addButton('左',v.width/2-70 , BottomAllign,btnHeight)
btnRgt= addButton('右',v.width/2+70 , BottomAllign,btnHeight)


v.add_subview(iv)

v.add_subview(btnStp)
v.add_subview(btnSit)
v.add_subview(btnLay)
v.add_subview(btnFwd)
v.add_subview(btnBan)
v.add_subview(btnBck)
v.add_subview(btnCtr)
v.add_subview(btnLft)
v.add_subview(btnRgt)


while True:
	line = soc.recv(32).decode()
	head=line.split(':')
	tag=head[0]
	frm=int(head[1])
	tim=int(head[2])
	siz=int(head[3])
	
	len=siz
	if tag == 'jpeg':	
		img=''
		buf=soc.recv(siz,socket.MSG_WAITALL)
		jpg=base64.b64decode(buf)	
		parser = ImageFile.Parser()
		parser.feed(jpg)
		jpgimg = parser.close()
		
		with io.BytesIO() as bIO:
			jpgimg.save(bIO,'png')
			img=ui.Image.from_data(bIO.getvalue())			
		
		iv.image = img



解説を期待している人はあまりいないだろうが、そんなのは無視してやると、
インポートのブロックのあとにあるonAction関数は、ボタンを押された後の動作を行う。
ボタンが押されると、onActionは、Senderを受け取る。senderには、押されたボタンのオブジェクトが格納されており、そのボタンのtitle を読みだしたことで押されたボタンの正体が判明し、それから
コマンドを送る
cmds配列は、ボタン名からコマンドへの変換テーブルで、コマンドは半角3文字とした。
コマンドが押された後の動きは、受け取った側でコントロールする。
選択されたコマンドは、socで指定されるソケットにより、commanderに送信される。
コマンドは、3文字の固定長文字列としている。

次のブロックは、ボタンを定義するサブルーチンで、画像にあるような9個のボタンを画面上に配置するために、タイトル、X位置、Y位置、ボタン高さ(幅)を指定する。

ボタンを押されたときの処理を決定するonAction関数を設定している。

これ以降はメインプログラムで、最初はソケットの作成を行っている。
ソケット作成した後、ベース画面を作成し、画面タイトル、背景色などを設定している。
ui.viewでは、titleではなく、nameで名前を設定するようだ。

iv は、受信した画像を表示するためのImageViewを指定する。Iphoneの画面は、本当は縦長なのだが、横位置に指定したかったので、背景windowを横位置にして、そこから計算される縦位置から、400x300にサイズを決定した。

次のブロックは、ボタンを配置している。画面の左に3個、右に3個、下に3個だ。

次のブロックで、作成した画像window、ボタンを背景に追加している。

whileから始まるブロックで、画像を受信する。
画像は、32バイトで指定される、フレーム番号、フレーム時刻、サイズで指定されたヘッダをまず受け取り、ここで、指定されるサイズバイトを実際に受け取り、バッファに格納している。
画像自体は、JPEGであるがバイナリによる動作の不安定さを防ぐために、いったんBase64に変換したもので通信している。
受け取ったバッファを、Base64でデコードした後ByteIoを使って、Jpegイメージかして、それを先ほど作った画像Windowに張り付けているということになる。


ただ、このプログラムには欠点があり、それを直さないといけないとは思うんだが、ほおってある。




コメント(0) 
共通テーマ:趣味・カルチャー

SpotMicro(mini) その27 ーリモコン そうだIphoneを使おう (その3)ー [ROBOT]

ちょっと時間がかかりった。
前回の作戦をもとに、Pythonista3で作っていましたが、いろいろUI上の癖みたいなのがあって、
向こうが期待している通りの設定をしないとうまく動いてくれない感じでしたが、
とりあえずUI部品の配置を終えて、だいたいの遅延を計測するまではできるようになった。



ボタンは配置してあるだけでライブではありません。
とりあえず、画像が転送できるところまでできたので。

コメント(0) 
共通テーマ:趣味・カルチャー

SpotMicro(mini) その26 ーリモコン そうだIphoneを使おう (その2)ー [ROBOT]

Pythonistaを用いたROSでの発信(トピックのパブリッシュ)はできたけど、サブスクライブができないのは、前言ったとおりだ。

すべてがROSの世界で実現できるとすると、こんな感じを予定してた。

ros.jpg

が、実際にやってみるとできなかったわけである。この絵でいうところのIPhoneで、CompressedImage
を使うところがうまくいけないわけだ。

そこで、どうするかを考えた。
1PythonistaのROSの環境の動かない理由を探索して、修正して動くようにする。
2ROSをpyto上のインストールして、使えるようにする。
3SpotMicroから出力されるJpegイメージをいったん別のノードで受けて、それをROSではない普通のソケットストリームに変換して、IPhone上のPythonista で受信する。


1番2番の方法は、世の中的にも紹介している人があまりいないので、できれば、すごく有名になれるチャンスかもしれないが、逆に言うと、IPHONEをROSの端末として使うことはあまり需要がないのかもしれない。あと、私は、IPhoneしか持ってないので、エディタの字が小さくなってきてちょっと厳しい。

ので、正攻法?とでもいえる3番を使うことにした。
とすると、上記の図は、以下のように変更する。

rosChange.jpg

カメラ画像はいわゆる動画ではないが、JPEG画像が連続して飛んでくる来るわけで、とても忙しい処理をしないといけない。Pythonは、インタプリタ言語であるので、普通のコンパイラ言語よりは遅い。
処理的に間に合うかが問題となりそう。

とりあえず、連続する画像をしばらく見ることはできた。


タグ:Pythonista ROS robot
コメント(0) 
共通テーマ:趣味・カルチャー

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。