728x90

멀티센서 융합 기반 품질 이상 판별 (Sensor Fusion + 이상 탐지 AI)

🎯 목표

정전용량 센서, 광센서, 유량센서 등 여러 센서를 통해 제품의 상태를 감지하고,
그 데이터를 AI 모델이 학습해 불량품을 자동 감지하는 시스템을 Unity에서 구현합니다.


🧩 사용 기술

  • Unity (센서 동작 시뮬레이션, 제품 상태 구현)
  • Python (이상 탐지 모델: Autoencoder / Isolation Forest)
  • C# (센서값 로깅, 판별 결과 반영)
  • 머신러닝 기반 이상 분류기
  • 선택: ONNX 모델 로딩 (Unity 추론 적용 시)

🖼️ 시뮬레이션 화면 예시

제품이 센서를 통과하면서 각 센서가 값을 수집하고, AI가 이 데이터를 분석해 불량 여부를 판단


🛠 Unity 구현 단계

1️⃣ 구성 요소 설계

오브젝트 설명
Product 감지 대상 물체 (Cube, Sphere 등 불량 포함)
CapacitiveSensor 재질 감지 (예: 금속 vs 비금속)
LightSensor 위치/정렬 상태 감지
FlowSensor 내부 유량 감지 시뮬레이션 (예: 정해진 액체 통과 여부)
InspectionManager 모든 센서 값을 종합하고 AI 호출
 

2️⃣ 센서 감지 스크립트 (C#)

public class SensorReader : MonoBehaviour
{
    public float sensorValue;

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Product"))
        {
            sensorValue = Random.Range(0.8f, 1.2f); // 간단한 센서값 시뮬
        }
    }
}

3️⃣ 멀티센서 데이터 수집 및 라벨링

public class InspectionManager : MonoBehaviour
{
    public SensorReader capacitive;
    public SensorReader light;
    public SensorReader flow;
    public Text resultText;

    void Inspect()
    {
        float[] features = new float[]
        {
            capacitive.sensorValue,
            light.sensorValue,
            flow.sensorValue
        };

        bool isDefective = RunMLModel(features);
        resultText.text = isDefective ? "❌ 불량" : "✅ 정상품";
    }

    bool RunMLModel(float[] input)
    {
        // 예: 평균과 편차 기반 간단 판별
        float avg = input.Average();
        return avg < 0.85f || avg > 1.15f;
    }
}

※ 초기에는 간단한 수치 판별 사용 → 추후 Python 학습 모델 적용 가능


🧠 Python AI 모델 학습 (이상 탐지)

Isolation Forest 사용 예시

from sklearn.ensemble import IsolationForest
import pandas as pd

df = pd.read_csv("sensor_dataset.csv")  # 컬럼: Capacitive, Light, Flow
model = IsolationForest()
model.fit(df[['Capacitive', 'Light', 'Flow']])
df['Anomaly'] = model.predict(df[['Capacitive', 'Light', 'Flow']])  # 1 = 정상, -1 = 불량

# 저장
import joblib
joblib.dump(model, 'sensor_model.pkl')

Unity ↔ Python 연결 방법 (선택)

  • Flask 서버 구성 후 Unity에서 HTTP GET으로 예측 요청
  • 또는 ONNX로 모델 변환 후 Unity 내 ONNX 추론 적용 (고급)

🎁 기대 결과

  • 센서 3개 이상을 융합한 품질 검사 가능
  • AI 기반으로 불량 자동 감지 → 검사 속도 향상
  • Unity에서 품질 판별 시뮬레이션까지 시각화 완료

📈 확장 아이디어

확장 주제 설명
제품 회전/정렬 불량 감지 3D 위치 기반 센서 추가
센서 간 상관관계 분석 PCA, SHAP 등으로 중요도 분석
강화학습과 결합 검사 타이밍 최적화
728x90
728x90

강화학습 기반 공정 최적화 (Unity + ML-Agents)

🎯 목표

Unity에서 공정 시뮬레이터를 만들고, 강화학습을 통해 AI가 자동으로 공정을 최적화하도록 훈련합니다.
예: 서보모터 속도 조절, 물체 이송 타이밍, 실린더 동작 간격 등을 AI가 스스로 최적화합니다.


🧩 사용 기술

  • Unity (시뮬레이션 + 제어 환경)
  • ML-Agents Toolkit (강화학습 훈련)
  • PPO (Proximal Policy Optimization) 알고리즘
  • Python (훈련 파이프라인)

🖼️ 시뮬레이션 예시 화면

AI 에이전트가 공정 조건(속도, 타이밍)을 스스로 조정하며 목표 시간과 품질을 만족시키는 방향으로 학습


🛠 Unity 구현 과정

1️⃣ 공정 시나리오 설정 예시

 

구성 요소 설명
Item 이송할 물체 (Cube 등)
Conveyor 벨트, 속도 조절 가능
Cylinder 물체를 밀어주는 역할
Sensor 감지 위치, 도달 시간 측정
Agent 공정을 제어하는 AI 에이전트
 

2️⃣ ML-Agent 설치 및 설정

✅ 설치 (Python)

pip install mlagents

✅ Unity 패키지 설치


3️⃣ AI Agent 스크립트 작성

🎮 공정 최적화용 Agent 스크립트 (C#)

using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;

public class FactoryAgent : Agent
{
    public Transform item;
    public Transform sensor;
    public float conveyorSpeed = 1.0f;

    private float timer;

    public override void OnEpisodeBegin()
    {
        item.position = new Vector3(-2f, 0.5f, 0f);
        timer = 0;
    }

    public override void CollectObservations(VectorSensor sensor)
    {
        sensor.AddObservation(item.position.x);
        sensor.AddObservation(conveyorSpeed);
    }

    public override void OnActionReceived(ActionBuffers actions)
    {
        float speedAction = actions.ContinuousActions[0];
        conveyorSpeed = Mathf.Clamp(speedAction, 0.5f, 3.0f);
        item.Translate(Vector3.right * conveyorSpeed * Time.deltaTime);

        timer += Time.deltaTime;

        // 성공: 센서 위치 도달
        if (item.position.x >= sensor.position.x)
        {
            float reward = 1.0f - Mathf.Abs(timer - 2.0f); // 목표 시간 2초
            SetReward(reward);
            EndEpisode();
        }

        if (timer > 4.0f) // 제한 시간 초과
        {
            SetReward(-1.0f);
            EndEpisode();
        }
    }

    public override void Heuristic(in ActionBuffers actionsOut)
    {
        actionsOut.ContinuousActions.Array[0] = 1.0f; // 테스트용 속도
    }
}

 


4️⃣ Python 훈련 설정 (config 파일)

behaviors:
  FactoryAgent:
    trainer_type: ppo
    hyperparameters:
      batch_size: 64
      buffer_size: 1024
      learning_rate: 0.0003
      beta: 0.005
      num_epoch: 3
    network_settings:
      normalize: true
      hidden_units: 128
      num_layers: 2
    reward_signals:
      extrinsic:
        gamma: 0.99
        strength: 1.0
    max_steps: 100000
    time_horizon: 64
    summary_freq: 1000

5️⃣ 학습 시작 명령어

mlagents-learn config/ppo_factory.yaml --run-id=factory_run_01 --train

Unity 실행 상태에서 에이전트가 스스로 공정 타이밍을 조절하며 최적화 학습을 진행합니다.


🧠 보상 설계 팁 (강화학습 핵심)

행동 결과
정확히 목표 시간 도달 (2.0s ± 0.2s) +1.0
너무 빠르거나 느림 -0.3 ~ -1.0
실패 (타겟 미도달 or 충돌) -1.0
연속 성공 +0.2 (보너스)
 

🎁 기대 결과

  • AI가 자율적으로 공정 속도 조절 전략 학습
  • 실제로 이송 거리, 목표 시간이 바뀌어도 스스로 조정
  • 튜닝 없이 강건한 공정 제어 자동화 구현

📌 확장 아이디어

확장 주제 설명
실린더+벨트 조합 최적화 동시 제어
강화학습 + 예측 모델 결합 Hybrid 제어
다중 에이전트 협업 공정 간 AI 협력 제어
 

🏷️ 태그 (4편 전용)

강화학습, UnityMLAgents, PPO, 공정강화학습, AI자율제어, 스마트팩토리AI, 공정최적화, 강화학습시뮬레이션, UnityAI, 스마트제조

▶️ 다음 편 예고 (5편)

멀티센서 융합 기반 품질 이상 판별 – AI가 다양한 센서 데이터를 조합해 불량 자동 감지

728x90
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
728x90

실린더 외란 감지 + 알람 시스템 (Unity + AI)

🎯 목표

Unity에서 실린더의 동작을 시뮬레이션하고, 외란(지연, 위치 오차, 튀는 현상 등)을 감지하는 AI 모델을 적용하여 알람 시스템을 만들자.


🧩 사용 기술

  • Unity 2021+ (시뮬레이터 제작)
  • C# (센서/실린더 제어, 로그 저장)
  • Python (Autoencoder 또는 이상탐지 모델)
  • 머신러닝: 이상 탐지 기반 분류 모델 (Isolation Forest / Autoencoder)

🖼️ 시뮬레이션 화면 예시

💬 실린더가 동작할 때, 예상 위치에 도달하지 않거나 도달 시간이 지연되면 AI가 외란 상태로 판단하고 알림 발생


🛠 Unity 구현 단계

1️⃣ 실린더 제어 시뮬레이션

🎮 오브젝트 구성

 

오브젝트 설명
Cylinder 실린더 역할, 위치 이동
Target 목표 위치
LightSensor 도착 여부 판단
AlarmPanel 경고 UI 표시
 

🎮 이동 스크립트 (C#)

public class CylinderMover : MonoBehaviour
{
    public Transform target;
    public float speed = 2.0f;
    public float moveStartTime;
    public bool isMoving = false;

    void Update()
    {
        if (isMoving)
        {
            transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
            if (Vector3.Distance(transform.position, target.position) < 0.01f)
            {
                isMoving = false;
                float arrivalTime = Time.time - moveStartTime;
                Debug.Log("도착 시간: " + arrivalTime);
                CylinderLogger.Instance.LogArrival(arrivalTime);
            }
        }
    }

    public void StartMove()
    {
        moveStartTime = Time.time;
        isMoving = true;
    }
}

2️⃣ 외란 기준 데이터 로깅

public class CylinderLogger : MonoBehaviour
{
    public static CylinderLogger Instance;
    public List<float> log = new List<float>();

    void Awake() => Instance = this;

    public void LogArrival(float time)
    {
        log.Add(time);
        // 예: time > 2.5초면 외란으로 라벨링 가능
    }
}

3️⃣ 외란 라벨링 기준 예시

도착 시간 (sec) 외란 여부
1.5 정상
2.7 외란 (지연)
1.6 정상
3.2 외란
 

이 데이터를 Python으로 Export (CSV)해서 학습에 사용합니다.


🧠 AI 모델 학습 (Python 예시)

Autoencoder 기반 이상 탐지

from sklearn.ensemble import IsolationForest
import pandas as pd

df = pd.read_csv("cylinder_data.csv")
model = IsolationForest()
model.fit(df[['arrival_time']])
df['anomaly'] = model.predict(df[['arrival_time']])
  • 1 → 정상, -1 → 외란
  • 모델을 Pickle 파일로 저장하여 Unity와 연동하거나, threshold 기반으로 Unity 내에서 직접 분류 가능

🖥 Unity 내 이상 감지 및 알람 출력

알람 표시 스크립트

public class AlarmController : MonoBehaviour
{
    public GameObject alarmUI;

    public void CheckForAnomaly(float arrivalTime)
    {
        if (arrivalTime > 2.5f) // 기준 시간 설정
        {
            alarmUI.SetActive(true);
            Debug.Log("⚠️ 외란 감지됨! 알람 발생");
        }
        else
        {
            alarmUI.SetActive(false);
        }
    }
}
  • 외란이 발생하면 빨간 경고창 (AlarmPanel) 활성화

🎮 UI 구성 추천

UI 요소 설명
TextMeshPro "정상 동작" / "외란 발생" 표시
LED Light (빨강) 외란 시 점등
Reset 버튼 다시 테스트 가능
Chart 버튼 로그 기반 도착 시간 시각화 (선택 사항)
 

🎁 기대 결과

  • 실린더 동작의 정상/비정상 판단 가능
  • 외란 발생 시 즉각 경고 → 공정 품질 확보
  • AI 기반 판단으로 휴먼 에러 감소

📊 실습 요약

 

항목 설명
센서 시뮬레이션 실린더 위치/도착 감지
외란 기준 정의 도착 시간, 위치 오차
AI 모델 적용 이상 탐지 기반 분류
알람 출력 Unity UI로 알림 표시
 

🔖 사용 태그

#Unity공정제어 #실린더제어 #AI이상탐지 #Autoencoder #IsolationForest #스마트팩토리 #외란감지 #산업자동화

📌 다음 편 예고

3편. 예측 기반 실린더 속도 제어 – LSTM으로 도착 시간 예측하고 제어 자동화하기

728x90
728x90

🟢 1편: 센서 기반 물체 감지 시뮬레이터 만들기

🎯 목표

Unity에서 광센서와 정전용량 센서를 구현하고, 머신러닝을 통해 물체 감지 이상을 AI로 판단


🖼️ 시뮬레이션 화면 예시

 

설명: 다양한 물체가 이송되고, 센서가 감지 여부를 판단. AI가 센서 이상을 탐지하면 화면에 알림 표시됨.


🔧 Unity 구현 과정

1️⃣ 씬 구성

  • 물체(GameObject) 프리팹: Cube, Sphere, MetalObject
  • 센서 오브젝트 2개 생성: CapacitiveSensor, LightSensor
  • Conveyor Belt 시뮬레이션: Scroll script로 이동 구현

2️⃣ 센서 감지 스크립트 (C#)

public class SensorTrigger : MonoBehaviour
{
    public bool isDetected = false;

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Item"))
        {
            isDetected = true;
        }
    }

    void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Item"))
        {
            isDetected = false;
        }
    }
}

🧠 AI 모델 학습용 데이터 생성

3️⃣ 센서 로그 기록 스크립트

public class SensorLogger : MonoBehaviour
{
    public SensorTrigger capacitiveSensor;
    public SensorTrigger lightSensor;

    void Update()
    {
        string log = Time.time + "," +
                     (capacitiveSensor.isDetected ? 1 : 0) + "," +
                     (lightSensor.isDetected ? 1 : 0);
        Debug.Log(log);
        // 파일 저장 가능 (StreamWriter 등 사용)
    }
}

예시 데이터 포맷 (CSV):

Time,Capacitive,Light,Label
0.5,1,1,Normal
0.6,0,1,Abnormal

📊 AI 모델 학습 (Python 예시)

from sklearn.ensemble import IsolationForest
import pandas as pd

df = pd.read_csv("sensor_log.csv")
model = IsolationForest()
model.fit(df[['Capacitive', 'Light']])
df['anomaly'] = model.predict(df[['Capacitive', 'Light']])

📣 Unity 내 이상 감지 표

void Update()
{
    if (sensorA.isDetected && !sensorB.isDetected)
    {
        // 이상 상태 시 UI 알람
        warningText.SetActive(true);
    }
}

🎁 완성 화면 구성

  • UI Text로 상태 출력 (정상, 이상)
  • 물체 통과 시 센서 동작 애니메이션
  • 이상 감지 시 경고음 또는 빨간 LED 점등 시뮬레이션

📌 요약

  • Unity에서 센서를 구현하고 데이터 수집
  • AI 모델로 이상 감지 학습
  • Unity에서 AI 결과 반영 (알람 출력)

🔁 다음 편 예고:

2편. 실린더 외란 감지 시뮬레이션 만들기 (Autoencoder 활용)

Unity에서 실린더 이동 데이터를 수집하고, 외란 상태를 감지해보자!

728x90
728x90

📅 2025.05.29
✍️ by 메타송이 | 🔍 #스마트팩토리 #설비예지보전 #AI분석 #Python #산업데이터분석


✅ 오늘의 주제

공장 설비 데이터를 기반으로 **"AI로 이상 탐지"**를 실현해보자!
이 글에서는 실제 **제조 데이터(CSV)**를 활용하여

  • 설비 이상 여부를 감지하고,
  • 설비 간 상관관계를 시각화하고,
  • 향후 예지보전(Predictive Maintenance)에 적용하는 방법까지
    실습합니다.

📂 분석에 사용된 데이터

  • 설비 센서 테이블: csv
  • 주요 컬럼:
    • 설비 ID (ex. EQ01 ~ EQ29)
    • 생산 사이클 시간
    • 데이터 수집 시점
    • 작업 구분 코드 (STR/END)

📌 총 데이터 건수: 14,955건


🔍 1. 데이터 시각화 – 설비별 사이클 시간 추이

sns.lineplot(data=df, x='데이터 수집 시점', y='생산 사이클 시간', hue='설비 ID')
  • EQ10, EQ25 등 일부 설비에서 급격한 상승 구간이 포착됨
  • 대부분은 0~100초 사이에서 동작하지만, 일부는 8,000초를 넘음 ❗

 


🧠 2. 상관관계 분석 – 어떤 설비가 비슷하게 움직일까?

pivot_df = df.pivot_table(index='데이터 수집 시점', columns='설비 ID', values='생산 사이클 시간')
sns.heatmap(pivot_df.corr(), annot=True)
  • EQ25 ↔ EQ29: 0.90 이상으로 매우 유사한 패턴!
  • 협업 혹은 동일라인 추정 가능

🚨 3. 이상 탐지 – AI가 감지한 비정상 설비

이상 탐지 기준:

threshold = df['생산 사이클 시간'].mean() + 3 * df['생산 사이클 시간'].std()
df['is_anomaly'] = df['생산 사이클 시간'] > threshold
  • 평균 + 3σ 기준으로 이상치 탐지
  • EQ10, EQ20에서 비정상적으로 긴 생산 시간 감지됨

✅ 시각화 결과: 빨간 점이 이상치!


🧭 4. 예지보전을 위한 다음 스텝은?

  • 작업 STR/END 구간을 기준으로 작업 시간 측정
  • 설비별 평균 작업시간 비교 → 위험도 지표화
  • 향후 AutoEncoder, LSTM 등으로 고장 예측 모델 적용 가능

📌 마무리 요약

항목결과
데이터 크기 14,955건
이상치 탐지 기준 평균 + 3표준편차
가장 유사한 설비쌍 EQ25-EQ29
시각화 도구 Matplotlib, Seaborn
활용 기술 Python, Pandas, Scikit-learn
 

🏁 이런 분들에게 추천합니다!

  • 제조 현장에서 AI 이상탐지를 도입하고 싶은 개발자
  • 스마트팩토리 데이터를 분석하는 데이터 사이언티스트
  • ICT 기반 설비 모니터링 솔루션에 관심 있는 분

🔖 추천 태그

#스마트팩토리, #AI이상탐지, #Python분석, #산업DX, #설비예지보전, #Seaborn, #Pandas, #제조AI, #ICT, #티스토리분석블로그
728x90

+ Recent posts