Android端末でROS1/ROS2を動かす（Rvizもあるよ！）

※2023.05.02更新

- `git clone`する際にブランチ名を指定するようにした

# はじめに

事の発端はちょうど1年前，[ROS/ROS2 Advent Calendar 2020 3日目のMeRT(ルット)さんの記事][1]だった．

どうせならROS2でやってみようと思い，UserLand上のUbuntu 18.04にROS2 Dashingをインストールしたところrqt_graphとrqt_plotは動いたので，[micro-ROSのデモに絡めてみた][2]．この段階ではrqt系は動いたものの，OpenGLがサポートされていないためrvizやgazeboは動かなかった．

それから程なくしてROS2 DashingがEOLとなり筆者のメイン環境もROS2 Foxyへ移行を済ませた頃，Android端末上でROS2 Foxyを動かせないものかと考えるようになった．そのためにはUserLand上のUbuntuが20.04である必要があったが，UserLand上にインストールできるUbuntuは18.04のままという状態が続いた．

そんな中で出会った新たな選択肢が[Termux][3]であった．


# 記事概要

Android端末上にROS環境(ROS2 Foxy および ROS Noetic)をインストールしてRvizの動作確認をするまでの手順を説明する．


![rviz2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/fe3c01db-1ecf-393b-531c-8fc2a04888c0.gif)


# 手順

ベースとなるUbuntuをインストールするために[modded-ubuntu][4]を利用している．これをフォークしてROS2 Foxy および ROS Noeticをインストールするために改変したものをgithubに用意したのでそれを補足しながら説明する．

https://github.com/maehara-keisuke/modded-ubuntu

## 事前準備

- Android 7.0以上
- **WiFi環境**
- キーボード
  - マウスもあればなお良い
  - USB接続を推奨(Bluetoothでも動くと思われるが筆者は確認していない)

## Android端末へのUbuntu 20.04 GUI環境のインストール

### Termuxのインストール

[F-Droid][5]から`Termux`のAPKをダウンロードしてインストールする．F-Droidそのものをインストールするのではないことに注意．

![termux_from_f-droid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/e89eefc7-4e86-2964-77a3-ab1c2d531f59.png)

![termux_apk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/6427a7f3-fe42-0a2b-0141-a0801489f4a0.png)

### Termux内にUbuntu 20.04をインストール

ここでキーボードとマウスを接続する．Termuxアプリを起動するとCUI環境に入るので，以下のコマンドを順に入力する．

``` sh
$ pkg update -y && pkg upgrade -y # デバイス内の写真，メディア，ファイルへのアクセスを許可しますかと聞かれたら許可しないでOK．`sources.listや`motd`を`package maintainer's version`に置き換えるか聞かれたら`y`と入力する．
$ pkg install git wget -y
$ git clone -b foxy-and-noetic https://github.com/maehara-keisuke/modded-ubuntu.git
$ cd modded-ubuntu
$ bash setup.sh
```

※Termuxのリポジトリに障害がある場合など，`pkg update -y`に失敗することがある．その場合は`termux-change-repo`コマンドを試すと良い．操作手順は[こちら](https://www.youtube.com/watch?v=Fn6uam4Je8o)．

スクリプトが終了したら`exit`で抜けて，Termuxアプリを再起動する．

### Ubuntuのセットアップ

Termuxアプリを再起動したら，以下のコマンドを順に入力する．

``` sh
$ ubuntu # Termux内のUbuntu環境にrootでログインする．
$ bash user.sh # 途中，ユーザー名とパスワードの設定を求められる．
```

スクリプトが終了したら`exit`で抜けて，Termuxアプリを再起動する．

### GUI環境のセットアップ

Termuxアプリを再起動したら，以下のコマンドを順に入力する．

``` sh
$ ubuntu # Termux内のUbuntu環境に設定したユーザー名でログインする．以降，このユーザー名でログインすることになる．
$ bash gui.sh # GUI環境をセットアップする．途中，キーボードの設定やタイムゾーンの設定を求められる．
```

途中，VNCクライアントから接続する際に入力するパスワードの設定を求められる．

※ "Would you like to enter a view-only password (y/n)?"と聞かれたら`y`を入力して，`view-only password`を設定するのを忘れないこと．設定を忘れたりパスワードを変えたいという際は，スクリプトが終了した後で以下のコマンドを入力して再設定を行うこと．

``` sh
$ vncpasswd
```

## VNCクライアントのインストール

本稿ではVNCクライアントとして[VNC Viewer][6]を使用する．

### VNC Viewerインストール後の設定

`接続の作成`

![connection-settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/1b4a53ca-3346-1376-2c4d-8a2ae85076ae.png)


Address : localhost:1
Name : 任意

`画質設定`

![real-vnc-settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/7d675b38-8bd0-a69f-cd0f-5000abb59f59.png)

Picture quality : High

※接続が突然切れるようなことがあれば，`Medium`に変更すると改善する場合がある．

## Xの起動

Termux内のUbuntu環境にログインした状態で，以下のコマンドを入力してVNCサーバーを立ち上げる．

``` sh
$ vncstart
```

VNCクライアントを起動する．"Unencrypted connection"という注意書きが出たら`OK`をクリックしておく．

VNC Viewerのメニューがピン止めされている場合は，ピンのアイコンをクリックして解除すると画面を広く使えて便利である．

`VNC Viewerのメニューがピン止めされている状態`

![pinned.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/c3bdf318-368d-65d4-b74a-a38ab7607f66.png)

`ピン止めを解除した状態`

![unpinned.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/249eedc6-5571-14b4-2375-f9825c142bb3.png)

## Xの終了
VNC ViewerのメニューからXアイコンをクリックしてdisconnectする．

Termux内のターミナルで以下のコマンドを順に入力する．

``` sh
$ vncstop
$ exit # Termux上のubuntuからログアウト．
$ exit # Termuxを終了．
```

### ROS2 Foxyのセットアップ

Termux内のUbuntu環境にログインした状態で以下のコマンドを入力する．後述するROS Noeticとの共存も可能である．

``` sh
$ bash ros2-foxy.sh
```

#### rviz2による動作確認

Xを起動してVNC ViewerのGUI上でターミナルを立ち上げ，以下のコマンドを入力する．

``` sh
$ source /opt/ros/foxy/setup.bash
$ rviz2
```

![foxy-rviz2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/a9651b8e-1cef-0744-fe59-24e3f68e3865.png)


## ROS Noeticのセットアップ

Termux内のUbuntu環境にログインした状態で以下のコマンドを入力する．前述したROS2 Foxyとの共存も可能である．


``` sh
$ bash ros-noetic.sh
```
#### rvizによる動作確認

Xを起動してVNC ViewerのGUI上でターミナルを立ち上げ，以下のコマンドを入力する．

``` sh
$ source /opt/ros/noetic/setup.bash
$ roscore
```

もう一つのターミナルを開き，以下のコマンドを入力する．

``` sh
$ source /opt/ros/noetic/setup.bash
$ rviz
```

![noetic-rviz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/fca1b482-6154-c565-8596-c6d64833e57e.png)

# 参考資料

1. [ROS/ROS2 Advent Calendar 2020 3日目のMeRT(ルット)さんの記事][1]
1. [micro-ROSデモの可視化にUserLandを利用した例][2]
1. [Termux][3]
1. [modded-ubuntu][4]
1. [F-Droid][5]
1. [VNC Viewer][6]
1. [MAEHARA_Keisukeのポータル記事][7]

[1]:https://qiita.com/MeRT/items/c4d27db1aa82925988e9
[2]:https://qiita.com/MAEHARA_Keisuke/items/1df4edef01560bb18161#%E3%83%87%E3%83%A2%E3%83%B3%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3
[3]:https://termux.com/
[4]:https://github.com/modded-ubuntu/modded-ubuntu
[5]:https://www.f-droid.org/
[6]:https://play.google.com/store/apps/details?id=com.realvnc.viewer.android&hl=ja&gl=US
[7]:https://qiita.com/MAEHARA_Keisuke/items/31faa68cf5c51831acc6