pythonからv-sido connectで ロボットを操る ~...
TRANSCRIPT
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: [email protected] twitter: @hine
Facebook: hine.gdw
本日のコード https://github.com/hine/PythonVSido
SIMATIC PC STEP 7 によるハードウェアと SIMATIC PC 5 · PDF filestep 7 によるハードウェアと通信接続のコンフィグレーション マニュアル, 03/2012,
Drobo 5N スタートアップガイド...Drobo 5N スタートアップガイド 3 作業を開始する前に Drobo 5N の設定を開始する前に、システムとハードウェアの要件を確認することをお勧めし