# 시뮬레이션 기록 및 분석

로봇 시뮬레이션을 효과적으로 수행하기 위해서는 시뮬레이션 중 발생하는 다양한 데이터를 체계적으로 기록하고 분석하는 과정이 필수적이다. 이 절에서는 Unity 환경에서 시뮬레이션 데이터를 기록하는 방법과 이를 분석하여 유용한 인사이트를 도출하는 방법에 대해 상세히 설명한다.

#### 시뮬레이션 데이터 로깅

시뮬레이션 데이터 로깅은 시뮬레이션 실행 중 발생하는 다양한 이벤트와 상태 정보를 기록하는 과정이다. 이러한 데이터는 로봇의 동작을 분석하고, 문제를 진단하며, 성능을 최적화하는 데 활용된다.

**데이터 로깅의 필요성**

* **문제 진단**: 시뮬레이션 중 발생한 오류나 예기치 않은 동작의 원인을 파악할 수 있다.
* **성능 분석**: 로봇의 속도, 가속도, 에너지 소모 등 다양한 성능 지표를 분석할 수 있다.
* **알고리즘 검증**: 로봇 제어 알고리즘의 정확성과 효율성을 평가할 수 있다.

**Unity에서 데이터 로깅 설정**

Unity에서는 다양한 방법으로 데이터를 로깅할 수 있다. 가장 일반적인 방법은 C# 스크립트를 이용하여 데이터를 파일에 기록하는 것이다. 아래는 기본적인 데이터 로깅 예제이다.

```csharp
using System.IO;
using UnityEngine;

public class DataLogger : MonoBehaviour
{
    private StreamWriter writer;
    private float startTime;

    void Start()
    {
        string path = "Assets/Logs/simulation_data.csv";
        writer = new StreamWriter(path, false);
        writer.WriteLine("Time,PositionX,PositionY,PositionZ");
        startTime = Time.time;
    }

    void Update()
    {
        float currentTime = Time.time - startTime;
        Vector3 position = transform.position;
        writer.WriteLine($"{currentTime},{position.x},{position.y},{position.z}");
    }

    void OnApplicationQuit()
    {
        writer.Close();
    }
}
```

이 스크립트는 시뮬레이션 시작 시 CSV 파일을 생성하고, 매 프레임마다 로봇의 위치 데이터를 기록한다.

#### 데이터 저장 형식

데이터를 효과적으로 저장하기 위해서는 적절한 파일 형식을 선택하는 것이 중요하다. 일반적으로 사용되는 데이터 저장 형식은 다음과 같다.

* **CSV (Comma-Separated Values)**: 간단한 텍스트 형식으로, 엑셀 등 다양한 도구에서 쉽게 열어볼 수 있다.
* **JSON (JavaScript Object Notation)**: 구조화된 데이터 저장에 유용하며, 계층적 데이터 표현이 가능한다.
* **Binary Files**: 대용량 데이터를 효율적으로 저장할 수 있지만, 읽기 및 쓰기가 복잡할 수 있다.

**CSV 파일 예제**

CSV 파일은 각 데이터 포인트를 쉼표로 구분하여 저장한다. 예를 들어, 로봇의 위치 데이터를 기록한 CSV 파일은 다음과 같다.

```
Time,PositionX,PositionY,PositionZ
0.0,0.0,0.0,0.0
0.1,0.1,0.0,0.0
0.2,0.2,0.0,0.0
...
```

CSV 파일은 간단하게 생성 및 수정할 수 있으며, 데이터 분석 도구와의 호환성도 높다.

#### 데이터 분석 방법

기록된 시뮬레이션 데이터를 분석함으로써 로봇의 동작을 이해하고, 성능을 개선할 수 있다. 데이터 분석은 주로 다음과 같은 단계를 포함한다.

1. **데이터 수집**: 시뮬레이션 실행 중 필요한 데이터를 로깅한다.
2. **데이터 정제**: 불필요한 데이터 제거 및 결측값 처리 등을 통해 데이터를 정리한다.
3. **데이터 시각화**: 그래프나 차트를 이용하여 데이터를 시각적으로 표현한다.
4. **통계 분석**: 평균, 분산, 상관관계 등 통계적 방법을 사용하여 데이터를 분석한다.
5. **모델링 및 예측**: 머신러닝 등의 기법을 사용하여 데이터로부터 모델을 구축하고 예측을 수행한다.

**데이터 시각화**

데이터 시각화는 복잡한 데이터를 직관적으로 이해할 수 있게 도와준다. Unity에서 로깅한 데이터를 외부 도구를 사용하여 시각화할 수 있다. 예를 들어, Python의 `matplotlib` 라이브러리를 사용하여 CSV 데이터를 시각화할 수 있다.

```python
import matplotlib.pyplot as plt
import pandas as pd

# 데이터 불러오기
data = pd.read_csv('simulation_data.csv')

# 시간에 따른 위치 변화 시각화
plt.figure(figsize=(10, 6))
plt.plot(data['Time'], data['PositionX'], label='Position X')
plt.plot(data['Time'], data['PositionY'], label='Position Y')
plt.plot(data['Time'], data['PositionZ'], label='Position Z')
plt.xlabel('Time (s)')
plt.ylabel('Position (m)')
plt.title('Robot Position Over Time')
plt.legend()
plt.show()
```

이 스크립트는 로봇의 위치 변화를 시간에 따라 그래프로 나타낸다.

#### 통계 분석

통계 분석은 로봇 시뮬레이션 데이터를 이해하고, 패턴을 발견하며, 의사 결정을 지원하는 데 중요한 역할을 한다. 이 절에서는 기본적인 통계 개념과 이를 Unity 시뮬레이션 데이터에 적용하는 방법에 대해 설명한다.

**기본 통계 개념**

* **평균 ($\mu$)**: 데이터의 중심 경향을 나타내는 지표로, 모든 데이터 포인트의 합을 데이터의 개수로 나눈 값이다.

$$
\mu = \frac{1}{N} \sum\_{i=1}^{N} x\_i
$$

* **분산 ($\sigma^2$)**: 데이터가 평균으로부터 얼마나 흩어져 있는지를 나타내는 지표이다.

$$
\sigma^2 = \frac{1}{N} \sum\_{i=1}^{N} (x\_i - \mu)^2
$$

* **표준 편차 ($\sigma$)**: 분산의 제곱근으로, 데이터의 흩어짐 정도를 원래의 단위로 표현한다.

$$
\sigma = \sqrt{\sigma^2}
$$

* **상관 계수 ($r$)**: 두 변수 간의 선형 관계의 강도를 나타내는 지표이다.

$$
r = \frac{\sum\_{i=1}^{N} (x\_i - \mu\_x)(y\_i - \mu\_y)}{\sqrt{\sum\_{i=1}^{N} (x\_i - \mu\_x)^2} \sqrt{\sum\_{i=1}^{N} (y\_i - \mu\_y)^2}}
$$

**Unity 시뮬레이션 데이터에의 적용**

Unity에서 로봇 시뮬레이션을 수행할 때, 다양한 센서 데이터와 로봇의 상태 정보를 수집하게 된다. 이러한 데이터를 기반으로 평균, 분산, 상관 계수 등을 계산하여 로봇의 성능을 평가하고, 제어 알고리즘의 효율성을 검증할 수 있다.

예를 들어, 로봇의 이동 속도를 분석한다고 가정해 보자. 로봇의 속도 데이터 $v$가 시간에 따라 수집되었다고 할 때, 평균 속도 $\mu\_v$와 표준 편차 $\sigma\_v$를 계산하여 로봇의 안정성을 평가할 수 있다.

**Python을 이용한 통계 분석 예제**

아래는 Python의 `pandas`와 `numpy` 라이브러리를 사용하여 시뮬레이션 데이터를 불러오고, 기본적인 통계 분석을 수행하는 예제이다.

```python
import pandas as pd
import numpy as np

# 데이터 불러오기
data = pd.read_csv('simulation_data.csv')

# 평균 계산
mean_x = np.mean(data['PositionX'])
mean_y = np.mean(data['PositionY'])
mean_z = np.mean(data['PositionZ'])

print(f'평균 위치: X={mean_x}, Y={mean_y}, Z={mean_z}')

# 표준 편차 계산
std_x = np.std(data['PositionX'])
std_y = np.std(data['PositionY'])
std_z = np.std(data['PositionZ'])

print(f'표준 편차: X={std_x}, Y={std_y}, Z={std_z}')

# 상관 계수 계산
correlation_xy = np.corrcoef(data['PositionX'], data['PositionY'])[0, 1]
correlation_xz = np.corrcoef(data['PositionX'], data['PositionZ'])[0, 1]
correlation_yz = np.corrcoef(data['PositionY'], data['PositionZ'])[0, 1]

print(f'PositionX과 PositionY의 상관 계수: {correlation_xy}')
print(f'PositionX과 PositionZ의 상관 계수: {correlation_xz}')
print(f'PositionY과 PositionZ의 상관 계수: {correlation_yz}')
```

이 스크립트는 시뮬레이션 데이터를 불러와 각 위치 축에 대한 평균과 표준 편차를 계산하고, 각 축 간의 상관 계수를 출력한다. 이를 통해 로봇의 움직임 패턴을 이해하고, 특정 축에서의 이상 동작을 감지할 수 있다.

#### 모델링 및 예측

모델링 및 예측은 수집된 시뮬레이션 데이터를 기반으로 미래의 상태를 예측하거나, 로봇의 동작을 최적화하는 데 사용된다. 머신러닝과 같은 고급 기법을 활용하여 데이터를 분석하고, 예측 모델을 구축할 수 있다.

**머신러닝을 이용한 예측**

머신러닝 알고리즘을 사용하면 로봇의 센서 데이터로부터 패턴을 학습하고, 이를 바탕으로 미래의 상태를 예측할 수 있다. 예를 들어, 로봇의 위치 데이터를 이용하여 향후 위치를 예측하거나, 장애물 회피 경로를 계획할 수 있다.

**예제: 로봇 위치 예측을 위한 선형 회귀**

아래는 Python의 `scikit-learn` 라이브러리를 사용하여 로봇의 위치 데이터를 기반으로 향후 위치를 예측하는 간단한 선형 회귀 모델을 구축하는 예제이다.

```python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

# 데이터 불러오기
data = pd.read_csv('simulation_data.csv')

# 입력 변수와 출력 변수 설정
X = data[['Time']]  # 시간
y = data[['PositionX']]  # 예측하려는 위치 축

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델 생성 및 학습
model = LinearRegression()
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)

# 결과 시각화
plt.scatter(X_test, y_test, color='blue', label='실제 값')
plt.plot(X_test, y_pred, color='red', label='예측 값')
plt.xlabel('시간 (s)')
plt.ylabel('PositionX (m)')
plt.title('로봇 PositionX 예측')
plt.legend()
plt.show()
```

이 스크립트는 로봇의 시간에 따른 PositionX 값을 선형 회귀 모델로 학습하고, 테스트 데이터에 대한 예측 값을 시각화한다. 이를 통해 모델의 예측 정확도를 평가할 수 있다.

**고급 모델링 기법**

더 복잡한 동작 패턴을 예측하기 위해서는 다층 퍼셉트론(MLP), 순환 신경망(RNN), 장단기 기억 네트워크(LSTM) 등과 같은 고급 머신러닝 알고리즘을 사용할 수 있다. 이러한 모델들은 시계열 데이터의 패턴을 효과적으로 학습하여 보다 정확한 예측을 가능하게 한다.

**예제: LSTM을 이용한 로봇 위치 예측**

아래는 TensorFlow를 사용하여 LSTM 모델을 구축하고, 로봇의 PositionX 데이터를 예측하는 예제이다.

```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler

# 데이터 불러오기
data = pd.read_csv('simulation_data.csv')

# PositionX 데이터 추출
position_x = data['PositionX'].values.reshape(-1, 1)

# 데이터 정규화
scaler = MinMaxScaler(feature_range=(0, 1))
position_x_scaled = scaler.fit_transform(position_x)

# 데이터셋 생성 함수
def create_dataset(dataset, time_step=1):
    X, Y = [], []
    for i in range(len(dataset)-time_step-1):
        a = dataset[i:(i+time_step), 0]
        X.append(a)
        Y.append(dataset[i + time_step, 0])
    return np.array(X), np.array(Y)

time_step = 10
X, Y = create_dataset(position_x_scaled, time_step)
X = X.reshape(X.shape[0], X.shape[1], 1)

# 학습용과 테스트용 데이터 분할
train_size = int(len(X) * 0.67)
test_size = len(X) - train_size
X_train, X_test = X[0:train_size], X[train_size:len(X)]
Y_train, Y_test = Y[0:train_size], Y[train_size:len(Y)]

# LSTM 모델 구축
model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(time_step, 1)))
model.add(LSTM(50, return_sequences=False))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')

# 모델 학습
model.fit(X_train, Y_train, batch_size=1, epochs=20)

# 예측
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

# 예측 결과 역정규화
train_predict = scaler.inverse_transform(train_predict)
test_predict = scaler.inverse_transform(test_predict)
Y_train = scaler.inverse_transform([Y_train])
Y_test = scaler.inverse_transform([Y_test])

# 결과 시각화
plt.figure(figsize=(12,6))
plt.plot(data['Time'], data['PositionX'], label='실제 값')
plt.plot(data['Time'][time_step:train_size+time_step], train_predict.flatten(), label='학습 데이터 예측')
plt.plot(data['Time'][train_size+time_step+1:], test_predict.flatten(), label='테스트 데이터 예측')
plt.xlabel('시간 (s)')
plt.ylabel('PositionX (m)')
plt.title('LSTM을 이용한 로봇 PositionX 예측')
plt.legend()
plt.show()
```

이 스크립트는 LSTM 모델을 사용하여 로봇의 PositionX 값을 예측한다. 시계열 데이터를 기반으로 학습된 모델은 미래의 위치를 보다 정확하게 예측할 수 있으며, 이를 통해 로봇의 경로 계획 및 제어 알고리즘을 개선할 수 있다.
