109
2015/08/10 業務のためのPython勉強会#3

PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

Embed Size (px)

Citation preview

Page 1: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

2015/08/10 業務のためのPython勉強会#3

Page 2: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

こんばんは!

Page 3: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

突然参加させていただきました、 「今井」です

Page 4: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

っていうか、お前だれよ?

Page 5: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

今井 大介 IMAI, Daisuke 1972/07/17生まれ43歳

アスラテック株式会社 事業開発室 ロボットエバンジェリスト

「ロボットと、ロボットアプリケーションを作れるエンジニアを増やして、世界中がロボットだらけになればきっと世界はもっと面白くなる。」

Page 6: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

1997~ 【新卒】株式会社ベネッセコーポレーション インターネット向けサービスの実証実験

2000~ 【起業】ギガフロップス株式会社 携帯向けのポータルサイトの立ち上げ、副社長兼CTO

2003~ 【バイアウト】株式会社サイバード 事業並びに会社の売却→技術部マネージャ

2005~ 【Uターン】石見ケーブルビジョン株式会社 CATV事業の立ち上げでインターネット側の担当

2010~ 【再度上京】BEENOS株式会社 新規事業立ち上げ&技術担当執行役員、グループCTO

2015~ 【現職】アスラテック株式会社 色々な企業さんとのコラボを模索したり、エンジニアの方向けのサンプルコード書いたり

Page 7: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

簡単に言うと、 Web系からロボット系に ジョブチェンジした エンジニア的な人

Page 8: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

【得意な領域(Web)】 インフラ>サーバーサイド>

Webフロントエンド>NativeApp

【好きな技術】 AWS、WebSocket マイコンボード各種

Page 9: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

【言語歴】 BASIC(PC-6001から) アセンブラ(Z80) C/C++/Java

LINGO(Adobe Director) PHP/Ruby/Python

JavaScript Processing/ArduinoIDE

etc…

Page 10: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

Pythonにめっちゃ詳しいって わけではないです

(意訳:色々大目に見てください)

Page 11: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

V-SidoのPython向けのライブラリの パッケージを作りたいと思っていたので

作り始めるいい機会!

Page 12: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

アスラテック株式会社

Page 13: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

ロボットの制御OS 「V-Sido OS」

(「ブシドー」と読みます)

Page 14: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

!

Page 15: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

. ,  

Page 16: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

!

Page 17: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

���

�� ��� ����

!

Page 18: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

������ ������

���

���������

����

��� �� ��

����

�������� �����

���

Page 19: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

OS

��

��

Page 20: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

  85E W BPN TRCV

   

  85 PN

S B B

28 5 -‐‑‒

34

O MI

Page 21: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

���������� �

KJ R V

O-‐‑‒

W KJ S P

Page 22: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

��������

0 -‐‑‒

Page 23: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

Page 24: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

PythonからV-Sido CONNECTで ロボットを操る

~ ハードウェアの絡んだ仕組みの制御を考える ~

アスラテック株式会社 事業開発室 ロボットエバンジェリスト 今井大介

Page 25: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

【注釈】 超駆け足で行きますが、

slideshareでスライド共有、 githubでコード共有します。

あとPython3です(確認環境3.4.3)

Page 26: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

ハードウェアの絡む仕組みを 作ったことのある人~?

Page 27: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

ロボットとPython

Page 28: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

C/C++についで ロボット関連ではPythonが よく使われているようです (当社は違いますが)

Page 29: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

numpy/scipy OpenCV

Page 30: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

Choregraphと Python SDK

Page 31: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

本日使うライブラリ PySerial

Page 32: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

使ったことのある人~?

Page 33: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

シリアル通信

Page 34: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

デバイス同士が やりとりする仕組み

Page 35: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

RS-232C/RS-485 I2C/SPI USB

etc…色々ありますが

Page 36: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

パソコンのシリアルポート UART/USART

Page 37: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

  85E W BPN TRCV

   

  85 PN

S B B

28 5 -‐‑‒

34

O MI

Page 38: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~
Page 39: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

Bluetoosh SPPで 無線化されたシリアル通信

Page 40: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

シリアル通信の基本は 「送信」「受信」

Page 41: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

送信

Page 42: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

(デモ)

Page 43: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

受信

Page 44: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

(デモ)

Page 45: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

受信するまで待ってしまう (その間は何もできない)

Page 46: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

解法1:timeoutを設定する

Page 47: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

(デモ)

Page 48: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

解法2:受信を別Threadにする

Page 49: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

本日使うライブラリ threading

Page 50: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

def start_reciever(self): """ 受信スレッドを立ち上げる """ self.receiver_alive = True self.receiver_thread = threading.Thread(target=self._reciever) self.receiver_thread.setDaemon(True) self.receiver_thread.start()

def stop_reciever(self): """ 受信スレッドの停止 """ self.receiver_alive = False self.receiver_thread.join()

def _reciever(self): """ 受信データの処理 """ try: while self.receiver_alive: data = self.serial.read(1) if len(data) > 0: print(data) except serial.SerialException: self.alive = False raise

Page 51: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

どのような通信をすべきか (内容)

Page 52: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~
Page 53: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~
Page 54: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~
Page 55: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~
Page 56: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

まずは、コマンドを送信する 共通で使う関数を作る

Page 57: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

def send_data(self, command_data): ''' コマンド送信 ''' data_bytes = b'' data_str = [] for data in command_data: data_bytes += data.to_bytes(1, byteorder='little') data_str.append('%02x' % data) self.serial.write(data_bytes) print('> ' + ' '.join(data_str))

def _adjust_ln_sum(self, command_data): ''' コマンドデータのLN(レングス)とSUM(チェックサム)の調整 ''' ln_pos = 1 if command_data[0] == 0x0c or command_data[0] == 0x0d or command_data[0] == 0x53 or command_data[0] == 0x54 else 2 if len(command_data) > 3: command_data[ln_pos] = len(command_data); sum = 0; for data in command_data: sum ^= data command_data[len(command_data) - 1] = sum return command_data

Page 58: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

個別のコマンドの 生成関数を作る

Page 59: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

# V-Sidoで利用するコマンドやオペランドのクラス変数定義 COMMAND_ST = 0xff; COMMAND_OP_WALK = 0x74; # 't'

def make_walk_command(self, forward, turn_cw): ''' 歩行コマンドのデータ生成 ''' data = [] data.append(VSidoConnect.COMMAND_ST) # ST data.append(VSidoConnect.COMMAND_OP_WALK) # OP data.append(0x00) # LN仮置き data.append(0x00) # WAD(Utilityでは0で固定) data.append(0x02) # WLN(現在2で固定) # 速度ならびに旋回は-100~100を0~200に変換する data.append(forward + 100) data.append(turn_cw + 100) data.append(0x00) # SUM仮置き return self._adjust_ln_sum(data);

Page 60: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

V-Sidoのコマンドの数だけ この関数を作っていけばいい

Page 61: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

(デモ)

Page 62: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

やった!動いた!

Page 63: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

はて、本日の勉強会は なんの勉強会でしたっけ?

Page 64: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

業務のための Python 勉強会

Page 65: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

【質問】 ロボットは業務の役に 立つのでしょうか

Page 66: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

立つかもしれないし、 立たないかもしれない

Page 67: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

��������

0 -‐‑‒

Page 68: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

それだけだとアレなので

Page 69: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

IoTに応用することを 考えてみましょうか

Page 70: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

「ロボットとV-Sido CONNECT」を IoTデバイスだと置き換えて

考えてみる

Page 71: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

ちなみに、IoTが分かる人~?

Page 72: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

例えばArduino

Page 73: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

例えばRaspberryPi

Page 74: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

例えばIntel Edison

Page 75: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

センサーをつければ、 立派なIoTデバイスに

Page 76: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

【業務効率化アイデア】 部長に印鑑を欲しいが、 部長は外出が多くて、 席にいるタイミングを 見計らうのが大変。 何とかならない?

Page 77: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

部長の椅子のクッションの下に 圧力センサーをいれれば 座ってるのがわかるぞ!

Page 78: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

どうやって知らせる?

Page 79: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

やっぱWeb(イントラ)でしょ!

Page 80: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

ハードウェアとWebを繋ぐ

Page 81: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

ということで、ロボットを Webから操ってみます。

Page 82: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

  85E W BPN TRCV

   

  85 PN

S B B

28 5 -‐‑‒

34

O MI

ウェブブラウザ

WebSocket

Page 83: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

本日使うライブラリ Tornado

Page 84: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

せっかく歩けるようになったので 歩く機能をウェブに実装

Page 85: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

Web画面作った

Page 86: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

<script language="javascript"> var ws = new WebSocket("ws://localhost:8080/ws"); var sent_deleter = null; var receiverd_deleter = null; ws.onopen = function() { }; function OnWalkButtonClick() { ws.send("walk_forward"); } </script>

ボタンを押したら、 “walk_forward”

というメッセージを投げる

Page 87: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

サーバー側の実装

Page 88: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

class SocketHandler(tornado.websocket.WebSocketHandler): #on_message -> receive data #write_message -> send data

def open(self): self.i = 0 self.callback = tornado.ioloop.PeriodicCallback(self._send_message, 50) self.callback.start() print("WebSocket opened")

# origin check disabled def check_origin(self, origin): return True

def on_message(self, message): print("got message:",message) if message == "walk_forward": if vsidoconnect: vsidoconnect.send_data(vsidoconnect.make_walk_command(100, 0))

def on_close(self): self.callback.stop() print("WebSocket closed")

Page 89: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

受け取るだけだと、 IoT的にイマイチなので、 ハード側から送る機能も

Page 90: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

Web画面作った

Page 91: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

ロボットとどんなコマンドの やりとりをしたのかがわかる

Page 92: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

class SocketHandler(tornado.websocket.WebSocketHandler): #on_message -> receive data #write_message -> send data

def open(self): self.i = 0 self.callback = tornado.ioloop.PeriodicCallback(self._send_message, 50) self.callback.start() print("WebSocket opened")

def _send_message(self): if len(vsidoconnect.message_buffer) > 0: self.write_message(vsidoconnect.message_buffer.pop(0))

def on_close(self): self.callback.stop() print("WebSocket closed")

Page 93: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

(デモ)

Page 94: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

やった!動いた!

Page 95: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

これでセンサー情報とか ブラウザに簡単に 送ることができますね

Page 96: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

ハードウェアとWebは Pythonで

結構簡単につなげることができる

Page 97: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

UI作るのは PythonのGUIライブラリでも

いいけど JavaScriptの方が僕は楽 (分業もしやすいしね)

Page 98: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

業務効率化に ハードウェアを!

Page 99: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

ネットと連携するデバイス

Page 100: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

ウェアラブルデバイス

Page 101: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

新しい入力装置

Page 102: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

「モノ」ができると 楽しい。

(続けるモチベーション)

Page 103: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

色んなものが作れる。 もっともっとhackしよう。

Page 104: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

業務効率化に ロボットを!

Page 105: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

Page 106: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

なお…

Page 107: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

V-Sido公式で、 WebSocketで接続する JavaScript向けのAPIを

公開している模様

Page 108: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

何たる「車輪の再発明」!

Page 109: PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~

ご清聴 ありがとうございました。

email: [email protected] twitter: @hine

Facebook: hine.gdw

本日のコード https://github.com/hine/PythonVSido