#1 開発環境を作ろう【SPIKE-RTでロボコンに出よう!!】

# 目次

https://qiita.com/koushiro/items/482162807339f4d18516

| 章 | タイトル | 内容 |
|:-:|:-:|:-:|
| 1 | [はじめに](#1-はじめに) | 本シリーズについて |
| 2 | [SPIKE-RTとは?](#2-spike-rtとは) | SPIKE-RTについての簡単な説明 |
| 3 | [環境構築の流れ](#3-環境構築の流れ) | 環境構築の流れついて説明 |
| 4 | [開発環境構築](#4-開発環境構築) | 環境構築の方法を解説 |
| 5 | [ビルドのテスト](#5-ビルドのテスト) | 構築した開発環境でビルドのテストを行う |
| 6 | [まとめ](#6-まとめ) | 今回のまとめ |

# 編集履歴
| 日付 | 内容 |
|:-:|:-:|
| 2024/01/20 | WSLのアップデート について追記 |
| 2024/01/20 | docker導入方法 について追記 |
| 2024/01/20 | usbipd-winのアップデートについて追記 |

# 1. はじめに

今回から新たなシリーズとして **【SPIKE-RTでロボコンに出よう!!】** を開始します!!
本シリーズでは、LEGO Education の最新型ロボットキット **「SPIKE Prime」** に、国産組み込みOSであるTOPPERS/ASP3ベースのリアルタイムOS **「SPIKE-RT」** を搭載し、WROやETロボコンといったロボットコンテストへ出場することを支援していきます。

少し自己紹介させて頂くと、私は高校生の時に同じくTOPPERSプロジェクトの**EV3rt**を使って、ロボットコンテスト **`WRO (World Robot Olympiad)`** に出場しておりました。
現在はこの大会に運営側として関わらせて頂いております。

この経験を活かして、[後輩たちのためのEV3rt講座]()というシリーズを書いておりました。
現在、新シリーズとして **もっと!後輩たちのためのEV3rt講座** というものも執筆中です。

https://qiita.com/koushiro/items/26aca0cb10c1d34c03a1

これらのEV3rtでの知見を活かしつつ、SPIKE-RTでの開発の仕方を解説していけたらと思います。
(尚、本シリーズではEV3rt講座での説明文を流用させて頂くことがあります。)

本記事では **初学者でも理解出来ること** を目標に解説を行います。
したがって、かなり簡単な表現を使い、丁寧に説明していきたいと考えています。

初回となる今回ですが、SPIKE-RTとはどんなものか説明した後、プログラムを作成するための開発環境を構築したいと思います。

# 2. SPIKE-RTとは?

**「SPIKE-RT」** とは、先ほども記した通りLEGO Education のロボットキット 「SPIKE Prime」用のOSです。
開発されているのは、名古屋大学 大学院 情報学研究科 組込みリアルタイムシステム研究室の朱義文さんです。
OSのベースとして、TOPPERSプロジェクトのASP3というリアルタイムOSが採用されています。

2022年末に最初のリリースが行われており、今年の夏にかけて何度かのアップデートがされています。

以下👇は、昨年12月24日に朱さんが公開されたzennの記事です。
こちらも併せて是非ご覧ください。

https://zenn.dev/envzhu/articles/spike-rt_first_blog

上述のとおり、SPIKE-RTとはTOPPERS/ASP3に基づく **リアルタイムOS(RTOS)** です。

リアルタイムOSをとてもに簡単に説明すれば、**与えられた時間内**で、**完璧で正確な処理を行う**ことに重きを置いたOSです。

高田研究室のHPに良い例がありましたので紹介させて頂きます。

>リアルタイムシステムのわかりやすい例として、自動車のブレーキを制御するコンピュータシステムを考えます。
>例えば、「99.99% はブレーキをかけてから 1秒以内に止まるが、残りの 0.01% は 10秒かかる自動車」と、「必ず2秒以内で止まる自動車」のどちらが優れているかは、説明するまでもないでしょう。

こういった特徴のあるRTOSをSPIKEでも使えるようにしたのが、SPIKE-RTというわけです。

## SPIKE-RTの良いところ

はじめに、SPIKE-RTの使用言語はC言語ですので、確認する限り唯一のSPIKE Prime C言語開発環境です。
SPIKE Prime 標準環境でも言語系開発環境としてmicropythonは使用出来ますが、C言語を使いたい人にとっては待ちに待った環境と言えるでしょう。

又，SPIKE-RTは先述のとおりTOPPERS/ASP3をベースとした **リアルタイムOS(RTOS)** のため、非常に高精度な制御が可能となります。
こちらも標準環境のmicropythonと比較すると、micropythonの方はインタプリタのため実行にある程度の時間が必要なのに対し、本環境ではコンパイルしているかつリアルタイムOSということで、マイクロ秒単位での制御をすることが出来ます。

一方で、いまだ開発途中ということもあり不便な点も少なくないですが、上記の理由からSPIKE-RTを選択する理由は十分にあると感じています。

# 3. 環境構築の流れ

今回と次回で、 **「開発環境の構築」** という作業を行います。

どんなソフトウェアでもそうですが、まずはPCにソフトをインストールするところから始めますよね。
広く一般的に使われるようなソフトウェアは**インストーラー**という「ソフトをインストールするソフト」があり、それが全て自動的に作業をしてくれますが、EV3rtはそうはいきません。
自分で、必要なものをインストールしていかなければならないのです。
これはSPIKE-RTに限らず、アプリケーション開発においてはごく一般的な事です。

しかし、初心者の方にはハードルが高いと思いますので、記事に沿って作業を行なって貰えればと思います。

## プログラム開発の流れ

環境構築について説明する前に、まずはSPIKE-RTでのプログラム開発の流れについて軽く触れておきましょう。

![SPIKE-RT 構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/d92d33e8-2ca3-45db-a6ad-2f37f7504dbb.png)

まず、私たち開発者は **「エディタ」** というソフトを使い、C言語を使ってプログラムファイルを書きます。
「エディタ」とは文字を書くためのツールの総称であり、Windows標準搭載の **「メモ帳」** もエディタの一つと言えます。
実際には、アプリケーション開発に向いたエディタの方が使いやすいため、Microsoft社の**Visual Studio Code**というとても有名なエディタを使いたいと思います。(エディタのインストール・設定は次回)

ここで、エディタで作製するC言語で書かれたプログラムファイルは、人間は読むことは出来ても、**機械はそのままでは読むことが出来ません。**
そこで、「人間が読める言葉」から「機械が読める言葉」に変換する作業が必要です。
この作業のことを **「コンパイル」** と呼び、コンパイルするソフトのことを **「コンパイラ」** と呼びます。

そしてこの「コンパイラ」ですが、Windowsで動かすには少し工夫が必要です。
今回はWindowsの上で**Linux**という別のOSを動かし、そのLinuxの中のコンパイラで、プログラムをコンパイルしてもらうことにします。
尚、Windowsの上でLinuxを動かす機能を**WSL (Windows Subsystem for Linux)** と言います。

## 今回の工程について

今回はまず **WSL** を使えるようにして、そのあとにLinuxの一つである **Ubuntu** というOSを入れていきます。
Ubuntuのインストールが出来たら、Dockerという仕組みを使い、開発者から提供されているコンテナを導入して環境を構築していきます。
その後、SPIKE Prime HubブロックをWSLに接続する設定を行います。
最後に、ビルド(コンパイル)が出来るかを確認して終わりたいと思います。

# 4. 開発環境構築

:::note info
この記事は Windows向けに開発環境の構築方法を解説します。
他のOSを使用する場合は、以下の記事を参照してください。
:::

### macOS 向け

https://qiita.com/koushiro/items/2bdee5fd3580f9373457

### Linux/Ubuntu 向け

https://qiita.com/koushiro/items/968dc1abe9cf02f6b170

## Step 1. WSLの有効化 ⇒ インストール

### WSL有効化

まず、WSLはデフォルトでは無効なので、これを有効化する作業を行います。
今回はPowershellというソフトを使って有効化します。

プログラム一覧からPowershellを探して、 **「管理者として実行」** をしてください。
見つからなければ👇こんな風に検索してみましょう。

![powershell_find.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/b525137c-e2f8-3c4f-c3c4-f234ea0c9631.png)

すると以下のようなウィンドウが出現します。

![powershell_window.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/f3fccdd5-ed8e-086c-c46b-4e5501e6cc13.png)

ここで、以下のコマンドを打ち込んでください。

```powershell:Powershell
> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

:::note warn
コマンドの前の`>`は入力する必要はありませんので注意してください。
上のスクショで言えば`C:\windows\system32>`の一番右の`>`に対応すると考えてください。
:::

これでまず、WSLの有効化が完了しました。

### 【2024/01/20 追記】WSLのアップデート
以下のコマンドで、WSLの機能をアップデートしておいてください。

```powershell:Powershell
> wsl --update
```

### WSL2への変更

この先のビルド環境の構築の際、Dockerというシステムを使います。
このDockerを使うためには、WSLのバージョンを`2`にしておく必要がありますので、これの変更を行います。
先ほどWSLを有効化したPowershellの画面で、以下のコマンドを入力してください。

```powershell:Powershell
> wsl --set-default-version 2
```

<details>
<summary>既にLinuxインストール済みの場合</summary>

もし既に何かしらのディストリビューションをインストールしていた場合は、以下のようにして変更してください。

```powershell:Powershell
> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Stopped         1

> wsl --set-version Ubuntu-22.04 2
```

1. `wsl -l -v`でWSLのインストール状況を確認、NAMEを控えておく
2. `wsl --set-version`コマンドの後にNAMEを指定し、VERSIONを`2`にする

</details>

### Ubuntuのインストール

次に、WSLに載せる **Ubuntu** をインストールしていきます。
Ubuntuをインストールする方法も色々ありますが、簡単に済ますために、**Microsoft Store**からダウンロードすることにしましょう。

Storeを開いたら、 **「Ubuntu」** と検索しましょう。
そうすると、以下のようにUbuntuがいくつか出現するはずです。

![ubuntu_find.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/6fd3b3f5-75e7-ec4c-4081-ab2168f11710.png)

どのバージョンでも構いませんが、今回は現時点で最新バージョンである**22.04.2 LTS**をダウンロードしたいと思います。

![ubuntu_dl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/deb36d82-fb82-52fa-dd4e-50af44422b58.png)

上の画面のように **「Ubuntu 22.04.2 LTS」** を選択して、「インストール」を押しましょう。
以下のように「開く」ボタンに変わればインストール完了です。

![ubuntu_dl_sucsess.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/8977d7f0-8e3f-bf10-f13b-9dfc9dddd355.png)

それでは、「開く」を押してUbuntuを起動しましょう。

### Ubuntuセットアップ

Ubuntuを開くと以下のような**ターミナル**が開き、自動的に初期セットアップが始まるはずです。
ある程度進むと、`Enter new UNIX username`と聞かれるので、このコンピュータに使う名前を入力しましょう。

![enter_username.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/f7310d2c-3e73-b34b-884b-a47691e87de5.png)

又、`New password`と聞かれるので、パスワードも設定しましょう。
パスワードは事あるごとに入力が求められるので、忘れないようにしてください。

![enter_pass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/5980c50a-6b65-3a33-b081-ba3ea6b77849.png)

全てが完了したら、以下のように緑色の文字で名前が表示され、コマンドが打てる状態になります。

![ubuntu_wakeup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/3f1f802b-4cf0-12ba-13f7-6eafdc53fb00.png)

これで、Ubuntuのセットアップは完了です。

この先、 **「Ubuntuのターミナルを開いてください」** という表現が出てきたときは、プログラム一覧からUbuntuのアイコンを選択して起動し、ターミナルを出現させることだと認識してください。

![ubuntu_menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/7b85e445-9e68-0cdf-dec0-39ef468429ae.png)

## Step 2. ビルド環境の構築

WSL上にビルド環境を構築します。
ビルドとは要するにコンパイルすることです。

SPIKE-RTのビルド環境は、「コンテナ」というパッケージングされたものが提供されており、これを「Docker」というシステムに適用して使います。

### ソースコードのダウンロード

Dockerの話の前に、SPIKE-RTのソースコードをクローン(ダウンロード)していきます。
ソースコードは、以下のGitHub上のリポジトリにあります。

https://github.com/spike-rt/spike-rt

では、Ubuntuのターミナルを起動して、以下のコマンドによりソースコードをクローンしましょう。

```terminal:Ubuntu
$ git clone https://github.com/spike-rt/spike-rt.git
```

実行後、以下のように`ls`コマンドを実行し、`spike-rt`というフォルダが確認されればクローン完了です。

![git_clone_complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/6d39eabc-1e6e-de6e-bb67-469afed278cd.png)

:::note warn
Linuxのターミナルについて、コマンドの前の`$`は入力する必要はありませんので注意してください。
上のスクショで言えば`koushiro@DESKTOP-■■■■■:~$`の一番右の`$`に対応すると考えてください。
:::

もし上手くいかなかった場合、Githubとの通信に必要な「SSL通信の設定」が必要になります。
以下の[@fumikomatsu](https://qiita.com/fumikomatsu) さんの記事の「SSHキーを作成する」から先を行ってみてください。

https://qiita.com/fumikomatsu/items/3b539e79010a4808337c#ssh%E3%82%AD%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B

### 【2025/01/02 追記】 rubyコードの修正

SPIKE-RTのアップデートに伴い、rubyのバージョンが3系に上がったようです。
これにより、ソースコードの修正が必要な箇所があります。

編集するのは `spike-rt/asp3/cfg/pass1.rb` の `181行目` です。

```ruby:pass1.rb
# 元のコード
symvalCsv = CSV.open(symvalTableFileName, { skip_blanks: true, skip_lines: /^#/ })

# 修正後のコード
symvalCsv = CSV.open(symvalTableFileName, skip_blanks: true, skip_lines: /^#/ )
```

詳しくは **「もっと!後輩たちのEV3rt講座」** の方で詳しく解説しておりますので、そちらを参照してください。

https://qiita.com/koushiro/items/4ee879e5420260cea6c8#%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%BF%AE%E6%AD%A3

### 【2024/01/20 追記】 Dockerの導入

次に行うコンテナ・イメージのプルの前に、Ubuntu内にDockerを導入しておく必要があります。
以下の記事を参考に、導入の手順を進めてください。

https://qiita.com/yoshiyasu1111/items/17d9d928ceebb1f1d26d

上記記事内の

- dockerリポジトリの設定
    - 準備
    - リポジトリの登録
- Dockerのインストール
    - Dockerのインストール

の部分を行ってくだささい。
導入完了後、以下のコマンドによりDockerが正しく入っているか確認しておくことをおすすめします。

```terminal:Ubutnu
$ docker -v
```

`Docker version 20.10.22, build 3a2c30b`のように出力されれば導入完了です。

### コンテナ・イメージのプル

次に、Github上にあるDockerのコンテナ・イメージをプル(つまりダウンロード)してきます。

Ubuntuのターミナルを開いて、以下を実行してください。

```terminal:Ubuntu
$ sudo docker pull ghcr.io/spike-rt/spike-rt:rich
```

### 【2025/01/02】 追記

:::note alert
コマンドの末尾が変更されていたので追記
:::

```terminal:Ubuntu
$ docker pull ghcr.io/spike-rt/spike-rt:v0.2.0-rich
```

プルが完了すると以下のように表示されます。

![docker_pull_complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/744f4389-718e-0c68-595c-2dc2810ea786.png)


### コンテナのアタッチと起動

プルしてきたコンテナをDockerにアタッチして起動します。

```terminal:Ubuntu
$ sudo docker run --rm -it \
  -v $(pwd):$(pwd) -w $(pwd) \
  -u "$(id -u $USER):$(id -g $USER)" -v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro \
  ghcr.io/spike-rt/spike-rt:rich /bin/bash
```

ここで、行の先頭に`sudo`というコマンドがありますが、こちらは **「管理者権限で実行する」** という意味です。
この際、パスワードの入力が求められますので、Ubuntuの設定で入力したパスワードを入力してください。

かなり長いコマンドで、`\`により改行されていますが、実際には一行のコマンドであることに注意してください。
コピー用のウィンドウを用意したので、下のコード部分の右上にある「コピーボタン」を押して、コピーした後Ubuntuに貼り付けて実行してください。

```terminal:コピー用
sudo docker run --rm -it -v $(pwd):$(pwd) -w $(pwd) -u "$(id -u $USER):$(id -g $USER)" -v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro ghcr.io/spike-rt/spike-rt:rich /bin/bash
```

正しく実行出来たら、以下のように表示されるはずです。

![docker_run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/095a9871-ce02-c95f-316e-77748b0d8d91.png)

これにて、ビルド環境の構築は完了です。

ここで、一度ターミナルのウィンドウを閉じましょう。

### 【2025/01/02】 追記

:::note alert
コマンドの末尾が変更されていたのに伴い、アタッチ・起動のコマンドも変更
:::

```terminal:Ubuntu
$ sudo docker run --rm -it -v $(pwd):$(pwd) -w $(pwd) -u "$(id -u $USER):$(id -g $USER)" -v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro ghcr.io/spike-rt/spike-rt:v0.2.0-rich /bin/bash
```

## Step 3. 転送方法の構築

:::note alert

【2024/01/20追記】
USBIPD-WINのバージョンが4.0.0にアップデートしました。
これにより、コマンドの変更などが発生しているため、ここからは以下の補足記事に沿って環境構築を進めてください。

:::

https://qiita.com/koushiro/items/c0ace8e363c7fab45f0d

## Version 3.2.0 までの場合はこちら👇から

続いて、HubブロックをPCに接続して、ビルドした実行ファイルをHubブロックに転送する方法を構築します。

### USBIPD-WIN プロジェクトをインストールする

このソフトは、Windowsに接続されたUSBデバイスを、WSLにも認識させるために必要なツールです。
デフォルトでは、PCに接続されたUSBデバイスは、自動的にはWSLに接続されません。
これを、USB/IPという仕組みを用いて、WSLにも接続できるように設定を行います。

まず、下記のリンクからインストーラをダウンロードします。

https://github.com/dorssel/usbipd-win/releases

ダウンロードするのは`usbipd-win_【バージョン名】.msi`です。

![usbipd_win_dl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/ddb0fc74-98d7-8d9b-9d87-a38bdf8b44ae.png)

ダウンロード出来たら、インストーラを実行します。
すると以下のような画面が表示されるので、「Install」ボタンを押しましょう。

![usbipd_win_installer1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/4e468221-5c08-cf4f-038f-8fb28baba0c5.png)

インストールが完了すると以下のような画面に変わるので、「Close」ボタンを押してウィンドウを閉じましょう。

![usbipd_win_installer3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/b235558d-278b-0d6f-0581-f446d6ff9d11.png)

### Linux に USBIP ツールとハードウェア データベースをインストールする

WSL側に、USB/IPでUSBデバイスを認識させるツールをインストールします。
インストール前に、パッケージ管理ツールであるaptをアップデートさせておき、その後にインストールを行います。

では、新しいUbuntuのターミナルを起動して、以下のコマンドを一行ずつ実行しましょう。

```terminal:Ubuntu
$ sudo apt-get update
$ sudo apt install linux-tools-generic hwdata
$ sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20
```

これにて、Windows側、WSL側とも、WSLにUSBを接続出来るようにするソフトがインストール出来ました。

### HUBブロックの接続

では、PCにSPIKE Prime HUBブロックを接続します。
この時、特殊な方法でPCと接続する必要があるため、その手順を説明します。

まず、HUBブロックの上面にある、Bluetoothアイコンが印字された丸いボタンを押します。
このボタンを押し続けた状態で、USBケーブルによりHUBブロックをPCと接続します。

接続した直後、Bluetoothボタンの淵が紫色に点灯します。
この状態のままさらに5秒程押し続けると、消灯⇒赤⇒緑⇒青の順に光り始めます。
これで、HUBブロックを「DFUモード」でPCと接続することができました。

![spike_dfu.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/85bd0cc1-69a5-8298-0668-1c87474452d2.gif)

DFUモードはファームウェア(元となるソフト、OSのようなもの)を書き換えるためのモードです。

SPIKE-RTは現時点でダイナミックローディング(ファームウェア内に複数のプログラムを入れる方式)には対応しておらず、スタンドアローン(1ファームウェアにつき1プログラム方式)となるので、毎度OSごと書き換えているようなイメージです。

### USBデバイスの確認

HUBブロックをDFUモードで接続出来たら、WSLを有効化したときと同じ手順でPowershellを**管理者権限**で起動し、WSLに接続可能なUSBデバイスを確認します。

```powershell:Powershell
> usbipd wsl list
```

実行すると、以下のように表示されます。
(USBの接続状況によって異なるため、以下は一例に過ぎません。)

```powershell:Powershell
> usbipd wsl list
BUSID  VID:PID    DEVICE                                                        STATE
2-1    0694:0008  LEGO Technic Large Hub in DFU Mode                            Not attached
2-2    0781:5571  USB 大容量記憶装置                                            Not attached
2-5    27c6:538d  Goodix fingerprint                                            Not attached
2-6    0c45:671b  Integrated Webcam                                             Not attached
2-10   0cf3:e007  Qualcomm QCA61x4A Bluetooth                                   Not attached
```

ここで、`LEGO Technic Large Hub in DFU Mode`がHUBブロックを指しているので、これの一番左の`BUSID`を控えておきます。
今回の場合、`2-1`となります。

### Prime HubのUSBをWSL2にアタッチ

以下のコマンドにより、Windows側からWSL側に、USBデバイスをアタッチ(接続)します。
`--busid`の後は、先ほど控えた`BUSID`を指定します。

```powershell:Powershell
> usbipd wsl attach --busid 2-1
```

このコマンドにより、HUBブロックをWSLに接続することが出来るのですが、このコマンドは一回限りのアタッチになります。
これを、USBを外して再度接続しなおしても、自動的にWSLにアタッチされるようにするには、以下のように`--auto-attach`オプションを付加します。

```powershell:Powershell
> usbipd wsl attach --busid 2-1 --auto-attach
```

これにより、ロボットを動かすために一時的にUSBを取り外しても、USBを接続しなおせば自動的にWSLにアタッチされます。

アタッチ実行の例👇
(busidは異なります)

![usbipd_attach.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/9efb0aa3-1a9a-93af-164e-489664d6fea6.png)

### 接続解除

接続を解除する場合は以下のコマンドで解除することができます。
(ただ実際の使用頻度はそこまで多くないかと思います…)

```powershell:Powershell
> usbipd wsl detach --busid 2-1
```

### 上手く繋がらなかったら

もし上手く繋がらなかったら、Ubuntuのターミナルを開いて、以下のコマンドを実行して再インストールしてみましょう。

```terminal:Ubuntu
$ sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20
```

:::note info
ここまでが USBIPD-WIN 3.2.0 までの方向けの解説です。
ここからは **USBIPD-WIN 4.0.0** 以降の方も作業を行ってください。
:::

### PyUSBの導入

HUBブロックに実行ファイルを転送するために、Pythonのスクリプトを使用します。
又、そのスクリプト内で、DFU ModeのUSBデバイスに実行ファイルを転送するためのライブラリ`pyusb`をインストールします。

まず、WSL内にPythonを導入する必要がありますが、今回は仮想環境下にインストールしたいと思います。
Pythonの仮想環境を、apt経由でインストールします。
Ubuntuのターミナルを開いて、以下のコマンドを実行していきましょう。

```terminal:Ubuntu
$ sudo apt install python3.10-venv
```

次に、`spike-rt/tools/python`のディレクトリに、Pythonの仮想環境を作成します。
最後に、仮想環境下に、Pythonのパッケージ管理ツールであるpipを用いて、pyusbをインストールします。
同じくUbuntuのターミナルにて以下のコマンドを実行していきましょう。

```terminal:Ubuntu
$ python3 -m venv ./spike-rt/tools/python
$ ./spike-rt/tools/python/bin/pip install pyusb
```

以上で、実行ファイルの転送方法の構築は完了です。

# 5. ビルドのテスト

それでは、構築した開発環境が正しく動作するか、ビルドのテストを行いたいと思います。
Ubuntuのターミナルを開いて、以下の操作を行ってください。

初めに、GithubからプルしてきたSPIKE-RTのフォルダに移動します。

```terminal:Ubuntu
$ cd spike-rt
```

次に、以下のコマンドを実行して、`scripts`フォルダ内の`build-test.sh`というシェルスクリプトを実行します。

```terminal:Ubuntu
$ ./scripts/build-test.sh
```

ここで必要なファイルの生成、およびコンパイルが行われるため、ターミナルには文字がザーっと流れます。
正しくビルドできたかどうかを見分けるには、実行完了時にターミナルに以下👇の文字列が表示されているかを確認すれば良いです。

```terminal:Ubuntu
arm-none-eabi-objcopy -O binary -S asp asp.bin
+ cd ..
```

実行例👇

![build_test_complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/e9a1d5d8-e947-9741-7876-695e42c4af93.png)

これにて、最低限の開発環境構築は完了です！！

# 6. まとめ

以上にて、ビルドに必要な環境は最低限整いました。
ただ、冒頭の説明の通り、エディタを導入する必要がある他、実際のプログラミング時に必要なテンプレート、またビルド・HUBブロックへの書き込みに必要なシェルスクリプト、などなど…
まだまだやらなければならない事項が沢山あります。

次回も引き続き、開発環境を整える作業を行っていきます。
地味な作業ですが、辛抱強くやっていきましょう。

次回: [#2 エディタを使おう(VisualStudio Code)](https://qiita.com/koushiro/items/dbfc45be2e05a44bc273)