今話題のビデオ通話アプリzoomを用いて、「安くてお手軽に作れるテレイグジスタンスロボット」の構築を目指す、今回は番外編として、操縦に便利(必須?)な足元カメラの拡張について説明します。
本編は3回分の連載になっています。こちらからご覧ください。
今回の方法を実現するためには、2台目のwebカメラを準備・接続する必要があります。カメラは下図のようにほぼ真下を向く形で天板に取り付けます。このような固定に支障がない物であれば、一般的なwebカメラで問題ありません。
2台目のカメラは足元の障害物確認に使います。図のように台車の先端とその先の地形が映るようにします。
zoomで二つのカメラを同時に使う方法には、zoomの画面共有を利用する方法と、別途ツール(OBS Studio)を用いて二つのカメラを合成した映像をzoomのカメラとして配信する方法の二つがあります。それぞれの方法について説明します。
zoomの画面共有を利用する
この方法は、zoom上のみでかなり容易な設定・操作で実現できますが、PC起動から通話待ち受けまで自動化できていたところに一部手動操作が発生したり、遠隔操縦者のビデオ画面がロボット側のモニタに大きく映らないといった欠点があります。
ロボットのPCを起動してzoomの待ち受け画面まで進んだら、使用するカメラを足元側のカメラに切り替えてください。
続いて「画面の共有」をクリックし、開いたウィンドウより「詳細」→「第2カメラのコンテンツ」→「共有」の順番でクリックしてください。
クリックすると、ロボットのモニタの前面に前方カメラが、端にワイプのように足元カメラが表示されます。この状態で外部から接続すると、同様に前方カメラが大きく、足元カメラが小さく表示されます。
足元カメラの表示サイズは、操縦側の通話画面で足元カメラにマウスカーソルを合わせ、左上に表示される3つの長方形アイコンをクリックすることで変更できます。
この方法を行う場合、起動ごとにこの画面共有の操作を行う必要があります。wmctrl及びxdotoolでキーボード入力を再現して実行できそうですが、筆者の環境ではシェルスクリプト経由でzoomのウィンドウに対してうまくコマンドを実行させることができませんでした。
OBS Studioによる画像合成
画像の加工・配信を行うフリーウェア「OBS Studio」を使うことで、複数のカメラ映像を合成し、更にそれを仮想カメラとしてzoomから配信することが可能です。この方法は最初に若干導入の作業が必要ですが、二つのカメラ画像の表示領域などを柔軟に設定出来たり、遠隔操縦者の映像をロボットのモニタ前面に出せる・起動に手動操作が不要などのメリットがあります。
OBS Studioのインストール
まず、OBS Studioをインストールします。インストールにはこちらのweb記事を参考にしました。
ロボットのPCよりコンソールを開いて、下記の通りに入力します。
$ sudo add-apt-repository ppa:obsproject/obs-studio
$ sudo apt-get update
$ sudo apt-get install obs-studio
v4l2loopbackのインストール
次に、仮想カメラを使うためのツール(v4l2loopback)をインストールします。OBS Studioにはバージョン26.0以降に仮想カメラの機能が搭載されていますが、2020年11月現在、Ubuntu 18.04用のソフトウェアには搭載されていないようです。もし機能が搭載されたらこの作業は不要になるかもしれません。
仮想カメラ用のツールの導入には、下記のwebページを参考にしました。
https://qiita.com/Vermilion_Squadron/items/2e86f239c99dc62ead24
http://www.nofuture.tv/diary/20200413.html
ロボットのPCのコンソールより、下記を入力してツールをインストールします。
$ sudo apt install v4l2loopback-dkms v4l2loopback-utils
インストール中、パスワードの設定を求められる画面が表示されたら、8文字以上で任意の文字列を入力してください。このパスワードは後で使うため、必ず控えておいて下さい。これは、セキュアブートの設定(署名されていないサードパーティのモジュールをロードできない制限)を回避するための設定に関係しています。
パスワードの入力を求められた場合、一度PCを再起動してください。再起動すると、普段の起動画面とは異なるブルーバックの画面が表示されます。この画面で4つほどの選択肢が並んでいるので、設定変更をするための項目を選んでEnterを押してください(通常上から2番目あたりに表示されます)。そのままOKを選んでEnterを押していくと、設定が完了すると思われます。
v4l2loopbackモジュールのロード
次に、v4l2loopbackのモジュールをロードします。コンソールより下記を入力してください。
$ sudo modprobe v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1
この時、modprobe: ERROR: could not insert ‘v4l2loopback’: Required key not available というエラーが表示されたら、セキュアブートの設定による制限に抵触している可能性があります。コンソールより下記を入力してください。エラーが表示されない場合は、次の項目まで進んでください。
$ sudo apt install mokutil
$ sudo mokutil --disable-validation
二つ目のコマンドを入力したら、8文字以上のパスワードの設定が求められるので、任意のパスワードを設定してください。このパスワードは次に使用するので必ず控えてください。パスワードを設定したら、PCを再起動してください。
再起動すると、下図のように通常の起動画面とは異なるブルーバックの画面が表示されます。「Press any key to perform MOK management」の画面でキーを押し、次に表示される選択肢から「Change Secure Boot state」を選んでください。
次に先ほど設定した8文字以上のパスワード入力を求められます。ここではパスワードすべてを入力するのではなく、「何番目の文字が何か」という入力方式です。「character *:」と表示された位置の文字を1文字入力してEnterを入力してください。パスワードの入力は何文字か求められます。
パスワードが正しく入力出来たら、「Disable Secure Boot」という選択肢が表示されるので「Yes」を選択してください。
以上で設定が完了したので、「Reboot」を選んで再起動してください。
これらの設定については、下記のページもご参照ください。
obs-v4l2sinkプラグインのインストール
OBS Studio用のv4l2loopbackプラグインをダウンロードしてインストールします。コンソールから下記のコマンドを実行してください。
$ wget https://github.com/CatxFish/obs-v4l2sink/releases/download/0.1.0/obs-v4l2sink.deb
$ sudo apt install ./obs-v4l2sink.deb
参考までに説明すると、下記で配信しているプラグインをダウンロードしてインストールしています。
https://github.com/CatxFish/obs-v4l2sink/releases
OBS Studioの設定
各種インストール作業が完了したので、OBS Studioを起動します。すべてのアプリ等からOBS Studioを選んで起動してください。起動すると下記の画面を開きます。
右下の「設定」をクリックし、設定のウィンドウを開いたら「映像」をクリックしてください。続いて表示された設定項目の「基本(キャンバス)解像度」と「出力(スケーリング)解像度」を同じ値に設定してください。設定したら「OK」をクリックして設定のウィンドウを閉じてください。
続いて二つのカメラを追加していきます。画面左下の「ソース」内にある+のボタンをクリックしてください。クリックするとポップアップメニューを開くので、「映像キャプチャデバイス(V4L2)」をクリックしてください。
「ソースの作成/選択」のウィンドウを開くので、そのまま「OK」をクリックしてください。続いて表示されるウィンドウに、ロボットの前方カメラの画像を映します。最初に足元カメラの画像が表示されている場合は「デバイス」の欄をクリックしてカメラデバイスを切り替えてください。設定したらウィンドウの「OK」をクリックしてください。
メインのウィンドウに戻ってくると、画面内にロボットのカメラ画像が表示されます。このカメラ画像も含む黒い四角の領域が、zoomで配信されるビデオ映像になります。
同じ手順で足元カメラの映像も追加します。
二つのカメラを追加したら、カメラ画像をクリックして領域をリサイズできるので、前方カメラの映像は黒い領域いっぱいに広げておき、足元カメラは隅に小さく表示させます。
カメラの配信テスト
OBS Studioで仮想カメラの配信テストを行います。メニューの「ツール」→「v4l2sink」をクリックしてください。
クリックすると「V4l2sinkProperties」のウィンドウを開きます。「Device Path」の箇所を「/dev/video10」に書き換えて、「Start」をクリックしてください。クリックして赤文字で何らかのエラーが表示されず「Start」のボタンがグレーアウトしたら正しく配信できています。また「Auto Start」の項目をクリックしてチェックしてください。
カメラを配信したら、一度zoomミーティングのみを立ち上げ直します。既にzoomミーティングを実行している場合は一度ミーティングを終了し、本システムの起動スクリプト(zoom_startup.sh)を実行するなどしてミーティングを開始してください。ミーティングを開始したら、左下のカメラアイコン横の^マークをクリックし、カメラの選択で「OBS Cam」を選択してください。選択してカメラを有効にすると、OBS Studioで合成した二つのカメラがzoomより配信されます。
ここまで正しく作業出来たら、OBS Studioを終了して設定を保存させます。OBS Studioを終了させずにPCを再起動・シャットダウンすると設定が保存されないようなのでご注意ください。
自動実行の設定
最後に、OBS Studioを自動実行スクリプトに組み込みます。本プロジェクトには既にOBS Studioの自動実行用スクリプトを「obs_startup.sh」と言うファイルで収録しています。このファイルの中身は下記の通りです。設定途中で実行したmodprobeコマンドによるv4l2loopbackのロードを行い、続いてOBS Studioを起動します。
#!/bin/bash
sudo modprobe v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1
sudo obs &
sleep 1
このスクリプトをzoom_startup.sh内で実行します。こちらも既にコメントアウトした状態でスクリプトの実行が組み込まれてるので、「#sh obs_startup.sh」の行の冒頭の#を削除してコメントアウトを外します。
#!/bin/bash
SCRIPT_DIR=$(cd $(dirname $0); pwd)
sleep 10
source /opt/ros/melodic/setup.bash
source /home/rover/catkin_ws/devel/setup.bash
source /home/rover/catkin_ws_isolated/install_isolated/setup.bash
echo pwd | sudo -S chmod 666 /dev/ttyUSB0
roslaunch megarover_samples rosserial.launch &
cd $SCRIPT_DIR
#OBS Studioで2カメラを利用する場合、設定後に下記のコメントアウトを外すと自動実行します。
#sh obs_startup.sh
node ./serverhost.js
以上で2カメラを使う方法はそれぞれ説明終了です。2カメラを使うことで、自分が把握している地形であれば、幅1m程度の狭い通路でも両方のカメラを見比べて慎重に動かすことで、衝突せずに操縦することができました。地形に応じて1コマンドでロボットが動く量をserverhost.jsのソース上で調整し、快適な操作性になるようにしてください。