どこでも動く!!つよつよロボットの為のITインフラ構築（産業用ラズパイ「RevPi」を使って。）

![IMG_4318.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96992/45b3371c-0963-ac5e-92ec-237933b17bd6.jpeg)


# はじめに
21世紀、、、私が子供の頃は、２１世紀の「ちまた」にはロボットが溢れているに違いない!!と確信しておりました。が!２０年経ってもそうなっていない現実に少し寂しさを感じております。（Pepperくん、ルンバ君など一部芽は出つつありますが。）

## この記事を書いた背景
ここから真面目な話。
[ROS(Robot Operating System)](http://wiki.ros.org/)を採用したロボットは、ROS2の登場もあって徐々に現場導入に耐えうるモノへと成長していくことが予想されています。
`IT infrastructure for ROS robots and IoT devices. These is very smart like your ROS robot.`な 「[ROSロボット/IoT 向けプラットフォームであるRDBOX](https://github.com/rdbox-intec/rdbox)」では、ロボット開発者の面倒を取り除くためのネットワーク/コンピューティング環境構築のための多くの機能を実装してきました。公開当初は無かった、Raspberry Pi 4やx86アーキテクチャ対応など、多くの実行環境の選択肢を提供しています。
一方でRaspberry Piの現場環境下への投入に不安を覚えるという声も多く聞かれます。RDBOXでは、x86アーキテクチャをサポートしているため産業クラスタ用のPCでの実行余地がありますが、それらは非常に高価で、特にRDBOXの「メッシュネットワーク」を構成し敷地内へとバラ撒くエッジ端末としてはオーバースペックでもあるためその導入に躊躇する側面もあります。
産業クラスタ用PCの他の選択肢として、ARMアーキテクチャの「Linux搭載　産業用IoTデバイス」があります。しかし、Linuxカーネルやデバイスドライバを専用としている場合が多く、市場に多種存在するそれら一つずつ全てに対応することは、現実的であるとは言えません。そこに来て、数多くのユーザが利用しておりカーネル、デバイスドライバそれぞれがOSSとして公開されて安定している **「Raspberry Piのエコシステム」** は非常に魅力的なものです。

## What's RevPi??
### バックグラウンド
RevPiは、日本代理店ハーティング様のHPでは、次のように紹介されています。[コンセプト \- HARTING K\.K\.](https://www.pi4industry.com/concept/)
> ラズベリーパイが誇る圧倒的なコストパフォーマンス、そしてラズベリーパイ上で使えるオープンソースソフトウェアと世界中のエキスパートユーザー達がインターネット上で発信する驚異の技術ナレッジベース。ラズベリーパイプラットフォーム上で日々生まれる最先端IoT工学技術を製造現場でいち早く展開したいという声で生まれたのが、ヨーロッパ生まれの産業用ラズベリーパイです。

### 特徴
Raspberry Pi Compute Module 3 をベースとして、専用筐体/専用ボードに収めること、専用設計電源で高い信頼性を得ています。また、Raspbianに対してRTパッチが当ててあるものがプリインストールされています。
開発元である[kunbus公式ページ](https://revolution.kunbus.com/)より、
> Open Source IPC based on Raspberry Pi

とある通り、オープンソースプロジェクトとして実装されていることが分かります。kunbusからは「ユーザフォーラム」「[ソースコード](https://github.com/RevolutionPi)」それぞれが提供されています。

産業用PCとして備えるH/Wの特徴としては、次の点が挙げられます。

1. eMMCストレージ採用（非SDカードなので信頼性が高い。）
1. 24V電源入力（非常に安定性の高いDC-DCコンバータを使っているのでUnder-Voltageになることはない。）
1. RTC搭載
1. 動作温度：-40°C〜55°C
1. 各種規格に適合(日本では、JIS B3502(プログラマブルコントローラ－装置への要求事項)相当)
   - ESD保護：EN 61131-2およびIEC 61000-6-2に準拠
   - サージ/バーストテスト：EN 61131-2およびIEC 61000-6-2
   - EMIテスト：EN 61131-2およびIEC 61000-6-2に準拠

## つよつよのロボットのためのインフラ構築
導入が長くなりましたが「RevPi」は、少しばかしタフな環境で働くロボットのためのインフラを作ることに、非常に有力な選択肢であると言えます。「つよつよのロボット」本体を作る実力値は低い私ですが、ITインフラの側面からその発展を支えられないか？と思いいろいろ挑戦してみました。

# セットアップ
## 注意
本記事では、購入した際プリインストールされているOSを上書きします。バックアップを取れば大丈夫だとは思いますが、その実施は自己責任でお願いします。

## RDBOX-HQ
AWS or Azure or オンプレミスサーバ　を使ったRDBOX-HQ（KubernetesのMasterや、VPNServer）は既に構築済みである前提で進めます。まだセットアップをしていない場合は、[RDBOX-HQ 構築編 step1 / 5.各サーバの構築-step1
](https://github.com/rdbox-intec/rdbox/wiki/tutorials-ja#rdbox-hq-%E6%A7%8B%E7%AF%89%E7%B7%A8-step1)まで終わらせて下さい。

## 物理配線
RevPiの日本代理店であるハーティング様の記事を参考にセットアップをしました。（特に電源周り）
[産業用ラズパイ RevPi Core3 ：セットアップ準備 \- Qiita](https://qiita.com/htg_ns/items/eb666e7b12fafb1e7dfb)
RDBOX開発チームでは、ねじ端子台付きDCジャックではなくDCジャックが片側がメスになっているキットを使いました。
![IMG_4295.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96992/9b6f430e-79ba-27a7-e2f0-a90c7293180f.jpeg)

## OS
念の為バックアップを取っておいた方が良いかもしれません。取れない場合も、以下のハーティング様の記事の通りに再セットアップを実施することも可能なようです。
[RevPi Core3にJessieをインストール \- Qiita](https://qiita.com/htg_ns/items/a6e78c97e64f6410d0b2)

バックアップをする場合は、各OSから、Compute Moduleをディスクとして認識させてからddコマンド等を用いてバックアップします。
[Flashing the Compute Module eMMC \- Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/hardware/computemodule/cm-emmc-flashing.md)

以下、Macを用いた場合のバックアップ手段を示します。[USBケーブルとPCの接続方法もこちらの記事で書かれています。ありがたい。](https://qiita.com/htg_ns/items/a6e78c97e64f6410d0b2#revpi%E3%82%92windows-pc%E3%81%A8%E6%8E%A5%E7%B6%9A)

```bash
$ brew install libusb
$ git clone --depth=1 https://github.com/raspberrypi/usbboot
$ cd usbboot
$ make
# 
# ここでUSBケーブルを接続する。
#
$ sudo ./rpiboot
$ diskutil list # ここで接続されたRevPiがどのドライブとして認識されているか確認する。
$ diskutil unMountDisk /dev/diskX # マウントを解除
$ sudo dd if=/dev/rdiskX of=revpi.img bs=1m
```

## RDBOXの書き込み
RevPiをマウントした状態のまま作業を継続します。
ここでは、**RDBOX(Master)** としてセットアップします。

1. rdboxGARIBANをインストール
   - ダウンロード
      - Win: [rdboxGARIBAN\-Setup\-0\.1\.0\.exe](https://github.com/rdbox-intec/rdboxGARIBAN/releases/download/v0.1.0/rdboxGARIBAN-Setup-0.1.0.exe)
      - Mac: [rdboxGARIBAN\-0\.1\.4\.dmg](https://github.com/rdbox-intec/rdboxGARIBAN/releases/download/v0.1.4/rdboxGARIBAN-0.1.4.dmg)
   - インストール
      - Mac/Windowsそれぞれ実行形式ファイルをダブルクリックし、指示従い操作。
2. rdboxGARIBANを起動
   <img width="1112" alt="スクリーンショット 2020-02-07 14.11.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96992/6a6e6bc4-0a9a-bfd4-7e1c-dc680fc175d2.png">
3. 「Select image」ボタンを押してRDBOXのイメージファイルを、「Select Drive」ボタンを押して、ドライブとして認識しているRevPiをそれぞれ選択します。 **なお、イメージはRevPi用に作った`stretch`版を必ず選択して下さい。**
   - ドライブは既に自動的に選択されていることもあります。 
   - [Download Link RDBOX(stretch)](https://github.com/rdbox-intec/rdbox/releases/download/v0.1.5/hypriotos-rpi-v1.10.0.rdbox-v0.1.5-deb9.img.zip)
   - DebianStretch版のRDBOXをテスト的に作成。
4. 「Set user-data」ボタンを押して、ウィザード形式で必要な情報を順に入力していきます。条件を揃えるための設定項目については以下の通り設定をあわせて下さい。
   - クラスタ名はチュートリアルの通り、「rdbox」とします。コメントは自由です。
      <img width="1112" alt="スクリーンショット 2020-02-07 14.15.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96992/3b9a4c34-f6f8-b684-5c1c-78488008f006.png">
   - ハードウェア構成は「Plan2: SimpleMesh」とします。
      <img width="1112" alt="スクリーンショット 2020-02-07 14.16.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96992/f321992e-76be-86ea-389b-0deaed5e2736.png">
   - 役割は「LEADER Master」を選択します。
      <img width="1112" alt="スクリーンショット 2020-02-07 14.18.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96992/d946de3d-c633-1d58-ddac-f47d5bb10d3d.png">
   - 外部ネットワークへの接続方法を「Wi-Fi」にします。
      <img width="1112" alt="スクリーンショット 2020-02-07 14.21.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96992/f9bbb8f7-5585-936a-837c-2ace7971586b.png">
5. 全ての設定が終わると「Flash!」ボタンが押せるようになります。「Flash!」ボタンを押して、RevPiにRDBOXを書き込みます。
6. 書き込みが終わったら、OS毎のデバイス取り外し方法に従い、RevPiをPCから安全に取り外します。

## Wi-Fiドングルの接続
RevPiに「USB Wi-Fiドングル」を「2本」接続します。ただし、USB端子の配置間隔が狭いのでL字に曲げるやつとかUSB延長ケーブルなんかを使って上手に繋げる必要があります。（Compute Module 3/3+ にはWi-Fiが搭載されていないのは痛い。）
![IMG_4301.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96992/1b2e820b-bde2-b1f4-b6bf-e2e8d1043111.jpeg)
また、各USBポートは500mAまでしか流せない仕様なのでセルフパワーのハブを使うか、２ポート使って接続する必要がある点に注意。（多くのWi-Fi USBドングルの消費電流は500mA程度）

## 電源を繋げる
Bootが始まります。徐々にWi-Fiのアクセスポイントなどが立ち上がってきます。Firmwareの更新など含めて約10分ぐらいでセットアップが完了します。
セットアップの完了はWi-Fiのアクセスポイントに繋いで、SSHでログイン。以下のプロンプトが表示されるようになったことを以て確認できます。

```bash
$ ssh ubuntu@192.168.179.1

Linux rdbox-master-00 4.19.93-v7+ #1290 SMP Fri Jan 10 16:39:50 GMT 2020 armv7l

RDBOX based on HypriotOS (Debian GNU/Linux 10)
. 
             .___. 
            /___/| 
            |   |/ 
            .---.  
            RDBOX  
 - A Robotics Developers BOX - 

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Feb  7 15:08:24 2020 from 192.168.179.40
```

処理が途中の場合は、次のような内容が表示されます。（RDBOXのロゴが表示されていません。）

```bash
The authenticity of host '192.168.179.1 (192.168.179.1)' cant be established.
ECDSA key fingerprint is SHA256:SVkmuxjKypNoBaz9IDpXU9KczYNwuiD+4P880IPjmO8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.179.1' (ECDSA) to the list of known hosts.
Linux rdbox-master-00 4.19.93-v7+ #1290 SMP Fri Jan 10 16:39:50 GMT 2020 armv7l

HypriotOS (Debian GNU/Linux 10)

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
```

## RDBOX(Master)の完成と、その後の作業
【注意】次の手順にて、一般的なRaspberryPiを使う際の設定項目を削除します。削除しない場合、再起動時に動かなくなるので絶対に実施してください。

```bash
$ sudo rm -rf /etc/udev/rules.d/70-persistent-net.rules # 一般的なRaspberryPi用の設定を削除する
```

また、起動引数を次の通り編集してください。

```/boot/cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 cgroup_enable=cpuset cgroup_enable=memory swapaccount=1 elevator=deadline fsck.repair=yes fsck.mode=force rootwait nosplash plymouth.ignore-serial-consoles
```

その後、
[kubernetesのノードとして参加したことの確認と操作](https://github.com/rdbox-intec/rdbox/wiki/setup-rdbox-3-RDBOX_turn_on-ja#kubernetes%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%89%E3%81%A8%E3%81%97%E3%81%A6%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%9F%E3%81%93%E3%81%A8%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%81%A8%E6%93%8D%E4%BD%9C)からチュートリアルを再開して下さい。RDBOXとして動いていることの動作確認並びに、ロボットへのセットアップを継続して実施することが出来ます。
RDBOX(Slave)も同様にRevPiを使ってセットアップすることが可能です。`rdboxGARIBAN`は先程設定したアカウントやWi-Fiの各設定をヒストリーとして保存しているため、2回目以降は参照作成が可能なのでより手早くRDBOXを量産可能です。是非、お試し下さい。
<img width="1112" alt="スクリーンショット 2020-02-07 15.27.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96992/e12d2381-6004-89bf-57dc-2d3277118137.png">


## RevPiとして再セットアップ
ここまででの手順で、非常に堅牢な「RDBOX」のエッジ端末が完成しました。RDBOXとして使用する場合はそれでもいいのですが、せっかくのRevPiです。RevPiとして、各産業機器への接続に使えるように再セットアップをします。



### カーネルのインストール

#### revpiのカーネルをそのまま使う

```bash
# カーネルをインストール

$ curl -fsSL https://github.com/RevolutionPi/imagebakery/raw/master/templates/revpi.gpg | sudo apt-key add -
$ echo "deb http://packages.revolutionpi.de/ stretch main contrib" | sudo tee /etc/apt/sources.list.d/revpi.list
$ sudo apt update
# raspberrypi-kernelのバージョンはその時々、最新のものを指定すること。
$ sudo apt install raspberrypi-kernel=9.20190904-4.9.76+revpi1
$ sudo shutdown -h now    # 何故か、rebootだとRevPiが不安定になるためShutdown。プラグも一度抜くのが良いかも。
```

### Dockerの再インストール
新しいカーネルに合わせてカーネルモジュールを作り直しさせるため、Docker周りのモジュールを再インストールします。

```bash
$ sudo apt purge docker-ce docker-ce-cli containerd.io
$ sudo apt install docker-ce docker-ce-cli containerd.io
```

【注意】インターネットに繋がらない（名前解決に失敗）っぽいエラーが出たら、`/etc/rdbox/dnsmasq.resolver.conf`に適切なDNSサーバを追加して、dnsmasqサービスを再起動して下さい。

```bash
$ sudo vi /etc/rdbox/dnsmasq.resolver.conf
8.8.8.8
8.8.4.4
$ sudo systemctl restart dnsmasq.service
```


### その他ミドルウェア類のインストール対応
```bash
$ sudo groupadd i2c
$ sudo apt install revpi-firmware revpi-repo revpi-tools revpi7 pictory piserial pitest pimodbus-master pimodbus-slave can-utils python-can python3-can libsocketcan-dev cpufrequtils tcpdump gdbserver logi-rts logiclab procon-web-iot nodered python3-revpimodio2
$ sudo sh -c "echo 'i2c-dev' >> /etc/modules"
$ sudo sh -c "echo 'dtoverlay=revpi-core' >> /boot/config.txt"
$ sudo sh -c "echo 'dtparam=eth0_mac_hi=0xc83ea701' >> /boot/config.txt"
$ sudo sh -c "echo 'dtparam=eth0_mac_lo=0x49df' >> /boot/config.txt"
$ sudo sh -c "echo 'hdmi_drive=2' >> /boot/config.txt"
$ sudo sh -c "echo 'dtparam=i2c_arm=on' >> /boot/config.txt"
$ sudo shutdown -h now                  # 何故か、rebootだとRevPiが不安定になるためShutdown。プラグも一度抜くのが良いかも。
```

### 動作確認等
検証中のこの環境にはRevPiの拡張用I/Oモジュールなどが無いため検証できることが少ないですが、この段階で`eth0`が正常に認識されるようになっていることが確認できます。（Macアドレスが、RevPi開発元であるKUNBUSのものになっています。ドライバーインストール前は違いました。）
また、piraight,pileftというNICも新たに追加されています。

```bash
HypriotOS/armv7: ubuntu@rdbox-master-00 in ~
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 1000
    link/ether c8:3e:a7:01:49:df brd ff:ff:ff:ff:ff:ff

5: piright: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 5e:d7:9c:dc:75:9b brd ff:ff:ff:ff:ff:ff
6: pileft: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 9a:c0:e1:f1:cd:44 brd ff:ff:ff:ff:ff:ff
```

RDBOXのWi-Fiに繋いで、デフォルトのIPアドレス（192.168.179.1）にアクセスすると、WebUIも見ることができます。ユーザ＆パスワードは本体横のラベルに書かれているモノを使用します。
<img width="1204" alt="RevPi_Status.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96992/bdf682a2-93b7-d898-215d-92783e4ed0fd.png">



# 終わりに
ちょっとタフな環境（建築現場とか、地下鉄の構内とか、工場の中とか←ここに関しては一部協働型ロボットが既に動いている）で動かすためにRevPiをRDBOXとしてセットアップしてみました。Raspberry Piのエコシステムは素晴らしいと改めて感じております。
電子工作用途から、RevPiのようなに過酷環境に耐えうる専用実装までいろいろなニーズに応えてくれます。
RDBOXでも、ROSロボットの学習ハードルをITの側面から下げるのはもちろんのこと、今後はもっと信頼性の高いネットワーク/コンピューティング基盤を提供していけるよう開発を進めてまいります。