[はじめてのRDBOX(5)]rdbox使ってみました：ROS Publisher編

# はじめに
ROS の初心者が、とっても簡単なROSアプリを作ってみました。（連載記事です）

# 今回の記事の概要
- 以前の記事で定義したメッセージを使い、撮影した画像ファイルを配信(Publish)する ROS アプリを構築する
- 作成したソースファイルを GitHub に登録する
- 今回の記事に該当するソースファイルは、以下のアドレスから参照可能です
  - https://github.com/higuchi-toshio-intec/example-picam/blob/master/picam_ros/scripts/pub_photo.py

# 事前準備
- 今回の ROS アプリは、Raspberry PI のカメラを制御するため、Raspbian OS 環境で稼働することを想定しています
- ROS 環境を**構築**する場合は、@dyson8910 さんの記事「[Raspberry Pi 3 にROS kinetic をインストールしてみました。](https://qiita.com/dyson8910/items/3aadcc13601fa6e501e1)」が参考になりました
  - 最終的に(次回以降の記事で)は、RDBOX 環境にて Dockerコンテナ(raspbian)で動かします
  - 今回の記事では、実際に環境構築せず雰囲気を感じてもらうだけでも十分です

# 構築

## 関連パッケージ
- 画像データ取り扱いに関連して OpenCV を使用している

  ```
  $ sudo apt install -y python-opencv ros-melodic-cv-bridge
  ```

## GitHub から clone
- GitHub から clone します
  - 以前の記事「[[はじめてのRDBOX(3)]rdbox使ってみました：ROSパッケージ作成編](https://qiita.com/higuchi-toshio-intec/items/44f1377c171738d9b49b#_reference-29b9c0b80060392c0b92)」などで作成(commit)したファイル一式を GitHub 経由で取得（**※GitHub便利です!!**）

  ```
  $ mkdir -p ${HOME}/ros_ws/src
  $ cd ${HOME}/ros_ws/src
  $ git clone https://github.com/YourGitHubAccount/picam_ros.git
  $ ls -lR picam_ros      # msg/picam_photo.msg などが取得できているはずです
  ```

## scripts/take_pub_photo.py
- 今回の記事のアプリソースファイルの作成
- 以下(↓)は具体的な手順（下記例では、GitHubよりファイルを取得）

  ```
  $ mkdir -p ${HOME}/ros_ws/src/picam_ros/scripts
  $ cd ${HOME}/ros_ws/src/picam_ros/scripts
  $ curl -s -o take_pub_photo.py https://raw.githubusercontent.com/higuchi-toshio-intec/example-picam/master/picam_ros/scripts/take_pub_photo.py
  $ chmod +x take_pub_photo.py
  ```

### ソースファイルの主要部分説明

- 静止画撮影
  - Rapbian OS の raspistill コマンドを実行
     - 今日の日付文字列を含んだファイル名
     - サブプロセスでコマンド実行（画像撮影）
  - 以下(↓)は対応する部分

  ```
        #
        filename = "%s/photo-%s.jpeg" % (dir_tmp, today.strftime("%Y%m%dT%H%M%S"), )
        cmd = "raspistill -w %d -h %d -o %s" % (args.w, args.h, filename)
        subprocess.call(cmd, shell=True)

  ```

- Publisherの生成
  - トピック名称：example_picam_photo
  - データ型：picam_photo
  - キューサイズ：100
  - latch：True
     - True を設定することで Publisher と Subscriber 間でのデータ受け渡しがうまくできたため
     - False でもよかったかもしれない
  - 以下(↓)は対応する部分

  ```
  def create_pub(node_name):
    rospy.init_node(MyNodeName, anonymous=True)
    staLatch = True
    pub = rospy.Publisher('example_picam_photo', picam_photo, queue_size=100, latch=staLatch)

    return pub
  ```

- 配信(Publish)
  - Publish 頻度に合わせて rate を設定（１秒当たりの回数）
     - 今回の記事のようなケースでは、もっと小さな値でも OK
  - データ型 picam_photo の変数(msg)を作成し以下の情報を格納
     - 現在時刻
     - 端末ID
     - 画像データ（OpenCV を使用し読み込み）
  - 以下(↓)は対応する部分

  ```
  def pub_photo(pub, file_photo):

    #
    pub_rate = rospy.Rate(30)

    #
    msg = picam_photo()

    #
    print("[INFO] reading... " + file_photo)
    photo_cv2 = cv2.imread(file_photo, cv2.IMREAD_COLOR)

    #
    msg.timestamp = rospy.Time.now()
    msg.edge_id = MyNodeName

    #
    msg.picam_photo = GV_cv_bridge.cv2_to_imgmsg(photo_cv2)

    #
    pub.publish(msg)
    pub_rate.sleep()
  ```


## GitHub への登録
- 作成したファイル全てを GitHub に登録
- 以下(↓)は具体的な手順

  ```
  $ cd ${HOME}/ros_ws/src/picam_ros
  $ git add .
  $ git commit -m 'CommitMessage'
  $ git push
  ```

## catkin_make
- コンパイル実行
  - 実行コマンドは catkin_make
  - 「catkin_make: command not found」となった場合は、以下のコマンドを実行

    ```
    $ source /opt/ros/${ROS_DISTRO}/setup.bash
    ```
- 以下(↓)は具体的な手順

```
$ cd ${HOME}/ros_ws/
$ catkin_make
```

## アプリ起動
- 以下(↓)は具体的な手順

```
$ cd ${HOME}/ros_ws
$ source /opt/ros/${ROS_DISTRO}/setup.bash
$ source devel/setup.bash
$ rosrun picam_ros take_pub_photo.py
```

---
# 記事リスト
1. [概要編](https://qiita.com/higuchi-toshio-intec/items/5d5499447d667e339b87)
2. [画像参照アプリの構築編](https://qiita.com/higuchi-toshio-intec/items/1deae0d03a74bafec8af)
3. [ROSパッケージ作成編](https://qiita.com/higuchi-toshio-intec/items/44f1377c171738d9b49b)
4. [ROS Subscriber編](https://qiita.com/higuchi-toshio-intec/items/3d62bbfc5e520de9dce1)
5. [ROS Publisher編](https://qiita.com/higuchi-toshio-intec/items/0c136f4d90e70983a8a3)（← 今回の記事）
6. [DockerImage 作成編](https://qiita.com/higuchi-toshio-intec/items/826b4c5407b05372b78c)
7. [RDBOX(k8s) ポート転送編](https://qiita.com/higuchi-toshio-intec/items/b3b79da5ca160ee418b0)
8. [RDBOX(k8s) Subscriber アプリ編](https://qiita.com/higuchi-toshio-intec/items/765d7ef1b6baf85d9f02)
9. [RDBOX(k8s) Publisher アプリ編](https://qiita.com/higuchi-toshio-intec/items/9c43e001d8098a6c7a40)
10. [雑記](https://qiita.com/higuchi-toshio-intec/items/5d80fd647514dfbd2938)