rvizで視点を自動で変更しながら録画するRviz_Cinematographerの紹介

# 動機

研究成果を発表する際，Rvizの画面をよく使います．
特に3次元的に見せたいときには，Rviz内でグリグリ動かしている動画を使うだけで，伝わりやすさが違う気がします．

ただ，手動でグリグリ動かしている動画は，毎回視点が変わってしまったり，不規則な動きになってしまうなど，限界がありました．
なんとか自動化したいなあと思いながら調べていると，素晴らしいツールを見つけてしまいました．

それが [Rviz Cinematographer](https://github.com/AIS-Bonn/rviz_cinematographer) です．

これはRvizプラグインの一つで，下記のような動画がRviz内で簡単に録画することができます．
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/1c9a447d-2282-deb9-581c-d2e99f015a58.gif)


本記事は，Rviz Cinematographerの紹介と導入方法，および使い方についてまとめたものになっています．基本的には元サイトを訳しただけです．

# テスト環境

Ubuntu: 16.04
ROS: kinetic
Rviz: 1.12.17
Qt: 5.5.1

# Rviz Cinematographer でできること

- 複数の視点設定
- 自動で生成した視点間経路に沿った視点移動
- 視点間移動している間の録画

# 導入方法

導入方法は至って簡単で，ROSのワークスペースにRviz Cenematographerをクローン，もしくはダウンロードするだけです．
クローンする場合は次のコマンドにてコンパイルまで行うことができます．rviz_cinematographerがメタパッケージになっているので注意してください．

```
$ cd <catkin workspace>/src
$ git clone https://github.com/AIS-Bonn/rviz_cinematographer.git
$ cd ..
$ catkin_make    // or catkin build
```

# 使い方

チュートリアルに沿い，使い方を説明します．

## 起動方法

```
$ roslaunch rviz_cinematographer_gui rviz_cinematographer_gui.launch
```

起動するとRvizの横にこんなGUIが表示されるはずです．
![gui.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/59f16323-1852-4994-6d8b-15a47bbd17bb.png)

## 基準フレーム

このツールを使うにあたり，基準となるフレームを決めます．上記画像の`Frame`欄にて"base_link"と書いてある場所にお好みのFrameを入力します．


## 視点の追加・編集

Interactive markerを視点として追加します．
先ほどの画像の"Append at Cam Pose"をクリックすることで，現在の視点にInteractive markerを追加することができます．
また，設定した視点の位置や姿勢は，"Edit Pose"タブより編集することができます．
![edit_pose.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/257c7178-6600-a6bd-0a40-746662fa3d3b.png)


一度作成したマーカを基準に次のマーカを追加したいのであれば，Rviz上のマーカを右クリックし，"Add marker after", "Add marker here", "Add marker before"を選択することで，マーカを追加することができます．

基本的に視点は追加された順に番号が振られていきます．

## 視点の削除

視点の削除は，削除したマーカを右クリックし，"Remove marker"を選択することで削除することができます．

## 視点の移動

視点間の移動経路は自動で生成してくれます．
視点の移動には，矢印ボタンを使います．

![first.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/0188baa0-721c-a54b-a140-8d57e8a838b1.png)：現在の視点から順番に最初の視点まで移動
![prev.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/0e03da92-c294-f58a-99b5-a20b2fb5f57b.png)：現在の視点から一つ前の視点に移動
![next.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/cfe4126d-b3f0-591a-7f77-e62ed88bd01e.png)：現在の視点から一つ後の視点に移動
![last.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/f4737582-036a-d7a3-45c2-805f5bbde832.png)：現在の視点から順番に最後の視点まで移動

視点間の移動時間は，Timingタブにてしてすることができます．
![tab_timing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/a6f11c57-7b9d-9b0a-5b7c-e5a7f785613a.png)

"Translation Duration"にて移動時間を，"Wait Duration"にて視点に留まっている時間を指定することができます．
また，選択されている視点を基準に，"Add Before", "Add Here", "Add After", "Delete"の操作を行うことができます．
（現在の視点基準ではないので注意！）

さらに，視点間移動の際の経路に関する設定を"Trajectory Parameter"タブにて編集することができます．
![tab_trajectory_parameters.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/3eb24377-ab17-e966-ddba-80231a93c679.png)

こちらについては詳細は[元サイト](https://github.com/AIS-Bonn/rviz_cinematographer/tree/master/rviz_cinematographer_gui)をご覧ください．


## 録画

録画は"Record"ボタンを押し，視点を移動させることで開始，移動が終了したら停止します．
![record.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/e847f2e4-82cc-5734-aaa2-7b6c8ba23845.png)

また，録画に関する設定を"Recording Parameters"にて編集することができます．
![tab_recording_parameters.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/30ec9fcf-7d1d-e3f4-1c0b-d045317adc50.png)

設定可能な項目は下記．

- 録画場所/ファイル名（ダイアログボックスにて指定可能）
- 1秒間に録画するフレーム数
- 動画を圧縮する/しない（チェックボックス）
- Watermarkを動画内につける/つけない

注意しなければならないのが，Watermarkの設定です．ツールの作成者はWatermarkについて次のように記載しています．
>The recorded video will contain a watermark in the bottom right corner.
Feel free to deactivate it in the GUI.
If you do so, please mention the Rviz Cinematographer in a comment somewhere around your video.
Your viewers might also be interested in using this tool.

つまり，「Watermarkは外してもいいよ！でもRviz Cinematographerってどこかに書いてね」とのことです．


一番簡単な録画手順は次のようになると思います．

1. 視点をセット
2. 一番最初の視点に戻る
3. 諸々の録画項目（ファイル名，Watermark等）を設定
3. "Record"ボタンを押す
4. 視点を最後まで移動するボタンを押す
4. 視点が最後まで移動するのを眺める（勝手に終了するので終了手続きも必要なし）


# 使ってみた

### カメラ追加

対象物の周りをぐるぐるし，適当にカメラを追加＆視点移動時間を変更しました．
![add_camera.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/63643d78-2737-1280-42c9-cc6c43d76037.gif)


最終的なカメラ配置はこんな感じです．
![qiita_interactive_marker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/93d57b3b-af44-92a4-5bda-ea872daf3c0e.png)


### 撮影動画

撮影対象物（`base_link`に固定）は`World`に対して一定速度で動きます．この対象物を，次の条件にて撮影しました．

- Fixed Frame : `World`
- Target Frame : `base_link`

撮影した動画がこちら．`World`座標系であるGridに対して，対象物が動いている様子を撮影することができています．

![from_base_link.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329862/38ed55fd-d885-6e3d-637f-f80eafe99d17.gif)


設置したカメラ位置は保存もできるので，異なる条件で同じ視点から見た動画も簡単に撮影することができます．

# まとめ

同じ視点が再現できるだけでなく，視点移動や撮影までできるなんて便利すぎるツールの紹介でした．

# 参考

- [Rviz Cinematographer](https://github.com/AIS-Bonn/rviz_cinematographer)