# 【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第51课-人脸识别控制机器人(机器人认主)
使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎(内嵌了three.js编辑器的定制版-支持以第一视角游览3D场馆),可以在浏览器和node.js、deno、electron上运行,它是一个跨平台的软件,支持多个操作系统使用!并且支持使用内置的poplang智体编程语言实现3D组件的智能化编程——语法超简单,一句话语法,人人轻松上手!
下面分为几步介绍,如何基于dtns.network智体世界引擎实现人脸识别控制机器人——通过poplang代码实现人脸识别并认主人。这就像是一个宠物,只会将第一个出现在它面前并成功让它认主的主人,才能发出让宠物狗吃人指挥的指令。好比是智能的机器宠物一般,只遵从主人的指挥行动。当视野中出现主人的身影时,遵从主人指令行事,否则将暂停机器人的行动。这强化了机器人只遵从一个主人行事的默认设置能力。从而使得机器人的指挥更符合客观现实。
为了实现机器人的认主并听从主人指挥的能力。我们使用了poplang智体编程的代码指令ib3.event.bus.on实现对rtcchat_capture事件的订阅(实时视频截图事件,截图会通过事件总线传输到3d轻应用的onEvent处理函数代码中),通过$.g_2d_faceapi_user_set全局函数指令实现对截图的人脸识别并绑定主人的人脸,并且仅在首次使用时判断$.g_2d_faceapi_user_ok是否已认证,如未认主,进入认主程序(绑定主人的人脸识别数据)。然后后续的实时视频中截图判断,使用$.g_2d_faceapi_search 全局函数,判断主人是否出现在视野中,如果则按主人指挥行事(人体姿式识别$.g_2d_pose_find全局函数指令)。简单的几个指令即完成了机器人认主和听从主人指挥的强大功能!
# 第一步:打开头榜页面,找到3D纪念馆xverse轻应用
注:找到标题为“人脸识别控制小车-识别失败提示”的xverse轻应用。
# 第二步:点击右上角...进入头榜编辑器
注:因为每一个xverse轻应用均是以xverse.json的方式进行源码级应用的分享的。故每一个社区用户均可通过编辑xverse轻应用源码来实现DIY和定制。
# 第三步:点击正面的“编辑xverse轻应用源码”,进入3D场馆编辑器
注:点击3D场景中间的avatar的3D对象,在右侧的属性面板中找到脚本-编辑。
# 第四步:编辑墙体avatar玩家3D组件的poplang代码
注:首先使用了ib3.event.bus.on rtcchat_capture实现了实时视频的截图的事件订阅(通过onEvent接收订阅的截图数据)。为了实现机器人的认主并听从主人指挥的能力。我们通过$.g_2d_faceapi_user_set全局函数指令实现对截图的人脸识别并绑定主人的人脸,并且仅在首次使用时判断$.g_2d_faceapi_user_ok是否已认证,如未认主,进入认主程序(绑定主人的人脸识别数据)。然后后续的实时视频中截图判断,使用$.g_2d_faceapi_search 全局函数,判断主人是否出现在视野中,如果则按主人指挥行事(人体姿式识别$.g_2d_pose_find全局函数指令)。如此简单的几个指令即完成了机器人认主和听从主人指挥的强大功能!可见poplang智体代码的强大特性,即简约(一句话指令),又强大(通过汇编成篇,可实现强大的机器人认主并听从主人指挥的能力)
在使用faceapi之前先使用$.g_2d_faceapi_load_models预加载网络模型,如下图所示:
判断是否是主人的标志是变量isuer,如下图:
注:此变量isuser来自于自定义指令函数search中使用的$.g_2d_faceapi_search全局的图片搜索人脸识别指令函数。使用它,会反馈主人是否出现在截图当中。然后保存在变量isuser中,以便行动控制函数执行运行指令与否。
# 第五步:点击顶部菜单“文件”推送头榜(作品),将此3D纪念馆以xverse轻应用方式分享给其他用户
# 第六步:将新的头榜标题设置为“人脸识别控制小车-识别失败提示”,点击右上角确认完成头榜发布
注:标题为xmsg,不能误删除“”双引号,否则会发布失败——仅修改xmsg属性的文字内容即可。
# 第七步:找到刚发布的xverse轻应用头榜,点击进入3D场景游览器
注:轻轻一点击,即可进入体验刚发布好的xverse-3D轻应用(智体应用),我们相当于可以无限地分享和裂变这个开源的3D轻应用(智体应用)。这样大家便可以按自己的需求,轻松的修改和定制这些动画的源码模板了。可以形成自己的故事、自己的动画、自己的3D场馆、自己的3D互动剧情等等。随心所欲地发挥,所以智体世界、智体OS也相当于【元宇宙】【开放世界】!
# 第八步:进入3D轻应用后,我们首先开始与机器人实现视频的实时连接(然后进行人脸识别——在前5秒钟可认为正在识别当前的视野中的人脸即为认主的主人)
注:当完成认主之后,可进行人体姿式识别控制。
当人脸被遮挡,或者当前视野中无主人的人脸出现时,会提示识别失败,此时无法通过通过人体姿式识别控制机器人行动(直至重新出现主人的人脸形象时方可继续控制机器人行动)。
注:无法再控制机器人右转等人体姿式识别控制(如下图所示):
注:经过反复测试,我们看到只有当人脸识别成功,并视野中存在着主人身影时,才能有效地进行机器人行动控制。从而实现了真正的机器人认主功能。
通过上8步,我们成功完成了通过3D轻应用中实现了机器人的人脸识别并完成认主,从而实现了机器人只听从机器人主人行事的强大的安全控制能力。意味着现实世界无论多复杂,只有被认主的机器人才能被主人控制,其它人无法侵害机器人权益,从而实现了机器人智体资产在现实世界中的保护,并且避免非授权指挥干扰机器人行动的事件发生,从而使得“行者机器人”具备了真实世界互动的能力——强大的poplang智体编程语言赋予了机器人灵魂!
我们也看到了poplang智体编程语言的强大能量,一两行简单的指令,即可完成复杂的3D互动的交互效果、音效效果的开发。并且通过xverse-json源文件(3D轻应用)的方式进行社区分享,使得开源开放、公开透明的3D场馆的设计,能被大家更多的学习和继承,达到互动学习、互动成长的目的。这也是智体OS、智体互动式教育-学习的目标。
注:dtns.network德塔世界(开源的智体世界引擎)是在github和gitee上开源的项目!
附录(poplang智体代码——实现人脸识别控制机器人——认主程序):
pop.func.define 3d_move
= event 3d_move_event
object.get event.turn turn
object.get event.forward forward
$.Math.abs turn
= aturn $ret
$.Math.abs forward
= aforward $ret
< aforward aturn turnflag
pop.ifelse turnflag turnNow goNow
pop.func.end
pop.func.define turnNow
set z 0
> turn z leftFlag
pop.ifelse leftFlag left right
pop.func.end
pop.func.define goNow
set z 0
> forward z goFlag
pop.ifelse goFlag move back
pop.func.end
pop.func.define left
/rtphone/robot/action?action=left
set tips 左转
$.g_2d_voice_play tips
pop.func.end
pop.func.define right
/rtphone/robot/action?action=right
set tips 右转
$.g_2d_voice_play tips
pop.func.end
pop.func.define move
/rtphone/robot/action?action=move
set tips 前进
$.g_2d_voice_play tips
pop.func.end
pop.func.define back
/rtphone/robot/action?action=back
set tips 后退
$.g_2d_voice_play tips
pop.func.end
set chatid msg_chat02G7TLu59Tzs
$.g_3d_show_rtcchat chatid
#订阅capture事件
pop.func.define onEvent
= data $event_data
object.get data.base64 base64
$.g_2d_pose_find base64
= cret $ret
object.get cret.w w
object.get cret.h h
object.get cret.pose.keypoints points
object.get cret.pose.score score
set i 0
+ i i i
set iw 9
+ iw i iw
array.get points i nose
array.get points iw leftWrist
set leftr 0.33
set rightr 0.66
set scoreMin 0.2
* w leftr leftw
* w rightr rightw
* h leftr toph
object.get nose.position.x npx
object.get nose.position.y npy
object.get leftWrist.position.y wpy
object.get leftWrist.score ws
< wpy npy backok
< npx leftw leftok
> npx rightw rightok
< npy h moveok
> score scoreMin sok
= sok0 sok
set nzero 0
== notuser nzero isuser
> ws scoreMin wsok
&& backok wsok backok
&& backok isuser backok
! backok notback
pop.ifelse backok back donothing
&& sok isuser sok
&& sok notback sok
&& leftok sok leftok
&& rightok sok rightok
&& moveok sok moveok
pop.ifelse leftok right donothing
pop.ifelse rightok left donothing
|| leftok rightok turnok
! turnok notturn
&& notturn moveok moveok
&& moveok sok moveok
pop.ifelse moveok move donothing
pop.ifelse sok0 doface donothing
pop.func.end
pop.func.define doface
$.g_2d_faceapi_user_ok
= uok $ret
pop.ifelse uok search setuser
pop.func.end
pop.func.define setuser
= userlogo base64
$.g_2d_faceapi_user_set userlogo
pop.func.end
pop.func.define search
= captureimg base64
$.g_2d_faceapi_search captureimg
= searchRet $ret
#ib3.toast searchRet
set errorTips 识别失败
pop.ifelse searchRet setOKFlag showError
pop.func.end
pop.func.define setOKFlag
set notuser 0
pop.func.end
pop.func.define showError
set notuser 1
ib3.toast errorTips
pop.func.end
ib3.event.bus.on rtcchat_capture onEvent
$.g_2d_rtcchat_capture_start
pop.func.define 3d_stop
ib3.event.bus.remove rtcchat_capture
$.g_2d_rtcchat_capture_stop
pop.func.end
set notuser 0
$.g_2d_faceapi_load_models
poplang的人脸识别并认主的控制代码到此结束!
# 开源地址:
github地址:https://github.com/dtnsman/dtns (opens new window)
Gitee地址:https://github.com/dtnsman/dtns (opens new window)
官方文档:https://dtns.network.yunapi.org (opens new window)
加入QQ群:279931001
加入微信群: