Skip to content

CAPSTONE-AI-FAN/capstone-server

Repository files navigation

AI 펑순기(제10회 대한임베디드공학회 ICT 대학생 논문경진대회 출품작)

AI 기반 얼굴 인식 및 온도 추적 자율주행 선풍기 시스템입니다. 실시간 열화상 카메라로 사람을 감지하고, LIDAR와 초음파 센서로 안전하게 이동하며, 가장 더운 사람을 향해 자동으로 바람을 보내는 스마트 쿨링 솔루션입니다.

Project Architecture

본 프로젝트는 MQTT 기반 IoT 아키텍처를 채택하여 모바일 앱, 중앙 서버, 그리고 두 개의 라즈베리파이 디바이스를 효과적으로 통합했습니다.

System Architecture

graph TB
    subgraph App["Flutter Mobile App"]
        UI[사용자 인터페이스]
    end

    subgraph Server["Node.js MQTT Broker :1883"]
        BROKER[MQTT Broker<br/>메시지 라우팅]
    end

    subgraph Raspbian[" Raspbian OS Server"]
        RPI[얼굴인식 + 온도측정<br/>선풍기 제어]
    end

    subgraph Ubuntu["Ubuntu OS Server"]
        UPI[LIDAR + 초음파<br/>이동 제어]
    end

    UI <-->|WebSocket :8883| BROKER
    BROKER <-->|sensor/face/thermal<br/>control/fan/rotation| RPI
    BROKER <-->|sensor/lidar/data<br/>control/movement| UPI

    RPI -.->|MQTT 통신| BROKER
    UPI -.->|MQTT 통신| BROKER

Loading

MQTT 기반 두 서버 간 통신 흐름

sequenceDiagram
    participant App as Flutter App
    participant Broker as MQTT Broker
    participant Rasp as Raspbian Server
    participant Ubu as Ubuntu Server

    App->>Broker: 자동모드 ON
    Broker->>Rasp: control/auto_mode
    Broker->>Ubu: control/auto_mode

    loop 센서 데이터
        Rasp->>Broker: sensor/face/thermal<br/>{faces: [<br/>  {id:1, temp:37.8°C},<br/>  {id:2, temp:36.9°C}<br/>]}
        Ubu->>Broker: sensor/lidar/data (장애물)
    end

    Note over Broker: 다중 객체 온도 비교<br/>person_1(37.8°C) > person_2(36.9°C)<br/>→ person_1 타겟 선택
    Broker->>Rasp: control/fan/rotation<br/>(target: person_1, speed: 70%)

    Note over Broker: 타겟 위치 기반 이동 계산
    Broker->>Ubu: control/movement (좌회전)

    Ubu->>Broker: sensor/ultrasonic (장애물!)
    Broker->>Ubu: control/movement (정지)
Loading

Node.js Server (Port 3000) - MQTT Broker & Controller:

  • Protocol: MQTT (Port 1883), WebSocket-MQTT (Port 8883)
  • Responsibilities:
    • MQTT Broker: 모든 디바이스와 앱의 통신 허브
    • Control Logic: 센서 데이터 분석 및 제어 명령 발행
    • Logger: 파일 기반 로그 시스템 (10MB 로테이션)
    • High Temperature Detection: 37.5°C 이상 감지 시 선풍기 자동 제어
    • Obstacle Detection: 장애물 감지 시 이동 정지 명령 발행
    • Real-time Status Broadcasting: 시스템 상태 실시간 전파

Raspbian Pi - Face Recognition & Fan Control:

  • Sensors: MLX90640 열화상 센서, Camera Module
  • Actuators: DC Motor (fan), Stepper Motor (rotation)
  • Responsibilities:
    • 120fps 고속 얼굴 인식 (DNN + Haar Cascade)
    • 개인별 정밀 온도 측정 (MLX90640)
    • Person Tracking System (얼굴 ID 추적)
    • 선풍기 회전 제어 (left/center/right)
    • 선풍기 속도 제어 (온도 기반)
    • MQTT 양방향 통신

Ubuntu Pi - LIDAR & Movement Control:

  • Sensors: YDLidar X4 (ROS2), Ultrasonic Sensors (4방향)
  • Actuators: BTS7960 Motor Driver (2개)
  • Responsibilities:
    • ROS2 기반 YDLidar 데이터 처리
    • YDLidar 오픈소스 최적화:
      • 각도 계산 알고리즘 개선 (정확도 향상)
      • 스캔 데이터 처리 성능 최적화
    • 360도 장애물 감지 및 회피
    • 모터 제어 (전진, 후진, 좌회전, 우회전)
    • 안전 거리 유지 (50cm 이하 시 자동 정지)
    • 얼굴 추적 기반 자율 이동
    • Flutter 앱 수동 제어 지원

MQTT Topic Architecture

시스템은 RESTful 형태의 계층적 토픽 구조를 사용합니다:

Topic Direction QoS Description Payload Example
control/auto_mode App/Server → All 1 자율주행 모드 ON/OFF {"enabled": true, "timestamp": 1234567890}
control/movement Server → Ubuntu 1 이동 명령 {"direction": "forward", "priority": "high"}
control/direction App → Raspbian 1 수동 방향 제어 {"direction": "left"}
control/fan/rotation Server → Raspbian 1 선풍기 회전 제어 {"action": "rotate", "speed": 70}
sensor/face/thermal Raspbian → Server 0 얼굴 인식 + 온도 데이터 {"faces": [{...}], "timestamp": 1234567890}
sensor/temperature/data Raspbian → Server 0 환경 온도 데이터 {"temperature": 36.5}
sensor/lidar/data Ubuntu → Server 0 LIDAR 스캔 데이터 {"ranges": [...], "angle_min": -3.14}
sensor/ultrasonic/data Ubuntu → Server 0 초음파 센서 거리 데이터 {"front": 120.5, "back": 150.0}
fan/status Raspbian → Server 0 선풍기 상태 피드백 {"is_active": true, "direction": "left"}
movement/status Ubuntu → Server 0 이동 상태 피드백 {"is_moving": true, "direction": "forward"}
system/status Server → App 0 시스템 전체 상태 브로드캐스트 {"mode": "auto", "connected_devices": 2}
device/status All → Server 0 디바이스 연결 상태 {"device_id": "...", "status": "online"}

Technology Stack

Backend (Server)

  • Node.js: 18+ (MQTT Broker & Controller)
  • Aedes: 0.51+ (MQTT Broker)
  • Express: 4.21+ (REST API)
  • WebSocket-Stream: 5.5+ (MQTT over WebSocket)
  • MQTT.js: 5.10+ (MQTT Client)

Frontend (Mobile)

  • Flutter: 3.x (Cross-platform Mobile App)
  • Dart: 3.x
  • MQTT Client: Flutter MQTT 패키지

Raspbian Pi (Python 3.11+)

  • OpenCV: 4.x (얼굴 인식)
  • NumPy: 1.24+ (데이터 처리)
  • Paho-MQTT: 1.6+ (MQTT 통신)
  • RPi.GPIO: GPIO 제어
  • MLX90640: 열화상 센서 드라이버
  • Threading: 동시성 처리

Ubuntu Pi (Python 3.11+ / ROS2)

  • ROS2 Humble: LIDAR 데이터 처리
  • YDLidar SDK: X4 모델 드라이버 (오픈소스 커스터마이징)
    • 각도 계산 최적화 (angle calculation optimization)
    • 스캔 속도 개선
  • rclpy: ROS2 Python 클라이언트
  • Paho-MQTT: MQTT 통신
  • RPi.GPIO: GPIO 제어
  • NumPy: 센서 데이터 분석

Project Structure

capstone-server/                    # 메인 레포지토리
├── app.js                          # Node.js MQTT Broker & Controller
├── package.json                    # Node.js 의존성
├── package-lock.json               # 의존성 잠금 파일
│
├── rasp/                           # 라즈베리파이 모듈
│   ├── rasbian/                   # Raspbian OS Pi (얼굴 인식 + 선풍기)
│   │   ├── integrated_face_fan_controller.py  # 메인 통합 컨트롤러
│   │   ├── facial/                # 얼굴 인식 및 온도 센서 모듈
│   │   │   ├── temp_and_face_mqtt.py       # MQTT 통신 모듈
│   │   │   ├── temp_and_face_detect.py     # 얼굴+온도 감지
│   │   │   └── camera_test.py              # 카메라 하드웨어 테스트
│   │   └── fan/                   # 선풍기 제어 모듈
│   │       ├── fan_controller.py           # GPIO 선풍기 제어
│   │       └── fan_power_test.py           # 선풍기 하드웨어 테스트
│   │
│   └── ubuntu/                    # Ubuntu OS Pi (YDLidar + 이동)
│       ├── integrated_lidar_movement_controller.py  # 메인 통합 컨트롤러
│       ├── lidar/                 # YDLidar X4 모듈
│       │   └── lidar_mqtt_bridge.py        # ROS2-MQTT 브리지 (각도 최적화)
│       ├── movement/              # 모터 제어 모듈
│       │   └── bts7960_mqtt.py             # MQTT 모터 제어 (BTS7960)
│       └── sensor/                # 센서 모듈
│           └── obstacle_avoidance.py       # 초음파 장애물 회피
│
├── tests/                          # 테스트 및 스크립트
│   ├── TEST_GUIDE.md              # MQTT 통신 테스트 가이드
│   ├── test_auto_mode.py          # 자동 모드 테스트
│   ├── install_requirements.sh    # Python 패키지 설치 스크립트
│   ├── run_mqtt_test.sh           # MQTT 통합 테스트 스크립트
│   └── run_auto_mode_test.sh      # 자동 모드 실행 스크립트
│
├── logs/                           # 서버 로그 (자동 생성, .gitignore)
│   └── aifan-server_*.log         # 10MB 단위 로테이션 로그
│
├── requirements_ros2.txt           # ROS2 Python 의존성
├── README.md                       # 📖 프로젝트 메인 문서 (본 파일)
└── README_Movement_Control.md      # 이동 제어 상세 문서

주요 파일 설명

서버 (Node.js)

  • app.js: MQTT 브로커, WebSocket 브로커, 제어 로직, 로깅 시스템 통합

Raspbian OS Pi

  • integrated_face_fan_controller.py: 얼굴 인식, 온도 측정, 선풍기 제어 통합
    • OpenCV DNN + Haar Cascade 얼굴 인식
    • MLX90640 열화상 센서 (8x8)
    • DC/Stepper 모터 GPIO 제어

Ubuntu OS Pi

  • integrated_lidar_movement_controller.py: LIDAR, 초음파, 모터 제어 통합
    • YDLidar X4 ROS2 통합 (각도 계산 최적화)
    • 4방향 초음파 센서
    • BTS7960 모터 드라이버 제어

Core Features

1. Smart Thermal Tracking

  • 다중 객체 동시 감지: 화면 내 여러 사람 동시 인식 및 추적
  • 고정밀 온도 측정: MLX90640 열화상 센서 (8x8 배열)로 개인별 체온 측정
  • 온도 비교 알고리즘: 감지된 모든 사람의 온도를 실시간 비교
  • 최고온 우선순위 타겟팅:
    • 여러 명 감지 시 온도가 가장 높은 사람을 자동 선택
    • 예: person_1 (37.8°C) > person_2 (36.9°C) → person_1 타겟
  • Person Tracking: 얼굴 ID 기반 지속적 추적 (이동 시에도 유지)
  • 실시간 타겟 전환: 온도 변화에 따른 동적 타겟 재선택
  • 온도 임계값 시스템:
    • 고온 (≥37.5°C): 즉시 타겟팅 및 고속 선풍기 가동
    • 중온 (36.5-37.5°C): 우선순위 중간
    • 저온 (<36.5°C): 낮은 우선순위

2. AI Face Recognition

  • DNN + Haar Cascade: 이중 얼굴 인식 엔진
  • 120fps 고속 처리: 실시간 다중 얼굴 인식
  • VNC 환경 최적화: GUI 없는 headless 환경 지원
  • 성능 모니터링: FPS, 처리 시간 실시간 측정

3. Autonomous Movement

  • YDLidar X4 기반 탐색:
    • 360도 스캔 (5.5Hz 주파수)
    • 오픈소스 최적화: 각도 계산 알고리즘 개선으로 정확도 향상
    • 장애물 거리 측정 범위: 0.12m ~ 10m
  • 초음파 센서: 4방향 근거리 장애물 감지
  • 안전 거리 유지: 50cm 이하 자동 정지
  • 얼굴 추적 이동: 타겟을 향한 자율 이동
  • 장애물 회피: 안전한 경로 자동 탐색
  • 정밀 각도 제어: 최적화된 LIDAR 데이터로 정확한 방향 전환

4. Smart Fan Control

  • 온도 기반 속도 제어:
    • 37.5°C 이상: 70% 고속
    • 36.5-37.5°C: 50% 중속
    • 36.5°C 이하: 30% 저속
  • 3방향 회전 제어: left/center/right
  • 타겟 추적: 사람의 위치에 따른 자동 회전
  • 우선순위 제어: 고온 감지 시 자동 가동

5. Mobile App Control

  • 자동 모드: 완전 자율 작동
  • 수동 제어: 이동 방향 및 선풍기 회전 수동 조작
  • 실시간 모니터링: 온도, 연결 상태, 시스템 상태
  • 메뉴 시스템: 디바이스 연결 상태 확인

6. Safety Features

  • 고온 감지 자동 정지: 37.5°C 이상 감지 시 모든 움직임 차단
  • 장애물 자동 정지: 30cm 이하 장애물 감지 시 즉시 정지
  • 연결 감시: MQTT 연결 끊김 감지 및 재연결
  • 에러 핸들링: 각 단계별 상세 예외 처리
  • 로그 시스템: 모든 이벤트 파일 로깅 (10MB 로테이션)

MQTT Message Not Received

  1. Check topic names: 발행자와 구독자의 토픽명 일치 확인
  2. Check QoS levels: 중요 메시지는 QoS 1 사용
  3. Check client IDs: 각 클라이언트가 고유 ID 사용하는지 확인
  4. Check server logs: logs/ 디렉토리의 최신 로그 파일 확인

High Temperature False Positives

  • 원인: 반사광, 햇빛, 히터 등
  • 해결: 열화상 센서 시야각 조정, 임계값 조정
  • 코드 수정: integrated_face_fan_controller.pyHIGH_TEMP_THRESHOLD 변경

Performance Optimization

Raspbian Pi (Face Recognition)

  • Frame Rate: 120fps (조정 가능)
  • Resolution: 640x480 (기본값)
  • Face Detection: DNN (정확도) + Haar Cascade (속도)
  • Memory Management: Garbage Collection 주기 실행
# integrated_face_fan_controller.py
CAMERA_FPS = 120  # 프레임 레이트 조정
CAMERA_WIDTH = 640  # 해상도 조정
CAMERA_HEIGHT = 480

Ubuntu Pi (LIDAR)

  • Scan Rate: 5.5 Hz
  • Angle Range: 360도
  • Data Processing: ROS2 QoS 최적화
# integrated_lidar_movement_controller.py
SAFE_DISTANCE = 50.0  # cm (안전 거리 조정)
MOVEMENT_CHECK_INTERVAL = 0.1  # seconds (체크 주기 조정)

Server (MQTT Broker)

  • Connection Limit: 무제한 (메모리 허용 범위)
  • Log Rotation: 10MB 단위
  • Max Log Files: 5개
// app.js
const MAX_LOG_SIZE = 10 * 1024 * 1024; // 로그 파일 크기 조정
const MAX_LOG_FILES = 5; // 로그 파일 개수 조정

Monitoring & Debugging

Server Logs

# Real-time log monitoring
tail -f logs/aifan-server_*.log

# Search for errors
grep "ERROR" logs/aifan-server_*.log

# Search for high temperature events
grep "고온 감지" logs/aifan-server_*.log

Raspbian Pi Logs

# Console output includes:
👥 감지된 얼굴: 2명
  - person_1: 37.8°C (high) 최고온
  - person_2: 36.9°C (medium)
🎯 타겟 선택: person_1 (온도 비교 결과: 37.8°C > 36.9°C)
💨 선풍기 회전 시작: 속도 70%
🔄 선풍기 방향 변경: center → left (대상: person_1)

# 타겟 전환 시나리오
👥 감지된 얼굴: 3명
  - person_1: 37.2°C (medium)
  - person_2: 38.1°C (high) 최고온
  - person_3: 36.5°C (normal)
🔄 타겟 재선택: person_1 → person_2 (온도 상승)
💨 선풍기 방향 변경: left → right (대상: person_2)

Ubuntu Pi Logs

# Console output includes:
🔄 LIDAR 360도 스캔 완료
⚠️ 장애물 감지: front 방향 30.5cm
🚀 이동 시작: forward, 속도: 50%
⏹️ 이동 중지

Future Features

  1. GPS 기반 자동 귀환: 설정된 위치로 자동 복귀
  2. 음성 명령 제어: "선풍기 켜줘", "나한테 와" 등
  3. 스케줄링 기능: 시간대별 자동 제어
  4. 다중 선풍기 제어: 여러 대 동시 제어
  5. AI 기반 패턴 학습: 사용자 선호도 학습 및 자동 조정
  6. 에너지 절약 모드: 불필요한 작동 최소화
  7. 클라우드 연동: 원격 모니터링 및 제어
  8. 날씨 API 연동: 외부 온도에 따른 자동 조정

Acknowledgments

  • Hardware: Raspberry Pi Foundation
  • ROS2: Open Robotics
  • LIDAR: YDLidar (오픈소스 SDK 각도 계산 최적화)
  • MQTT: Eclipse Paho, Aedes
  • AI Models: OpenCV DNN, Haar Cascade
  • Thermal Sensor: Adafruit MLX90640

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published