MYO

MYO是一款类似Leap motion的新型人机交互HCI设备。它被戴在人的前臂,从而可以感知人的肌肉电流,进而识别出人的各种手势动作,比如向左向右挥手。

官方给出的MYO的几个用途是

  • 做展示。挥挥手就能换页,或者将Prezi的控制变成它应有的样子。
  • 控制手机。比如跑步的时候挥挥手就能切换歌曲,玩1024之类的。
  • 智能家居。打个响指就能让电视开机之类的。
  • 控制那些会跑的。现在支持了Sphero和Parrot Drone。

另一个我觉得很酷的例子是Armin Van Buuren在一次演出里使用MYO来辅助增强现场表演效果。特别有未来实时大规模交互演出的感觉。那些具体的表演视频就大家自己去搜吧。

我买了两个MYO腕带,下面三天我们就来想想能用它来玩点什么~(那上面的标志是在亮的,真的挺酷)

MYO的结构

整个MYO中间靠近皮肤的部分都布满了各种金属触点,所以戴起来的时候完全不在乎什么角度。充电用的是标准的Micro USB。

开发者视角

跟Leap motion类似,MYO提供两类输入数据:空间数据(Spatial data),手势数据(Gestural data)和唯一一种反馈接口,震动(vibration command)。

空间数据包括两个维度:方向(orientation),三维的加速度向量(acceleration vector)。
手势数据包括几种特定的手势,比如握拳等。

iOS sample

当然,MYO提供了基本所有平台的SDK(当然Windows phone除外)。开发起来最方便的还是Mac啦,windows要装一堆驱动啥的。如果只是开发应用的话,基本之用跟Android/iOS的SDK打交道就好啦。如果需要底层数据,MYO也提供C lib API。另外,还有一种用Lua写的Myo Scripts。

跟各种Sensor的使用类似,MYO的数据是以回调传递事件的方式来提供。MYO提供三类事件,如前面所说所空间事件,手势事件,以及一些辅助类的事件(如连接,断开设备等)。

开发MYO应用的最好方式就是先运行sample程序。iOS的SDK里面包括一个Doc和叫HelloMyo的Sample程序。打开Sample,运行,玩玩就好了。(MYO SDK开发速度很快,所以如果发现Sample程序告知版本太低,则需要连上USB和蓝牙发射器进行一次升级)。

看看代码吧。

- (void)viewDidLoad {[super viewDidLoad];// Data notifications are received through NSNotificationCenter.// Posted whenever a TLMMyo connects[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(didConnectDevice:)name:TLMHubDidConnectDeviceNotificationobject:nil];// Posted whenever a TLMMyo disconnects.[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(didDisconnectDevice:)name:TLMHubDidDisconnectDeviceNotificationobject:nil];
...// Posted when a new pose is available from a TLMMyo.[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(didReceivePoseChange:)name:TLMMyoDidReceivePoseChangedNotificationobject:nil];}

首先是注册各种事件,包括连接断开连接,这里有个Sync Gesture,指的是一种比较奇怪的动作(不大好描述)。应该是MYO用来给手臂肌肉电流做一个基本的base line吧。

最有用的可能就是TLMMyoDidReceivePoseChangedNotification了。一旦有新的姿势检测到,这个函数就能收到一次callback。来看这个Callback的内容。

- (void)didReceivePoseChange:(NSNotification *)notification {// Retrieve the pose from the NSNotification's userInfo with the kTLMKeyPose key.TLMPose *pose = notification.userInfo[kTLMKeyPose];self.currentPose = pose;// Handle the cases of the TLMPoseType enumeration, and change the color of helloLabel based on the pose we receive.switch (pose.type) {case TLMPoseTypeUnknown:case TLMPoseTypeRest:case TLMPoseTypeDoubleTap:// Changes helloLabel's font to Helvetica Neue when the user is in a rest or unknown pose.self.helloLabel.text = @"Hello Myo";self.helloLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:50];self.helloLabel.textColor = [UIColor blackColor];break;case TLMPoseTypeFist:// Changes helloLabel's font to Noteworthy when the user is in a fist pose.self.helloLabel.text = @"Fist";self.helloLabel.font = [UIFont fontWithName:@"Noteworthy" size:50];self.helloLabel.textColor = [UIColor greenColor];break;case TLMPoseTypeWaveIn:// Changes helloLabel's font to Courier New when the user is in a wave in pose.self.helloLabel.text = @"Wave In";self.helloLabel.font = [UIFont fontWithName:@"Courier New" size:50];self.helloLabel.textColor = [UIColor greenColor];break;case TLMPoseTypeWaveOut:// Changes helloLabel's font to Snell Roundhand when the user is in a wave out pose.self.helloLabel.text = @"Wave Out";self.helloLabel.font = [UIFont fontWithName:@"Snell Roundhand" size:50];self.helloLabel.textColor = [UIColor greenColor];break;case TLMPoseTypeFingersSpread:// Changes helloLabel's font to Chalkduster when the user is in a fingers spread pose.self.helloLabel.text = @"Fingers Spread";self.helloLabel.font = [UIFont fontWithName:@"Chalkduster" size:50];self.helloLabel.textColor = [UIColor greenColor];break;}// Unlock the Myo whenever we receive a poseif (pose.type == TLMPoseTypeUnknown || pose.type == TLMPoseTypeRest) {// Causes the Myo to lock after a short period.[pose.myo unlockWithType:TLMUnlockTypeTimed];} else {// Keeps the Myo unlocked until specified.// This is required to keep Myo unlocked while holding a pose, but if a pose is not being held, use// TLMUnlockTypeTimed to restart the timer.[pose.myo unlockWithType:TLMUnlockTypeHold];// Indicates that a user action has been performed.[pose.myo indicateUserAction];}
}

内置的手势有这些:

TLMPoseTypeDoubleTap(拇指和中指连续点击两次)
TLMPoseTypeFist(握拳)
TLMPoseTypeWaveIn(向内挥手,戴在右手就是往左挥手)
TLMPoseTypeWaveOut(向外挥手)
TLMPoseTypeFingersSpread(按理来说是类似cross finger的意思,但似乎我没咋触发过这个pose)

基本就这么点儿代码。明天我们尝试把这个跟其他功能联系起来哈。

(30 gadget day 1) MYO get started相关推荐

  1. (30 gadget day 2) 最简单也最复杂的Gadget - YubiKey

    晚上翻出myo准备继续写的时候,被提示需要升级,于是就update呗.于是...就update了一个小时,现在还在转... 其他设备都在办公室,于是智能在家里翻箱倒柜...先是翻出了Chromecas ...

  2. 一步步创建 边栏 Gadget(一)

    相信朋友们总有这样的经历:通过视频站点看电视剧,由于种种原因全屏时候某个程序(word,Excel)等,而又不想错过看电视剧的机会.看看屏幕右侧边栏上的时钟,主意来咯,要是能够把站点的页面放在边栏上就 ...

  3. 一步步创建 边栏 Gadget(二)

    相信使用上篇中创建的边栏Gadget之后,大家会很郁闷.难道视频窗口就那么小吗?看起来真费劲.我能通过该Gadget看着一部电视剧.而不能够定制自己需要的或者想要看的电视剧. 在上一篇一步步创建 边栏 ...

  4. usb gadget g_webcam uvc gadget调试

    开发板连接了一个USB camera,想通过UVC gadget将摄像头输出到PC上. 内核关于gadget的测试说明 gadget-testing.txt 中提到: # uvc-gadget -u ...

  5. linux usb gadget 日志

    1,USB 协议入门 几种USB控制器类型:OHCI,UHCI,EHCI,XHCI 遇到过一些关于USB的东西(如下),一直没搞明白什么USB1.0/1.1/2.0/3.0之类的,当然我知道它们的各自 ...

  6. USB gadget设备驱动解析

    利用Linux USB gadget设备驱动可以实现一些比较有意思的功能,举两个例子: 1.一个嵌入式产品中的某个存储设备,或是一个存储设备的某个分区,可以作为一个U盘被PC:设别,从而非常方便的完成 ...

  7. Linux3.x——USB Gadget HID keyboard + Mass storage

    本篇可能是全网第一个具体介绍板子做为usb device 设备 同时实现HID keyboard + Mass storage 功能的(内核版本3.xx).废话不多说,下面是具体操作.操作之后,你回头 ...

  8. linux gadget 模拟鼠标,HID设备--开发板模拟鼠标

    HID HID 鼠标裸数据 驱动:1 2 3 4 5 6 7Symbol: HIDRAW [=y] Type : boolean Prompt: /dev/hidraw raw HID device ...

  9. 第16章 USB主机、设备与Gadget驱动之USB UDC与Gadget驱动(一)

    16.4.1 UDC(USB设备控制器)和Gadget(小配件)驱动的关键数据结构与API USB设备控制器(UDC)驱动指的是作为其他USB主机控制器外设的USB硬件设备上底层硬件控制器的驱动,该硬 ...

最新文章

  1. php 公共的 受保护的,php-不使用$this-gt;调用受保护的属性
  2. 一起学nRF51xx 15 - spis
  3. [C#] DataTable 操作汇总(持续更新)
  4. P4310-绝世好题【位运算,dp】
  5. Asix下日志包冲突
  6. 前端学习(3293):effect hook
  7. python白森_氧气恋人小说-江白森修辞在线阅读-829阅读网
  8. java代码安全检测机制_全面解析:java中的反射机制,内含代码验证解析
  9. 对Repository模式误用的反思和纠正
  10. 【kafka】kafka 建立很多很多消费组 会怎么样
  11. 单反相机很久没有更新产品问世了,真的已经被抛弃了吗?
  12. GUN/LINUX的文件类型
  13. 数字系统——实验一:常用元器件的识别与简单测试
  14. 华为手机fastboot解锁
  15. lisp弧度转度分秒_用C语言实现度分秒与弧度的转化
  16. import itchat ModuleNotFoundError: No module named 'itchat'
  17. 下列属于mysql流程控制的是什么_下面选项中,不属于MySQL中流程控制语句的有...
  18. 教你找回直接打开outlook附件文件编辑后保存但未另存为的附件文件?
  19. 使用 Matlab 解决数学建模问题
  20. 美国Zip code大全

热门文章

  1. halcon 19.05 linux x64
  2. jquery 简单的进度条实现代码
  3. 微信小程序授权登录第一次总是失败,第二次登录便正常了
  4. 基于Qt的截图工具,实现截图后进行编辑
  5. 斯特林——安菲尔德的新宠
  6. post请求php报500错误,php - Volley POST字符串请求意外错误500 - 堆栈内存溢出
  7. 使用 docker 启动 nginx
  8. Matlab安装时频分析工具箱(解决无支持的编译器问题)
  9. 【vue】v-for循环样式乱
  10. 3G应用开发之Android 传智播客 基础知识总结