大多数浏览器和
Developer App 均支持流媒体播放。
-
Core Motion 的新功能
了解如何使用最新的 Core Motion 更新来扩展 App 使用运动数据的方式。了解在 Apple Watch 上记录 HealthKit 锻炼时如何流式传输高频传感器数据。我们将为你展示如何在浮潜等水上活动期间获取浸水数据,包括水深和温度。了解如何将姿态、用户加速度和旋转率等运动数据从 AirPods 等音频设备传输到 iPhone 和 Mac 等联网设备。
资源
相关视频
WWDC23
WWDC20
-
下载
♪ ♪
Erin:大家好 我是 Erin 我是 CoreMotion 团队的工程师 很高兴给大家介绍 CoreMotion 一些很酷的更新 CoreMotion 是一个 中央框架 用于访问 来自惯性传感器的运动数据 随着硬件的发展 我们捕捉运动信息的能力 也在不断提高 碰撞检测、摔倒检测和空间音频 只是依赖于改进感知能力的一些功能 通过 CoreMotion 你也可以 在你的 App 中利用这些改进 在本次讲座中 我将重点介绍一些 可以与运动数据进行交互的新方法 在讲新功能之前 我想带你快速了解一下 产生运动数据的传感器 捕捉设备的运动方式 是我们体验它们的核心 Apple 的很多设备 都内置了传感器 以帮助创建 它们在空间中的运动概念 以 Apple Watch 为例 它的内置传感器包括测量加速度的 加速感应器、 测量旋转的陀螺仪、 测量磁场的磁力计 和测量压力的气压计 它们共同帮助追踪 设备在空间中的运动和定向 围绕着设备的运动而联想出的概念 是许多受欢迎功能的基础 这些功能包括追踪你当天的步数 以及你在训练中消耗了多少卡路里 它支持依赖于设备方向的体验 比如用观星 App 来探索天空中的星星 当你发生车祸或摔倒时 这些通过检测保证我们安全的功能 也依赖于使用相同的传感器 来追踪运动 可利用 CoreMotion 改进的 App 众多 这些只是其中的一些 我们很期待看到你 如何利用 CoreMotion 现在 我已经向你 简要介绍了所涉及的一些传感器 我将介绍从 AirPods 等 音频产品中获取运动数据 获取浸水数据的更新 最后将介绍一种流式传输 更高速率传感器数据的新方法 我们从耳机运动开始 不久前 带有动态头部追踪的空间音频 改变了我们体验音乐和电影的方式 动态头部追踪依赖于与 iPhone 和 Apple Watch 上的相同设备运动算法 CMHeadphoneMotionManager 几年前被引入时 使动态头部追踪成为可能的相同数据 就可以为你所用了 通过向连接的 iOS 或 iPadOS 设备 流式传输位姿、 用户加速度和旋转率数据 你可以追踪你的头部运动方式 头部追踪解锁了很多很酷的功能 从游戏 App 到健身 App 今年 CMHeadphoneMotionManager 将新增至 macOS 让我们来看看一些细节 CMHeadphoneMotionManager 最早可以 在 iOS 和 iPadOS 14 中使用 从今年开始 它也将新增至 macOS 14 你可以使用 CMHeadphoneMotionManager 从支持空间音频、 有动态头部追踪的音频设备 比如 AirPods Pro 流式传输设备运动 到连接的 iOS、iPadOS 或 macOS 设备 在从支持的设备流式传输时 就像在 iPhone 和 Apple Watch 上一样 检查 CMDeviceMotion 的 位姿、用户加速度和旋转率数据 注意 CMHeadphoneMotionManager 特有的附加信息 如 SensorLocation 这有助于区分数据来源 是来自左耳机还是右耳机 因为数据是流式传输自远程设备 所以了解什么时候连接很重要 CMHeadphoneMotionManagerDelegate 让监听连接状态更新变得更容易 让我来为你展示一下
采用 CMHeadphoneMotionManagerDelegate 协议 响应连接状态更新 当音频设备连接到支持的流媒体设备 如 iPhone、iPad 或 Mac 时 数据是可用的 如果启用了自动人耳检测 你也会收到影响头部追踪的事件 如果你把耳机从耳朵里取出 你会收到一个断开事件 它们被放回去时 你会收到一个连接事件
同样地 如果启用了自动头部检测 戴上和摘下头戴式耳机 也会触发这些事件 设置 CMHeadphoneMotionManager 来监听这些事件和数据流很容易 让我来为你展示如何操作 在开始流式传输之前 你要确保 设备的运动数据是可用的 这可以通过 isDeviceMotionAvailable 属性来检查 指定一个委托 来接收我前面谈到的连接事件 然后 开始流式传输数据 CMHeadphoneMotionManager 提供了一个 推送和一个拉取接口来抓取数据 在这个例子中 我们将使用推送接口 使用 startDeviceMotionUpdates 并指定一个操作队列和处理程序 因为要访问运动数据 所以授权很重要 你的 App 用户会被提示使用 你添加到 Info.plist 中的 Motion Usage Description 键 来授权你的 App 获取运动数据 你可以检查 authorizationStatus 属性 以确认你是否已被授权访问运动数据 并提供一个流畅的体验 无论权限级别如何 一旦你得到授权 数据开始流式传输 使用每个设备 运动更新提供的位姿信息 追踪头部位姿就很容易了 例如 我们可以 追踪一个参考位姿作为 startingPose 并使用 multiply 方法来方便地 获得当前样本与原始位姿的相对变化 除了位姿、用户加速度 和旋转率数据之外 每个设备的运动更新 都包含传感器的位置信息 这一点很重要 因为运动数据 是一次从一个耳机中传递给你的 与每个样本一起交付的 SensorLocation 枚举可以让你 识别数据来源于哪个耳机 流式传输数据的耳机 可能会受到许多因素的影响 包括在启用自动人耳检测的 情况下的入耳状态 例如 如果数据 从我的右耳机流式传输 但我在启用自动人耳检测的情况下 把它从耳朵里拿出来 那么我的左耳机会接管数据传输 这使得头部追踪的体验更加流畅 方便的头部追踪 为许多体验打开了大门 比如 它让计算做了 多少个俯卧撑或监测姿势 变得前所未有得简单 现在 有了 macOS 的支持 你可以将运动数据 从支持头部追踪的音频产品 流式传输到更广泛的设备中 我们很高兴看到你使用 CMHeadphoneMotionManager 构建的产品 现在 你不需要测量压力 来追踪你的头部如何移动 但其他东西需要 我将谈谈你如何利用 CMWaterSubmersionManager 的 一些很酷的更新来和 与水有关的活动进行互动 在进行与水有关的活动中 如浮潜或游泳 关于水和你的浸水状态 有很多有趣的事情 你可能对你的深度 和水温有兴趣 知道你什么时候浸入水中 或者你是否已经离开水面 回到岸上或船上 以及你活动期间的表面气压 是多少 也很有用 使用内置的气压计 CMWaterSubmersionManager 可以在你进行与水有关的活动时 为你追踪这些数据 让我给你详细介绍一下 CMWaterSubmersionManager 可用于使用 watchOS 9 的 Apple Watch Ultra 使用 CMWaterSubmersionManagerDelegate 来监听深度、温度 和浸水状态数据 请确保将浅水深度和压力功能 添加到你的 App 中 并通过配置自动启动设置 让你的 App 用户在开始 与水有关的活动时获得流畅体验 让我来为你展示如何开始使用 CMWaterSubmersionManager 为了开始追踪浸水状态 在检查完可用性后 设置 CMWaterSubmersionManager 然后指定一个委托 开始 接收关于浸水状态和事件的更新 让我们来谈一谈如何接收这些更新 使用 CMWaterSubmersionManagerDelegate 获得更新很简单 你可以接收很多不同类型的更新 浸水状态的更新 比如当你进入和离开水面时 是通过 CMWaterSubmersionEvent 的 didUpdate 方法传递的 当有问题时 你会收到 errorOccurred 更新 比如当你的 App 缺少授权 或者在一个不支持的平台上 你尝试接收更新时 水温更新是使用 CMWaterTemperature 传递的 它们带有不确定性 因为手表的温度 需要几秒钟才能与水温平衡 因此 当你第一次浸水时 不确定性会更高 一旦你在水中呆的时间长了 数据就会开始趋同 注意 水温只有在 浸入水中时才能得到 你将通过 CMWaterSubmersionMeasurement 接收深度、压力、表面压力 和浸水状态的更新 在你的浸水活动中 测量结果会以 固定的时间间隔传递给你的 App 注意 其中一些数据 如深度 只在你处于浸水状态时适用 所以这些是可选的 水下的深度对应某些深度状态 让我向你展示它们是如何映射的
我们从水上的状态快开始 此时你处于 notSubmerged 状态 在水下 1 米以内 你就处于 浸水的 submergedShallow 状态 超过 1 米 你就处于浸水的 submergedDeep 状态 通过浅水深度和压力功能 就可以很容易地确保你的 App 用户 停留在深水区域外 使减压病的风险最小化 它会将最大深度保持在 6 米 并会在你接近这一深度时提醒你 你可以使用最大深度属性 来检查被监测的深度 当接近 6 米时 你将进入 approachingMaxDepth 状态 超过 6 米时 你就进入了 pastMaxDepth 状态 在 pastMaxDepth 状态下 数据和一些不确定性会被输送到 6 米以下 超过这个深度 你就会进入 sensorDepthError 状态 通过将深度分区 CMWaterSubmersionManager 可以很容易地监测深度的变化 关注安全和传感器的限制 如果你对超过 6 米 深度上限的用例感兴趣 你可以查看文档 了解更多关于管理权限的信息 无论你选择哪种方式 使用 CMWaterSubmersionManager 为水上运动创造良好的体验 都前所未有的容易 不过 也有很多非水上运动 我很高兴能分享一种使用 CMBatchedSensorManager 在这些活动中 消耗高速运动数据的方法 首先 我们从一些背景开始 我已经介绍了一些 把运动数据传输给你的方法 设备运动算法融合了 来自内置加速器和陀螺仪的数据 以提供一种简单的方式来追踪设备 如 Apple Watch 在空间中移动的方式 你可能很熟悉 CMMotionManager 它以每个样本为基础 向你的 App 实时提供这些样本 它支持的最大频率是 100Hz 这意味着如果你有低延迟需求 比如依赖设备的 瞬时位姿的 UI 组件 它是一个很好的选择 这与我们使用新的 CMBatchedSensorManager 提供高速率数据的方式相比如何? CMBatchedSensorManager 在固定时间表上提供成批的传感器数据 每秒钟传输一批数据 这意味着我们能够以较低的开销 向你的 App 提供更高速率的数据 也就是 800Hz 的加速器 和 200Hz 的设备运动 而现有的 CMMotionManager 是 100Hz 现在 你可以访问一些相同的数据流 这些数据流支持保护我们安全的功能 如跌倒和碰撞检测
因为数据是分批的 所以在考虑使用 CMBatchedSensorManager 时 有一些事情需要考虑 如果你的 App 有以训练为中心的功能 可以从高速率数据中受益 但没有非常严格的延迟要求 那 CMBatchedSensorManager 就很适合 我介绍了如何将 更高速率的传感器数据传递给你 以及它与我们现有的 一些界面所提供的数据的比较 让我向你展示一些它的使用方法 许多运动都是 以短时的冲击性活动为中心的 这些运动包括高尔夫、 网球和棒球等 在这些运动中 在挥的动作中捕捉更多的信息 可能对评估形式 和改善你的比赛至关重要 这就是捕捉更高速率的 传感器数据发挥作用的地方 我们将通过把它固定在 一个具体案例中来进行深度了解 我们来专注于棒球挥棒
挥棒有几个不同的阶段 在这个图中 我们可以看到挥棒前的准备 挥棒和挥棒的后续动作 挥棒质量的一个重要指标是接触时间 换句话说 就是从击球手开始挥棒 到球棒击中球 这中间经过了多长时间 使用高速率的传感器数据 我们可以将其分为三个步骤 在击球手的手腕上 我们可以看到 Apple Watch 的 x、y 和 z 方向 我们可以把击球手击球时 手腕的运行轨迹想象成蓝色 重力矢量指向下方 为了计算接触时间 我会先先使用 800Hz 加速度计 检测球棒和球的碰撞点 然后 我会用 200Hz 设备运动 沿重力方向的旋转 来确定挥棒的开始 最后 我们可以计算出 这些时间戳之间的差异 从挥棒开始到碰撞 称为接触时间 让我们先把挥棒过程中的 传感器数据可视化 以获得相关数据 我绘制了包含 一次挥棒的一秒钟时间窗内 z 方向的加速度计数据 可以看到 在 0.5 秒到 0.6 秒之间 有一个活动的爆发 我们检测碰撞点的算法 将围绕这一观察进行 让我们比较一下挥棒过程中 可用的信号信息量 上面是 800Hz 加速器 下面是 100Hz 加速器 在这一部分中 在 0.5 秒到 0.6 秒之间 我们不止有 10 个数据点 而是 80 个数据点 让我们对正在发生的事情 有了更细致的了解 这有帮助我们将注意力集中在 我们感兴趣的事情上 如碰撞 现在 让我们从设备运动的角度 来看看同一次挥棒 这是以 200Hz 的速度 着重力方向绘制的旋转率 可以看出挥棒在旋转率开始变化时 于 0.3 秒左右时开始 让我们把这些放在一起 有了这些按时间排列的图 我可以感受到 800Hz 加速器 和 200Hz 设备运动的信息 如何帮助我计算接触时间 现在我对挥棒如何显示在 传感器流中有了一个很好的概念 我可以使用 CMBatchedSensorManager 开始流式传输和处理数据
首先 我们要确认 数据在这个平台上是可用的 你可以通过检查 isAccelerometerSupported 来做到这一点 你可以使用类似的属性 来检查设备运动支持 Apple Watch Series 8 和 Ultra 都支持高速率加速计 和设备运动
因为这是一个以训练为中心的 API 你需要有一个活跃的 HealthKit 训练会话来获取数据 获得了 HealthKit 体能训练会话之后 你就可以开始接收数据了 有了 Swift 异步支持 接收 成批的传感器数据并处理每批数据 就变得很容易 确保你评估了退出循环的条件 例如 如果训练已经结束
记住 如果我们 没有得到运动数据的授权 或者在不支持的平台上 错误就会浮现 现在 让我们仔细看 我想对每批数据做什么 对于每批数据 我会调用一个 feed 函数 在数据上运行我的算法 当球棒与球接触时 我希望在 z 方向上 看到一个明显的反应 记住 z 轴是垂直于表冠的 这种回响是碰撞很好的近似 我会在处理每批加速度计数据时 都考虑这一点 首先 我想更好地隔离高频率响应 因为力在接触时被转移了 为此 我将筛选 z 样本为 fz 利用筛选后的数据 我会把碰撞点 近似为筛选后信号的峰值 让我们把与该样本相关的索引 记为 impactIndex 利用从筛选后的信号中 得出的 impactIndex 我可以从原始的数据中 获取碰撞的时间戳 这就把我带到了 计算接触时间的第二步: 利用沿重力方向的旋转 来检测挥棒的开始
想象一下击球者挥棒时 Apple Watch 的轨迹 它会遵循围绕身体的轨迹来迎接球 因此 我预计在挥棒过程中 会看到沿重力方向的非零旋转率 而在挥棒之外 沿重力方向的旋转率接近于零 通过将高频率的设备运动 流式传输到本地缓冲区 我可以使用旋转率数据 来识别挥棒开始的位置 让我们仔细看看 我的计算函数是什么样子的 我将向后遍历本地缓冲区 以在兴趣点周围进行调查: 碰撞时间戳 由于我知道挥棒的开始 必须在碰撞之前 我可以在处理 缓冲区中的每个样本之前 运行一系列的 shouldProcess 检查 这可以包括一个时间戳检查 以确认设备运动样本 来自碰撞时间之前 我还可以对挥棒持续时间进行限制 挥棒的开始在与球接触前 不会超过一定的时间 这是有道理的
对通过我的一系列初始检查的样本 我会在 computeRotation 函数中 计算沿重力方向的旋转 该函数是每个轴的旋转率 和重力值的总和 计算了沿重力方向的旋转后 我可以开始寻找挥棒的开始 简单的挥棒开始的检查可能会寻找 沿重力方向的 旋转率的一致失败 以满足阈值 一旦看到沿重力方向的旋转率 不再达到该阈值 我将把它作为 挥棒的开始时间并退出循环 作为最后的检查 我将验证我们检测到的挥棒 这里 我可以看一下挥棒期间 沿重力方向累积的旋转 并确认它在预期的阈值之内 这样 我就可以 返回我检测到的起始时间戳 这把我带到了最后一步 第三步 现在我有了 计算接触时间所需的一切 让我们回到我们的初始 feed 函数
使用 CMBatchedSensorManager 我从流式传输加速度计 和设备运动数据开始 通过使用筛选后的加速度计 在 z 方向的数据来检测碰撞时间 然后 我通过检查沿重力方向的旋转率 来确定在该碰撞时间戳 附近的挥棒的开始 我取这两个时间戳之间的差异 来计算接触时间 这是如何基于传感器数据 开发功能的一个简单示例 高频数据流中的额外信号信息 也为很多其他调查打开了大门 让我们来看看 我们在前面看到了 这个加速度计数据追踪 在 z 方向上有 800Hz 的加速度计流 现在 看一下第二个图 它看起来很相似 但不太一样 这是一个挥棒失误的轨迹 即球棒没有真正接触到球 尽管两者的挥棒动作本身是相似的 但你可以看到高速数据流 如何让我们 对这样的差异有额外的了解 你开发的算法可以利用这些差异 来检测以前不可能做到的事情 总结一下 同样的设备运动算法 以几种不同的方式向你提供数据 CMMotionManager 以每个样本 最大 100Hz 的频率提供数据 如果你有亚秒级的低延迟要求 或者在训练之外有基于运动的功能 它会是一个很好的选择 新的 CMBatchedSensorManager 以更高的速率提供数据 在批量处理计划中 其上限为 200Hz 的设备运动 和 800Hz 的加速度计 每秒钟传输一批数据 这让它对 以训练为中心的功能很有用 可以受益于高速率数据 它适用于 Apple Watch Series 8 和 Ultra 虽然我专注于棒球挥棒来使用 CMBatchedSensorManager 但这些较高速率的数据流可以为 Apple Watch 的所有运动 提供有价值的洞察 特别是在短时或基于碰撞的活动中 这就是 CMBatchedSensorManager 我对 CoreMotion 的 新内容的评论也到此结束 我们有很好的方法来与运动互动 无论是在耳机还是在 Apple Watch 上 有很多很酷的方法来使用运动数据 而我只介绍了几个例子 我鼓励你尝试这些方法 并查看文档以了解更多信息 请务必为我们提供反馈 关于运动数据如何转化为 基于健康的功能的例子 如测量移动性 请查看 WWDC 2020 的讲座“超越记步数” 关于利用 CMBatchedSensorManager 运行训练的更多信息 请查看 “用 WorkoutKit 构建自定义训练” 我们非常期待看到你如何利用 运动数据创造惊人的新体验 感谢你的观看
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。