YuYuYouEr工作室

AREA OF 雨雨油儿 ~~ 承接体感互动软件、游戏定制开发 ~~

YuYuYouEr Kinect SDK Wrapper v2.0.0.6版本发布

YuYuYouEr Kinect SDK Wrapper 发布了新的v2.0.0.6版本,下载地址:

http://www.yuyuyouer.cn/blog/?page_id=369

本次新增特性如下:

本版增加与彩色RGB图像对应的平面骨骼节点,方便大家做AR互动类开发;

更换角色骨骼模型,支持背后跟随视角与面对面视角;

增加一代二代SDK切换脚本,详见Assets\YuYuYouEr_Kinect_SDK_Wrapper\Plugins\目录;

 

插件对Kinect V2硬件设备提供支持,封装了Kinect for windows SDK v2.0-1409版本;

并提供与Kinect V1设备完全兼容的DLL插件接口,大家可以根据自己需要切换硬件设备,无需修改应用代码;

使用本插件开发的应用直接替换DLL即可切换Kinect V1/V2硬件设备;

 

YuYuYouEr Kinect SDK Wrapper v2.0.0.0版本发布

YuYuYouEr Kinect SDK Wrapper 发布了新的v2.0.0.0版本,下载地址:

http://www.yuyuyouer.cn/blog/?page_id=369

本次增加对Kinect V2硬件设备的支持,封装了Kinect for windows SDK v2.0-1409版本;

并提供与Kinect V1设备完全兼容的DLL插件接口,大家可以根据自己需要切换硬件设备,无需修改应用代码;

使用V1 Wrapper开发的应用直接替换DLL即可支持Kinect V2硬件设备;

 

有限状态自动机类库 – qfFSM v1.2版本发布

有限状态自动机类库发布了新的v1.2版本,请在如下地址下载:

http://www.yuyuyouer.cn/blog/?p=290

本次主要更新了qfFSMLogic在各个语言中的实现,允许绑定到一个状态中,绑定的同时会执行reset()方法,对状态机进行初始化配置。

 

北京爱徒步作品 – 商场LED大屏幕AR增强现实

商场大屏幕AR增强现实
可设置任意图案地标,可支持结合Kinect互动

Kinect体感营销互动

Ski Shop

Toy Store

Kinect用于可口可乐交互
用户分享交互视频达到广告目的

Retail Clothing

YuYuYouEr Entity Class Generator 实体类生成工具

YuYuYouEr Entity Class Generator 实体类生成工具

工具URL:http://www.yuyuyouer.cn/code/class_generator/

C++支持库源码下载:yuyuyouer_class_generator_cpp_v1.1.zip
Java支持库源码下载:yuyuyouer_class_generator_java_v1.1.zip
C#支持库源码下载:yuyuyouer_class_generator_csharp_v1.1.zip

此项目完全开源,工具代码为JavaScript。

各个语言支持库也都以源码方式提供,C#版本在Unity3D中测试通过。

此工具使用方法比较简单,在左侧template中定义一个类模板,然后点击上面的按钮来生成不同语言的类,结果会显示在右侧。

template写法很简单,打开工具时会有一个默认格式,根据需要修改即可。

工具目前支持的类型:

原始类型:int、float、bool、string、byte[]
对象类型: 成员可以是另一个由本工具生成的Enity Class

关于byte[]需要多说一下,这个类型可以存放任意字节序列,这样你可以将一个类的encode结果放在这里,实现嵌套定义。
关于对象类型,此特性允许你将定义的多个实体类嵌套起来,在C++中使用指针实现,C#、Java中使用对象引用实现。

这些类型会被对应到各种语言支持的类型,Java和C#都有直接对应,C++中使用std::string类处理string和byte[]。

关于类的属性

模板中定义的属性都会有定义和初始化。

此外还会为每个属性增加一个是否存在标志:bool m_has_xxx,表示是否存在xxx这个属性,这个机制允许定义可选属性;也可以用来减少编码后的字节数目,encode时会跳过不存在的属性;

关于decode/encode

生成的每个类中都带有decodeFromBytes()和encodeToBytes()函数。

decodeFromBytes():从一个byte[]字节序列中解析类的属性,解析完成后,可以通过get_has_xxx()类检查是否存在xxx属性。

encodeToBytes():将目前的类属性编码为byte[]字节序列,编码时,会跳过不存在的属性。

此外,需要注意,同一个类用各种语言编码得到的字节顺序是不相同的,但不会影响属性解析的正确性。因为在编码解码时,内部使用了Map或者Hashmap这样的key/value对来存放属性,所以解码时与属性存放顺序无关,编码时属性顺序与他们在各种语言的hashcode生成算法相关。所以,请不要以encodeToBytes()的结果来比较不同语言的类对象是否相等。

 

YuYuYouErMessageServer – 消息队列服务器

项目中经常用到各种需要阻塞操作的组件,如联网上传、下载,硬件设备通讯,原来多是使用线程来解决,传递一些简单的进度信息。

最近做的项目用到了多台主机采集数据,同样也有一些上传功能,还有串口读卡器,此时很需要一套完善的组件通讯机制,用来分发任务,收集进度反馈。

前端使用消息服务器解决组件通讯问题,后端使用状态机(参考qfFSM有限自动机)来解决逻辑问题,理论上讲一套消息驱动的组件便OK啦。

这份消息队列服务器由两部分组成:

  1. 服务器:独立exe,命令行方式,接受参数,可指定一个tcp端口以及IP,默认为“tcp://*:117058”;
  2. 客户端:Win32接口DLL,提供连接服务器,发送、收取消息,注册、删除服务器消息队列;

服务器exe说明:

服务器启动后界面如下,最下方会显示busy或者idle,后面last 1s为最近一秒内处理的请求数目,sum为服务器启动后处理的请求总数。

下图中可以看到,服务处于busy状态,通讯端点为本机tcp端口117058,最近一秒处理了129192个请求。

客户端Win32 DLL异步接口说明:

以下接口分为3类,连接/关闭服务器、异步请求接口(asyn_request_开头)、异步响应接口(asyn_response_开头)。

所有响应消息有四个字段:id、message、status、data;

message为请求名称;status为“ok”表示成功,其他值为错误信息;

特别说明asyn_request_类接口,返回值为bool型,表示此请求是否被加入本地发送队列,并不是成功发出的标志,后面会提到本地发送队列也是有限额的(10000条),所以队列满时,会淘汰最早的请求消息。

务必将应用设计成以响应消息为准。

1、连接服务器

bool WINAPI asyn_connect_server(char * str_endpoint);

str_endpoint为服务器连接点,默认为“tcp://127.0.0.1:117058”

服务器端未运行时,客户端依然可以连接成功,底层会不但去尝试到服务器的连接;在此期间发送的消息会缓存在客户端进程空间中,为避免大量积压,最多缓冲10000条,超过则按照FIFO方式淘汰最早的消息。

此函数会开启一个线程负责与服务器通讯,并在本地维护一个请求队列和一个响应队列,大小均为10000条,对于普通互动应用而言足够了。

2、断开服务器连接

bool asyn_disconnect_server();

 3、关闭服务器

 bool asyn_request_shutdown_server();

向服务器端发送关闭指令,用于退出服务器端进程;

4、注册消息队列

bool asyn_request_register_message_queue(char * str_queue_name);

发送注册消息队列请求,参数为消息队列名称;

消息队列服务器发送、接收消息均需要指定消息队列名称,消息排序方式为FIFO;

消息队列已存在时,响应为注册成功;

5、删除消息队列

bool asyn_request_remove_message_queue(char * str_queue_name);

发送删除消息队列请求,参数为消息队列名称;

消息队列删除后,向此队列投递消息的客户端会得到“unknown queue name”错误;

6、发送消息到指定队列

bool asyn_request_send_message(char * str_queue_name, char *message_buf, int message_length);

发送一条消息投递请求,参数为接收队列名称和消息数据;

str_queue_name为目标消息队列名称;

message_buf为消息缓冲区地址,message_length为消息数据长度;客户端会将这些数据作为二进制通过socket发送给服务器端,并加入到目标消息队列;

7、发送广播消息到所有队列

bool asyn_request_broadcast_message(char *message_buf, int message_length);

发送一条广播请求,参数为广播消息数据;

message_buf为消息缓冲区地址,message_length为消息数据长度;客户端会将这些数据作为二进制通过socket发送给服务器端,在每个消息队列中添加一份;

8、从指定队列接收消息

bool asyn_request_recv_message(char * str_queue_name);

发送一条接收消息请求,参数为队列名称;

应用可以根据需要注册一个或多个消息队列,与其他组件约定好通讯用的消息队列名称,便可以通过此接口获取其他组件发送来的消息通知;

9、清空指定消息队列

bool asyn_request_clear_message_queue(char * str_queue_name);

发送清空指定消息队列请求,参数为消息队列名称;

消息队列服务器在运行过程中,并不会主动删除、清空一个消息队列,即使客户端进程退出,服务器仍然会保留这些消息队列,待客户端重新连接后,仍可使用。

10、获取响应消息

bool asyn_response_query();

接收一条响应数据,返回值为bool型,如果成功响应数据接收成功,则返回true;

此接口会将响应数据保存在本地,作为当前响应消息,有效时间直达下次调用此接口获取新的响应消息,应用可通过其他asyn_response_开头的接口查询消息内各个字段的内容;

11、获取响应消息id

int asyn_response_get_message_id();

获取当前响应消息的id序号,此id号,由客户端发送时生成,采用递增方式;

12、获取响应消息名称

int asyn_response_get_message_length();

int asyn_response_get_message(char* buf, int length);

此接口由两个接口函数完成,应用首先获取消息名称的长度,然后准备足够的内存缓冲区,然调用获取数据的接口,参数为用户提供的buffer首地址以及buffer长度,接口会将消息名称复制到里面,返回值表明了实际复制的字节数。

13、获取响应消息状态

 int asyn_response_get_status_length();

int asyn_response_get_status(char* buf, int length);

与获取消息名称类似,此接口也由两个接口函数完成,参数和返回值含义均类似。

14、获取响应消息数据

int asyn_response_get_data_length();

int asyn_response_get_data(char* buf, int length);

与获取消息名称类似,此接口也由两个接口函数完成,参数和返回值含义均类似。

目前请求名称如下,分别对应上述ayn_request消息:

 getVersion:此请求只是例行公事,返回服务器版本信息,目前收到后可以简单忽略;

 shutdownServer:关闭服务器请求

 registerMessageQueue:注册消息队列请求
removeMessageQueue:删除消息队列请求

 sendMessage:发送消息请求
 broadcastMessage:广播消息请求
 recvMessage:接收消息请求

 clearMessageQueue:清空消息队列请求

此客户端DLL在C++、Unity3D(C#)脚本中测试OK,效果还是挺不错的。

大家有问题,加QQ技术群(322609996)询问即可。

群共享会发布最新版本,文中提到的qfFSM有限自动机,是本人为自己开发的另一个小类库,感兴趣的老大可以下载他的源码,目前支持几种主流编程语言。

YuYuYouEr Kinect SDK For C++ v0.3版发布

 

C++ Win32 DLL最新为v0.3版本增加以下特性:

支持双人骨骼

双人握拳手势

支持坐标系转换:骨骼数据 <-> 深度图像 -> 彩色图像

下载地址:http://www.yuyuyouer.cn/blog/?page_id=369

Unity3D版本也会尽快发布0.3版本,支持双人特性;


 

YuYuYouEr Kinect SDK Wrapper v0.2版发布 for Unity3D

关于YuYuYouEr Kinect SDK Wrapper最新信息,请点击:

http://www.yuyuyouer.cn/blog/?page_id=369

新的v0.2版本增加Unity3D插件支持,这份Wrapper代码会长期维护,并不断增加新特性,将来也会提供对其他体感硬件、体感平台的支持。

目前已经开始着手Android平台体感插件设计,我们会尽最大努力保证应用层接口的一致性,方便大家应用层代码移植。

此外qfFSM状态机类库支持多种语言,对于体感通用的UI交互组件算法,我们也会以状态机设计图或源码的方式发布,请大家关注本站更新。

功能说明:

提供Unity3D插件(移植自CMU Kinect Wrapper,修复bug,增加特性)

对Kinect for windows SDK v1.7进行封装

支持深度图、彩色视频、单人骨骼数据

支持Kinect Interaction握拳手势

支持语音识别

提供OpenCV图像处理函数:改变图像大小,水平、垂直翻转图像

Wrapper以Win32 DLL方式提供,可以被任何支持DLL调用的语言使用。

目前已经测试过C++、C#、Unity3D、Flash Air(ANE方式)、Java。

Unity3D插件移植自CMU Kinect Wrapper Package,替换原始版本底层实现,增加语音、握拳手势检测特性。

 

Kinect超时按钮实现 – 基于qfFSM有限状态自动机类库

qfFSM有限状态自动机类库目前拥有C++、C#、Java、JavaScript版本,对于同一份UML状态图,不同语言均可用qfFSM来实现。

本文使用JavaScript版本在浏览器中实现一个超时按钮,为方便测试,我使用鼠标指针来模拟Kinect关节,接入Kinect数据后,只需将手部关节坐标替换进来即可。

首先看超时按钮的UML状态图:

主状态机中有STATE_Normal、STATE_PointIn、STATE_PointOut三个状态,其中后面两个作为子状态机存在,他们内部分别含有3个状态:激活/非激活开始状态、正在激活/非激活状态、已激活/非激活状态。

设计 正在激活/非激活状态 是为了配合相应动画机制,如经典的按钮注水、按钮转满一周等计时方式。

事件方面支持UserLeave、PointIn、PointOut,以及MultiActive(多次连续激活)。

MultiActive机制可以很方便的实现 保持按住按钮,系统会周期触发某个事件。

源码中分为以下几个部分:

[Read the rest of this entry...]


京ICP备09080331号