1. 개요

실험을 시작하기 전에 우선 CGX Data Aquisition 프로그램을 다운/설치하여 기본적인 프로그램 환경을 구축한다 (http://cognionics.com/wiki/uploads/Main/CGXAcquisitionv66.zip). 아래 이미지와 같이 동봉된 CGX Trigger, Receiver를 PC에 연결시킨다. 이때 Trigger는 Unity 또는 실험을 구동하는 컴퓨터에, Receiver는 CGX Data Aquisition을 구동하는 컴퓨터에 연결을 해야한다. 성능이 좋은 경우 한 컴퓨터에서 다 해도 문제는 없어보인다. 아래의 미지는 헤드셋에 내장된 SD카드에 직접 저장하는 것인데 손실위험이 있기 때문에 Steraming으로 받아서 저장하는 것을 추천한다. EEG 기기를 장착하고 impedance값을 최대한 낮게 조정한 뒤 연결 후 실험을 시작하면 된다.

`Trigger System Flow (http://cognionics.com/wiki/pmwiki.php/Main/WirelessTrigger)

 

2. Wireless Trigger

다음으로는 Data Acquisition Program에서 Recording 중에 Trigger 신호를 주는 방법에 대해 설명한다. 랩에서는 주로 Unity를 활용하기 때문에 CGX Wiki에서 제공하는 예시를 변형하여 구현하였다. 아직 프로그램 내에서 문자열을 보내서 해석까지는 하지 못해서 문자열을 숫자로 변환하여 전송하도록 하였다.

Python 버젼은 LSL을 활용해서 Data Acquisition Program에서 LSL Streaming 버튼을 눌러 실행하면 그때부터 받은 데이터를 따로 저장하고, Trigger도 같이 저장하게끔하였다. 데이터 수집이 동일하게 되는 것은 확인했지만 아직 이를 활용해서 분석을 해보지는 않았으니 참고하길 바랍니다.

1) Unity (C#) - Port 설정 (https://coderzero.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%8B%9C%EB%A6%AC%EC%96%BC%ED%86%B5%EC%8B%A0-RS232-%EC%8B%9C%EB%A6%AC%EC%96%BC-%ED%86%B5%EC%8B%A0)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

using System.IO;
using System.IO.Ports;

/**
Baud Rate: 57,600 bps
Data Bits: 8
Stop Bits: 1
Flow Control: None
COM3
**/

public class serialCom : MonoBehaviour {
    public static serialCom sc;

    public enum PortNumber{
        COM1, COM2, COM3, COM4,
        COM5, COM6, COM7, COM8,
        COM9,COM10,COM11,COM12,
        COM13,COM14,COM15,COM16
    }

    private SerialPort serial;

    [SerializeField]
    private PortNumber portNumber = PortNumber.COM1;
    [SerializeField]
    private string baudRate = "9600";

    void Start(){
        if(sc && sc != this)
            Destroy(this);
        else
            sc = this;

        serial = new SerialPort(portNumber.ToString(), int.Parse(baudRate), Parity.None, 8, StopBits.One);
    }

    public void sendTriggerEEG(string data){
        if(!serial.IsOpen)
            serial.Open();

        int marker;
        if(data == "T"){  //response
            marker = 102;
        }else if(data == "S"){  //dummy
            marker = 101;
        }else if(data == "N"){  //Normal
            marker = 11;
        }else{
            marker = 10;  //Odd
        }

        byte[] buffer = new byte[] { Convert.ToByte(marker) };
        serial.Write(buffer, 0, buffer.Length);

        //0~255 사이 값을 보낼 수 있는데, 찍혀 나오는 값은 256이 곱해져있는 값이 찍히게 됨
    }
}

2) Python LSL (LabStreamingLayer) : https://github.com/jinwook31/Quick20_LSL_rtRecording_python

https://github.com/nikk-nikaznan/SSVEP_Stimuli/blob/master/onebox_stimuli_RDA.py (이거도 참고해볼만한 코드)

 

GitHub - jinwook31/Quick20_LSL_rtRecording_python: Quick20 Labstreaminglayer real-time recording (python)

Quick20 Labstreaminglayer real-time recording (python) - GitHub - jinwook31/Quick20_LSL_rtRecording_python: Quick20 Labstreaminglayer real-time recording (python)

github.com

3) MATLAB 및 기타 등등 : http://cognionics.com/wiki/pmwiki.php/Main/WirelessTrigger

 

CGX Wiki | Main / Wireless Trigger

#include #include HANDLE hSerial; COMMTIMEOUTS timeouts={0}; int init_SPP(int port){     char com[100];     sprintf(com, "\\\\.\\COM%d", port);         hSerial = CreateFile(com,                                              

cognionics.com

 

3. 주의 사항

주석에도 있지만 실험 코드에서 Trigger 신호를 보낼 때 0~255사이의 값 (8 bit)만 사용을 할수 있다. 그런데 이게 전송 과정에서 8bit Shift 되버려서 Data Aqu. Program에서 보낸 값에 256이 곱해진 값으로 보여지게 된다. 그래서 분석 전에 Trigger 값에 256을 다시 나누어주면 원래 값을 볼 수 있을 것이다.

추가로 연속으로 같은 Trigger Tag를 전송하면 찍히지 않는 것을 볼 수 있는데, 문의를 해보니 그냥 Dummy Trigger Tag를 그 사이에 보내야 한다고 한다. 그리고 이 Tag도 간격이 너무 짧으면 찍히지 않는 경우가 가끔 있으니 반드시 잘 찍히는지 확인 후 실험을 하길 바란다.

다음에는 LSL, RDA 등으로 데이터를 읽는 것과 실시간 Streaming에 대해 정리해보겠습니다.

'Cognitive Neuroscience > EEG' 카테고리의 다른 글

ERP Core P300 (EEGLAB, ERPLAB)  (0) 2021.01.13

21년도에 나온 ERPLAB을 개발한 Steve Luck 교수님의 저널 논문으로 Event-Related Potential (ERP)의 대표적인 패러다임들 각각에 대한 분석 방법 및 코드, 전처리, 실험 자극 구조, 실험 및 신호가 포함하는 의미 등 매우 잘 정리가 되어있다.

개인적으로 P300에 해당하는 Component에 대한 코드를 깊게 분석해보았다. 데이터 셋도 오픈소스로 공개되어있고 코드 한줄 한줄에 대한 설명이 자세하게 써있으니 직접 돌려보면서 아래 PDF 슬라이드를 참고해보아도 좋을 것 같다.

추가로 같은 데이터를 MNE 라이브러리를 활용해서 개발을 해보고, 이 논문의 결과와 비교해보며 제대로 코드가 작성 된것인지 검증해볼 수도 있었다 (https://github.com/jinwook31/MNE_Event-Related-Potential).

논문 링크 : www.sciencedirect.com/science/article/pii/S1053811920309502?via%3Dihub

 

ERP CORE: An open resource for human event-related potential research

Event-related potentials (ERPs) are noninvasive measures of human brain activity that index a range of sensory, cognitive, affective, and motor proces…

www.sciencedirect.com

 

[21.01.06] ERP CORE_P3.pdf
1.46MB

'Cognitive Neuroscience > EEG' 카테고리의 다른 글

CGX Quick 30 - Data Acquisition Program  (0) 2022.03.27

+ Recent posts