KIHARA BLOG:社内ラズコンでめざせ優勝!

Raspberry Pi(ラズパイ)で機械学習とか音声認識とか姿勢推定とかしながら組み込みシステムを構築して、社内ラズコンで優勝をめざすブログです。勉強中:Raspberry Pi、Linux、Python、Coral EdgeTPU、PoseNet、Julius

ラズパイ9日目①:ラズパイ+サーボモータ+PoseNetで人物追跡カメラを組み立てる

PoseNetで検出した人物を追跡するカメラを作りました。
1日かかった、長かった~
カメラフレームに全身収まる前提のシステムなので、垂直方向の追跡はナシ、水平方向の追跡だけ対応させました。
今回も詳しい解説なしです、すみません。後でまとめます。

f:id:KIHARA0223:20200216221748p:plain

作ったもの


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('左に行かないで~')

     ・・・(略)・・・

参考サイト

勉強させていただきました。

https://hakengineer.xyz/2018/03/03/post-1056/

make-muda.net

raspberry765.hatenablog.com