---
# System prepended metadata

title: AUV交接報告 - 軟體組
tags: [2021交接]

---

# AUV交接報告 - 軟體組
###### tags: `2021交接`
[TOC]


## 控制組

### 技術進步
#### 控制方式
1. 整合IMU和壓力計的資訊並透過PID來控制馬達輸出
2. 利用keyboard或joystick搖桿操控潛水艇
3. 視覺追蹤指令

#### 統一的指令接口
上述方式，會轉成統一的指令{forward, backward, up, down, ...}再輸出成馬達力道訊號。

#### PID class
- pid_attitude
    控制水平姿態的平衡
- pid_depth
    控制垂直深度的平衡
- Class/pid_class
    最上層的class(可以不修改)
- UI/ 
    利用UI來顯示潛水艇資訊and控制潛水艇and調整PID參數

#### 將code分類整理
有以下幾個子目錄:
- cmd
    控制指令等
- motor
    計算合力，輸出給pwm開發版等
- nonROS
    手動reset arduino，控制機械手臂(目前報銷)
- pid
    pid class implementaion
- sensor
    利用Serial port接收arduino的sensor資料


### 檢討
1. 納入數學考量，加入模型
    **線性數學模型**
    -力學模型可以減輕控制方面的負擔
    -如果可以，將潛水艇的transfer function找出來
2. 馬達
    -測量控制訊號與馬達實際輸出力道
    -抵銷力矩
3. 控制器
    -選擇使用PID->調整參數讓整體系統反應速度加快
    -選擇使用其他控制器->自行研究
4. 繼續完善GUI
    -顯示潛水艇資訊(深度、姿態、電量、PID參數...)
    -控制潛水艇移動(keyboard or joystick...)
    -方便調整PID參數
5. 與聲納等sensor整合
    -建立地形
    -最終目標是路線規劃
6. 增加更多種移動方式

### QA
- 系統反應不夠快，所以不好走直線，或是做完指令後需要平衡，沒辦法馬上做下一個指令
- 找老師拿六軸感測器
- [phabricator](https://www.phacility.com/phabricator/)
- 線性控制系統

### 馬達控制
#### 概括
馬達([T200](https://bypass.bluerobotics.com/store/thrusters/t100-t200-thrusters/t200-thruster-r2-rp/))利用pwm訊號接受控制，所以利用RPI外接PWM Signal 擴充版(PCA9685)。
> 因為rpi的pwm主要是軟體模擬，可能在運算量大了時候不穩，而且硬體計算pin也不夠。

#### PCA9685
[別人的介紹](https://www.taiwaniot.com.tw/product/%E5%8E%9F%E5%BB%A0-pca9685-16%E8%B7%AF%E8%88%B5%E6%A9%9F%E6%8E%A7%E5%88%B6%E6%93%B4%E5%B1%95%E6%9D%BF-16%E8%B7%AF12-bit-pwm%E6%8E%A7%E5%88%B6%E6%9D%BF/)(我懶得打.jpg)
重點:
1. 16個output channel
2. I2C 通訊協定

[**仔細der教學**](http://blog.ittraining.com.tw/2015/07/raspberry-pi2-python-i2c-16-pwm-pca9685.html)
重點:
1. 須設定PWM Frequency
2. I2C Address: x40
3. 有睡眠模式
4. 只要傳輸一次指令，輸出就會持續維持

#### T200
[Datesheet](https://cad.bluerobotics.com/T200-Public-Performance-Data-10-20V-September-2019.xlsx
)
[Technical Details](https://bypass.bluerobotics.com/store/thrusters/t100-t200-thrusters/t200-thruster-r2-rp/#tab-technical-details)

1. ESC是認logic high的持續時間 e.g.1500us，而非duty cycle
2. 不過用示波器看他自己也沒有很準
3. 根據上面的datasheet，可以力量與PWM的對應關係，其餘的部分就是用插值搞定

#### Note
1. 主要架構是由PID或其他Node算出各自馬達的力，再交由*motor_force_summation*將所有力相加起來(假設直接線性相加)
2. 得到各個馬達力的最終輸出後，交由*motor_output*將力插值轉成控制訊號輸出給PCA9685
3. 由於PCA9685的frequency與T200 ESC都沒有很準，所以控制訊號還要再經過一次mapping(測出來)才會對應到1500us
4. 由於3，理想上*motor_force_summation*的輸出值的單位即為kgf，但最後可能有被乘上一個倍率
5. 由於3，所以可以測試看看輸出力道與控制訊號的關係，對以後有幫助



---

## 水聽組
### 技術進步
1. 水聽技術從TDOA升級為MUSIC演算法
3. 運用聲納的地形圖做路徑規劃
### 檢討
1. 水下麥克風壞掉，無法測試MUSIC演算法的準確度
2. 希望可以多理解MUSIC演算法的數學意義
3. 麥克風買便宜一點
4. 日後將路徑規劃與PID結合

### QA
- 聯絡廠家-修復麥克風
- 
---
## 視覺辨識組

### 技術進步

- [x] 縮短 Training Model 的時間以及配備
    - 3 days -> 10 hrs (也可以用基隆借我們的，可以快點train一些，不知道甚麼時候要回去)
    - 桌機 -> Google Colab 
    
- [x] FPS測試
    - Yolov3  (5fps)
    - Yolov3-tiny (18fps)
    - Yolov4  (5fps)
    - Yolov4-tiny  (18.2fps)
    
- [x] Collect [dataset(door, ball)](https://drive.google.com/drive/folders/1PqqKdBjH2NxJGJN0970ClyN1h9n-mVan?usp=sharing) and [bag files](https://drive.google.com/drive/folders/1d7QCEIXzq5kt159dRXqsJVGshUSjRFy_?usp=sharing)
- [x] 成功訓練模型且成功辨識物體 - [video](https://drive.google.com/file/d/1dm6BNA1v_yT261lE5bJoBWOncnBN3uZo/view?usp=sharing)
- [x] [Finite State Machine](https://photos.google.com/share/AF1QipN7WGlcyEAhIWYt-P4e_L4qWHSjDW8FOWjDQIYhb9Z-FeAmmWqKM7lv9wrO2KurTA/photo/AF1QipN0S5DwkzXs6iw7m4P366YpFQ9BUBlKGCwEughK?key=Q1BjTXVHV19DOFpEYUw2QWtWNmVJRFNicE4taGVB)
追蹤球球
- [x] 持續更新code在[github](https://github.com/NCTU-AUV/auv_track)

- Tutorial
    - 訓練模型(by 君瀚)https://hackmd.io/nhRoiaYTSCKfT5MroaI-6Q?view


### 檢討
:::success
1. FPS還是偏低，可以嘗試yolov5一些更快的模型
2. 整體code還是在別人寫好的框架底下，可以自己設計好一個框架，只要讀取 weight就可以使用就好
3. 把一些平常遇不到的node都關掉，應該可以減少一些消耗
:::


:::warning
4. 可以嘗試用 [gmapping](http://wiki.ros.org/gmapping)這個package，可以把水下聲納的laser-scan轉換成grid map，應該可以幫助潛水艇做好路徑規劃
![](https://i.imgur.com/Snm4cxg.png)
![](https://i.imgur.com/sJGmlOa.jpg)
:::

::: danger
5.  可以把潛水艇的相關tf固定好，就可以去跑gazebo模擬  
![](https://i.imgur.com/WWJxnFi.jpg)

:::
