로봇 시뮬레이션을 효과적으로 수행하기 위해서는 시뮬레이션 중 발생하는 다양한 데이터를 체계적으로 기록하고 분석하는 과정이 필수적이다. 이 절에서는 Unity 환경에서 시뮬레이션 데이터를 기록하는 방법과 이를 분석하여 유용한 인사이트를 도출하는 방법에 대해 상세히 설명한다.
시뮬레이션 데이터 로깅
시뮬레이션 데이터 로깅은 시뮬레이션 실행 중 발생하는 다양한 이벤트와 상태 정보를 기록하는 과정이다. 이러한 데이터는 로봇의 동작을 분석하고, 문제를 진단하며, 성능을 최적화하는 데 활용된다.
데이터 로깅의 필요성
문제 진단: 시뮬레이션 중 발생한 오류나 예기치 않은 동작의 원인을 파악할 수 있다.
성능 분석: 로봇의 속도, 가속도, 에너지 소모 등 다양한 성능 지표를 분석할 수 있다.
알고리즘 검증: 로봇 제어 알고리즘의 정확성과 효율성을 평가할 수 있다.
Unity에서 데이터 로깅 설정
Unity에서는 다양한 방법으로 데이터를 로깅할 수 있다. 가장 일반적인 방법은 C# 스크립트를 이용하여 데이터를 파일에 기록하는 것이다. 아래는 기본적인 데이터 로깅 예제이다.
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()
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}')
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()
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()