ArduPilot SITLをラズパイ4で動かそう

(2024年1月18日追記)
64bit版Raspberry Pi OSは Bullseye版を使ってください。
最新のBookwarm版は初回起動直後の状態では、ardupilotのインストールシェルファイルでのインストールに失敗します。
これは最新のPython3が、PEP668に従ってvenv環境を作っていない状態でのpipのインストールを拒否するようになったためです。
Legacyの方に残っているBullseye版であれば、このルールが無いのでインストールに成功します。

そりゃライブラリのバージョンに厳密な機械学習(AI)はvenvの切り替えも必要になるけど、それはGPU挿したガチのPCの話だよなあ。
Raspberry Piって１つの機能で１台って使い方が多いから、venvなんか使わなくても良いんだけどなあ。。。

(2023年7月29日追記)
Ubuntu Serverでなくても、64bit版Raspberry Pi OS Bullseyeでも問題なくArduPilot SITLがインストールできました。
その場合、Ubuntu関連の話は飛ばして、[aptの更新](https://qiita.com/drafts/2b65b205b0834089a54e/edit#apt%E3%81%AE%E6%9B%B4%E6%96%B0) から進めてもらえば大丈夫です。

# はじめに
オープンソースのフライトコントローラ「ArduPilot」には，シミュレーション環境としてSITL(Software in the Loop)があります．
本ページでは,これを「Ardupilot-SITL」と呼んで記事を書いていこうと思います．

以前，

　[ArduPilotのSITLを動かす](https://qiita.com/hsgucci/items/9037835f9c25ce04c38d)

で，SITLのインストール方法を説明しました．
このシミュレーション機能を使えば，

・Pixhawk系フライトコントローラに自作で追加した機能をテストする．（ファームウェアの改造）
・ドローン輸送などのプログラムの動作テストをする．（コンパニオンＰＣのプログラム）
・群飛行などの複数同時飛行のテストをする．（地上の管制プログラム）

など，実機で試す前に様々な仮想実験が行えます．

ところが，Ardupilot-SITLは，インテル系のCPUを持ち，64bitのＯＳが入ったＰＣでしか動作できませんでした．
実質「Linux用のデスクトップＰＣを別途１台準備しろ」と言われている様なものです．
余ったＰＣがある人でないといけない，というのが辛いところでした（泣）

しかし，<font color=red>最近Raspberry Pi用のＯＳが64bitに対応</font>しました．
ということは「<font color=blue>**Ardupilot-SITLがラズパイで動くのでは？**</font>」と期待してしまいますよね．
ところが，公式ページそのままの手順ではインストールできませんでした．．．

本ページでは，ラズパイ４にArdupilot-SITLをインストールする手順を解説します．

# 概要
公式ページ　[SITL Simulator (Software in the Loop)](http://ardupilot.org/dev/docs/sitl-simulator-software-in-the-loop.html)
にインストールの方法が記載されているので，基本的にはこの手順で行いますが，
2020年7月の現時点では依存しているライブラリ<font color=red>**"pygame"のインストールでトラブる**</font>こと確認しています．

というわけで，[以前のページ](https://qiita.com/hsgucci/items/9037835f9c25ce04c38d)　にラズパイ対策として必要な部分を記載します．

# 準備するもの
・Raspberry Pi 4 (メモリ4GB版)
　　dronekit-sitlは「x86系のみ，ARM系非サポート」と明記されていましたが,
　　Ardupilot-SITLはARM系でも大丈夫！

・動作確認済みＯＳ：　Ubuntu Server 18.04.4 arm64版
　　[このページ](https://ubuntu.com/download/raspberry-pi)　で「Download 64bit」をクリック

・有線LAN
　　Ubuntu ServerはGUIの無いコマンドライン版なので，WiFi設定などが大変．
　　なので最初は有線LANでアップデートやソフトウェアインストールをします．

# 初期設定の参考ページ

・[Raspberry Pi 4にUbuntu Serverを入れて初期設定をするまで]
(https://qiita.com/quailDegu/items/63114ba1e14416df8040)
　　イメージのダウンロード，SDカードへの書き込み，WiFi設定，初回ログインあたりまでが参考になります．

・[Raspberry Pi 4とUbuntu Server+デスクトップのインストール](https://raspida.com/rpi4b-ubuntuserver)
・[Raspberry Pi 4にUbuntu MATEをインストールしてみた](https://bigmoro.cocolog-nifty.com/blog/2019/12/post-90eaca.html)
　　コマンドラインしかないUbuntu Serverにデスクトップ環境をインストールする方法です．
　　xfce，lxde，KDE，MATEのお好きなものをどうぞ．
　　「シミュレーション環境にはデスクトップなぞいらん！」という猛者には必要ない作業です．
　　WiFiの設定はデスクトップ環境が入ってからでも良いよね～という弱者の筆者(^^;;

# 初回起動時

初回起動時は，

```bash:初回起動時
Ubuntu 18.04.4 LTS ubuntu tty1

ubuntu login:
```
この様に表示されるので，
**ユーザ名：ubuntu**
**パスワード：ubuntu**
でログインしてください．
**<font color=red>※cloud-initの出力メッセージがloginに被ってきて非常に邪魔(怒)ですが，どうしようもないので，「いないもの」と見なしてIDとパスを打ち込みましょう．</font>**

ログインすると，
「パスワードを変更しろ」と言ってくるので，
まずは現在(current)のパスワード**ubuntu**を入力し，

```bash:初回ログイン時のパスワード変更要求
You are required to change your password immediately (root enforced)
Changing password for ubuntu.
(current) UNIX password:
```
続いて新しいパスワードを２回打ち込みます．

```bash:新しいパスワードの入力を２回
Enter new UNIX password:
Retype new UNIX password:
```
すると，色々メッセージが出た後にプロンプト($)が出ます．

```bash:プロンプトが出たらログイン完了
ubuntu@ubuntu:~$ 
```

これでログイン完了です．

以降の作業のために，**ラズパイが有線LANでインターネット接続できるようになっている**ことを確認しておきましょう．

また，コンソールで手打ちでコマンドを打ち込むのが嫌な場合，
この時点でデスクトップ環境をインストールしておくことをオススメします．
Webブラウザをインストールすれば，本ページを見ながらコピー＆ペーストで作業ができますね(^^

# aptの更新
まずはaptのリポジトリのリストを最新のものに更新(update)し，
更新のあるものをupgradeします．

```bash:システムの更新
sudo apt update
sudo apt upgrade -y
```

初回なので，100個以上のアップデートがあります．
コーヒーでも飲んでゆっくり待ちましょう(^^

# gitのインストール
もし，gitがインストールされていなかったら，インストールします．
（確か既にインストールされていたはず）

```bash:gitのインストール
sudo apt install git
```

# Ardupilotのクローン
ホームフォルダにArdupilot本体をクローン（コピーダウンロード）します．
また，必要なサブモジュール(mavlinkやChibiOS,wafなど)もダウンロードしておきます．

```bash:Ardupilotのクローン
cd ~
git clone https://github.com/ArduPilot/ardupilot
cd ardupilot
git submodule update --init --recursive
```

# 必要なパッケージのインストール

インテルＰＣだと，ここでインストール用のシェルファイル`install-prereqs-ubuntu.sh`を実行するのですが，"pygame"のインストール中にエラーで落ちます．

なので，予め手作業でpygameをインストールしておきます．

## pygameのインストール

pygameのインストールに必要なパッケージを手入力でインストールします．

```bash:pygameのインストールに必要なパッケージのインストール
sudo apt install python-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libsdl1.2-dev libsmpeg-dev libportmidi-dev ffmpeg libswscale-dev libavformat-dev libavcodec-dev libfreetype6-dev
```
たくさんあるので，手打ちすると大変ですね．
冗長なパッケージもあるかもしれませんが，これだけ入れておけばエラーは発生しません．



## インストールシェルを実行
gitでcloneしたフォルダの中に，ビルドに必要な依存パッケージをインストールしてくれるシェルファイルがあるので，実行します．
(sudoを使うので，途中でパスワードを聞かれることがあります．)

```bash:依存関係のインストールシェルを実行
~/ardupilot/Tools/environment_install/install-prereqs-ubuntu.sh -y
```

<!--
※インストール途中で，STM32マイコンのビルド環境をインストールするかどうか聞かれます．

```:STMマイコンのビルド環境をインストールするか？
Install ArduPilot STM32 toolchain [N/y]?
```
STM32はPixhawk系やbetaflight系のフライトコントローラに使われているARMマイコン(Cortex-M)です．
(F1,F3,F4,F7コントローラなどと呼んでいるのは，STM32<font color=red>F1</font>03,STM32<font color=red>F3</font>03,STM32<font color=red>F4</font>27などの型番です)
つまりPixhawkのファームウェアをビルドできるように環境を作るかどうか？と聞いています．
ラズパイでファームウェアがビルドできると嬉しいですね．
なので，推奨はNですが**yにしてEnterしました．**
**<font color=red>しかし現時点では，STM32系のファームのビルドは失敗しています．．．
今後，これ以降の選択肢は全部デフォルトのNに変更するかもしれません．</font>**

その後，同じ様に質問が来ます．

```:パスに追加するか？
Add /opt/gcc-arm-none-eabi-6-2017-q2-update/bin to your PATH [N/y]?
```
先程インストールしたSTM32(arm)のコンパイラをパスに通すか聞いています．
これも推奨Nですが，**yにしました．**

```:autotestをパスに追加する？
Add /home/ubuntu/ardupilot/Tools/autotest to your PATH [N/y]?
```
ardupilotのツール関連フォルダにあるautotestをパスに通すか聞いています．
これも推奨Nですが，**yにしました．**

```:ArduPilotの入力補完機能を追加する？
Add ArduPilot Bash Completion to your bash shell [N/y]?
```
Bash（コンソール）にArduPilot関連の入力補完を追加するかどうか聞いてきています．
これも推奨Nですが，**yにしました．**

```:CCacheをパスに追加する？
Append CCache to your PATH [N/y}?
```
パスにccacheを追加するか聞いています．
これも推奨Nですが，**yにしました．**
-->
プロンプトに戻って来たら，インストール完了です．
一応ですが，ラズパイを再起動しておきましょう．
色々インストールしてゴチャゴチャなので．

```
reboot
```

# SITLのビルド＆簡易実行

これ以降の作業は，以前のページと同様なので，
　　[SITL Simulatorのビルド＆簡易実行](https://qiita.com/hsgucci/items/9037835f9c25ce04c38d#sitl-simulator%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E7%B0%A1%E6%98%93%E5%AE%9F%E8%A1%8C)
へ移動してください．

wafのビルドは，ラズパイ４の冷却が適切でないと温度警告がでますよ～(-_-;


# おわりに

Arupilot-SITLをラズパイ４で走らせる方法を解説しました．

この環境でdronekit-pythonもテストしたくなってしまいますが、
筆者がよく使うパターンでは、ラズパイを２台用意して、以下のように接続しています

SITLラズパイ(ドローン本体)<-- 有線LANで接続 --> コンパニオンのラズパイ(dronekit-python環境)

としています。
こうすれば、コンパニオンのラズパイは、シミュレーターであるSITLへの接続から、実機のArdupilot系フライトコントローラへの接続に切り替えるだけでどちらも動かせるので、便利です。

Cube RedやCUAV 7 nano、Holybro Pixhawk 6XなどはEthernetのポートも備えているので、コンパニオンとの接続もほぼ同じになりますね。

<!--
ついでに，STM32のビルド環境もインストールしましたが，
**<font color=red>現時点では，STM32マイコン系のファームウェアのビルドには成功していません．(T_T)</font>**

```:wafのconfigureのエラーメッセージ
Checking for 'g++' (C++ compiler)       : not found
Checking for 'clang++' (C++ compiler)   : Command ['/usr/lib/ccache/arm-none-eabi-gcc', '--print-sysroot'] returned 1
```
追跡調査していきます．
-->