コンテンツにスキップ

Servo連携

#519 基板にあるPCA9685チップからPWM信号を発生させ付属のデジタルマイクロサーボSG-90を制御するためのライブラリをインストールします。

PWMの設定

Jupyter labのターミナルを開きます。

pythonでi2cバスを利用するため以下をインストールします。

smbusをインストール

apt install python-smbus

PCA9685を制御するためのライブラリをFaBoPWMインストールします。

cd /nvdli-nano/
git clone -b jupyterlab https://github.com/FaBoPlatform/FaBoPWM-PCA9685-Python
cd FaBoPWM-PCA9685-Python
pip3 install .

pip3 install smbus

PWMサーボと連携

以下の黄色い領域のコードを追加します。

顔の部位を認識した座標からサーボを動かします。

import Fabo_PCA9685
import time
import pkg_resources
import smbus
SMBUS='smbus'
BUSNUM=1
SERVO_HZ=60
INITIAL_VALUE=300
bus = smbus.SMBus(BUSNUM)
PCA9685 = Fabo_PCA9685.PCA9685(bus,INITIAL_VALUE,address=0x40)
PCA9685.set_hz(SERVO_HZ)

def execute(change):
    image = change['new']
    data = preprocess(image)
    cmap, paf = model_trt(data)
    cmap, paf = cmap.detach().cpu(), paf.detach().cpu()
    counts, objects, peaks = parse_objects(cmap, paf)#, cmap_threshold=0.15, link_threshold=0.15)
    human = objects[0][0]
    C = human.shape[0]
    for j in range(C):
        k = int(human[j])
        if k >= 0:
            peak = peaks[0][j][k]  
            peak = (j, float(peak[0]), float(peak[1]))
            if j == 0:
                pwm = 150 + peak[1] * 400
                PCA9685.set_channel_value(0,pwm)
    draw_objects(image, counts, objects, peaks)
    image_w.value = bgr8_to_jpeg(image[:, ::-1, :])

j == 0はnoseのポイントを指している。kの値はpointが検出できれば0, 出来ない場合は-1が取得される。

point no 部位
0 "nose"
1 "left_eye"
2 "right_eye"
3 "left_ear"
4 "right_ear"
5 "left_shoulder"
6 "right_shoulder"
7 "left_elbow"
8 "right_elbow"
9 "left_wrist"
10 "right_wrist"
11 "left_hip"
12 "right_hip"
13 "left_knee"
14 "right_knee"
15 left_ankle"
16 "right_ankle"
17 "neck"

Dockerの保存しましょう。つぎのページへ。

参考

https://spyjetson.blogspot.com/2019/12/jetsonnano-human-pose-estimation-using.html