/
sample.py
159 lines (134 loc) · 6.31 KB
/
sample.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# coding:utf-8
import time
import threading
import multiprocessing as mp
import queue
import sys
sys.path.append('../../')
import cv2
import mumeikaneshige as mk
import movidius
class SampleRobot(mk.Mumeikaneshige):
"""
中間発表で見せた挙動をするロボット
"""
def __init__(self):
# 親クラスのコンストラクタは最初に必ず明示的に呼ぶ
super().__init__()
# キーボード入力のスレッドの生成
self.key_queue = mp.Queue()
self.th_key_input = threading.Thread(target = self.key_input,
args = (self.key_queue,))
self.th_key_input.start() # スレッドをスタートする
# self.controllers['Arm'].cmd_queue.put(-20)
# 画像の中の棒で叩ける四角形の座標[(x1, y1), (x2, y2)]
self.smash_point = [(290, 330), (400, 350)]
# movidius召喚
path_to_graph = '../../movidius/graph'
categories = ('background','aeroplane', 'bicycle', 'bird', 'boat',
'bottle', 'bus', 'car', 'cat', 'chair','cow',
'diningtable', 'dog', 'horse','motorbike', 'person',
'pottedplant', 'sheep','sofa', 'train', 'tvmonitor')
self.ssd_detector = movidius.MobileSSD('../../movidius/graph', categories)
def key_input(self, key_queue):
while True:
keys = input() # 入力を受け取る
key_queue.put(keys, True) # 受け取ったら即キューに送信
def run(self):
# 実際の動作をここに書く
while True:
# Webカメラの画像を取得
frame1, frame2 = self.senders['Webcamera'].msg_queue.get()
# Movidiusで演算
result = self.ssd_detector.detect(cv2.resize(frame2, (300,300)))
# 人の座標
person_rect = None
for item in result:
if item['category'] == 'person':
person_pos = ((item['x1'], item['y1']), (item['x2'], item['y2']))
break
# 人が画像内にいない場合
if person_rect is None:
return 'extermed_coc'
# if 知っている人か
# wav ”@@さんこんにちは、何分お休みになりますか?”
# while 入力待ちjuliusからの文字列”**分”
# "**分で記録して”おやすみなさい” カウントダウンして待つ"
#else 知らない人か
# wav "誰ですか名前を登録します"
while True:
try:
# Webカメラの画像を取得
frame1, frame2 = self.senders['Webcamera'].msg_queue.get()
# Movidiusで演算
result = self.ssd_detector.detect(cv2.resize(frame2, (300,300)))
# 人の座標
person_rect = None
for item in result:
if item['category'] == 'person':
person_pos = ((item['x1'], item['y1']), (item['x2'], item['y2']))
break
# 人が画像内にいない場合
if person_rect is None:
return 'extermed_coc'
except queue.Empty:
pass
# キーボードのキューの確認
try:
keys = None # 何かしら入れておく特に大きな意味はない
# 0.1秒経過してもキューが空だったらmp.Empty例外が出る
keys = self.key_queue.get(timeout = 0.1)
if 's' in keys or 'S' in keys: #ストップ
self.controllers['Motor'].cmd_queue.put((0,0))
elif 'g' in keys or 'G' in keys:
self.controllers['Motor'].cmd_queue.put((10000, 10000))
elif 'r' in keys or 'R' in keys:
self.controllers['Motor'].cmd_queue.put((-5000, 5000))
elif 'l' in keys or 'L' in keys:
self.controllers['Motor'].cmd_queue.put((5000, -5000))
elif 'b' in keys or 'B' in keys:
self.controllers['Motor'].cmd_queue.put((-10000,-10000))
elif 'a' in keys or 'A' in keys:
self.controllers['Arm'].cmd_queue.put(50)
time.sleep(1)
self.controllers['Arm'].cmd_queue.put(-20)
elif 'e' in keys or 'E' in keys:
self.controllers['Motor'].cmd_queue.put((e,e))
else:
pass
except queue.Empty:
pass
# Juliusから送られる文字列の確認
try:
julius_msg = None
julius_msg = self.senders['Julius'].msg_queue.get(timeout = 0.1)
if '止まれ' in julius_msg:
self.controllers['Motor'].cmd_queue.put((0,0))
self.controllers['JTalk'].cmd_queue.put('./voice-sample/yes.wav')
elif '進め' in julius_msg:
self.controllers['Motor'].cmd_queue.put((10000,10000))
self.controllers['JTalk'].cmd_queue.put('./voice-sample/yes.wav')
elif '右' in julius_msg:
self.controllers['Motor'].cmd_queue.put((-5000, 5000))
self.controllers['JTalk'].cmd_queue.put('./voice-sample/yes.wav')
elif '左' in julius_msg:
self.controllers['Motor'].cmd_queue.put((5000, -5000))
self.controllers['JTalk'].cmd_queue.put('./voice-sample/yes.wav')
elif '下がれ' in julius_msg:
self.controllers['Motor'].cmd_queue.put((-10000,-10000))
self.controllers['JTalk'].cmd_queue.put('./voice-sample/yes.wav')
elif 'やれ' in julius_msg:
self.controllers['JTalk'].cmd_queue.put('./voice-sample/test.wav')
self.controllers['Arm'].cmd_queue.put(50)
time.sleep(1)
self.controllers['Arm'].cmd_queue.put(-20)
else :
pass
except queue.Empty:
pass
def main():
robot = SampleRobot()
robot.run()
del robot
if __name__ == '__main__':
main()