ラズパイ4B + ODAS_ROS でReSpeaker 4-Mic Array for Raspberry Piを使ってみる


ラズパイ4B + Raspberry Pi OS でReSpeaker 4-Mic Array for Raspberry Piを使ってみる でちょっと毛色の変わったマイクアレイデバイスを使ってみました。

音声がどの方向から来ているのか検知し、移動すればそれを追跡してみます。

前回はデータ送信は同一コンピュータ上でサーバー・クライアントを使いましたが、ここでは異なるコンピュータでROSのtopic通信をやってみます。

使うのはODASのROSパッケージです。

odas_ros

ROSはUbuntuで動くミドルウエアですが’、ReSpeaker 4-Mic Array for Raspberry PiがUbuntuにはセットアップできませんでした。

なので、ラズパイで使う場合は

1:Raspberry Pi OS (Debian)にReSpeaker 4-Mic Array for Raspberry Piをセットアップ

2:Docker でUbuntu のコンテナを作り、この中にROS1(Melodic)とodas_rosをセットアップし、コンテナからRaspberry 4-Mic Array を使う

 

で、PublishしたデータをJetson Nano から見てみます。

通信については以下をご参照

シングルボードコンピュータ + ROS1 (Melodic) でノード間通信をやってみる

ここでは、こんな感じ

 


ラズパイ4BにReSpeaker 4-Mic Array for Raspberry Piをセットアップ

使うOSイメージは32-bit Bullseye、MicroSDに焼いてセットアップしておきます。

 

seeed-voicecardをクローンしておきます。

インストール

再起動

以下のコマンドでac108やCARD=seeed4micvoicecが見えているのを確認

 


Docker Engine のインストール、コンテナ作成

コンテナを作成してROSをインストール

ROSはMelodic を使うので、Docker Hub からUbuntu 18.04 LTS イメージをダウンロード

 

my_ros1 という名前でコンテナ作成

サウンドデバイスが見えるようにしておきます。Xを使うかどうかまだ分かりませんが、とりあえずセットしておきます。

sudo docker create -it --name my_ros1 --network host --device=/dev/snd:/dev/snd -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix ubuntu:18.04

 

hostとファイル交換する場合はdocker cp コマンドを使うかworkディレクトリを作ってボリュームマウントするようにしておきましょう。

 

コンテナ起動

 

アップデート&アップグレード、必要なパッケージやライブラリなどをインストール

 


コンテナにROS1(Melodic)をインストール

リポジトリ追加

aptキー追加

sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

Melodicをインストール

OSのソフトウェアパッケージのインストールに必要なrosinstallをインストール

apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential -y

ソースコンパイル時の依存パッケージインストールに使われるrosdepをインストール

ワークスペース作成

 


odas_ros をインストール

パッケージや依存ライブラリをインストール

ODAS ROSはAudioUtilsのオーディオユーティリティを使用するため、catkinワークスペースにインストールする必要があります。

依存ライブラリを追加インストール

submoduleをインストール

 

odas_rosをクローンしてインストール

ここで一旦コンテナを終了して再起動

 


ハードウェア設定ファイル( configuration.cfg)を編集

ファイルは以下の場所にあります。

/root/catkin_ws/src/odas_ros/config/configuration.cfg

odas_rosに書かれているのを参考にしますが、これはReSpeaker 4-Mic Array for Raspberry Pi用ではないので、ラズパイ4B + Raspberry Pi OS でReSpeaker 4-Mic Array for Raspberry Piを使ってみる で作られたrespeaker_4_mic_array.cfgも参考にして修正します。

修正ファイルはここからダウンロードできます。

以下のコマンドでカード番号、デバイス番号を確認

主な修正先

ReSpeakerのマイクは4つなので、nChannels は4.devicenameに先に確認したカード番号を変更

 

マイクは4個なので配列こんな感じ

micsには16個マイクが定義されていますが5以降は削除({}閉じの最後のカンマも削除するようにしてください)。

各micsの設定をrespeaker_4_mic_array.cfgのものに置き換え。

ssl,sst,sssの各セクションのinterfaceもIPアドレスなどを変更。

詳細はこのファイルをご参照ください。

 

ちなみに

ssl -> Sound Source Localization(音源定位)

sst -> Sound Source Tracking(音源追跡)

sss -> Sound Source Separation(音源分離)

 


データをPublish

Jetson Nano でSubscribeしてみます。

Jetson Nanoのセットアップは以下をご参照ください。

Jetson Nano にROS1 (Melodic) をインストール(メモ)

 

以下のようなIPアドレスだとして、やってみます。

 

Jetson Nano 側でmasterを設定してROSを起動しておきます。

 

ラズパイ側でコンテナからPublishします。

Jetson Nano 側で別のターミナルを開いてtopicを確認します。

以下のようなtopicが見えればOKだと思います。

/odas/ssl
/odas/ssl_pcl2
/odas/sss
/odas/sst
/odas/sst_poses

 

Jetson 側で以下のエラー

rostopic echo <topic名>をやってみましたが、/odas/ssl、/odas/sss、/odas/sstでERRORになりました。

/odas/ssl

ERROR: Cannot load message class for [odas_ros/OdasSslArrayStamped]. Are your messages built?

/odas/sss

ERROR: Cannot load message class for [audio_utils/AudioFrame]. Are your messages built?

/odas/sst

ERROR: Cannot load message class for [odas_ros/OdasSstArrayStamped]. Are your messages built?

 

sstのERRORは odas_rosにあるようにSound Source Tracking Threshold adjustmentの問題かもしれません。

messageは以下の2つでこうなっていました。

rostopic echo /odas/ssl_pcl2

type:sensor_msgs/PointCloud2

--- ^Cheader: seq: 3713 stamp: secs: 1646554913 nsecs: 599056005 frame_id: "odas" height: 1 width: 2 fields: - name: "x" offset: 0 datatype: 7 count: 1 - name: "y" offset: 4 datatype: 7 count: 1 - name: "z" offset: 8 datatype: 7 count: 1 - name: "intensity" offset: 12 datatype: 7 count: 1 is_bigendian: False point_step: 16 row_step: 32 data: [74, 12, 66, 63, 10, 215, 35, 190, 193, 202, 33, 63, 53, 94, 58, 62, 221, 36, 198, 62, 231, 251, 169, 189, 12, 2, 107, 63, 18, 131, 64, 62] is_dense: False

rostopic echo /odas/sst_poses

type:geometry_msgs/PoseArray

 

Jetson で見れなかったtopicをラズパイ側のtopic echo で見るとこんな感じ

rostopic echo /odas/sst

type:odas_ros/OdasSstArrayStamped

 

rostopic echo /odas/ssl

type:odas_ros/OdasSslArrayStamped

 

rostopic echo /odas/sss

type:audio_utils/AudioFrame

format: "signed_16" channel_count: 1 sampling_frequency: 44100 frame_sample_count: 256 data: [53, 0, 22, 255, 155, 254, 198, 254, 64, 255, 169, 255, 224, 255, 253, 255, 29, 0, 52, 0, 23, 0, 172, 255, 9, 255, 98, 254, 219, 253, 112, 253, 8, 253, 161, 252, 86, 252, 70, 252, 112, 252, 173, 252, 213, 252, 228, 252, 246, 252, 42, 253, 124, 253, 207, 253, 18, 254, 85, 254, 186, 254, 75, 255, 223, 255, 57, 0, 59, 0, 3, 0, 215, 255, 230, 255, 43, 0, 115, 0, 144, 0, 128, 0, 100, 0, 96, 0, 119, 0, 134, 0, 102, 0, 9, 0, 129, 255, 250, 254, 154, 254, 115, 254, 122, 254, 144, 254, 145, 254, 105, 254, 30, 254, 210, 253, 162, 253, 154, 253, 177, 253, 212, 253, 255, 253, 58, 254, 137, 254, 218, 254, 12, 255, 12, 255, 231, 254, 197, 254, 198, 254, 227, 254, 244, 254, 210, 254, 125, 254, 29, 254, 224, 253, 213, 253, 227, 253, 228, 253, 205, 253, 181, 253, 192, 253, 247, 253, 61, 254, 100, 254, 82, 254, 22, 254, 221, 253, 212, 253, 12, 254, 114, 254, 221, 254, 42, 255, 70, 255, 51, 255, 5, 255, 216, 254, 198, 254, 225, 254, 45, 255, 157, 255, 19, 0, 115, 0, 173, 0, 203, 0, 232, 0, 28, 1, 102, 1, 172, 1, 204, 1, 185, 1, 139, 1, 110, 1, 129, 1, 188, 1, 246, 1, 8, 2, 240, 1, 204, 1, 194, 1, 216, 1, 241, 1, 226, 1, 160, 1, 70, 1, 1, 1, 234, 0, 247, 0, 7, 1, 7, 1, 4, 1, 24, 1, 81, 1, 154, 1, 205, 1, 209, 1, 177, 1, 141, 1, 132, 1, 151, 1, 170, 1, 157, 1, 97, 1, 2, 1, 152, 0, 60, 0, 1, 0, 247, 255, 40, 0, 138, 0, 250, 0, 66, 1, 54, 1, 205, 0, 46, 0, 152, 255, 52, 255, 2, 255, 223, 254, 166, 254, 81, 254, 252, 253, 196, 253, 173, 253, 154, 253, 104, 253, 17, 253, 181, 252, 131, 252, 148, 252, 212, 252, 24, 253, 63, 253, 78, 253, 104, 253, 172, 253, 24, 254, 137, 254, 214, 254, 243, 254, 245, 254, 4, 255, 61, 255, 159, 255, 23, 0, 139, 0, 241, 0, 78, 1, 171, 1, 14, 2, 112, 2, 190, 2, 226, 2, 203, 2, 128, 2, 24, 2, 189, 1, 140, 1, 142, 1, 174, 1, 204, 1, 211, 1, 199, 1, 184, 1, 176, 1, 168, 1, 145, 1, 98, 1, 36, 1, 238, 0, 211, 0, 211, 0, 222, 0, 232, 0, 239, 0, 252, 0, 23, 1, 67, 1, 121, 1, 181, 1, 240, 1, 29, 2, 37, 2, 245, 1, 145, 1, 23, 1, 180, 0, 126, 0, 105, 0, 75, 0, 8, 0, 167, 255, 82, 255, 49, 255, 70, 255, 113, 255, 141, 255, 148, 255, 162, 255, 220, 255, 83, 0, 250, 0, 181, 1, 109, 2, 17, 3, 139, 3, 193, 3, 163, 3, 71, 3, 230, 2, 186, 2, 211, 2, 5, 3, 18, 3, 215, 2]

 


可視化

Jetson 側で取得できる/odas/ssl_pcl2 /odas/sst_posesRvizで見てみます。

Rvizを起動して、

Fixed Frameを odas にして、Addボタンー>By topicタブで両方を指定

こんな感じ

赤い矢印がsst_poses、ちょっと見ずらいですが点群がチラチラしてますのがssl_pcl2です。

左側半分下に見えてるwindowはrostopic echo /odas/sst_poses を表示しています。

 

移動する音源の方向を矢印が追跡しているようすです。スマホからyoutubeなどでニュースなどを流してReSpeakerの周りをグルグル移動させてみると、矢印が追随する様子が分かります。

 


課題

〇Jetson 側でmessageをloadできるようにする(configuration.cfgの問題?)

〇Publishされたデータがどんな意味を持っているのか調査

〇すべてのデータを可視化してみる

〇動作中、ラズパイからのPublishが停止します(イレギュラーな現象に見えますが必ず起こるようです)。エラーというよりtopicにデータが送られなくなっている感じ。例えて言うなら、「何かが詰まっている」。rostopic bw で見ると10Kくらいのサイズが途中で数十Bくらいに低下しています。再ローンチすれば復活します。解決策はあるのかな?

似たような現象は前回のODAS_web版でも起きます。途中でSegmentation faultで落ちることがあります。

configuration.cfgで、sstのmodeをカルマンフィルタ(kalman)ではなくパーティクルフィルタ(particle)に変更すると少しましになるように思えます。なんで?という感じですが….よく分かりません。使っている環境がkalmanよりparticleの方が適していると考えたほうがいいのかな?

パラメータの設定は難しいです。configuration.cfgに合わせて、You should leave this parameterでやると、簡単に停止します。ちょっとづつ調整しましょう。

 


サイトをあれこれさがしてもこれといった情報に行き当たりません。

より詳しいことはこの論文を読んでね…..ってことのようです。

ODASについて

 


Appendix

【configuration.cfg】

 


 

 

Be the first to comment

Leave a Reply

Your email address will not be published.


*