返回

揭秘响应式脑电波:Web 蓝牙+RxJS+Angular 赋能脑机交互!

前端

几个月前,我发现了一个蓝牙智能脑电波头戴设备,顿时被它的潜力所吸引。想象一下,我们可以使用 Web 蓝牙,让大脑直接与网页进行通讯!脑电波 ( Electroencephalography,简称 EEG ) 是一种监测脑电活动的方式,通常需要昂贵的仪器和复杂的操作。然而,随着技术的进步,脑电波头戴设备变得更加轻便和易于使用,为我们探索脑机交互的无限可能性打开了大门。

在这篇文章中,我们将深入探讨响应式脑电波技术,并使用 RxJS、Angular 和 Web 蓝牙构建一个简单的脑机交互演示。我们将学习如何从脑电波头戴设备接收数据,如何使用 RxJS 处理和过滤这些数据,以及如何将处理后的数据可视化呈现。

脑电波入门

脑电波是神经元在处理信息时产生的电活动。这些电活动可以被放置在头皮上的电极检测到,并被记录下来。脑电波可以分为不同的频段,每种频段都与不同的脑活动状态相关。例如,α 波 (8-12 Hz) 与放松和冥想状态相关,β 波 (13-30 Hz) 与注意力集中和认知活动相关,θ 波 (4-8 Hz) 与睡眠和梦境相关。

响应式脑电波

响应式脑电波是指大脑对外部刺激的电活动反应。当我们看到、听到或感觉到一些东西时,大脑会产生相应的脑电波。例如,当我们看到一张熟悉的面孔时,大脑会产生一种称为 P300 的脑电波。P300 波通常出现在刺激出现后的 300 毫秒左右,并且与注意和记忆相关。

Web 蓝牙

Web 蓝牙是 HTML5 中的一个新 API,允许网页与蓝牙设备进行通信。这使得我们能够使用 JavaScript 直接访问脑电波头戴设备的数据。Web 蓝牙的优势在于它简单易用,并且可以在各种设备上使用,包括台式机、笔记本电脑、平板电脑和智能手机。

RxJS

RxJS 是一个 JavaScript 库,用于处理异步数据流。它提供了丰富的操作符,可以让我们轻松地过滤、转换和组合数据流。在脑机交互中,我们可以使用 RxJS 来处理从脑电波头戴设备接收到的数据流,并从中提取有用的信息。

Angular

Angular 是一个前端框架,用于构建交互式 web 应用程序。它提供了许多开箱即用的组件和服务,可以帮助我们快速构建复杂的 web 应用程序。在脑机交互中,我们可以使用 Angular 来构建一个简单的演示应用程序,将处理后的脑电波数据可视化呈现。

构建脑机交互演示

现在,让我们一步一步地构建一个简单的脑机交互演示。

1. 设置开发环境

首先,我们需要设置开发环境。你可以使用你喜欢的代码编辑器和终端。还需要安装 Node.js 和 Angular CLI。

2. 创建 Angular 项目

接下来,我们需要创建一个 Angular 项目。打开终端,并输入以下命令:

ng new brain-computer-interface

3. 安装依赖项

我们需要安装一些依赖项。打开终端,并输入以下命令:

npm install rxjs web-bluetooth

4. 配置 Web 蓝牙

接下来,我们需要在 Angular 项目中配置 Web 蓝牙。在 src/main.ts 文件中,添加以下代码:

import { enableWebBluetooth } from '@web-bluetooth/繞台js';

enableWebBluetooth();

5. 创建服务

我们需要创建一个服务来处理脑电波头戴设备的数据。在 src/app/services/brain-computer-interface.service.ts 文件中,添加以下代码:

import { Injectable } from '@angular/core';
import { Observable, fromEvent } from 'rxjs';
import { map, filter } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class BrainComputerInterfaceService {

  private device: BluetoothDevice;
  private service: BluetoothRemoteGATTService;
  private characteristic: BluetoothRemoteGATTCharacteristic;

  constructor() { }

  connect(): Observable<void> {
    return fromEvent(window, 'deviceattached').pipe(
      filter((event: any) => event.device.gatt.prf !== null),
      map((event: any) => event.device)
    ).subscribe((device: BluetoothDevice) => {
      this.device = device;
      this.device.gatt.connect().then((server) => {
        server.getPrimaryService('e0cb49f0-8d8e-11e9-8f0b-362b9e155667').then((service) => {
          this.service = service;
          service.getCharacteristic('e0cb49f1-8d8e-11e9-ac3f-2a2ae2dbcce4').then((characteristic) => {
            this.characteristic = characteristic;
            characteristic.startNotifications().then(() => {
              console.log('Connected to brain-computer interface device.');
            });
          });
        });
      });
    });
  }

  getData(): Observable<number[]> {
    return fromEvent(this.characteristic, 'characteristicvaluechanged').pipe(
      map((event: any) => {
        const data = event.target.value.getInt8Array(1);
        return data;
      })
    );
  }
}

6. 创建组件

我们需要创建一个组件来显示脑电波数据。在 src/app/components/brain-computer-interface.component.ts 文件中,添加以下代码:

import { Component, OnInit, OnDestroy } from '@angular/core';
import { BrainComputerInterfaceService } from '../services/brain-computer-interface.service';
import { Subscription } from 'rxjs';

@Component({
  selector: 'app-brain-computer-interface',
  templateUrl: './brain-computer-interface.component.html',
  styleUrls: ['./brain-computer-interface.component.css']
})
export class BrainComputerInterfaceComponent implements OnInit, OnDestroy {

  private subscription: Subscription;
  public data: number[] = [];

  constructor(private brainComputerInterfaceService: BrainComputerInterfaceService) { }

  ngOnInit(): void {
    this.brainComputerInterfaceService.connect().subscribe();
    this.subscription = this.brainComputerInterfaceService.getData().subscribe((data) => {
      this.data = data;
    });
  }

  ngOnDestroy(): void {
    this.subscription.unsubscribe();
  }
}

7. 创建模板

我们需要创建一个模板来显示脑电波数据。在 src/app/components/brain-computer-interface.component.html 文件中,添加以下代码:

<div class="container">
  <h1>Brain-Computer Interface</h1>
  <div class="data">
    <p *ngFor="let value of data">{{ value }}</p>
  </div>
</div>

8. 运行项目

现在,我们可以运行项目了。打开终端,并输入以下命令:

ng serve

9. 使用脑电波头戴设备

最后,我们需要连接脑电波头戴设备,并将其置于头上。确保脑电波头戴设备已打开并已与你的电脑配对。

结论

我们成功地构建了一个简单的脑机交互演示。这个演示应用程序可以让我们使用大脑来控制网页上的元素。这是一个非常简单的示例,但它展示了脑机交互的巨大潜力。随着技术的进步,脑机交互技术将变得更加强大和复杂,并将在许多领域发挥重要作用,例如医疗、教育和娱乐。