2021年初にROS(Melodic)を初代ラズパイ(Stretch)でも動かしてみた

###はじめに

ARM11ベースの`Raspberry Pi`は、Zeroシリーズとして今も健在で、かつ、`ROS`のインストールの成功事例が既にいくつも報告されています。[^1]　

Zeroシリーズで動くなら`Raspberry Pi Model B` （初代ラズパイ）モデルでも動かせるのではないかと思いネット上の記事を探したのですが、こちらはあまり報告例が見当たりません。単に、機材が古すぎるからでしょうが・・・

そこで、Zeroの事例を参考に自分でも実際にやってみたところ、少し設定を変更すれば初代ラズパイでもROSのコアをインストール／動作をさせることができました。2021年になってすでに過去の産物扱いの初代ラズパイですが、家に転がして飾っておくだけなのはもったいないという方のために、作業の備忘録を兼ねて、自分で実際に行ったインストール手順を簡単にご紹介します。

（追記 2021/1/5）誤字脱字、launch.pyのファイルフォルダ表記漏れ等を修正しました。

[^1]: [ROS(melodic)をRaspberry Pi + Raspbian(stretch)にインストールする方法](https://asukiaaa.blogspot.com/2018/06/raspberry-pi-raspbianstretchrosmelodic.html "試行錯誤な日々")

###ROS入りRaspberry Pi Zero用OSイメージのダウンロード

手っ取り早く`Stretch + Melodic`を試したい方には、すでにRaspberry Pi Zero用にRaspbian StretchにROS MelodicをインストールしたOSのイメージファイルを配布している方がいらっしゃいますので、まずは以下の記事をご確認ください。
・[Installing ROS Melodic on Raspbian Stretch](https://labs.fpv.umb.sk/ros/)

(2021/1/12追記）
ダウンロードしたイメージでupdateを行うと、こちらでもROSの認証エラーが発生しますので、認証キーの再取得をしてください。やり方は、後述と同じです。

```
$ sudo apt-key del F42ED6FEAB17C654
$ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
```

###初代ラズパイ向けの修正

上記サイトからダウンロードしたZIPイメージを4GB以上のSDカードに焼いて初代ラズパイを起動すれば、すんなりとRaspbianが立ち上がります。単純なROSノードを起動させるだけであればこれでも使用できます。ただし、ROSCOREは、Zeroなら起動したのですが、初代ラズパイでは起動する途中でプロセスがダウンしてしまいました。

実際に発生した現象は、[こちらの報告事例](https://www.mail-archive.com/meta-ros@googlegroups.com/msg00029.html)と同じです。パイソンがROSCOREの立ち上がりを待ちきれずにタイムアウトしてしまうために発生しました。

解決方法は、[こちらの記事](https://github.com/ros/meta-ros/issues/215 "roscore doesn't wait enough for ros master to start #215")と[こちらの記事](https://github.com/moriarty/ros-ev3/issues/2 "[How to] run roscore on the EV3 #2")を参考にしました。具体的な作業を次に示します。

```bash
$ sudo nano /opt/ros/melodic/lib/python2.7/dist-packages/roslaunch/launch.py

#_TIMEOUT_MASTER_START = 10.0 #seconds   ###コメントアウト
_TIMEOUT_MASTER_START = 100.0 #seconds   ###追加
```

あと、[こちらの記事](https://neverbenever.wordpress.com/2017/12/20/install-ros-and-opencv-in-raspberry-piraspbian-stretch/ "INSTALL ROS AND OPENCV IN RASPBERRY PI(RASPBIAN STRETCH")を参考にして、スワップファイルのサイズも元に戻しておきました。

```bash
$ sudo nano /etc/dphys–swapfile

CONF_SWAPSIZE=100       ###追加
# CONF_SWAPSIZE=1024    ###コメントアウト
```
ファイルを保存して、スワップサイズの変更を有効にします。

```bash
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start
$ free -m
```
以上で、初代ラズパイでROS(Melodic)のコア部分(ROS Core)がインストールした環境が入手できます。

###さらに、衝動が抑えきれない方のために・・・

ROSを使用するのに、上記のような方法で環境を入手するのは、`ubuntu`に`apt-get`で`ROS`をインストールするのと実質的な違いはないとも思いますが、どうせなら、自分でも一通りの手順を踏んでみたいという好奇心旺盛な方のために、冒頭でご紹介したサイトで紹介されているインストール手順を進める上で変更が必要だった手順やコマンドをいくつかご紹介します。

- Ros.org の [REP 3 (Target Platform）](https://www.ros.org/reps/rep-0003.html)のデータを確認する。

これは、思いのほか重要な情報で、特に強調したい点です。ROS.orgの[ステップ・バイ・ステップの手順](Installing ROS Melodic on the Raspberry Pi)通りにやっても記事が古いためか必ず失敗します。途中で作業が失敗した場合の原因を考えるうえでも有益な情報で、インストールの最後までたどり着くための羅針盤のようなものでした。ソフトウェアごとのバージョンの組み合わせについての知識なしに作業をするのは無謀であると同時に時間の無駄だと痛感しました。

- 作業は、全体でほぼ半日以上かかります。特にrosdepの初期化（`Initializing rosdep`）作業だけで数時間かかりました。時間には、十分に余裕があるときに行いましょう。（追加の注意点は後述します。）
- スワップメモリの拡張（100→1024）は、OSを最初に起動した際にやっておいても作業中のトラブルはありませんでした。インストール作業完了後には、元に戻しておきました。
- 初回起動時の`raspi-config`では、`SSH`だけを使えるようにしました。Windows PCからSSHで接続すれば、画面のコピペで作業できますので作業効率が上がります。
- オーバークロックは今回は使用しませんでした。その他OSの初期設定は、できるだけ変更せず、ロケールや言語、キーボード配列も変えないようにしました。

- SDカードは、`8GB`の`Micro SD`を利用しました。[^2]

[^2]: ひと昔では信じられないほど新品が安く（税込みで350円くらい）入手できました。個人的な意見ですが、OSの実験ではSDカードのドライブの削除やパティションの再構築をしてフル・フォーマットをやり直したりするので、時間の節約のためにも、メモリカードはできるだけ小さいものを使用しています。
 
###rosdepの初期化作業前の追加作業

一番時間のかかる作業で途中でエラーが起きるとやり直すのが大変です。以下の作業を事前に加えて、コマンドも以下のように少し変更してみてください。

```bash
$ sudo apt-key del F42ED6FEAB17C654
$ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
$ rosdep install --from-paths src --ignore-src --rosdistro melodic -y --skip-keys-"python-pycryptodome" --os=debian:stretch

```

最初の二つのコマンドは、認証キーのエラー対策です。以下の記事を参考にさせていただきました。
・[ROS melodicインストール時のキーエラー (NO_PUBKEY F42ED6FBAB17C654)](https://qiita.com/MikhailBertrand/items/cf290d7d2cb170855a98)

python-pycryptodomeは、[Melodicで使用されています](https://index.ros.org/d/python-pycryptodome/)がStretchのdebには標準搭載されていないようです。pipでインストールする方法もあるようですが、私は、以下のROS Answerの記事を参考にして、プロセスをスキップさせました。
・ [Pycryptodome](https://answers.ros.org/question/348170/pycryptodome/)

###おわりに

実は、このテーマは、2020年にさんざん時間をかけて調べたり試したりしたものの、うまくいかなかった「道楽」の一つです。やっぱり、他人の書いた手順や実験結果だけをうのみにして、よく内容を理解せずに作業をしていたのが失敗の原因でした。ですので、`REP 3`のような「仕様」にかかわる情報の存在を知らずにいたのに、たまたまネット検索で偶然見つけられたのは幸運であるとともに、昨年までのやり方を大いに反省しました。