自然非言語処理第7日目:生体信号を用いた非言語処理


生体信号によるコミュニケーション

みなさんは超能力を信じますか?
私は超能力があったら、再現性のある手法をぜひとも見つけたいと思っています。
さて、真面目な話、生体信号により人と人はコミュニケーションできるのでしょうか?
私が考える限り最も有力な方法はテレパシーでしょう。

さて普通は生体信号で人と人はコミュニケーションを取れないでしょう。しかし、人と機械はコミュニケーションを取れちゃたりします。人類の叡智のおかげですね。

今回は生体信号のうち取り扱いやすい脈波を題材に実装してみます。脈波に同期してブルブルするものを作ってみましょう。普段は感じることができない脈派ですが、このように技術を使えば機械だけではなく人にも感じることができるようになるのです。

その前に生体信号のメカニズムを解説します。

生体信号のメカニズム

生体信号の定義はわりとふわっとしているそうです。そのふわっとした中でも多くの場合で脳波、心電図、筋電図の3つは出てくるようです。ここでは心電図とそれらと因果関係にある脈拍や脈波が発生するメカニズムと測定するメカニズムを紹介します。

脈波が発生するメカニズム

まず、心臓は心筋によって拍動しています。この拍動するために主に脳のうち脳幹が制御している自律神経系が電気刺激を出しますが、このうち、皮膚表面まで漏れ出た電位を時系列にプロットしたものが心電図になります。つまり、インナーマッスルの活動を示す筋電図の一種になります。病院で心電図を取るとき静止していないといけないのは胸筋などの筋電がノイズとして入らないようにするためなんですね。

さて、心臓の拍動により全身に血液が送り出されます。このとき、ものすごい圧力で血液を送り出します。それというのも、動脈の血管は毛細血管を含めると相当入り組んだ構造をしており、細部まで循環させるためにはそれなりに圧をかける必要があるためです。心臓をポンプ、血管をホースだと例えると、相当絡まってるホースに水を流すには圧力が必要だと想像できるはずです。
この拍動で送り出された血流のピークを心拍といい、指先などの末端に到達する血液量を時間に並べたデータを脈波といいます。
こうやって聞くと、心電図と心拍、脈波は因果関係があるとわかります。しかし、それらをモデル化するのはとても困難です。先ほども言ったように動脈の入り組んだ構造やその構造による反射波が重ね合わせられるため、実際には心電図のピークの数と心拍数、脈波のピークの数ぐらいしかモデル化できません。
それぐらい心電図と心拍、脈波は関係はあっても違うものであると思ってください。

脈波の測定メカニズム

心臓が流す血液の中には、酸素を運ぶ赤血球が含まれています。この赤血球の中に酸素を運ぶ化学物質であるヘモグロビンがあります。このヘモグロビンは緑色の光を微妙に反射する吸収する特性を持っています[6。したがって、ヘモグロビンを持つ赤血球が血液の中に均一に存在すると仮定すれば、血液に光をあて、その反射具合をカメラ(厳密に言えば受光素子)で測定すれば、血管に穴を開けなくとも皮膚外部から血液量が測定できるわけです。
以上の説明で納得してくださる人もいれば、納得してくださらない人もいると思います。納得できない理由はたぶん以下の2つだと思われます。

  1. よく図で見る血管って赤くて太いけど、そんな血管は光を通すのか?
  2. 血管にたどり着く前に皮膚が光を遮ってしまうのでは?

これらをざっくり答えると、

  1. 血液量の全てはわからないが、皮膚表面には光を通すほど細い毛細血管が沢山あるから、血液量の一部ぐらいはわかる
  2. 皮膚は細胞という言わば小さな水風船で構成されているため、遮るどころか、光が皮膚内部で乱反射を起こし、毛細血管を通った光が皮膚表面から反射してくる

ということで、皮膚表面から緑色の光を当てて、その反射光を測定すれば、脈波を測定できるわけです。

生体信号の特性

  • 生体信号を測定するには体を傷つけなければならない時もある。体に傷をつける計測装置を侵襲型、そうでない場合を非侵襲型と呼ぶ。
  • 生体信号を測定するには体に装置を長い間取り付ける時もある。体に取り付けるタイプの装置を接触型や装着型(ウェアラブル)、そうでないものを非接触型や非装着型という。
  • 侵襲型、接触型、装着型の計測装置は衛生面に気をつけなければならない。
  • 生体信号を見える化する事で無意識の運動を意識的に運動を制御できる場合もある。(バイオフィードバック法)
  • 人には感じ取れないことを読み取ることができる。
  • 人には感じ取れないことを読み取るためにプライバシーには配慮しなければならない。生体信号は個人情報に該当しやすい。
  • 何よりも人体の安全を考えなければならない。過度な電圧をかけたり、磁場をかけると健康を損なう可能性がある。
  • 生体信号を用いて実験するときは基本的に人体実験という扱いになるため、ヘルシンキ宣言[4]を守る倫理的義務が生じる。
  • 医療目的に野良で使うと薬事法違反になる。

実装: ふるえるぞハート(ビート)

脈波に同期してブルブルするものを作ってみましょう。

材料

開発用PC(Win, Macなど) 1
マイコンボード Arduino Uno 1
振動モーター 1
脈波センサ PulseSensor 1

回路図

回路図は以下の通りです。
2番ピンにモーターのプラス側を突っ込みます。
Arduino Unoのピンは40mAまでしかでないのですが、
意外と振動モーターを動かせるようです。
また、脈波センサの出力はアナログ値なため、紫色の線をA0番ピンに突っ込みます。

ソースコード

血流量が一定以上になるとLEDがちかっと光るというPulseSensorのサンプルほぼそのままですが、
LEDだけではなく、モーターに出力するところだけ違います。

SignalVib.ino

/*  PulseSensor™ Starter Project and Signal Tester
 *  The Best Way to Get Started  With, or See the Raw Signal of, your PulseSensor™ & Arduino.
 *
 *  Here is a link to the tutorial
 *  https://pulsesensor.com/pages/code-and-guide
 *
 *  WATCH ME (Tutorial Video):
 *  https://www.youtube.com/watch?v=82T_zBZQkOE
 *
 *
-------------------------------------------------------------
1) This shows a live human Heartbeat Pulse.
2) Live visualization in Arduino's Cool "Serial Plotter".
3) Blink an LED on each Heartbeat.
4) This is the direct Pulse Sensor's Signal.
5) A great first-step in troubleshooting your circuit and connections.
6) "Human-readable" code that is newbie friendly."

*/


//  Variables
int PulseSensorPurplePin = 0;        // Pulse Sensor PURPLE WIRE connected to ANALOG PIN 0
int LED13 = 13;   //  The on-board Arduion LED
const int motorPin=2;

int Signal;                // holds the incoming raw data. Signal value can range from 0-1024
int Threshold = 550;            // Determine which Signal to "count as a beat", and which to ingore.


// The SetUp Function:
void setup() {
  pinMode(LED13,OUTPUT);         // pin that will blink to your heartbeat!
  pinMode(motorPin, OUTPUT);
   Serial.begin(115200);         // Set's up Serial Communication at certain speed.

}

// The Main Loop Function
void loop() {

  Signal = analogRead(PulseSensorPurplePin);  // Read the PulseSensor's value.
                                              // Assign this value to the "Signal" variable.

   Serial.println(Signal);                    // Send the Signal value to Serial Plotter.


   if(Signal > Threshold){                          // If the signal is above "550", then "turn-on" Arduino's on-Board LED.
     digitalWrite(LED13,HIGH);
     digitalWrite(motorPin,HIGH);
   } else {
     digitalWrite(LED13,LOW);                //  Else, the sigal must be below "550", so "turn-off" this LED.
      digitalWrite(motorPin,LOW);
   }


delay(10);


}

実験と結果

実際に動かしてみた結果がこちらになります。
すごくブルブルしてます

感想

このネタですね、実はとある先輩のネタから着想を得て作っています。
ちなみに元ネタは「アイドルにウェアラブル心電計を装着させて、そのドキドキ感をライブ中にスマホのバイブで感じる」[1]という斜め上の企画をドコモとやった話ですね。

たしかにアイドルの鼓動を感じれるなら嬉しいかもしれませんが、
こんなおっさんの脈を感じて一体何の得があるのだろうか

まとめ

今回は感覚からは得られない生体信号の例として脈波を取り扱いました。
次回は生体信号の中でもさらに一歩進んだ脳活動による非言語処理について説明します。

おまけ

去年のアドベントカレンダーでは生体信号の1つ、筋電図の解析方法について取り扱いました。
興味があれば、合わせてごらんくださいませ。
https://qiita.com/alfredplpl/items/e0936c8817ae79ee34de

参考文献

[1] https://k-tai.watch.impress.co.jp/docs/news/1027848.html
[2] http://www.kumikomi.net/interface/sample/201504/if04_034.pdf
[3] http://www.rohm.co.jp/web/japan/pulse-wave-sensor
[4] https://ja.wikipedia.org/wiki/%E3%83%98%E3%83%AB%E3%82%B7%E3%83%B3%E3%82%AD%E5%AE%A3%E8%A8%80
[5] 石山 陽事, "生体信号計測用センサに求められる性能," 医療機器学、2010, https://www.jstage.jst.go.jp/article/jjmi/80/1/80_1_21/_pdf
[6] http://www.epson.jp/technology/engineer/pulse_sensing.htm