LSLでプログラミング - C#編:part2
2025年9月8日

みなさま、どうも。
クレアクトの鬼塚です。
LSLってなんぞ(プログラミング)のPart2を解説していきたいと思います。
...サラッと始めましたが色々ありまして結構な間が空いたようですね。
いろんなご時世もありましたが、こんな感じでまたやっていきたいと思います。
前置きはこのくらいにしてさっさと始めますが、前回から結構経っているのでなにか変わったか見てみましょう。
と思ったのですが基本的には前にご紹介した方法でほぼ問題なく行けました。
サンプルプログラムの実行準備まではこちらをご参考ください。

変わった点といえば、
liblslのバージョンがliblsl-1.14.0-Win_amd64.zip→liblsl-1.16.2-Win_amd64.zip
になっていますので最新版を使用しましょう。
VisualStudioで"liblsl.sln"を開くとソリューションエクスプローラーで下記のようなメッセージが出る場合があるので、インストールをクリックして.net5ランタイムのコンポーネントをインストールします。
また前回は"lsl.dll"を実行ファイルの場所に直接コピーしていましたが、"liblsl.sln"と同じ場所に"lsl.dll"を置いてあげるとソリューションエクスプローラーに表示されますので、これのプロパティを開いて「新しい場合はコピーする」を設定すると他のサンプルも自動でdllをコピーしてくれます。


LSLはネットワークを使用するのでアクセス許可のダイアログが出てきたら「許可する」を押してください。
なんか前はexe実行ファイルができなかったですが、今は作られるようになっているかと思います。
ここまでで前回の「SendData」、「ReceiveData」サンプルが動作するようになってるはずですので、本題のプログラムの中身を見ていきます。


もともとシンプルなコードですが、両方とも3つのポイントがあります。
送信、受信のコードを見比べてみてください。
①ストリーム情報を作る/探す
最初に送信側でどのようなデータを送るか設定を行います。
各パラメータにコメントを付けてみました。
受信側に見つけてもらうにはname(名前)かtype(タイプ)どちらかの情報がわかれば大丈夫です。
受信側のコードでは"type"がEEG"のものを探しています。
なーんもわからーん!というときは、resolve_streams()というのが使えるっぽいです。
他にはチャンネル数やサンプリングレート、データの型を指定します。
データの型についてはLSLで定義されたものを指定します。
ここでは浮動小数点数(float)を"channel_format_t.cf_float32"で指定しますが、テキストデータを送りたいときは"channel_format_t.cf_string"を使います。
あと最後にある固有のIDは複数の送信元(センサやPC等)がある場合、同じにならないようにします。
他のパラメータは被っててもたぶん大丈夫です。
サンプルでもキーボードを適当に叩いたような文字列が入ってます。
②アウトレット/インレットを作る
これはデータの出口と入口のようなものでそのまんまですね。
それぞれStreamInfoを引数にして生成します。
出口と入口を間違えると痛い目にあいますのでご注意ください。
それと受信側でコンソール出力になんか吐いてますが、これは別の機会に解説します。
③データサンプルをプッシュ/プルする
押す!と引く!です。
間違えると痛い目にあいますのでご注意ください。
送信側ではチャンネル数分の8個のfloatにランダムな数値を入れてプッシュ(送信)しています。
100Hzで送りたいのでThread.Sleep(10)で10ミリ秒ほど待ってから次のデータを送信しています。
受信側ではひたすらプル(受信)して、引っ張ってきたデータをコンソール出力に書き出しています。
どちらもwhileループで繰り返されているので、なにかキー入力がないと止まりません。
これでLSLの基本の3ステップができました。
結構そのままなので、いちいち解説するまでもないかもしれませんが、実際にこれを使ってなにかしようとすると、つまづくポイントで参考になるかもしれません。とにかく実際にやってみてください!
というわけで、次回はさっそく弊社で取り扱っているセンサからLSLを使ってデータを取ってみようかと思いますのでお楽しみに!
ハッピー コーディング!