動画をROSで送信


# 1.概要

動画をROSメッセージとして送信したいと思い、方法を調べたところ[video_stream_opencv](https://github.com/ros-drivers/video_stream_opencv)というパッケージでそのようなことができることが分かりました。
ここでは、このパッケージを使って動画をROSメッセージで送信する方法を説明します。

# 2.パッケージのインストール

```
sudo apt install ros-noetic-video-stream-opencv
```

# 3.使い方

このパッケージには,mp4 fileを送信するためのlaunchが用意されていてその中身は次のようになります。

これを見ると,```camera.launch```の引数の```video_stream_provider```にファイル名を入れることで動画が出力できることが分かる。

他にも

```visualize=true``` : gui上に動画出力
```loop_videofile``` : videoを繰り返し再生

等の設定ができます。


```xml:/opt/ros/noetic/share/video_stream_opencv/launch/video_file.launch
<?xml version="1.0"?>
<launch>
   <!-- launch video stream -->
   <include file="$(find video_stream_opencv)/launch/camera.launch" >
        <!-- node name and ros graph name -->
        <arg name="camera_name" value="videofile" />
        <!-- full path to the video file -->
        <!-- wget http://techslides.com/demos/sample-videos/small.mp4 -O /tmp/small.mp4 -->
        <arg name="video_stream_provider" value="/tmp/small.mp4" />
        <!-- set camera fps to (video files not affected) -->
        <!-- <arg name="set_camera_fps" value="30"/> -->
        <!-- set buffer queue size of frame capturing to -->
        <arg name="buffer_queue_size" value="1000" />
        <!-- throttling the querying of frames to -->
        <arg name="fps" value="30" />
        <!-- setting frame_id -->
        <arg name="frame_id" value="videofile_frame" />
        <!-- camera info loading, take care as it needs the "file:///" at the start , e.g.:
        "file:///$(find your_camera_package)/config/your_camera.yaml" -->
        <arg name="camera_info_url" value="" />
        <!-- flip the image horizontally (mirror it) -->
        <arg name="flip_horizontal" value="false" />
        <!-- flip the image vertically -->
        <arg name="flip_vertical" value="false" />
        <!-- enable looping playback -->
        <arg name="loop_videofile" value="true" />
        <!-- start frame of video -->
        <arg name="start_frame" default="0"/>
        <!-- stop frame of video, -1 means the end of video -->
        <arg name="stop_frame" default="-1"/>
        <!-- visualize on an image_view window the stream generated -->
        <arg name="visualize" value="true" />
   </include>
</launch>
```

# 4.実行

## 4.1サンプルの動画を再生

サンプル動画を再生します。

まず動画をダウンロードします。

```
wget http://techslides.com/demos/sample-videos/small.mp4 -O /tmp/small.mp4
```

そして実行します。

```
roslaunch video_stream_opencv video_file.launch
```

するとサンプルの動画が再生されます。

![Screenshot from 2021-09-11 16-34-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/ff7d4b43-44a4-82bc-2818-8001222684bd.png)


## 4.2オリジナルの動画を送信

次にオリジナルファイルを再生する場合です。

この場合はcamera.launchを使用します。

video_stream_providerのファイル名はご自身のものに合わせていただき、次のように実行します。(※ファイル名は絶対パスを入れることに注意が必要です)

```
# GUI表示あり
roslaunch video_stream_opencv camera.launch video_stream_provider:=/home/hoshina/Downloads/sample-5s.mp4 visualize:=true loop_videofile:=true

# GUI表示なし
roslaunch video_stream_opencv camera.launch video_stream_provider:=/home/hoshina/Downloads/sample-5s.mp4 loop_videofile:=true
```

すると次のようにGUI上に動画が再生され、ros imageとしても出力されました。

![Screenshot from 2021-09-11 15-30-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/1714bd41-b80e-ae33-dc8d-be6ceaf40f77.png)