728x90

예측 기반 실린더 속도 제어 (LSTM + Unity)

🎯 목표

실린더의 이동 거리, 속도, 환경 조건을 기반으로 도착 시간을 AI가 예측하고, 예측 결과에 따라 속도 또는 입력 값을 실시간 보정하는 Unity 시뮬레이터를 제작합니다.


🧩 활용 기술

  • Unity (물리 기반 이동 시뮬레이션)
  • Python (LSTM 예측 모델 학습)
  • C# (속도 제어 및 보정 로직 구현)
  • ML.NET (선택: Unity 내 ML 추론 가능)

🖼️ 시뮬레이션 화면 예시

실린더가 이동 거리에 따라 도착 시간을 AI가 예측 → 속도 자동 보정 → 일정한 도착 시간 유지


🛠 Unity 구현 과정

1️⃣ 실린더 + 거리 기반 제어 스크립트

public class PredictiveCylinder : MonoBehaviour
{
    public Transform target;
    public float speed = 2f;
    private float moveStartTime;
    private float predictedTime;

    public void StartMove(float predictedTime)
    {
        this.predictedTime = predictedTime;
        moveStartTime = Time.time;
        StartCoroutine(MoveRoutine());
    }

    IEnumerator MoveRoutine()
    {
        Vector3 start = transform.position;
        Vector3 end = target.position;

        while (Vector3.Distance(transform.position, end) > 0.01f)
        {
            float distance = Vector3.Distance(start, end);
            speed = distance / predictedTime;
            transform.position = Vector3.MoveTowards(transform.position, end, speed * Time.deltaTime);
            yield return null;
        }

        Debug.Log("🟢 실린더 도착! 실제 시간: " + (Time.time - moveStartTime));
    }
}

 


2️⃣ 데이터 수집 (거리, 속도, 도착 시간)

public class TimeLogger : MonoBehaviour
{
    public Transform start;
    public Transform target;
    public float speed;
    private float startTime;

    void Start()
    {
        float distance = Vector3.Distance(start.position, target.position);
        startTime = Time.time;

        float estimatedTime = distance / speed;
        float actualTime = SimulateMovement(distance, speed); // 추후 구현

        Debug.Log($"{distance},{speed},{actualTime}");
    }
}

📁 CSV 예시:

 
Distance,Speed,ActualTime
0.5,2.0,0.24
0.8,2.0,0.38
1.0,2.5,0.40

🧠 AI 모델 학습 (Python - LSTM)

import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

df = pd.read_csv("cylinder_data.csv")
X = df[['Distance', 'Speed']].values
y = df['ActualTime'].values

X = X.reshape((X.shape[0], 1, X.shape[1]))  # LSTM 입력 형태

model = Sequential()
model.add(LSTM(32, input_shape=(1, 2)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
model.fit(X, y, epochs=100, verbose=1)

model.save("lstm_predictor.h5")

 


🎯 예측 결과를 Unity에서 사용하는 방법

💡 옵션 1: 예측값 CSV로 저장 → Unity에서 로딩

float predictedTime = PredictTimeFromCSV(distance, speed);
cylinder.StartMove(predictedTime);

💡 옵션 2: Unity에서 Python 서버 호출 (Flask)

UnityWebRequest www = UnityWebRequest.Get("http://localhost:5000/predict?d=0.5&s=2.0");
yield return www.SendWebRequest();
float predictedTime = float.Parse(www.downloadHandler.text);

💡 옵션 3: ML.NET or ONNX 모델 로딩 (고급)


📢 보정 로직 개념

 

거리 예측 시간 속도 보정
0.8m 0.4s 0.8 / 0.4 = 2.0 m/s
1.2m 0.6s 1.2 / 0.6 = 2.0 m/s
1.2m 0.9s (부하 ↑) 1.2 / 0.9 = 1.33 m/s
 

→ AI가 예측한 시간에 맞춰 속도 보정


🎁 기대 결과

  • 실린더가 항상 일정한 시간에 도달
  • 공기압 변화, 부하 변화가 있어도 예측 기반으로 자동 보정
  • Unity 기반 시뮬레이션 + 제어 최적화 모델 완성

🧪 확장 아이디어

화장 설명
센서 피드백 추가 정전용량 센서로 도달 여부 검증
온도/공기압 영향 변수 추가 예측 정확도 개선
PID 보정 병행 AI+전통 제어 융합 가능
 

 


📌 태그 

#예측제어 #속도자동조절 #LSTM예측 #UnityAI #스마트팩토리제어 #공정시간보정 #AI제어최적화 #C샵유니티 #Unity시뮬레이션

 


▶️ 다음 편 예고 (4편)

강화학습 기반 공정 최적화 – Unity ML-Agents로 서보모터와 공정 순서를 스스로 학습하는 AI 만들기

728x90

+ Recent posts