開発ブログ

第14回 パペロで顔追従をしてみた

投稿日時:2019年3月18日 09:03

こんにちは。ピャペロンです!
今回はパペロで顔追従をしてみよう。

あらかじめパペロシミュレーターを動かす環境を整えておこう。第2回 Windowsからパペロシミュレーターを動かしてみた
※実機のパペロで動作確認したのでシミュレーターでは上手く動かない可能性があります。

使用するソフト
・Windows 10
・テキストエディタ(Visual Studio Code
・Google Chrome
・Python 3.6.6 ※実機で動かす場合はPython 3.4で開発しないと動作しない可能性があります。

参考


中央ボタンで顔検出のオン・オフ
顔を検出するとパペロが顔の方向を向く
右ボタンで終了
このような動きを実現してみよう

  1. from logging import basicConfig, DEBUG
  2. basicConfig(level=DEBUG)
  3. import sys
  4. import pypapero
  5. from time import sleep
  6. def send_event_message(msg, end=False): #イベントメッセージを処理
  7.     if msg[0]["Name"] == "detectButton" and msg[0]["Status"] == "C": #中央ボタンが押されたら
  8.         if papero.on_detect_face: #顔検出中なら
  9.             papero.send_start_speech("顔検出を停止します")
  10.             papero.send_stop_face_detection(None) #実行中の顔検出を停止
  11.             papero.on_detect_face = False
  12.         else:
  13.             papero.send_start_speech("顔検出を開始します")
  14.             papero.send_start_face_detection(None,"higher") #顔検出を開始
  15.             papero.on_detect_face = True
  16.     elif msg[0]["Name"] == "detectFace": #顔を検出したら
  17.         right_eye_pos = pypapero.get_numstr_list_from_coord(msg[0]["RightEyePos"]) #検出した右目のピクセル座標を取得
  18.         right_eye_pos = [float(s) for s in right_eye_pos] #float型に変換
  19.         dist_pos = [x - y for (x, y) in zip(papero.pixel_center, right_eye_pos)] #検出画像の中心座標と右目の座標の距離を計算
  20.         dist_angle = [x / y for (x, y) in zip(dist_pos, papero.pixel_per_angle)] #首振りの角度を計算
  21.         horizontal_angle = str(round(dist_angle[0])) #首振りの水平角度
  22.         vertical_angle = str(round(dist_angle[1])) #首振りの垂直角度
  23.         horizontal_param = ["R" + horizontal_angle + "S300L"] #horizontalパラメータ
  24.         vertical_param = ["R" + vertical_angle + "S300L"] #verticalパラメータ
  25.         papero.send_move_head(vertical_param, horizontal_param, priority="higher")
  26.     elif msg[0]["Name"] == "detectButton" and msg[0]["Status"] == "R": #右ボタンを押されたら
  27.         papero.send_stop_speech()
  28.         papero.send_stop_face_detection(None) #実行中の顔検出を停止
  29.         papero.on_detect_face = False
  30.         sleep(0.5)
  31.         papero.send_start_speech("おやすみなさい")
  32.         papero.papero_cleanup()
  33.         end = True
  34.     return end
  35. if __name__ == "__main__":
  36.     simulator_id, robot_name, ws_server_addr = pypapero.get_params_from_commandline(sys.argv)
  37.     papero = pypapero.Papero(simulator_id, robot_name, ws_server_addr)
  38.     if papero.errOccurred == 0:
  39.         end = False
  40.         papero.on_detect_face = False
  41.         papero.pixel_per_angle = [11.85, 11.43] #1度あたりのピクセル数
  42.         papero.pixel_center = [320.0, 240.0] #検出画像の中心
  43.         while end == False:
  44.             message = papero.papero_robot_message_recv(None)
  45.             end = send_event_message(message)

シミュレーターの項目から顔を表示してパペロに検出させてみよう。
このように動けば成功だ!

 


0

最新開発ブログ一覧  (一覧で確認
2020年8月19日 14:08
開発ブログ
第30回 パペロで赤外線アレイセンサを動かしてみよう!【中編:顔の表面温度を測ってみよう】
by 管理者
2020年7月22日 16:07
開発ブログ
第29回 パペロで赤外線アレイセンサを動かしてみよう!【前編:簡易サーモグラフィを作ろう】
by 管理者
2019年11月20日 17:11
開発ブログ
第28回 パペロでJulius4.5を実行してみた
by 管理者
2019年11月13日 09:11
開発ブログ
第27回 JuliusをPaPeRoi向けにクロスコンパイルしてみた
by 管理者
2019年9月19日 17:09
開発ブログ
第26回Linaro Toolchainでクロスコンパイルしてみた
by 管理者

コメントは受け付けていません。