WindowsでPX4の開発環境を整える


# はじめに
この記事では，PX4公式でも推奨されているUbuntu環境でのbuildを実現するためにWSLを用いたWindows 10での環境構築環境構築までの流れを書いていきます．基本的には[wsl環境の構築](https://qiita.com/AokabiC/items/e9312856f588dd9303ed)に加えて，[公式](https://docs.px4.io/master/en/index.html)の内容をまとめただけになります．
wsl＋githubといった感じです．

特にGit周りは間違った理解が大いにあり得るので，ぜひ指摘して教えてください．

# WSLおよびvscodeの導入
こちらの記事通りに進めていけばできます．
以前まではVMwareにUbuntuを載せたり，GitBashを使ったりしてました．
先の話ですが，PX4でSITLをする場合，この方法ではできませんGUIのUbuntuを用意する必要があります．（GazeboがWindowsに対応していないので）
参考：[Visual Studio Codeで競プロ環境構築(導入編) - Qiita](https://qiita.com/AokabiC/items/e9312856f588dd9303ed)

# Firmwareを自分のPCに入れる
PX4の[Firmwar](https://github.com/PX4/Firmware)はGithubで開発されている．とりあえずコードが見てみたい，というだけならまずこれを自分のPCにcloneします．

本家のサイトの右の緑のClone or Downloadからhttpsのアドレスを取得して，```git clone <取得したもの>```とします．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497251/c0eddff7-0eab-fe1c-433a-55919ca98dd2.png)

```bash
git clone https://github.com/PX4/Firmware.git
```

# folk+branchでしっかり環境を整える
この参考先通りにやればできます．
参考：[GIT Examples · PX4 Developer Guide](http://dev.px4.io/master/en/contribute/git_examples.html#contributing_code)

# アカウントを作りfolkする
まずGitHubの自分のアカウントを作ります．その後[本家](https://github.com/PX4/Firmware)に行き，右上のfolkを押します．
これは，既存のリポジトリ（今回でいうところのPX4/Firmware）の複製を作る行為です．これがされてない他人様のリポジトリには書き込むことができませんが，folkしたものは自分の所有物なので自由に更新ができます．pullリクエストなどは今は置いておきます．とりあえずコピーをもらってきたという感じです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497251/c0eddff7-0eab-fe1c-433a-55919ca98dd2.png)

## folkしたリポジトリをローカルにcloneする

先程と違い，folkしたリポジトリをcloneします．これによって，リモートでもローカルでも自分の好きなように開発ができます．（さっきのだとローカルのみ）


```bash
cd ~/wherever/
git clone https://github.com/<your git name>/Firmware.git
```
cloneしたらcdでFirmwareのdirectoryに移動して，submoduleを更新します．
このサブモジュールは（自分の理解があっているかわかりませんが），とあるリポジトリ（今回でいうFirmware）を動かしている一部moduleが，独立してリポジトリとして開発されているという状態．つまり元のリポジトリでは，Winでいうところのショートカットのようなものが設定されている状態．
このアップデートは，その参照先のアップデートをFirmwareにも適用させるよーという感じでしょうか…たぶん…ざっくりと…

三行目もあんまりちゃんと理解してないですが，本家の進行状況も見れるように追跡できるようにしておいて，本家がなんか変更されたら自分のリポジトリに本家の変更を反映させる，的なやつだと思います，ざっくり．

```bash
cd Firmware
git submodule update --init --recursive
git remote add upstream https://github.com/PX4/Firmware.git
```
```
git remote -v
```
二個のリポジトリが出ると思います．一つはupstreamでPX4のFirmwareを指しています．もう一つはさっき自分がfolkしたリポジトリを指しています．


## branchを作る
基本的プロジェクトの本筋の最新版は_master_というbranchです．ここから枝を伸ばして自分のbranchを作ります．
そしてそのbranchに移動します．

```
git checkout -b <your feature branch name>
```

`git status`で自分の今いるbranchが確認できます．自分が作ったbranchになっているはずです．

さて，このbranchの名前ですが，基本的には**自分が変更したものがわかる**ものにするのが一般的です．例えば新しいセンサのドライバを新しく追加したなら，`add_xxxsensor_driver`みたいな感じですかね．まあでも本家に貢献せず（本来は貢献が前提ですが），自分でいろいろ開発するだけなら好きな名前でいいと思います．

## commit＆pushする
まず用語から．
__add__
- ローカルでローカルで変更して，これは確定やな変更したろ，と思う項目をcommitするためのリスト？に追加する
__commit__
- 自分のローカル環境の変更（addで指定されたもの）をローカルのリポジトリに書き込む
- ここ変ったよーっていう内容を手元にメモする感じ
__push__
- ローカルのリポジトリにcommitされたものを，リモートに反映させる
- そするとGithubに反映される

という流れです．それでは．．．

```
git add <file name>
```
これで変更を反映したいファイルなどを指定します．

```
git commit -m "<your commit message>"
```
-mは**メッセージをつける**というオプションです．これを書くと，リモートのそのファイルの横にメッセージが載ります．（これが新しいドライバでっせーみたいな）

これでひとまず完了．chrome等で自分のGitHubのfolkしたリポジトリを見ると，ちゃんとbranchが追加され，変更が反映されているはずです．


## 本家の変更をfolkしたリポジトリにも反映させたい

PX4はかなり活発に開発が進められているOSSですから，知らぬ間に新しい機能やらバグ修正やらいろんなアップデートがされています．しかし（僕の理解だと）folkリポジトリは，ほっといてもそれを参照してくれないので，それを更新する作業が必要です．（たとえば3年前にfolkしたら，今見ても三年前の状態で変わっていないはず）

これを`rebase`というコマンドを使ってやります．
まずは一旦`master`ブランチに移動します．

```
git checkout master
```
ここで，先程**追っかけ用**と言っていたupstreamに最新版の変更を反映させます．`pull`というコマンドを使います．

```
git pull upstream master
```

これで，ローカルのmasterが更新されました．自分のブランチに戻ります．

```
git checkout <your feature branch name>
```
ここで，`rebase`です．rebaseってなんぞや？てかたは[こちら](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%99%E3%83%BC%E3%82%B9)がわかりやすかったのでぜひ参照してみてください．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497251/76580efc-5e35-baf1-d180-aa2a8c26b3d9.png)
参照：[3.6 Git のブランチ機能 - リベース](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%99%E3%83%BC%E3%82%B9)

```
git rebase master
```
これで無事自分のブランチの**ローカル**が更新されました．
これをリモートにも反映させます．

```
git push origin <your feature branch name>
```




# おわりに
やっと最近ちょこちょこ理解できるようになってきましたがまだまだ…gitの慣れが微妙ですね．
中のソースはpublish/subscribeシステムやCMakeによる自動化等，まだまだ理解しなくてはならないことが山のように…