kHome小程序提供的“姿势识别”任务、参数type是“shoulder_neck”时,实现了陪伴做一种肩颈操。
相机放在人的正前方。高度上,桌面高度加上面放台笔记本电脑,相机就夹在屏幕上边沿,大概1米。总的来说,上面,得拍到双手直举时手腕;下面,差多快要拍到腰部。人的部分在图像不要太小,建议最低就到腰部。
1、提示各动作的开始、结束。
2、判断用户姿势,开始20秒倒计时。
3、倒计时过程中,一旦发现动作不规范,会提示不规范原因。等规范了,重新20秒倒计时。
一、状态和语音
此部分面向读者是开发者。
1.1 状态
enum {snsect_0prelude, snsect_0desc, snsect_0_20, snsect_1prelude, snsect_1desc, snsect_1_20, snsect_2prelude, snsect_2desc, snsect_2_20, snsect_3prelude, snsect_3desc, snsect_3_20, snsect_4prelude, snsect_4desc, snsect_4_20, snsect_finished};
在视频中,肩颈操是4节,但在实现时,把第三节拆成右和左,认为是5节。“sn”是“Shoulder Neck”缩写。
状态只会向前,不会向后。

在每一节,分3个状态。
- snsect_[x]prelude。序。等着播放完上节的pytype_finished。对第一节,是播放此肩颈操总序,以及等它播放完。
- snsect_[x]desc。播放此节要领。
- snsect_[x]_20。20秒倒计时。一旦播放完此节要领,就进入此状态,而不管用户有没有开始此节动作。
5节动作完成后,进入snsect_finished。如果用户不退出肩颈操场景,每隔10秒会播报“肩颈操,已结束”。
1.2 语音
pytype_desc | pytype_unsatisfied | pytype_remind | pytype_finished | |
播放时机 | 开始该动作 | 动作持续3/8秒不符合规范,提示错在哪里 | 动作持续17秒不符合规范,提示正确操作是什么样子 | 该动作已结束 |
在哪状态播放 | snsect_0desc | snsect_0_20 | snsect_0_20 | snsect_1prelude |
示例一 | 第一个动作:十指相扣,手臂向上延展。抬头,眼睛看手臂,保持20秒 | 第一个动作不再规范 | 请检查下动作。十指相扣,手臂向上延展。抬头,眼睛看手臂。 | 结束动作,还原 |
示例二 | 第二个动作:双手在体前,交叉相抱,含胸,下颚向下贴胸骨。保持20秒。 | 第二个动作不再规范 | 请检查下动作。双手在体前,交叉相抱,含胸,下颚向下贴胸骨。 | 结束动作,还原 |
示例三 | 第四个动作:十指交叉,放在颈部后侧,同时两手肘向两侧展开,看向天花板。保持20秒。 | 第四个动作不再规范 | 请检查下动作。十指交叉,放在颈部后侧,同时两手肘向两侧展开,看向天花板。 | 肩颈操,已结束。 |
pytype_unsatisfied内容用于提示动作不规范。可能是两种情况,一是动作不对,二是用户一直没开始这节动作。
- pytype_unsatisfied对应文字只是说动作不规范了,没指出不规范原因。如果可以给出原因,把它存放在unsatisfied_msg_变量。所以,动作出现不规范时,如果设置了unsatisfied_msg_,播放的是unsatisfied_msg_,否则播放pytype_unsatisfied。
- 如果是第一次报pytype_unsatisfied,持续时间阈值是3秒,第二次或后面的阈值是在8秒。加5秒原因,一来播放pytype_unsatisfied文字需要点时间,二来已经播了第一次,用户晚听到没问题了。
- 什么时候会认为是第一次?一是没有检测到过规范操作,二是检测到最后规范操作的那一刻。
语音提示除上面4类外,还是有总序(sn^prelude)。一开始作动就会播放它。示例:肩颈操分四个动作。