LoginSignup
7
3

自動運転シミュレーターを録画するシステムを構築してみた

Last updated at Posted at 2023-12-15

はじめに

技術チャレンジ部の、とも(Tomo)ことAirです。
自動運転AIチャレンジに参加しているメンバーを応援するために、自動運転をシミュレーションしている様子を画面キャプチャーで録画するシステムを構築しました。

お品書き

機能拡張のベースとなるスクリプト

  • 自動運転シミュレーターを繰り返し実行するスクリプト
    • メンバーにより既に作成済み。これに録画機能を付ければ、録画システムはきっとできる!

録画

  • OBS Studio
    • クロスプラットフォームの配信ソフトとして有名だが、以下の理由で録画に採用
      • ハードウェアエンコードによる録画ができ、今回の長時間録画のエンコード時間短縮や負荷低減に効果ありそう
      • WebSocketによる制御ができるので、仕組みが理解できれば、別でやっているVR配信にも応用できそう
      • 開発着手時点では、画面のレイアウトや録画シーンが未定だったため、マウスでの設定が便利そう
  • obs-cmd
    • OBS StudioをWebSocketで制御するCLIとして使用
    • 制御ソフトはいろいろありそうだが、今回は以下の理由で採用
      • 最新のWebSocket v5プロトコルに対応
        • obs-cliはv4までの対応の模様
      • ミニマルな機能だが、録画の開始と停止ができる
      • バイナリ配布があり、インストールが簡単
  • ffmpeg
    • 録画ファイルの結合に使用
    • OBS公式によると、「Linuxのリリースは公式にはUbuntu 14.04以降で利用可能です。 FFmpeg が必要です。」とのことで、OBSにも必要

画面レイアウト

  • Zenity
    • 画面にパッチ名とループ回数を表示させるために使用
    • コマンドラインから簡単にウィンドウを作成できる
  • xdotool
    • 画面レイアウトの変更に使用
    • Wayland環境では困難が予想される
      • 2023年度インテグレーション大会では、Ubuntu 22.04にnvidia製ドライバーを入れる手順のため、この環境ではX.orgになる模様(要出典)で問題なさそう
      • 2023年度シミュレーション大会では、CPU環境も提供されるため、環境によってはWaylandになる可能性があり、要注意かも
      • とはいえX.orgへの変更はできるはず

録画ファイルの公開

  • Apache HTTP Server
    • 容量が必要だが、アップロード回数も多めになることが予想され、YouTubeなどの利用が難しそうなため、録画ファイル公開用webサーバーを自前で用意
    • MakerFaire向けに使用していたサーバーを利用
  • OpenMediaVault
    • 録画ファイル保存用NFSサーバーとして使用
  • sftp
    • 録画ファイルのアップロードに使用

対応内容とポイント

録画

対応内容diffはこちら

OBS Studio

OBSは手動で起動しておいた上で、スクリプトからobs-cmd経由で録画することにする。

  • 公式の手順でppaを追加し、obs-studioをインストールする
  • obs-cmd経由でWebSocketで制御するために、ツール(T)->WebSocketサーバー設定で、WebSocketサーバーを有効にしておく
  • デフォルトでサーバーパスワードが設定されているはずなので、ツール(T)->WebSocketサーバー設定->接続情報を表示で、パスワードを控えておく
  • シーンや画面レイアウトの設定を事前にしておく

obs-cmd

  • linux-amd64用の実行ファイルを、Releasesからダウンロードしておき、obs-cmdにリネームして、~/bin/などPATHの通った場所に置く
  • 先ほど調べておいた、OBSのサーバーパスワードを、
    • ~/.config/obs-cmd.tomlに、OBS_WS_PASSWORD = "PassWord"として設定する
    • …はずだったのだが、今見たら仕様が変わったようなので、obs-cmd --websocket obsws://localhost:4455/PassWord infoのように、--websocketオプションでパスワードを設定する
      • --websocketオプションは以下表記を省略
  • WebSocketサーバーが有効になったOBSをobsコマンドで起動した状態で、obs-cmd infoコマンドが通るか手動で確認しておく
  • スクリプトからは、obs-cmd recording startobs-cmd recording stopで録画を開始/停止する

obs-cmd --websocket obsws://localhost:4455/PassWord recording start
sleep 60
obs-cmd --websocket obsws://localhost:4455/PassWord recording stop

ffmpeg

  • sudo apt install ffmpegで、ffmpegをインストール
  • 結合する動画ファイルのリストをlsで作る
    • lsの-Qオプションでは、ダブルクオートで囲われるが、ffmpegの仕様ではシングルクオートで囲う必要があるため、sedで変換する
      • 囲っておけば、ファイル名にスペースがあっても問題ない
        • 実際、OBSのデフォルトでは、ファイル名にスペースが入る
    • ffmpegの仕様で、シングルクオートで囲われたファイル名の先頭にfile という文字列も付与する必要があるため、同じくsedで付与する

REC_LIST="rec_file_list_tmp.txt"
ls -Q ${REC_PATH}/2023-*.mp4 | sed "s/\"/\'/g" | sed "s/^/file /" > ${REC_LIST}
  • ffmpeg -f concatで動画ファイルを結合する
    • 念の為-safe 0をつけておき、絶対パス/相対パスのどちらでも指定できるようにしておく
    • 結合する動画ファイルのリストのファイルを-iで指定する

REC_LIST="rec_file_list_tmp.txt"
REC_RESULT_NAME="result_${TARGET_PATCH_NAME}_${BEST_TIME}.mp4"
ffmpeg -f concat -safe 0 -i ${REC_LIST} -c copy ${REC_PATH}/${REC_RESULT_NAME}

画面レイアウト

対応内容diffはこちら

Zenity

  • Ubuntu Desktop 22.04にはデフォルトで入っている模様
  • マニュアルによると、--info--textで情報を表示できる
  • LANG=Cにしないと、xdotoolでWindow名を見つけづらい
  • こちらによると、Pango Markupが使えるので、フォントサイズを大きくできる
  • ¥nで改行もできた
    • …のは勘で見つけた

ZENITY_FONTSIZE=32
LANG=C zenity --info --text "<span font='${ZENITY_FONTSIZE}'>${TARGET_PATCH_NAME}\nLoop: ${i}</span>" &

xdotool

  • sudo apt install xdotoolでインストール
  • xdotool search --name "WindowName"で、WindowNameという名前のWindowのIDを探す
    • RVizのウィンドウは候補が複数出てしまうため、--onlyvisibleオプションで絞り込む
  • xdotool windowmovexdotool windowsizeで、位置とサイズをいい感じに設定する
  • スクリプトからいろいろ起動すると、Zenityのウィンドウが裏に入って見えなくなってしまうので、
    • xdotool windowraiseで表に起こす
    • …のが動作しないため、windowraiseの前にwindowfocusでフォーカスを取るようにすると、windowraiseが動作する
      • …のは勘で見つけた

AWSIM_WID=`xdotool search --name "AWSIM"`
xdotool windowmove ${AWSIM_WID} ${AWSIM_POS}
xdotool windowsize ${AWSIM_WID} ${AWSIM_SIZE}

ZENITY_WID=`xdotool search --name "Information"`
xdotool windowfocus ${ZENITY_WID}
xdotool windowraise ${ZENITY_WID}

できた動画

こちらに出てくるこちら!

感想

  • スクリプトにすると1行のコマンドだが、そこにたどり着くのが大変で、調査や試行錯誤で時間がかかる
    • 勘まで動員が必要
  • 動作が目に見えるのが嬉しい
  • 使ってもらえてもっと嬉しい!

やり残したこと

  • 録画ファイル公開の話が出てこないじゃねーか!
    • Webサーバーで、mp4ファイルの一覧をクリックすると、HTML5のVideoプレーヤーで再生する仕組みの構築、したかった…
      • 今回はmod_autoindexで逃げたため、再生UIがいまいち
    • 録画ファイルが大きいので、WebサーバーでOpenMediaVaultのNFSをmountした
7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3