2021爱智先行者 - 智能灯(手势开关)

一、前言

【本文正在参与"2021爱智先行者-征文大赛"活动】

最近跟了多期 《2021爱智先行者》直播课,了解了一些关于edgros的知识,自己也关注了爱智官方以及公众号,发现了spirit1的强大之处,正好借着这次征文大赛,向大家分享关于爱智的体验。

二、EdgerOS介绍

关于 spirit1 开箱的文章已经有很多,这里不再赘述。我们直接聚焦到EdgerOS上。

首先,EdgerOS是什么?

EdgerOS是翼辉信息推出的智能边缘计算操作系统,它基于自主研发的SylixOS 内核,完全自主研发,spirit1 就是搭载的 EdgerOS 智能操作系统。

官方也给了比较详细的介绍说明:EdgerOS 简介

作为一个互联联网开发者,一直从事的是web前后端开发,个人对于物联网app开发还是比较陌生,如果说让我直接去开发一个物联网app,我可能会一头雾水,但了解了EdgerOS后,这一切就变得简单起来了。

EdgerOS系统集成了javascript运行时JSRE, JSRE (类比nodejs,JSRE是运行在EdgerOS上的js运行时)提供了大量功能强大的 API,包含:

  • Web框架
  • 数据库
  • 多任务,多进程
  • 文件系统
  • 网络
  • 路由
  • IoT设备
  • 多媒体
  • AI
  • 其他通用模块

这就对我们web开发者非常友好,接触过前端的开发者一定对js比较熟悉,熟悉js,我们就可以开发运行在EdgerOS上的应用了。

关于JSRE,官方有文档做了详细介绍:Overview , 感兴趣的话可以详细阅读,你会感叹api的丰富性,并且会发现很多新鲜好玩的东西。

三、应用开发(手势控制智能灯)

因为我从小就是个科幻迷,总是想象着生活在一个充满智能的世界里,像很多科幻电影里面,动一动手指,或者随便讲几句话,就可以操控各种智能设备有序工作,解放人力(像钢铁侠里,托尼斯塔克动动手势就可以指挥机械自动穿戴铠甲可太酷了)。所以我对JSRE提供的ai接口比较感兴趣。阅读了ai相关接口后,再结合之前看过的《2021爱智先行者》直播课 以及爱智官方的一些 demo, 我有一个小想法,就是通过监控手势,来实现一个智能灯的开关。

准备的设备:

  1. 支持网线直连的摄像头
  2. 支持zigbee协议的智能灯
  3. 我们的主角spirit 1

功能介绍:

  1. 连接摄像头和智能灯
  2. 打开部署好的爱智应用
  3. 将单手对准摄像头,握拳 ,灯关闭,五指伸开,灯打开。

话不多说直接放代码吧:https://github.com/ScottMuZhao/smart-light-ai

核心代码:

连接智能灯的代码,为了简化代码,这里默认只有一个智能设备。
 

let light = undefined;
let lightId = '';
// 发现设备,并把发现的设备赋值light
Device.list(true, function (error, list) {
	if (list && list.length === 1) {
		let dev = list[0];
		Device.info(dev.devid, function (error, info) {
			if (info &&
				info.report.name === 'light') {
				light = new Device();
				light.request(dev.devid, function (error) {
					if (error) {
						console.error('light request error: ');
						light = undefined;
					} else {
						lightId = dev.devid;
						light.send({ query: true, attrs: ['channel0'] }, function (error) {
							if (error) {
								console.error('Query light error:', error.message);
							} else {
								console.log('Query light Ok!');
							}
						}, 3);
					}
				});
			}
		});
	}
});
// 监听设备丢失事件
Device.on('lost', function (devid) {
	if (lightId && lightId === devid) {
		lightId = '';
		if (light) {
			lightRemove();
		}
	}
});
// 监听设备加入事件,
Device.on('join', function (devid, info) {
	if (info.report.name === 'light' && info.report.model === 'port' && lightId === '') {
		light = new Device();
		light.request(devid, function (error) {
			if (error) {
				console.error('light request error: ');
				light = undefined;
			} else {
				lightId = devid;
				light.send({ query: true, attrs: ['channel0'] }, function (error) {
					if (error) {
						console.error('Query light error:', error.message);
					} else {
						console.log('Query light Ok!');
					}
				}, 3);
			}
		});
	}
});

视频传输的时候会触发onVideo事件,在这里调用智能手势接口,监控手势处理开关灯逻辑

onVideo(frame) {
		var buf = new Buffer(frame.arrayBuffer);
		const view = DEF_DETEC_VIEW;
        // jsre手势监控api, 监控到的手势信息数组
		var handInfo = handnn.detect(buf, { width: view.width, height: view.height, pixelFormat: HANDNN_PIXEL_FORMAT });
		var ret = []; /* Empty array - clear. */
		for (var i = 0; i < handInfo.length; i++) {
			var info = handInfo[i];
			if (info.prob > 0.9) {
                // jsre手势监控api, 手势详情,包含手指伸缩情况
				var hand = handnn.identify(buf, {width: view.width, height: view.height, pixelFormat: HANDNN_PIXEL_FORMAT}, info);
				if (hand) {
					var fingers = hand.fingers;
					var num = 0;
					for (var j = 0; j < fingers.length; j++) {
						if (!fingers[j].curl){
							num++
						}
					}
                    // 如果说手指全部收回,则关灯
					if (num === 0) {
						console.log('关灯');
						if (light) {
							var l = new Device()
							console.log('发送信号');
                            // 向智能灯发送关灯信号
							light.send({
								channel0: false,
							}, function (error) {
								if (error) {
									console.error('Send message to light error:', error.message);
								}
							}, 3);
						} else {
							console.log('Light is not connected !')
						}
					}
                    // 如果说手指全部展开,则开灯
					if (num === 5) {
						console.log('开灯');
						if (light) {
							console.log('发送信号');
                            // 向智能灯发送开灯信号
							light.send({
								channel0: true,
							}, function (error) {
								if (error) {
									console.error('Send message to light error:', error.message);
								}
							}, 3);
						} else {
							console.log('Light is not connected !')
						}
					}
				}
			}
		}
	}

因为本次主要介绍的JSRE 的ai 模块:handnn,所以摄像头部分直接引用edgeros官方demo: app-demo-camera-ai(app-demo-camera-ai: 带人脸识别功能的流媒体摄像头监控爱智应用。)中的连接摄像头代码,并做部分改动,这个修改是改为通过网线直连的形式获取摄像头(流媒体这块我还不是很熟悉,暂且使用了比较简单的方法,更高级的用法还在探索中。。), 如果想了解这部分代码可直接看项目中代码,或直接到官方demo进行查看

如果你有摄像头和智能灯,代码直接拉下来,开发模式部署到你的spirit1 上,并连接好摄像头和智能灯,就可以直接打开app体验了。如果说你还不知道怎么创建和部署爱智项目,可参考爱智官方文档 或 《2021爱智先行者》直播课。

我录制了一个小视频,来展示初步效果(废话比较多,想直接看效果,可快进到2分钟处):1637130339483765_哔哩哔哩_bilibiliicon-default.png?t=LA92https://www.bilibili.com/video/BV1uh411b74C/

以上就是我们手势开关智能灯的全部内容了,虽然说这个功能离科幻小说里面的场景还相差甚远,但是,edgros给了我们自己实现这种场景的机会,只要智能设备足够完善,我们就可以利用spirit1 自行实现各种科幻电影的场景啦,所以,让我们共同期待爱智生态的完善吧,我相信未来的某天,梦想会成为现实。

【本文正在参与"2021爱智先行者-征文大赛"活动】

你可能感兴趣的:(物联网,javascript)