纯web技术玩转机器人?(上篇)

首先想说的是,web 开发者玩些机器人传感器硬件啥的,并不是新鲜话题或者技术,但作为已入行前端多年的我,第一次接触并且做到的时候,也是非常兴奋的。第一次在简书创作,请各位同道前辈多多包涵指教,先谢了!

对于一个 web 开发者,这些年感受最深最多的,恐怕就是前端开发世界的“善变”,变化让人深受其累,但同时也充分说明前端世界极其活跃。这些迫使让人习以为常的变化,就好比过山车,既让人忐忑,又带人一路快速领略风光无限。

这不,时下一大波物联网、人工智能、机器人的又开始抬头,而且势头强劲地从台面跑到台下并介入到我们的生活中来了。前端人以其与生俱来的危机感,一面左眼深陷 react 代码、手不离“键”,一面右眼时不时瞟一下 TensorFlow、SLAM 什么鬼的暗自骂道:我靠!

路漫漫其修远兮,吾常默念勿放弃。

好了以上就是作为一名 JSer 的我的纠结和废话。一开始入行前端时,谁也没想到除了页面 pages 之外还有什么其他高大上的东西是前端可以做的。既然这样,那么用 web 技术去操控机器人应该是个比较麻烦的事吧?

——任何麻烦的事,可以归纳并映射到写代码上大概是:

  • 门槛太高,壁垒太硬 ——> 技术栈不具备,且短时间难以触及
  • 琐碎太多,路途迂回 ——> 要做的事太多,比如啃一堆 8 级英文文档
  • 敌强我弱,难以战胜 ——> 写得少、见得少,对付不了一个项目的十八般武艺

但在本文所介绍 sensorium.js 库看来,这些麻烦事早就被“铲平”了,借助它,web 开发者能轻松(如果你不轻松一定记得发邮件反馈2333~)地通过手中的 JavaScript 代码控制机器人,体验代码控制物理世界的快感!

web 设施

一个非常弱的前提:会 ajax,会用 promise.then() 回调(照实例写甚至不用会...),会用 npm 安装个 sensorium.js 包到你的项目根目录
npm install sensorium --save
如果有淘宝镜像,你自然会加个c,比如这样cnpm install sensorium --save 下载安装得更快。安装 OK 后开始铺代码。

三步创建好主控板实例对象

// 获取一个 sensorium 实例
var sensorium = new Sensorium(); 

// 设定一个通信通道
var xhr = new XMLHttpRequest();
sensorium.setTransport({
    send: function(buf) {
        let host = 'http://127.0.0.1:8800';
        var data = '/?buf='+ JSON.stringify(buf);
        xhr.open("GET", host + data ,true);
        xhr.send(null);
    },
    onReceived: function(pipe) {
        xhr.onreadystatechange = function(e) {
          if (this.readyState == 4 && this.status == 200) {
            let binaStr = this.response;
            pipe(JSON.parse(binaStr).data);
          }
        };
    }
});

// 获取一个主控板实例
// var mcore = sensorium.createMcore(); 

// 好了,主控板实例已经成功获取
// 接下来看这个对象能干嘛

操控机器人

简单的理解,主控板就是主电路板,每台计算机上都有,机器人也由它作为控制中心。机器人身上搭载的各种传感器、电子元件比如 LED 灯、电机、舵机等等,构成了机器人本身,机器人凭借这些部件,在程序的控制下就能完成特定的任务。

——上面貌似已经涉及到硬件上的东西了,不过也只作为一个简单的理解,只需保留这样一个概念即可。最后只要知道上面 js 代码的 mcore 就代表了机器人的一种主控板就好了。在这个“主控板”中,用以下代码来控制机器人完成一些任务。

// 点亮主控板上的 LED 灯为绿色
var mcore.RgbLedOnBoard().g(200).turnOn();

// 读取超声波测距
mcore.Ultrasonic(3).getData().then(val => console.log(val));

// 控制左右电机(如果接上了的话)以 200 的速度前进
mcore.VirtualJoystick().leftSpeed(200).rightSpeed(200).run()

一路链式调用,就是这么简单!

sensorium.js 简介

sensorium.js 库本身提供了更多的 API 来驱动各种各样的传感器,所以拿到传感器,各种组合,玩法就超多~这是后话。如果您已经搭建了基本的页面,并且完成主控板的实例化,那么(win: F12 或 mac: win+alt+j)打开浏览器(chrome)控制台,输入 mcore. 就能以快捷方式查看到 mcore 主控板所支持的所有 API,比如罗盘、火焰、陀螺仪等等:

mcore apis.png

sensorium.js 本身也就是这么简单易用,在 API 设计之初就是让大家无需知道领域知识,也能凭“直觉”轻巧的用起来(还是那句话,要是用得不轻松一定记得发邮件反馈,先谢啦2333~)

到现在为止,算是告了一段落。但是 “web 设施” 其实还没有建成通车,且不说老师傅,就是年轻的司机也能一眼看出来:就凭你上面那些玩意,这车就能开了?还有机器人在哪?

开启一个小后台服务

明眼人很快看出来,上面用了 ajax,但属于一厢情愿,没有后台来处理,ajax 有诉难求。
所以,除了上面安装的 sensorium 库,这里还得装一个库
sensorium-server.js 作为 ajax 的服务器来用。
npm install sensorium-server -g
建议用 -g 全局安装它,这样允许您可以在任何目录下开启这个服务。
请耐心等待下这个库的下载安装,因为里头依赖了一个 serialport.js 库,该库包含了一个 node-pre-gyp ,文件较大。

sensorium-server.js 简介

我们就着它安装的时候,简单介绍下 sensorium-server.js 库。

sensorium-server 是个简单职责单一甚至简陋的库,这也是子标题说是个“小后台服务”的原因。它的主要业务逻辑及用途是:

  • 借助 nodejs 创建一个简单的 http 服务器
  • http 服务器主要负责将前端的 ajax 请求过来的数据转发给 serialport.js,并由 serialport.js 完成对主控板(mcore)的 I/O 操作,同时会将读取的传感器的值返回给 http 服务器 。
  • http 服务器将接收到的读值再响应给前端 ajax
  • 打印来往消息日志

其实说白了,就是 web 或者说浏览器没办法直接连通机器人,操作硬件,所以中间就插一道 nodejs,让 nodejs 来带为处理,并且 nodejs 每处理一次请求都会打印一次日志,方便 web 开发者 debug。

至于它简陋,是现在只接受 GET 请求,以及只能接受简单的命令行参数配置比如 stopReq 表示禁止打印请求消息。后续会抽时间把这个库完善下,毕竟这么残破的库真不好意思占用一个 npm 仓位。。

提交 sensorium-server.js 这个库的目的,就是方便 web 开发者直接在浏览器中就能调试机器人,铲平 web 连通机器人的最后一道障碍。

但不得不声明的是,笔者找了一些同类库(如大名鼎鼎的 http-server)但是又实在没有谁提供这样的功能,于是半造轮子半创作下,快速写出来这个库,可能有一些未知 bug,但我保证自己用来是 ok 的。

好,看看命令行窗口,正常网速下,应该已经下载并安装好了。接下来于命令行中,在任何文件目录下开启这个服务:
sensorium-server
或者简写成这样:
ss
当看到命令行中打印出以下信息,就说明服务正常开启了:

Starting up http-server, serving 8800
  http://127.0.0.1:8800
Hit CTRL + C to stop the server

开启了这个服务,你就无需关注通信传输部分了,只要借助 sensorium.js 提供的 API 专注于您前端代码即可。

至此,web 开发者已经完成了 “web 设施“ 的建设,也完成了 90% 的工作量。常言 “行百里半九十”,《纯web技术玩转机器人?(下篇)》将带您开完最后 10 里路。拜拜~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,413评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,591评论 18 139
  • 一个学期前我也和楼主差不多不知道这些都是啥,一个学期之后差不多都弄懂了,来讲讲自己的理解吧 > < 因为接触的时间...
    16a0f81b529b阅读 790评论 1 12
  • 前两天, 大叔问,你下步会去哪呢? 我说不知道, 大叔说, 要不回来吧。 那一刻, 突然很想念厦门。 我于是跳过躺...
    波波的吉他阅读 388评论 2 1
  • 每一个不曾起舞的日子,都是对生命的辜负! 第二天90天(2017-8-10月) 目标一:备考雅思6.5 目标二:朝...
    AMY3358阅读 175评论 0 0