Raspberry Pi 4 に Ubuntu 20.04 LTS + ROS2の環境構築をしてみた


# はじめに
- raspi4 + ubuntu20.04 + ROS(foxy)の環境を構築してみます。
- 更新日
    - 2020/06/16
    - 2021/07/07

# 目次
1. Raspberry Pi 4にUbuntu 20.04 LTSをインストールする
2. Ubuntu 20.04 LTSにROS2のインストール
3. テストコードを実行してみる

# 1. Raspberry Pi 4にUbuntu 20.04 LTSをインストールする

## 用意したもの
- Raspberry Pi 4 computer Model B 4GB RAM
- micro SDカード(今回は16GB) 
- PC(mac or windows or linux)


## 手順
### (1) Raspberry Pi Imagerをインストール
- [公式ページ](https://www.raspberrypi.org/downloads/)からmy PCにダウンロード
- macの場合、homebrewでも簡単に取れる
    - ```brew install raspberry-pi-imager```



### (2) Raspberry Pi Imagerを使ってmicroSDカードにイメージを書き込む
- Raspberry Pi Imagerを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582061/263e146a-207a-7095-7cf0-24795b347072.png)

- operating systemでubuntu 20.04 LTSを選択
    - ROS2をインストールする場足は、64bitをとりましょう
    - ちなみに、ubuntu 21.04に対応したROS２のversionは、21/07/07の時点ではreleaseされていないようです

![スクリーンショット 2020-06-16 22.47.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582061/bad23651-4cf4-8362-7b54-680008b4b89d.png)

- SD cardを指定して、WRITEを押す
- SDカードを取り外して終了


### (3) raspi4を起動 
- (2)でイメージを書き込んだSDカードをraspiに差して起動（電源を繋ぐ）
- 初回は時間がかかる、、？
- ログインする
    - デフォルトのユーザ名　```ubuntu```
    - デフォルトのパスワード　```ubuntu```
- パスワードを変更する

### (4) ホスト名、タイムゾーン、IPアドレスの設定

[参考サイト](https://denor.jp/ubuntu-20-04-focal-fossa%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A-ip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%80%81%E3%83%9B%E3%82%B9%E3%83%88%E5%90%8D%E7%AD%89)

#### ホスト名の設定

```
sudo hostnamectl set-hostname ooo
```

#### タイムゾーンの設定


```
sudo timedatectl set-timezone Asia/Tokyo
```

#### IPアドレスの設定


```
sudo vim /etc/netplan/50-cloud-init.yaml
```

- 参考ファイル
    - 192.168.xxx.1がルーターのIP
    - 192.168.xxx.yyyがraspiのIP


```50-cloud-init.yaml:
network:
    ethernets:
        eth0:
            dhcp4: false
            addresses: [192.168.xxx.yyy/24]
            gateway4: 192.168.xxx.1
            nameservers:
                addresses: [192.168.xxx.1]
    version: 2
```

- 編集が終わったらnetplanで設定を反映させる

```
sudo netplan apply
sudo reboot
```

# 2. Ubuntu 20.04 LTSにROS2のインストール
- いろいろなversionがある
    - [これまでバージョン](https://index.ros.org/doc/ros2/Releases/)
    - 今回は、ubuntu 20.04 LTSに対応した ROS2 foxyを使用する

- 基本的には[公式ページのインストール手順](https://index.ros.org/doc/ros2/Installation/Foxy/Linux-Install-Debians/)に沿って思考停止でコピペしてれば終わる。はず。
    - 今回は、公式ページの**Install argcomplete (optional)**までを行った。

## 手順
### (1) ロケールのセットアップ
- OSの文字コードをUTF8にする

```
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
```

### (2) Setup Sources
- ROS2のapt repositoryを加える

```
sudo apt update && sudo apt install curl gnupg2 lsb-release
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo sh -c 'echo "deb http://packages.ros.org/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'
```

### (3) ROS2のpackagesをインストール
- baseとdesktopの２種類があるが、今回はbaseをインストール

```
sudo apt update
sudo apt install ros-foxy-ros-base
```

### (4) 環境設定
```
source /opt/ros/foxy/setup.bash
echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc
```

### (5) argcompleteをインストール
- 必須ではない
- ROS2関連のコマンドラインをtabで補完できるようになる

```
sudo apt install python3-argcomplete
```

# 3. テストコードを実行してみる
- 今回は、python用のコードを実行する

## 手順
### (1) ワークスペースを作って、テストコードを取得、
- C言語用のテストコード(rclcpp)もインストールされるので、今回は消しちゃいます。

```
mkdir -p ~/ros2/src
cd ~/ros2
git clone https://github.com/ros2/examples src/examples
cd ~/ros2/src/examples/
git checkout $ROS_DISTRO
rm -rf rclcpp 
```

### (2) colcon（ビルド用ツール）をインストール
- [インストール参考ページ](https://index.ros.org/doc/ros2/Tutorials/Colcon-Tutorial)
- [colconについてのページ](http://design.ros2.org/articles/build_tool.html)
- colconについて
    - ROS1とROS２の両バージョンが混在していてもビルドできるビルド用ツール
        - ROS1パッケージのビルドは**catkin**、ROS2は**ament**を呼出して行っている

```
sudo apt install python3-colcon-common-extensions
```

### (3) パッケージをビルドする

```
cd ~/ros2
colcon build --symlink-install
```

### (4) 環境設定

```
source ~/ros2/install/setup.bash
echo "source ~/ros2/install/setup.bash" >> ~/.bashrc
```


### (5) 動作確認

- 端末（１）でPublisher

```
ros2 run examples_rclpy_minimal_publisher publisher_member_function
```

- 端末（２）でSubscriber

```
ros2 run examples_rclpy_minimal_subscriber subscriber_member_function
```

さすれば、 ファンタスティック！！！

- 端末（１）Publisher
![スクリーンショット 2020-06-16 22.34.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582061/1c204395-dc94-8144-db6b-f1b7947c1226.png)

- 端末（2）Subscriber
![スクリーンショット 2020-06-16 22.34.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582061/e96092a1-6d72-2cfb-2461-918e260ee289.png)


- 今回実行したテストコードはこちら

    - [Publisher側](https://github.com/ros2/examples/blob/master/rclpy/topics/minimal_publisher/examples_rclpy_minimal_publisher/publisher_member_function.py)

    - [Subscriber側](https://github.com/ros2/examples/blob/master/rclpy/topics/minimal_subscriber/examples_rclpy_minimal_subscriber/subscriber_member_function.py)



# 参考ページ