1

MYO

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

图片描述

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

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

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

avb-myo-home.jpg

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

图片描述

MYO的结构

myo-overview.png

整个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

sdk-stack.png

跟各种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:self
                                          selector:@selector(didConnectDevice:)
                                          name:TLMHubDidConnectDeviceNotification
                                          object:nil];
    // Posted whenever a TLMMyo disconnects.
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(didDisconnectDevice:)
                                          name:TLMHubDidDisconnectDeviceNotification
                                          object:nil];
...
    // Posted when a new pose is available from a TLMMyo.
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(didReceivePoseChange:)
                                          name:TLMMyoDidReceivePoseChangedNotification
                                          object: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 pose
    if (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)

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


fxp
462 声望59 粉丝

coder in action