Odrive S1 を WebGUIで使ってみる

# はじめに
これまで使っていたOdrivev3.6が生産終了ということで、そろそろ後継機種であるOdrive S1を使ってみようと思います。
# 開発環境
* Linux 22.04
* Odrive S1
* Odrive Firmware 0.6.9
* ODrive D5065-270KV
* AS5047(磁気エンコーダー)

※windowsでは正しく接続されませんでした
↑Odrive3.6のドライバが残っていたためでした。デバイスマネージャーから削除したところwindowsでも動きました。

# Web GUIを接続してみる
Odrive S1は[Web GUI](https://gui.odriverobotics.com)に対応しています。（v3.6も対応してほしかったなぁ、、）ということで早速使ってみましょう。OdriveとPCをUSBで接続します。USBアイソレータを使用しろと書かれていましたが、そのまま接続しても通信はできます。（筆者は壊れても良いPCを使っているためそのまま接続しましたが、安全のためアイソレータを用意したほうが良いと思います。）また、通信を行うだけなら外部から12V等の給電を行う必要もないようです。　　
ということで接続すると以下のような画面に！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976768/dfd0c6da-aa41-44a9-bf13-c295001f96b9.png)

それぞれのタブに以下のような機能があります。
* Configuration モーターやセンサー、軸などの各種パラメータの設定・調整を行います。
* Dashboard Odrive の現在の動作状態をリアルタイムで監視するための表示画面です。
* Inspector システム内部の詳細な動作状況やエラー情報を調査するためのツールです。
* Firmware Update Odrive のファームウェアを最新のものにアップデートするための機能です。

# ファームウェアアップデートを行う
WebGUI画面上のFirmware Updateから行えます。最新の0.6.10に更新しました。

# モーターの設定を行う
今回使用するモーター（D5065-270KV）や電源に合わせて設定していきます。

## Power Source 
Power Sourceでは、以下のような項目を設定できます。
* DC bus overvoltage trip level[V]
ODrive が検出する DC バス電圧の上限値
通常は使用する電源電圧よりも少し高めに設定します。
* DC bus undervoltage trip level [V]
ODrive が検出する DC バス電圧の下限値
通常は使用する電源電圧よりも少し低めに設定します
* Internal current limit [A]
ODrive の基板設計や耐久性、ドライバの仕様などに基づく物理的・設計的な最大電流値
（ユーザは設定できません）
* DC max positive current [A]
電源から ODrive への正方向電流（供給方向）に対する最大値
この値を超える電流が流れると、過電流エラーとして扱われ、ODrive が停止またはエラー状態になります
* DC max negative current [A]
ODrive から電源側へ戻る（回生ブレーキ等による）逆方向電流の最大値
モーターがブレーキ動作をしている際など、エネルギーが電源側へ返される（回生電流が発生する）場合に、この値を超えるとエラーになります。
**安定化電源等を使用している場合は-0.01にし、ブレーキ抵抗を繋ぐのが無難**と思われます。
* Use brake resistor[Ω]
回生ブレーキ時に発生するエネルギーを、外部に接続したブレーキ抵抗（ダンピングレジスタ）に放出するかどうかを設定します。

今回は以下のように設定しました。
DC bus overvoltage trip level[V]　= 28
DC bus undervoltage trip level [V] = 10.5
Internal current limit [A] = 50
DC max negative current [A] = -0.01
Use brake resistor = 2

## Motor 
今回はOdrive純正モーターは、選択するだけで良いようです。Other MoterからOdrive以外のモーターの設定もできるようです。今回はD5065-270KVを選択しました。サーミスターは使わないのでチェックを外しています。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976768/97c00f9d-8a96-4004-8f79-3d0483f898c8.png)

## Encoder
こちらも既成品のプリセットがいくつか用意されていました。今回はAS5047を使用するのでSPI Encoderから以下の画像のように設定しました。
ちなみにuse separate commutation encoder とは、位置制御用のエンコーダとは別に、モーターの初期位置検出や磁極位置（コミュテーション）用に別のエンコーダを使用する機能だそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976768/ae23374b-ffbe-4930-b15e-6f1e0549c525.png)

## ControlMode
モーターのコントロールモードを設定します。以下のようなコントロールモードがありました。
* Position Control
目標位置を入力し、ODriveが自動的に速度やトルクを調整して指定位置に到達するよう制御するモード。
* Velocity Control
目標速度（turns/s など）を入力し、その速度を維持するようにモーターを制御するモード。
* Torque Control
目標トルク（Nm や対応する電流値）を直接入力し、そのトルクを出すように制御するモード。
* Ramped Velocity Control
通常の Velocity Control に「加速度リミット（速度変化率の上限）」を加えた制御モード。
* Ramped Torque Control
Torque Control に「トルクの変化率の上限」を設けた制御モード。
* Trajectory Control
目標位置・最大速度・最大加速度などを指定すると、ODrive が トラペゾイド（台形）状や S字状の速度プロフィールを自動生成し、スムーズに目標位置へ移動するモード。
* Filtered Position Control
Position Control に対して入力される位置コマンドを、フィルタで平滑化してから適用するモード。

今回はTrajectory Controlを使用しました。

## Interfaces
以下の項目を設定できます
* USB
常に有効状態で設定項目はありません
* CAN Bus
CAN (Controller Area Network) を用いた通信を行うかどうかを設定します。
* UART
UART (シリアル通信) を用いて制御を行う場合に有効化する項目です。
* Watchdog timer
通信が一定時間途絶えた際に、ODrive を安全に停止させるためのタイマー機能
* GPIO Input
ODrive の GPIO ピンを アナログ入力 や RC サーボ信号（PWM）入力 として使い、モーターの目標値（位置・速度・トルク）を与える機能。

今回はCAN Busを使用しました。CAN Busについてさらに以下のような設定項目があります。
* Bitrate
CAN 通信で使用するビットレート（通信速度）を設定する項目です。単位は bps（ビット/秒）
125000, 250000, 500000, 1000000 bps などが代表的な標準ビットレート
* Node ID
ODrive を CAN バス上で一意に識別するための ノード ID を設定します
**Node IDを有効化しないとcan通信できません**
* Send heartbeat every X ms
ODrive が自分の状態を通知する ハートビートメッセージ を何ミリ秒ごとに送信するか設定します
> メッセージ内容
> ハートビート ID: 0x700 + Node ID（例：Node ID=1 なら 0x701）
> ペイロード: エラー状態や制御モードなど、ODrive の基本ステータス。

* Send feedback every X ms
ODrive がエンコーダ情報や電流・電圧などのフィードバックデータを 自動送信する周期 を設定します。
> 代表的なフィードバックメッセージ
> Get Encoder Estimates (位置・速度)
> Get Iq (モーター電流)
> Get Fet Temperature (FET温度)
> Get Bus Voltage Current (バス電圧・電流)

## Apply & Calibrate
Apply & Calibrate タブでは、これまでに設定してきた内容を ODrive 本体に反映し、モーターやエンコーダのキャリブレーションを行うための操作がまとめられています。基本的に上から実行していけば大丈夫です。
* Erase old configuration
Drive 本体に保存されている 既存の設定（旧設定）をすべて消去します
* Apply new configuration
これまで Power Source、Motor、Encoder、Control mode、Interfaces タブで設定した内容を、一括して ODrive に適用します。自動でPythonスクリプトを生成してくれるのでコピーしておくと、odrivetoolからも簡単に設定できます。
* Save to non-volatile memory
上記で適用した設定を ODrive のフラッシュメモリに書き込み、再起動後も保持させます
* Calibrate
モーターやエンコーダの キャリブレーションシーケンスを実行します。
モーターが実際に回転し、エンコーダのオフセットや位相アライメントを自動で測定する。
* Save & Reboot
現在の設定やキャリブレーション結果を保存し、ODriveを再起動します。

## 動かしてみる
設定できたらDashboradタブに移動します。目標値に合わせてposition、velictiy、torqueを選択肢電源ボタンを押すと、Odriveがactiveになります。あとはSetpointを動かすとそれに合わせて動きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976768/b445a58a-95d6-4d39-9cba-a883fa8f3044.png)

# 最後に
WebGUIで操作できるようになったことでデバッグをしやすくなりました。ただ1つのモーターしか制御できなくなったためOdriveにかかる費用が高くなってしまいました。