개요
무인 사물함을 구현하는 AIoT 프로젝트를 시작하였다.
프로젝트 인원은 총 6명으로 임베디드 2명, 프론트엔드 2명, 백엔드 2명으로 구성된 팀이다.
임베디드를 공부하긴 했지만 백엔드 쪽에 관심이 더 생겨 나는 백엔드 파트를 맡게 되었다.
여태 개인 프로젝트만 진행하다 팀 프로젝트를 처음으로 진행하게 되어 걱정 반 기대 반인 상태이다.
프로젝트 명세를 데드라인까지 성공적으로 구현하고 좋은 결과를 도출하면 좋겠다.
아이디어
프로젝트 주제를 정의하기 까지 수 많은 아이디어가 오고갔다.
무엇보다 AI요소를 접목하여 자율주행이 가능한 IoT를 개발해야 한다는 것이 주제 선정에 크게 애를 먹였다.
삼성의 볼리처럼 가전용 기계가 방을 순회하며 온습도 및 에어컨 등을 자동으로 틀어주는 로봇
공장 재고파악을 자동으로 해주는 로봇
식물 관리를 자동으로 해주는 로봇
얼굴을 인식하여 출/퇴근 혹은 입/퇴실을 자동으로 체크해주는 기능 등
다양한 아이디어가 오고갔으나 최종적으로 무인 창고형 물품 보관 서비스를 주제로 정했다.
1. Why?
스키장, 놀이공원, 쇼핑센터 등 인파가 몰리는 장소의 경우 물품보관소의 갯수가 부족하거나 접근이 용이한 곳에 위치하지 않은 경우에 불편함을 느끼는 것을 타겟으로 잡았다.
2. What?
창고 형태의 물품 보관소를 운영하여 공간 활용도를 최대로 한 무인 물품 보관소를 운영한다.
3. How?
키오스크를 통해 보관소에서 물품 보관을 요청하면 무인 로봇이 창고로 옮겨 보관해 준다.
물품 수령 요청 시 대기열에 삽입되며 차례가 되면 로봇이 보관중이던 물품을 가져온다.
4. WhatEffect?(Benefit)
사용자는 직접 빈 사물함을 찾으러 다닐 수고를 덜 수 있고, 사업장은 자동화를 통해 인건비를 절약할 수 있다.
리스크
1. 병목 현상
사람이 몰리는 시즌엔 로봇이 놀 수도 있고, 피크 타임엔 로봇이 부족해 사용자의 대기시간이 길어져 불편을 느낄 수 있다.
-> 관리자 페이지를 별도로 운영하여 사용 현황 데이터를 누적해 데이터 분석을 통해 개선할 수 있다.
2. 효율성
컨베이어 벨트를 활용한 자동화가 더 간편하고 빠를 수있다.
-> 컨베이어 벨트의 경우 창고 형식의 운영에는 적합하지 않다, 공간 절약의 효과가 주 목적이다.
고객여정맵
- 스키장에 도착하여 스키복으로 갈아입은 후 스키와 보호장구를 렌탈했다.
- 스키화를 신은 후 신발을 보관하기 위해 사물함을 찾아보았으나 실내엔 이미 모든 사물함이 사용중인 상태다.
- 실외 사물함을 이용하기엔 날씨도 춥고 짐이 너무 많아 들고 나가기 불편하다.
- 렌탈 구역 옆에 무인 물품 보관소가 눈에 띈다.
- 제공되는 바구니에 물품을 올리기만 하면 물품을 알아서 보관해 준다기에 맡긴 후 바로 스키를 타러 갔다.
- 2시간 정도 스키를 타다 마지막 슬로프에 리프트를 타고 올라왔다.
- 출발하기 전 물품 수령하기를 요청한 후 마지막 슬로프를 즐긴다.
- 사용한 장비를 정리하고 물품 보관소의 대기열을 확인하니 2번 뒤에 나의 물품을 받을 수 있다.
- 렌탈한 장비를 반납하고 물품 보관소에 방문하니 내 물품이 나와있다.
- 물품을 수령하고 스키장을 유유히 떠난다.
기술 스택
1. 프론트엔드
- Clinet : React
2. 백엔드
- Cloud : AWS EC2
- Server : Spring(JAVA)
- DB : PostgreSQL
3. 임베디드
- Board : RaspberryPi5, NVIDIA Jetson Nano
- Server : Flask(Python)
- AI : Yolov8(OpenCV)
플로우 차트
물품 보관 알고리즘
- 사용자가 키오스크에서 사용 가능한 사물함을 터치
- 핸드폰 번호 입력 후 물품 보관 요청
- 사용자가 물품을 바구니에 담아 보관 구역에 비치 시 담당 로봇이 해당 구역에 물품 보관
- 클라이언트가 서버로 사물함 번호와 핸드폰 번호 전달
- 서버에서 6자리 정수로 이루어진 난수 생성
- 난수를 DB에 전달하여 새로운 토큰ID 생성 및 토큰ID 반환
- 핸드폰 번호를 기준으로 기존 사용 이력 조회, 없다면 생성 후 유저ID 반환
- DB에서 현재 사용 가능 상태인 로봇 탐색 후 존재하면 로봇ID 반환 후 사용 중으로 변경
- 사물함번호의 토큰ID 칼럼을 새로 생성한 토큰ID로 갱신
- 사물함번호, 유저ID, 토큰ID, 로봇ID, 현재 시간을 기준으로 보관 이력 생성
- 클라이언트에게 물품 보관 요청에 대한 성공 여부 전달, 성공 시 생성된 난수 전달
- 서버에서 라즈베리파이로 로봇ID와 사물함 번호 전달
- 라즈베리파이에서 로봇ID와 일치하는 로봇을 제어
- 젯슨 나노와 실시간 객체 인식 정보를 MQTT로 통신하여 사물함 번호의 위치로 이동 및 물품 보관
- 보관 작업 완료 시 서버로 완료 메시지를 보냄, DB에서 해당 로봇ID를 사용 가능 상태로 변경
- 요청 성공 시 유저의 핸드폰 번호으로 사물함 번호 및 난수 전달
물품 반환 알고리즘
- 사용자가 키오스크 혹은 웹 페이지를 통해 물품을 보관한 사물함 터치
- 유저에게 전달된 6자리 난수를 입력
- 서버에서 사물함 번호의 토큰ID값을 참조하여 토큰ID의 Value가 사용자가 입력한 난수와 일치 여부 확인
- 일치할 경우 클라이언트에게 반환 요청 성공 응답을 보냄
- 성공 응답을 받았을 경우 클라이언트 대기열에 유저의 요청 정보 삽입
- 해당 유저의 차례가 된 경우 클라이언트가 서버로 물품 반환 요청 진행
- 서버가 DB에서 사용 가능한 상태인 로봇 ID를 반환 후 사용 중으로 변경
- 서버에서 로봇ID와 사물함 번호를 라즈베리파이로 전달
- 라즈베리파이에서 로봇ID와 일치하는 로봇을 제어
- 젯슨 나노와 실시간 객체 인식 정보를 MQTT로 통신하여 사물함 번호의 위치로 이동 및 물품 수령
- 반환 작업 완료 시 서버로 완료 메시지를 보냄, DB에서 해당 로봇ID를 사용 가능 상태로 변경
- 요청 성공 시 클라이언트의 대기열에서 해당 유저 정보 삭제
'프로젝트 > 무인 사물함' 카테고리의 다른 글
[AIoT] 무인 사물함 프로젝트 물리적 DB 설계 (0) | 2025.01.23 |
---|---|
[AIoT] 무인 사물함 프로젝트 논리적 DB 설계, ERD 작성 (0) | 2025.01.23 |