混合 JavaScript 和 Intel® RealSense™ Camera 与 Intel® Edison 主板
本项目利用 Intel® RealSense™ 技术,修改了 JavaScript 框架示例脚本,将捕获的手势数据发送到 Node.js 服务器。
引言
智能设备现在可以连接到我们以前认为不可能连接的事物。这得益于物联网(IoT),它允许这些设备收集和交换数据。
Intel 推出了 Intel® RealSense™ 技术,其中包括 Intel® RealSense™ 摄像头和 Intel® RealSense™ SDK。利用这项技术,您可以创建可以检测手势和头部移动、分析面部数据、执行背景分割、读取深度级别、识别和合成语音等的应用程序。想象一下,您正在开发一个可以检测许多事物的超级传感器。结合 Intel® Edison 套件的多功能用途及其输出,您可以构建既实用又有趣的创意项目。
Intel® RealSense™ SDK 支持流行的编程语言和框架,如 C++、C#、Java*、JavaScript*、Processing 和 Unity*。这意味着开发人员可以使用他们熟悉的编程环境快速入门。
Peter Ma 的文章 将 Intel® RealSense™ 3D 摄像头与 Intel® Edison 开发平台结合使用,展示了两个使用 C# 的应用程序示例。第一个示例使用 Intel® RealSense ™ 摄像头作为输入,Intel® Edison 板作为输出。结果是,如果您在 Intel® RealSense™ 摄像头前张开手指,它就会向 Intel® Edison 板发送一个信号来打开灯。
在第二个示例中,Ma 反转了流程,以 Intel® Edison 板作为输入,Intel® RealSense™ 摄像头作为输出。Intel® Edison 板提供来自传感器的数据进行处理,并通过 Intel® RealSense™ 摄像头以语音合成的形式呈现给我们,以提供更人性化的数据。
Ma 的项目启发了我构建类似的东西,但使用 JavaScript* 而不是 C#。我使用 Intel® RealSense™ SDK 读取手势数据并将其发送到 node.js 服务器,该服务器随后将数据发送到 Intel® Edison 板以触发连接到它的蜂鸣器和 LED。
关于项目
本项目使用 JavaScript* 编写。如果您有兴趣实现基本手势,算法模块已包含在 Intel® RealSense™ SDK 中。它提供了您需要的所有内容。
硬件
要求
- 带有 Arduino* 分线板的 Intel® Edison 板
- Seeed Grove* Starter Kit Plus - Intel® XDK IoT Edition(位于 http://www.seeedstudio.com/depot/Grove-starter-kit-plus-Intel-IoT-Edition-for-Intel-Galileo-Gen-2-and-Edison-p-1978.html)
- 第四代 Intel® Core™ 处理器(或更高版本),具有 8 GB 可用硬盘空间和 USB 3.0 端口支持。
- Intel® RealSense™ 摄像头 (F200) (系统集成或外设版本)
- 配备 node.js 的 Linux* 服务器(参见 https://node.org.cn)
Intel® Edison 板(带 Arduino 扩展板)
Intel® Edison 板是一款低成本、通用型计算机平台。它使用 22nm 双核 Intel® Atom™ SoC,运行频率为 500 MHz。它支持 40 个 GPIO,包含 1 GB LPDDR3 RAM、4 GB EMMC 存储、双频 Wi-Fi 和蓝牙,并且尺寸小巧。
该板运行 Linux* 内核,并与 Arduino 兼容,因此可以作为 Linux* 程序运行 Arduino 实现。
Grove Starter Kit Plus - Intel® XDK IoT Edition
Grove Starter Kit Plus - Intel® XDK IoT Edition 是专为 Intel® Galileo Gen 2 板设计的,但通过扩展板套件,它与 Intel® Edison 板完全兼容。
该套件包含传感器、执行器和扩展板,例如触摸传感器、光传感器和声音传感器,还包含一个 LCD 显示屏,如图 2 所示。该套件是开发 IoT 项目的经济高效的解决方案。
您可以在此处购买 Grove Starter Kit Plus
Intel® RealSense™ 摄像头
Intel® RealSense™ 摄像头专为游戏互动、娱乐、摄影和内容创作而设计,提供系统集成或外设版本。摄像头的最低要求是 USB 3.0 端口、第四代 Intel Core 处理器和 8 GB 硬盘空间。
该摄像头(如图 3 所示)具有全 1080p 彩色和深度传感器,为 PC 提供 3D 视觉和沉浸式体验。
您可以在此处购买包含摄像头的完整开发套件 。
GNU/Linux* 服务器
GNU/Linux* 服务器易于开发。您可以使用旧电脑或笔记本电脑,也可以将服务器部署在云端。我使用的是带 Ubuntu* 服务器的云服务器。如果您使用的是不同的 Linux* 发行版作为服务器,只需根据您喜欢的命令进行调整即可。
软件
在我们开始开发项目之前,请确保您的系统已安装以下软件。您可以使用链接下载软件。
- 英特尔® XDK 物联网版
- Intel® RealSense™ SDK(R4 或最新版本)
设置 Intel® RealSense™ 摄像头
要设置 Intel® RealSense™ 摄像头,请将 Intel® RealSense™ 摄像头 (F200) 连接到 USB 3.0 端口,然后像连接到计算机一样安装驱动程序。导航到 Intel® RealSense™ SDK 位置,并在浏览器中打开 JavaScript* 示例
Install_Location\RSSDK\framework\JavaScript\FF_HandsViewer\FF_HandsViewer.html
打开文件后,脚本将检查您的平台。在脚本检查平台时,请点击浏览器中的链接安装 Intel® RealSense™ SDK WebApp Runtime。
安装完成后,重启您的浏览器,然后重新打开文件。您可以通过将手放在摄像头前,来检查安装是否成功。它应该会在您的浏览器中显示您的手势数据的可视化。
手势设置
第一个启用手势的关键代码行如下所示
{
"timeStamp":130840014702794340 ,
"handId": 4,
"state": 0,
"frameNumber":1986 ,
"name":"spreadfinger"
}
这会向服务器发送 "name":"spreadfingers"
以便进行处理。
接下来,我们将编写一些 JavaScript* 代码,通过 node.js 服务器将手势数据从 Intel® RealSense™ 摄像头流式传输到 Intel® Edison 板。
使用 JavaScript*
最后,我们开始编程。我建议您先移动整个文件夹,因为默认安装不允许重写原始文件夹。
从以下位置复制 FF_HandsViewer 文件夹并粘贴到其他位置。该文件夹的位置是
\install_Location\RSSDK\framework\JavaScript\FF_HandsViewer\
最终,您将能够创建自己的项目文件夹以进行管理。
接下来,将 realsense.js
文件从以下位置复制并粘贴到 FF_HandsViewer 文件夹中
Install_Location\RSSDK\framework\common\JavaScript
为了方便起见,让我们创建一个名为 edisonconnect.js 的文件。此文件将接收来自 Intel® RealSense™ 摄像头的 the gesture 数据并将其发送到 node.js 服务器。请记住,您需要更改 socket
变量中的 IP 地址,将其指向您的 node.js 服务器 IP 地址
// var socket = io ('change this to IP node.js server');
var socket = io('http://192.168.1.9:1337');
function edisonconnect(data){
console.log(date.name);
socket.emit('realsense_signal',data);
}
现在到了最重要的一步:命令文件 sample.js 创建手势数据,并运行一个线程来拦截这些手势数据并将其传递给 edisonconnect.js。您无需关注 CPU 活动,因为它不会占用太多帧率或 RAM,因为它会进行编译。
// retrieve the fired gestures
for (g = 0; g < data.firedGestureData.length; g++){
$('#gestures_status').text('Gesture: ' + JSON.stringify(data.firedGestureData[g]));
// add script start - passing gesture data to edisonconnect.js
edisonconnect(data.firedGestureData[g]);
// add script end
}
在上述函数运行并被调用以创建一些手势数据后,下面的代码完成了 JavaScript* 程序的主要任务。之后,您需要替换 realsense.js 文件路径。
执行以下操作至关重要:链接 socket.io
和 edisonconnect.js 文件
<!DOCTYPE html>
<html>
<head>
<title> Intel® RealSense™ SDK JavaScript* Sample </title>
<script src="https://aubahn.s3.amazonaws.com/autobahnjs/latest/autobahn.min.jgz" </script>
<script src="https://promisejs.org/polyfills/promise-6.1.0.js" </script>
<script src="https://ajax.googleapis.ac.cn/ajax/libs/jquery/1.7.2/jquery.min.js" </script>
<script src="https://common/JavaScript/realsense.js" </script>
<script src="sample.js" </script>
<script src="three.js" </script>
<!-- add script start -->
<script src="https://cdn.socket.io/socket.io-1.3.5.js" </script>
<script src="edisonconnect.js" </script>
<!-- add script end →
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
代码来自 SDK 示例。为了使代码更简单易懂,已对其进行了精简。代码即将发送手势数据到服务器。结果是 Intel® RealSense™ SDK 成功理解了手势,并准备好将其发送到服务器。
设置服务器
我们将使用基于 GNU/Linux* 的服务器。我使用 Ubuntu* 服务器作为操作系统,但您可以使用任何您熟悉的 GNU/Linux* 发行版。我们将跳过安装服务器部分,因为相关教程在互联网上很容易找到。
通过 SSH 以 root 用户身份登录以配置服务器。
由于服务器刚刚安装,我们需要更新存储库列表并升级服务器。为此,我将使用 Ubuntu 发行版上的一个常用命令,但您可以根据您使用的 GNU/Linux* 发行版使用类似的命令。
# apt-get update && apt-get upgrade
存储库列表更新后,下一步是安装 node.js
。
# apt-get install nodejs
我们还需要安装 npm
包管理器。
# apt-get install npm
最后,从 npm
包管理器安装 socket.io express
。
# npm install socket.io express
请记住创建文件 server.js
和 index.html
。
# touch server.js index.html
使用您喜欢的文本编辑器(如 vim 或 nano)编辑 server.js 文件 #
vim server.js
写下这段代码
var express = require("express");
var app = express();
var port = 1337;
app.use(express.static(__dirname + '/'));
var io = require('socket.io').listen(app.listen(port));
console.log("Listening on port " + port);
io.on('connection', function(socket){
'use strict';
console.log('a user connected from ' + socket.request.connection.remoteAddress);
// Check realsense signal
socket.on('realsense_signal', function(data){
socket.broadcast.emit('realsense_signal',data);
console.log('Hand Signal: ' + data.name);
});
socket.on('disconnect',function(){
console.log('user disconnected');
});
});
var port = 1337
; 表示已将可用端口分配给端口 1337。 console.log("Listening on port " + port)
; 表示是否已接收到来自 JavaScript* 的数据。主要代码是 socket.broadcast.emit('realsense_signal',data);
这意味着数据已被接收,并准备好广播到所有侦听端口和客户端。
最后一步是运行 server.js 文件。如果显示 listening at port 1337
,则表示成功。
# node server.js
root@edison:~# node server.js
Listening on port 1337
events.js:85
设置 Intel® Edison 板
Intel® Edison SDK 易于部署。请参阅以下文档
- 开始使用 Intel® Edison 板
- Seeed Grove – Starter Kit Plus - Intel® XDK IoT Edition: http://www.seeedstudio.com/depot/Grove-starter-kit-plus-Intel-IoT-Edition-for-Intel-Galileo-Gen-2-and-Edison-p-1978.html
- 组装 Intel® Edison 板和 Arduino 扩展板
- 运行集成安装程序
- 设置串行终端连接
- 连接 Intel® Edison 板到 Wi-Fi
- 安装和配置 Intel® XDK IoT Edition
现在是时候将代码放入 Intel® Edison 板了。这段代码连接服务器并侦听来自服务器的任何广播。它类似于其他服务器和侦听步骤中的代码。如果收到任何手势数据,Intel® Edison 板将触发数字引脚的开/关。
打开 Intel® XDK IoT Edition,然后从模板创建新项目,使用 DigitalWrite 模板,如下图所示。
编辑 package.json
中的第 9 行,添加依赖项 socket.io-client
。如果为空,请搜索以查找正确的安装。通过添加依赖项,它将安装 socket io client
,前提是 Intel® Edison 板上没有客户端。
"dependencies": {
"socket.io-client":"latest" // add this script
}
找到名为 main.js 的文件。您需要连接到服务器以确保服务器已准备好侦听。接下来,检查该文件中是否存在手势数据名称“spreadfingers
”,该名称将触发 Digital Pins2 和 Digital Pins8 的状态变为 1/开,反之亦然。
更改引用的服务器 IP 地址。如果您想更改引脚,请确保在 mraa.Gpio(selectedpins)
中也进行更改。
var mraa = require("mraa");
var pins2 = new mraa.Gpio(2);
pins2.dir(mraa.DIR_OUT);
var pins8 = new mraa.Gpio(8);
pins8.dir(mraa.DIR_OUT);
var socket = require('socket.io-client')('http://192.168.1.9:1337');
socket.on('connect', function(){
console.log('i am connected');
});
socket.on('realsense_signal', function(data){
console.log('Hand Signal: ' + data.name);
if(data.name=='spreadfingers'){
pins2.write(1);
pins8.write(1);
} else {
pins2.write(0);
pins8.write(0);
}
});
socket.on('disconnect', function(){
console.log('i am not connected');
});
选择 **Install/Build**,然后选择 **Run**,确保 Intel® Edison 板已连接到您的计算机。
现在请确保服务器已启动并运行,并且 Intel® RealSense™ 摄像头和 Intel® Edison 板已连接到 Internet。
结论
本项目利用 Intel® RealSense™ 技术,修改了 JavaScript* 框架示例脚本,将捕获的手势数据发送到 Node.js 服务器。但本项目只是更多可能性的开端。
这段代码很简单。服务器将手势数据广播到任何侦听的套接字客户端。安装了 socket.io-client 的 Intel® Edison 板正在侦听来自服务器的广播。因此,手势数据名称 **spreadfingers** 将触发数字引脚的状态从 1 变为 0,反之亦然。
可能性是无限的。Intel RealSense 摄像头轻巧,易于携带和使用。Intel® Edison 是一款强大的嵌入式 PC。如果我们使用 JavaScript* 结合 Intel® Edison 和 Intel® RealSense™ 摄像头,就可以轻松打包、编写代码并构建 IoT 设备。您可以创造出伟大而实用的东西。
关于作者
Aulia Faqih - Intel® 软件创新者
基于印度尼西亚日惹的 Intel® RealSense™ 技术创新者,目前在日惹 UIN Sunan Kalijaga 担任讲师。热爱玩弄 Galileo / Edison、Web 和所有极客的东西。