LSL上手操作

LSL Hands On

Posted by 陈锐CR on March 31, 2020 | 阅读

Lab Streaming Layer 数据流

在上一篇博文中,我们说到了LSL数据流的简介以及可支持的设备。你会发现LSL是一个非常强大的工具,尤其是对于脑机接口方面,需要实时的读取在线数据时,它将会发挥很大的能力。

今天,我将以MATLAB和python简要的展示,如何通过LSL接收数据和发送数据。

所需工具支持以及code

工具支持:这部分可查看上一篇博文所支持的设备。另一个也可以查看Github上的APP工具箱

代码:这是官网上的示例代码

Matlab示例代码:

Receive接收数据

首先在上面的代码中下载MATLAB的文件夹,打开MATLAB后先将文件夹加载到路径下,并导航到ReceiveData文件下,打开后你会发现以下代码

%% instantiate the library初始化库
disp('Loading the library...');

lib = lsl_loadlib();
% resolve a stream...进行数据流传输
disp('Resolving an EEG stream...');

result = {};
while isempty(result)
  result = lsl_resolve_byprop(lib,'type','EEG'); end

% create a new inlet创建数据
disp('Opening an inlet...');
inlet = lsl_inlet(result{1});

disp('Now receiving data...');
while true

  % get data from the inlet得到数据
  [vec,ts] = inlet.pull_sample();
  % and display it展示数据
  fprintf('%.2f\t',vec);
  fprintf('%.5f\n',ts);
end

在以上代码中有一个地方非常关键。Resolving an EEG stream…

当你需要采集NIRS数据时,将EEG修改为NIRS;

当你需要采集眼动数据时,将EEG修改为eye;

当你需要采集音频数据时,将EEG修改为Audio;

当你需要采集event事件时,将EEG修改为MyEventStream。

Send发送数据

在该文件下打开senddata.m,可查看以下代码;

%% instantiate the library初始化
disp('Loading library...');

lib = lsl_loadlib();

% make a new stream outlet创建
disp('Creating a new streaminfo...');
info = lsl_streaminfo(lib,'BioSemi','EEG',8,100,'cf_float32','sdfwerr32432');

disp('Opening an outlet...');
outlet = lsl_outlet(info);

% send data into the outlet, sample by sample发送
disp('Now transmitting data...');
while true
  outlet.push_sample(randn(8,1));
  pause(0.01);
end

跟接收数据同样的道理,lib,’BioSemi’,’EEG’,8,100,’cf_float32’,’sdfwerr32432

这一句是非常关键的代码。

当你需要修改时,确保当前的设备名称及数据类型是正确的。

Python示例代码:

当前所使用的python版本可查看图中,首先我们需要在电脑上安装pylsl库,可通过命令行pip install pylsl进行安装。

打开example里的receivedata.py可查看以下代码:

"""Example program to show how to read a multi-channel time series from LSL."""

from pylsl import StreamInlet, resolve_stream

# first resolve an EEG stream on the lab network
print("looking for an EEG stream...")
streams = resolve_stream('type', 'EEG')

# create a new inlet to read from the stream
inlet = StreamInlet(streams[0])

while True:
    # get a new sample (you can also omit the timestamp part if you're not
    # interested in it)
    sample, timestamp = inlet.pull_sample()
    print(timestamp, sample)

在这里面跟matlab中是一样的道理,需要得到哪种数据就将EEG修改为哪种数据。

Senddata.py

"""Example program to demonstrate how to send a multi-channel time series to
LSL."""

import time
from random import random as rand

from pylsl import StreamInfo, StreamOutlet

# first create a new stream info (here we set the name to BioSemi,
# the content-type to EEG, 8 channels, 100 Hz, and float-valued data) The
# last value would be the serial number of the device or some other more or
# less locally unique identifier for the stream as far as available (you
# could also omit it but interrupted connections wouldn't auto-recover)
info = StreamInfo('BioSemi', 'EEG', 8, 100, 'float32', 'myuid34234')

# next make an outlet
outlet = StreamOutlet(info)

print("now sending data...")
while True:
    # make a new random 8-channel sample; this is converted into a
    # pylsl.vectorf (the data type that is expected by push_sample)
    mysample = [rand(), rand(), rand(), rand(), rand(), rand(), rand(), rand()]
    # now send it and wait for a bit
    outlet.push_sample(mysample)
    time.sleep(0.01)

使用Psychopy通过LSL发送marker信息到近红外设备,可参考文章

Psychopy通过LAN网线触发marker连接NIRX设备


谢谢大家观看,如有帮助,来个喜欢或者关注吧!


本文作者:Chen Rui

博客地址 : Chen Rui Blog
知乎地址 : 知乎专栏
B站地址 : B站主页
书店地址 : 书店主页
网易云音乐地址 : 音乐主页


版权声明:本文由 陈锐CR 在 2020年03月31日发表。本博客文章作者为陈锐CR时均采用属于个人原创撰写,未经许可,禁止在任何媒介以任何形式复制、发行本文章,如需转载,请查看About联系方式,非商业转载请注明出处,不得用于商业目的。
文章题目及链接:《LSL上手操作》



☛您的打赏是我创作的动力☚


「游客及非来必力用户留言」:

%
UP
博客已运行