# LSTM Anomaly Detection
線上HackMD連結:https://hackmd.io/@BgZWbLVqSAao47vGhbNIgA/BJiqAkYlY
## ROS robot arm simulation
### Prerequisites
* Ubuntu 16.04
* ROS kinetic
* Python 2.7
* MoveIt
### Ros environment setup
ROS是用宜慧提供的Yaskawa手臂模擬環境,可用以下兩種方法建置
#### Method 1
可以直接用宜慧提供的Virturebox的環境,將~/Trajectory_anomaly_detection/ROS/ 中的檔案全部移動到ROS環境中專案的src/即可。
#### Method 2
也可使用我提供的ROS環境,目前已放在雲端中的~/Trajectory_anomaly_detection/src資料夾中
1.安裝ROS kinetic
http://wiki.ros.org/kinetic/Installation/Ubuntu
2.創建一新工作環境
```c
$ mkdir aoi_flexbe_ws_sg
$ cd aoi_flexbe_ws_sg
$ mkdir src
$ catkin_make
```
3.資料移動
將原始環境中src裡的檔案除了CMakeFile.list全部移動到新環境的src裡
4.安裝moveit
```c
$ rosdep update
$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install ros-kinetic-catkin python-catkin-tools
$ sudo apt install ros-kinetic-moveit
```
5.補齊缺少package
```c
$ chmod 777 -R aoi_flexbe_ws_sg
$ cd aoi_flexbe_ws_sg
$ rosdep install --from-paths src -i -y
$ catkin_make -j1
```
基本到這應該就可以使用,若有catkin_make時仍有缺少librarie可能需要根據缺少內容去下載。
### Open the simulation environment
```c
$ cd /aoi_flexbe_ws_sg
$ source ./devel/setup.bash
$ roslaunch aoi_moveit_config demo.launch
```
### Generation trajectory plan
Generate certain number trajectories with various velocity(fast/normal/slow),and output trajectories with plan.yaml file
> Parameter:
> -n : number of trajectories
> -v : velocity {fast,normal,slow}
```python
# open a new terminal
$ cd /aoi_flexbe_ws_sg
$ source ./devel/setup.bash
$ cd /src
$ python generate_trajectory_plan.py -cl -n 50 -v normal
```
### Generate Tampered plan
Generate tampered trajectories based on plan.yaml,and output tampered trajectories with spoof.yaml file
```python
# open a new terminal
$ cd /aoi_flexbe_ws_sg
$ source ./devel/setup.bash
$ cd /src
$ python spoofing_plan.py
```
### Excute normal plan:
1.Excute normal trajectories
```python
# open a new terminal
$ cd /aoi_flexbe_ws_sg
$ source ./devel/setup.bash
$ cd /src
$ python excute_plan.py -cl -f plan
```
2.Excute tampered trajectories
```python
# open a new terminal
$ cd /aoi_flexbe_ws_sg
$ source ./devel/setup.bash
$ cd /src
$ python excute_plan.py -cl -f spoof
```
### Collect robot info
First,start collecting robot infomation
```python
# open a new terminal
$ cd /aoi_flexbe_ws_sg
$ source ./devel/setup.bash
$ cd /src
$ python get_robot_info.py -cl
```
Second,excute the trajectory plan,and get_robot_info.py will ouput robot info with output.csv
```python
# open a new terminal
$ cd /aoi_flexbe_ws_sg
$ source ./devel/setup.bash
$ cd /src
$ python excute_plan.py -cl -f plan
```
## Anomaly Detection
### Prerequisites
* Python 3.6
* Pytorch
### Data
#### Data features
In csv file
> Column 1~6:Position of 6 joint angle
> Column 6~9:End effector(x,y,z position)
> Column 10:Index of trajectory
and velocity of 6 joint angle will generate when training
#### Data categories
1.Normal data
* train data(train_with_ee.csv)
* test data(test_with_ee.csv)
2.Anomaly data
* Fast trajectory(v_1_ee.csv)
* Slow trajectory(v_0.01_ee.csv)
* Tampered trajectory(spoof.csv)
### Performance
Parameters
* Hidden size: 32
* Batch size: 32
* Learning rate: 0.01
* Epochs: 20
Evaluate metrics
* FPR:(False Positive Rate) at 95% TPR (True Positive Rate)
* AUROC:Area Under the Receiver Operating Characteristic curve
* AUPR:Area under the Precision-Recall curve
Anomaly score:
* Max SE: Max square error of one trajectory
* MSE: Mean square error of one trajectory
Result:
1.Max SE

| Anomaly data | FPR(%) | AUROC(%) | AUPR(%) |
|---------------------|--------|----------|---------|
| Fast trajectory | 9.8 | 97.7 | 92.8 |
| Slow trajectory | 4.2 | 99.1 | 99.1 |
| Tampered trajectory | 2 | 97.9 | 92.2 |
2.MSE

| Anomaly data | FPR(%) | AUROC(%) | AUPR(%) |
|---------------------|--------|----------|---------|
| Fast trajectory | 3.4 | 97.9 | 94.5 |
| Slow trajectory | 2.5 | 99.3 | 99.5 |
| Tampered trajectory | 2 | 97.9 | 92.2 |
## Coordination trasform
### Coordination
Ros 模擬中有三個坐標系(x axis:紅, y axis:綠, z axis:藍)
1.world:
為excel中收到end effector值的座標

2.base_link:
以手臂模型基座無原點

3.workcell_turntable
為操作平台為座標原點,軌跡規劃中的目標點以此為座標

### Trasform
兩兩坐標系之間可透過rotation matrix$(R)$與Traslation matrix$(T)$轉換
$$
\left[
\begin{matrix}
x \\
y \\
z
\end{matrix}
\right]=
\left[
\begin{matrix}
R
\end{matrix}
\right]
\left[
\begin{matrix}
x_0 \\
y_0 \\
z_0
\end{matrix}
\right]
+
\left[
\begin{matrix}
T
\end{matrix}
\right]
$$
1.從wolrd到base_link
$$
R=
\left[
\begin{matrix}
0 & -1 & 0 \\
1 & 0 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
$$
$$
T=
\left[
\begin{matrix}
0.210 \\
0.000 \\
-0.870
\end{matrix}
\right]
$$
2.從wolrd到workcell_turntable
$$
R=
\left[
\begin{matrix}
-1 & 0 & 0 \\
0 & -1 & 0 \\
0 & 0 & 1
\end{matrix}
\right]
$$
$$
T=
\left[
\begin{matrix}
0.006 \\
-0.320 \\
-1.045
\end{matrix}
\right]
$$
### tf_echo
Reference:http://wiki.ros.org/tf
可透過tf_echo了解兩坐標系之間關係
```python
$ tf_echo <source_frame> <target_frame>
```
Example
```bash
$ rosrun tf tf_echo /base_link /world
At time 0.00
- Translation: [0.210, 0.000, -0.870]
- Rotation: in Quaternion [0.000, 0.000, 0.707, 0.707]
in RPY (radian) [0.000, -0.000, 1.571]
in RPY (degree) [0.000, -0.000, 90.000]
```