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