Contenu connexe
Similaire à PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~ (20)
Plus de Daisuke Imai (16)
PythonからV-Sido CONNECTで ロボットを操る ~ ハードウェアの絡んだ仕組みの制御を考える ~
- 5. 今井 大介 IMAI, Daisuke
1972/07/17生まれ43歳
アスラテック株式会社
事業開発室 ロボットエバンジェリスト
「ロボットと、ロボットアプリケーションを作れるエ
ンジニアを増やして、世界中がロボットだらけになれ
ばきっと世界はもっと面白くなる。」
- 20. 85
E W BPN TRCV
85 PN
S B B
28 5 -‐‑‒
34
O MI
- 37. 85
E W BPN TRCV
85 PN
S B B
28 5 -‐‑‒
34
O MI
- 50. 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
- 57. 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
- 59. # 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);
- 82. 85
E W BPN TRCV
85 PN
S B B
28 5 -‐‑‒
34
O MI
ウェブブラウザ
WebSocket
- 86. <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
というメッセージを投げる
- 88. 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")
- 92. 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")