複数ロボット会話システムとTkinter連携
複数ロボット会話システムとTkinterによるGUIシステムを連携したロボット案内システムを開発した。
PythonのGUI(Graphical User Interface:グラフィカル・ユーザ・インタフェース)ライブラリの一つであるTkinterで案内画像や案内文をディスプレイに表示させて、複数のロボットが案内を行うシステムです。
TkinterはPythonの標準ライブラリに採用されているGUIライブラリです。
クロスプラットフォームでGUIアプリを作成できる点は他のライブラリと同様です。
Python/Tkinter は、イベント駆動方式です。
GUI アプリケーションの場合、ユーザーからの入力やシステムの状態変化(タイマーなど)など、ある出来事をきっかけにプログラムが実行されます。
この出来事を イベント(event) といい、イベントをきっかけにしてプログラムが起動されることを イベントドリブン(eventdriven:イベント駆動) といいます。
後ろのディスプレイに案内画像と案内文を表示させます。
ロボットは3体で、左右のロボット(ぬいぐるみ)が交互に案内を音声でします。
また、3体のロボットは、首を振ったり手を動かしながら案内をします。
複数ロボット会話システムとTkinterによるGUIシステムは、インターネットに接続しており、各々の動作はWebサービスAPIで同期をとっています。
Tkinterは、起動して画面が表示されるまで、5~6秒程の遅延があります。
Tkinterが完全に立ち上がって画面が表示されるのを待って、ロボットは、案内を開始します。
Tkinterシステムが完全に立ち上がると、サーバーに立ち上がったことを知らせます。
ロボットは、WebサービスAPIで、立ち上がりを監視していて、立ち上がりを確認してから案内を開始します。
Tkinterの after() メソッドについて
今回は、TkinterによるGUIシステムですが、マウスによるクリック入力がなくても画像やテキストを更新さないといけなので、プログラム自身でなんらかのきっかけを作ってやる必要があります。
このような場合、役に立つメソッドがTkinterの after() です。
時間によるイベント駆動です。
root.after(msec, command)
指定した時間経過後 command を実行 (固有番号 id を返す)
このように、after() には単純な時間待ちを行うほかに、一定時間後に指定した command を起動するタイマーの働きも持っています。
たとえば、一定間隔で実行する関数を talk() とします。
この場合、talk() 関数の最後で after()メソッド を使って自分自身の起動を設定します。
具体的には次のようにプログラムします。
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 |
def talk(): global root while True: try: mskcdown() # クライアント管理辞書ダウンロード if MSKCDIC['ss'] == '11': break if MSKCDIC['ss'][0] == '0': root.quit() speak('シャットダウンします。','wn','s001k1','0') os.system('sudo shutdown -h now') # シャットダウン if MSKCDIC['ss'][1] == '0': # Wait on ? #print('sibai-sleep(0.5) wait for all member standby!') if MSKCDIC['ss'][0] == '0': root.quit() speak('シャットダウンします。','wn','s001k1','0') os.system('sudo shutdown -h now') # シャットダウン sleep(0.5) continue if MSKCDIC['ss'] == '23': # サーバープログラムが番号入力待ち時に、MSKCDIC['ss']に'23'をアップロード tkinterup(tf='0',t1='0',t2='0') # tkinter立ち上がり初期化(tf='0') sleep(10) root.quit() # 番号入力待ちで、GUIをリセット。 sys.exit() continue # ss = '11'になって、全てが待機中で以下の処理が実効される。 except Exception as e: print('except-simappo-sibai-Error1') print(type(e)) print(e) EXCEPT = 'except-simappo-sibai-Error1 ' + str(type(e)) print('mskcdown()-Error-継続実効します') continue break for key,item in TALKDIC[MSKCDIC['skey']].items(): tp = MSKCDIC['skey'].find('-') titletxt = MSKCDIC['skey'][5:tp] if 'PFM' in key: continue cp = key.find('-') index = key[(cp + 1):] if int(index) == int(MSKCDIC['sindex']): # sindexと同じか? cp1 = key.find('$') imgn = key[(cp1+1):cp] # イメージファイル名抽出 '0.gif' #print(imgn) sibai_images.insert(0,tk.PhotoImage(file = "/home/pi/ai/sima-images/" + imgn)) # イメージファイル設定 RESPONSE = item # 会話テキスト設定 break continue # コンテンツ表示 response_area.configure(text=RESPONSE) # タイトル表示 response_area1.configure(text=titletxt + ' (' + str(int(MSKCDIC['sindex']) + 1) + '/' + str(len(TALKDIC[MSKCDIC['skey']]) - 1) + ')') canvas2.itemconfig( on_canvas, image = sibai_images[0], ) print('sibai-会話スタート') print('tkinter立ち上がり完了') tkinterup(tf='1',t1='0',t2='0') # tkinter立ち上がり完了(tf='1') root.after(1000, talk) # (1秒)タイマーイベント生成 |
案内内容は、四万温泉の摩耶姫伝説の紙芝居です。
紙芝居の画像と紙芝居の文言をディスプレイに表示させて、下のロボットたちが交互に紙芝居の文言を発声します。
このシステムは、四万温泉観光協会で稼働しています。
複数ロボット会話システムとTkinterによるGUIシステム
複数ロボット会話システムとTkinterによるGUIシステム
複数ロボット会話システムとTkinterによるGUIシステム
群馬プログラミングカレッジでは、子どもから成人を対象にしたプログラミング教室です。
現在、開発しているシステムです。
・複数ロボット自然会話システム
・案内ロボット
・自然会話ロボット
・教育ロボット
・IOTシステム
開発言語は、python、PHPなどです。
ロボットは、Raspberry Pi などのマイクロコンピュータを使用しています。
子どもたちは、Scratchビジュアルプログラミング言語から学び、上級生は並行してpythonプログラミング言語を学びます。
Scratchプログラミング、pythonプログラミング、PHPプログラミング、IOTシステム開発、AIロボット開発に興味がある方は、ご連絡ください。