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

Preview:

Citation preview

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

こんばんは!

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

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

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

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

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

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

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

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

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

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

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

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

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

Webフロントエンド>NativeApp

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

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

LINGO(Adobe Director) PHP/Ruby/Python

JavaScript Processing/ArduinoIDE

etc…

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

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

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

作り始めるいい機会!

アスラテック株式会社

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

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

!

. ,  

!

���

�� ��� ����

!

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

���

���������

����

��� �� ��

����

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

���

OS

��

��

  85E W BPN TRCV

   

  85 PN

S B B

28 5 -‐‑‒

34

O MI

���������� �

KJ R V

O-‐‑‒

W KJ S P

��������

0 -‐‑‒

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

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

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

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

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

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

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

ロボットとPython

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

numpy/scipy OpenCV

Choregraphと Python SDK

本日使うライブラリ PySerial

使ったことのある人~?

シリアル通信

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

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

etc…色々ありますが

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

  85E W BPN TRCV

   

  85 PN

S B B

28 5 -‐‑‒

34

O MI

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

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

送信

(デモ)

受信

(デモ)

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

解法1:timeoutを設定する

(デモ)

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

本日使うライブラリ threading

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

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

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

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

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

# 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);

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

(デモ)

やった!動いた!

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

業務のための Python 勉強会

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

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

��������

0 -‐‑‒

それだけだとアレなので

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

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

考えてみる

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

例えばArduino

例えばRaspberryPi

例えばIntel Edison

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

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

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

どうやって知らせる?

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

ハードウェアとWebを繋ぐ

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

  85E W BPN TRCV

   

  85 PN

S B B

28 5 -‐‑‒

34

O MI

ウェブブラウザ

WebSocket

本日使うライブラリ Tornado

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

Web画面作った

<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”

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

サーバー側の実装

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")

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

Web画面作った

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

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")

(デモ)

やった!動いた!

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

ハードウェアとWebは Pythonで

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

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

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

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

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

ウェアラブルデバイス

新しい入力装置

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

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

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

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

なお…

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

公開している模様

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

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

email: daisimai@asratec.co.jp twitter: @hine

Facebook: hine.gdw

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

Recommended