
ラズパイ4B + Raspberry Pi OS でReSpeaker 4-Mic Array for Raspberry Piを使ってみる でちょっと毛色の変わったマイクアレイデバイスを使ってみました。
音声がどの方向から来ているのか検知し、移動すればそれを追跡してみます。
前回はデータ送信は同一コンピュータ上でサーバー・クライアントを使いましたが、ここでは異なるコンピュータでROSのtopic通信をやってみます。
使うのは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_posesをRvizで見てみます。
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でやると、簡単に停止します。ちょっとづつ調整しましょう。
サイトをあれこれさがしてもこれといった情報に行き当たりません。
より詳しいことはこの論文を読んでね…..ってことのようです。
Appendix
【configuration.cfg】
Leave a Reply