ラズパイ9日目①:ラズパイ+サーボモータ+PoseNetで人物追跡カメラを組み立てる
PoseNetで検出した人物を追跡するカメラを作りました。
1日かかった、長かった~
カメラフレームに全身収まる前提のシステムなので、垂直方向の追跡はナシ、水平方向の追跡だけ対応させました。
今回も詳しい解説なしです、すみません。後でまとめます。
- Raspberry Pi 3 Model B+
- カメラ:Raspberry Pi Camera B01 (Rev1.3)
- Edge TPU:Google Coral Edge TPU Accelerator vertion 1.0
- 機械学習モデル:Google Coral PoseNet
- サーボモータ:マイクロサーボ9G SG-90
作ったもの
20200216MoterControl
全身画像の写真をカメラ君が追いかけてくれます。ちょこちょこ動きがかわゆい。
2軸のカメラマウントなので水平、垂直の動きができるのですが、水平方向だけ追跡します。
カメラフレームに全身収まる前提のシステムなので垂直方向は不要と判断しました。
Pythonプログラム
import pigpio #X,Yのサーボ可動範囲 X_MAX = 2350 X_MIN = 500 X_HOME = 1450 #0° pi = pigpio.pi() def move(x_move): #print('x_move: ', x_move) pi.set_servo_pulsewidth(21, x_move) def main(): ・・・(略)・・・ m_now_degree=X_HOME move(m_now_degree) ・・・(中略)・・・ def render_overlay(engine, output, src_size, inference_box): nonlocal n, sum_process_time, sum_inference_time, fps_counter, prepose, frameCnt_Rsg, frameCnt_Lsg,armTurnDeg, start_flg, m_now_degree ・・・(略)・・・ for pose in outputs: if pose.score < 0.60: continue # モーター制御 img_x = round((pose.keypoints.get('left shoulder').yx[1] + (pose.keypoints.get('right shoulder').yx[1]))/2) m_move_degree = m_now_degree - (img_x - 320)*0.1 #print('img_x:' + str(img_x) + ' now:' + str(m_now_degree) + ' move:' + str(m_move_degree)) print('img_x:' + str(img_x) + ' move:' + str(m_move_degree) + ' now:' + str(m_now_degree)) if m_move_degree >= X_MIN: if m_move_degree <= X_MAX: if abs(m_now_degree - m_move_degree) >= 10: move(m_move_degree) m_now_degree = m_move_degree else: print('右に行かないで~') else: print('左に行かないで~') ・・・(略)・・・
参考サイト
勉強させていただきました。