AI 기반 얼굴 인식 및 온도 추적 자율주행 선풍기 시스템입니다. 실시간 열화상 카메라로 사람을 감지하고, LIDAR와 초음파 센서로 안전하게 이동하며, 가장 더운 사람을 향해 자동으로 바람을 보내는 스마트 쿨링 솔루션입니다.
본 프로젝트는 MQTT 기반 IoT 아키텍처를 채택하여 모바일 앱, 중앙 서버, 그리고 두 개의 라즈베리파이 디바이스를 효과적으로 통합했습니다.
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
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 (정지)
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 앱 수동 제어 지원
시스템은 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"} |
- 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)
- Flutter: 3.x (Cross-platform Mobile App)
- Dart: 3.x
- MQTT Client: Flutter MQTT 패키지
- OpenCV: 4.x (얼굴 인식)
- NumPy: 1.24+ (데이터 처리)
- Paho-MQTT: 1.6+ (MQTT 통신)
- RPi.GPIO: GPIO 제어
- MLX90640: 열화상 센서 드라이버
- Threading: 동시성 처리
- ROS2 Humble: LIDAR 데이터 처리
- YDLidar SDK: X4 모델 드라이버 (오픈소스 커스터마이징)
- 각도 계산 최적화 (angle calculation optimization)
- 스캔 속도 개선
- rclpy: ROS2 Python 클라이언트
- Paho-MQTT: MQTT 통신
- RPi.GPIO: GPIO 제어
- NumPy: 센서 데이터 분석
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 # 이동 제어 상세 문서
- app.js: MQTT 브로커, WebSocket 브로커, 제어 로직, 로깅 시스템 통합
- integrated_face_fan_controller.py: 얼굴 인식, 온도 측정, 선풍기 제어 통합
- OpenCV DNN + Haar Cascade 얼굴 인식
- MLX90640 열화상 센서 (8x8)
- DC/Stepper 모터 GPIO 제어
- integrated_lidar_movement_controller.py: LIDAR, 초음파, 모터 제어 통합
- YDLidar X4 ROS2 통합 (각도 계산 최적화)
- 4방향 초음파 센서
- BTS7960 모터 드라이버 제어
- 다중 객체 동시 감지: 화면 내 여러 사람 동시 인식 및 추적
- 고정밀 온도 측정: 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): 낮은 우선순위
- DNN + Haar Cascade: 이중 얼굴 인식 엔진
- 120fps 고속 처리: 실시간 다중 얼굴 인식
- VNC 환경 최적화: GUI 없는 headless 환경 지원
- 성능 모니터링: FPS, 처리 시간 실시간 측정
- YDLidar X4 기반 탐색:
- 360도 스캔 (5.5Hz 주파수)
- 오픈소스 최적화: 각도 계산 알고리즘 개선으로 정확도 향상
- 장애물 거리 측정 범위: 0.12m ~ 10m
- 초음파 센서: 4방향 근거리 장애물 감지
- 안전 거리 유지: 50cm 이하 자동 정지
- 얼굴 추적 이동: 타겟을 향한 자율 이동
- 장애물 회피: 안전한 경로 자동 탐색
- 정밀 각도 제어: 최적화된 LIDAR 데이터로 정확한 방향 전환
- 온도 기반 속도 제어:
- 37.5°C 이상: 70% 고속
- 36.5-37.5°C: 50% 중속
- 36.5°C 이하: 30% 저속
- 3방향 회전 제어: left/center/right
- 타겟 추적: 사람의 위치에 따른 자동 회전
- 우선순위 제어: 고온 감지 시 자동 가동
- 자동 모드: 완전 자율 작동
- 수동 제어: 이동 방향 및 선풍기 회전 수동 조작
- 실시간 모니터링: 온도, 연결 상태, 시스템 상태
- 메뉴 시스템: 디바이스 연결 상태 확인
- 고온 감지 자동 정지: 37.5°C 이상 감지 시 모든 움직임 차단
- 장애물 자동 정지: 30cm 이하 장애물 감지 시 즉시 정지
- 연결 감시: MQTT 연결 끊김 감지 및 재연결
- 에러 핸들링: 각 단계별 상세 예외 처리
- 로그 시스템: 모든 이벤트 파일 로깅 (10MB 로테이션)
- Check topic names: 발행자와 구독자의 토픽명 일치 확인
- Check QoS levels: 중요 메시지는 QoS 1 사용
- Check client IDs: 각 클라이언트가 고유 ID 사용하는지 확인
- Check server logs:
logs/디렉토리의 최신 로그 파일 확인
- 원인: 반사광, 햇빛, 히터 등
- 해결: 열화상 센서 시야각 조정, 임계값 조정
- 코드 수정:
integrated_face_fan_controller.py의HIGH_TEMP_THRESHOLD변경
- 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- 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 (체크 주기 조정)- Connection Limit: 무제한 (메모리 허용 범위)
- Log Rotation: 10MB 단위
- Max Log Files: 5개
// app.js
const MAX_LOG_SIZE = 10 * 1024 * 1024; // 로그 파일 크기 조정
const MAX_LOG_FILES = 5; // 로그 파일 개수 조정# 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# 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)# Console output includes:
🔄 LIDAR 360도 스캔 완료
⚠️ 장애물 감지: front 방향 30.5cm
🚀 이동 시작: forward, 속도: 50%
⏹️ 이동 중지- GPS 기반 자동 귀환: 설정된 위치로 자동 복귀
- 음성 명령 제어: "선풍기 켜줘", "나한테 와" 등
- 스케줄링 기능: 시간대별 자동 제어
- 다중 선풍기 제어: 여러 대 동시 제어
- AI 기반 패턴 학습: 사용자 선호도 학습 및 자동 조정
- 에너지 절약 모드: 불필요한 작동 최소화
- 클라우드 연동: 원격 모니터링 및 제어
- 날씨 API 연동: 외부 온도에 따른 자동 조정
- Hardware: Raspberry Pi Foundation
- ROS2: Open Robotics
- LIDAR: YDLidar (오픈소스 SDK 각도 계산 최적화)
- MQTT: Eclipse Paho, Aedes
- AI Models: OpenCV DNN, Haar Cascade
- Thermal Sensor: Adafruit MLX90640