신발정리해조 - 자동 수납 신발장

MIE capstone
EmSys2025B (토론 | 기여)님의 2023년 6월 17일 (토) 09:02 판 (평가항목)
이동: 둘러보기, 검색

프로젝트 소개

프로젝트 명

자동 수납 신발장

프로젝트 기간

2023.3~2023.6

팀 소개

서울시립대학교 기계정보공학과 20184300** 김*완 (팀장)
서울시립대학교 기계정보공학과 20184300** 박*영
서울시립대학교 기계정보공학과 20184300** 최*
서울시립대학교 기계정보공학과 20184300** 허*

프로젝트 개요

프로젝트 요약

이번 프로젝트에서는 집에 들어갈 때 편리하게 신발을 자동으로 수납해주는 신발장 제작을 목표로 한다. 집에서 나갈 때는 사용자가 원하는 신발을 지정된 위치에서 꺼내갈 수 있도록 한다. 스마트폰 어플리케이션을 통해 나갈 때 신을 신발을 미리 선택하고, 신발을 관리할 수 있는 기능을 제공한다. 자취방 등 좁은 공간에서 혼자서 신발을 정리하기 힘든 상황에 놓인 사람들에게 유용할 것으로 예상된다. 자취방의 현관은 공간이 협소해 신발을 정리하기에 어려움이 있다. 정리를 안하다보면 신발이 섞이고 원하는 신발을 찾기가 어려워진다. 자동 정리 신발장은 이런 고초를 겪는 자취생들의 고민을 해결해준다. 정해진 수납 위치에만 넣으면 자동으로 정리해준다. 또한 앱을 통해 신발을 관리하고 출납하여 보다 쉽게 신발을 찾을 수 있도록 도와준다.

프로젝트의 배경 및 기대효과

가. 배경

자취생들은 자취방에 들어올 때 신발을 바닥에 그냥 벗어 놓을 때가 많다. 현관의 공간이 넓을 경우 큰 문제가 되지 않을 수 있지만, 대부분의 자취방은 공간이 협소하여 벗어놓은 신발이 계속 쌓일 경우 현관에 발 딛을 틈조차 사라질 정도이다. 물론 바닥에 놓인 신발을 손으로 잡아 신발장에 올려놓으면 되지만, 이러한 작업을 기계가 스스로 해 준다면 훨씬 편리해질 것이다. 이번 프로젝트에서는 이러한 편리함에 초점을 맞춰, 사용자가 집에 들어올 때 신발을 단순히 지정된 위치에 벗어놓기만 한다면 자동으로 수납해 주고, 나갈 때는 원하는 신발을 미리 선택하여 정해진 위치에 놓인 신발을 꺼내가는 새로운 형태의 신발장을 제작할 것이다.

나. 기대 효과

집에 들어올 때 손에 집을 가득 들고 있는 경우에는 손을 이용하여 신발을 수납하기 힘들다. 또한 다리 또는 허리를 다친 사람의 경우, 바닥에서 신발을 집는 행동이 매우 불편하다. 이 기계 장치는 신발 수납 과정을 자동화하여 이러한 사람들에게 편의를 제공할 것이다. 이번 프로젝트에서는 여러 사람이 들어올 경우를 고려하지 않아 자취방에서 사용하는 것으로만 한정했지만, 향후 연구개발을 통해 처리 속도를 향상시킨다면 식당이나 헬스장 같은 공동 이용 시설에서도 활용이 가능할 것으로 생각된다.

프로젝트 개발 목표

목적 계통도

가. 실용성

자동정리 신발장이 실용적이기 위해서는 하드웨어 동작이 정확하고 수납/출납에 대한 시나리오가 빠르게 동작해야 한다. 스텝모터를 사용하기 때문에 발판의 움직임을 정확하게 제어할 수 있다. 발판 사이의 간격은 하드웨어가 동작할 때 충돌하지 않도록 정하였다. 간격이 너무 멀면 동작이 느릴 수 있으므로 이러한 부분 또한 고려하여 간격을 정하였다. 신발이 발판 위에 불안정하게 놓여있으면 떨어질 염려가 있다. 불안정하게 놓여있는 신발을 제대로 놓여있을 때까지 하드웨어의 동작은 시작하지 않는다. 이처럼 시나리오가 지연되는 것을 막기 위해 사용자에게 스피커로 신발이 제대로 놓여있지 않음을 알린다.

나. 편의성

자동 정리 신발장은 사용자에게 편리함을 제공한다. 수납하는 발판의 위치를 아래쪽으로 두어 사용자가 손을 이용하지 않고 발로 신발을 넣을 수 있게 한다. 발판에 턱을 달아 신발이 떨어지지 않게 도와주어 안정적으로 신발을 발로 넣을 수 있다. 또한, 출납위치를 위쪽에 둠으로써 출납할 신발과 사용자의 손이 최대한 가깝게 한다. 사용자는 스마트폰의 앱을 이용함으로써 간단히 신발의 리스트를 확인하고 관리할 수 있다. 라즈베리파이와 앱은 신발의 데이터를 firebase를 통해 처리하기 때문에 사용자가 어떠한 IP주소이든 간에 산발 데이터에 대한 접근과 수정을 할 수 있다. Classification을 활용해 수납한 신발을 분류하여 자동으로 리스트에 신발이 업데이트된다. 또한, 새로운 종류/색깔의 신발을 인식했을 경우 앱을 통해 새로운 신발을 리스트에 등록할 수 있다.

다. 경제성

주요 타겟이 자취방에 사는 자취생들이기 때문에 실용성과 편의성을 최대한 보장하는 선에서 재료비를 최소화한다.

동작 시나리오

신발장 수납 및 출납 시나리오

구현 내용

시스템 구성

신발장 시스템 개략도

제품 형태 및 시스템 개략도는 위와 같다. 전체적인 시스템을 자동 신발 수납장(제어부), 데이터베이스, 스마트폰 어플리케이션으로 나눌 수 있다. 자동 신발 수납장은 아두이노를 중심으로 한 입출력 장치와, 아두이노에서 받은 제어 신호를 기반으로 신발 상태에 대한 판단을 수행하는 라즈베리파이로 구성된다. 어플리케이션은 사용자가 신발 상태를 확인하고 신발장에 대한 조작 명령을 받아 처리한다. 데이터베이스는 신발 정보를 저장하여 어플리케이션과 수납장 사이에서 정보를 송수신하는 매개체로 사용된다.

기구부 설계 및 구현

전체 기구부

자동 수납 신발장의 작동 방식은 체인-스프로킷 구조를 이용한 수직 순환 방식이다. 체인 스프로킷 구조를 이용할 때, 체인 구동 중 스프로킷을 지지하고 있는 지지부가 휘어지면 이에 따라 체인의 장력이 약해져, 구동이 원하는 대로 되지 않을 수 있다. 따라서, 이를 방지하기 위해 알루미늄 프로파일을 이용하여, 튼튼한 지지부를 만든 뒤 스프로킷을 결합하여, 처짐에 의한 장력 감소 현상을 최대한 막고자 한다.

가. 구동 메커니즘

구동 메커니즘
(g) 체인에 전달되는 토크








기구부 구동을 위한 모터 및 체인 시스텀 구성은 다음과 같다. 우선, 공간활용성을 높이기 위해서 왼쪽 아래와 같이 스텝 모터를 프레임 내부에 두고, 스텝모터와 스프로킷을 연결한 뒤, 이를 구동축(발판이 부착된 체인을 직접적으로 돌리는 회전축. 이하 구동축) 과 체인으로 연결하여 동력을 전달한다. 구동축의 경우 발판과 충돌할 우려가 있기 때문에, 발판의 이동과 영향이 가장 적은 기구부 중심에 배치하였다(추가적으로 가운데 배치시 구동축을 양 옆 스프로킷에 비해 살짝 아래에 위치시켜 체인이 느슨해 지는 현상을 최대한 막고자 함). 모터에서 토크가 발생하면, 이에 따라 구동축이 움직여 구동축의 토크를 바탕으로 체인을 구동시켜 발판을 수/출납부로 이동시킨다.
위 그림은 모터가 구동축에 토크를 전달하는 상황을 그림으로 나타내고 이를 수식으로 표현한 그림이다. 1번 성분은 모터 축 성분을 의미하고, 2번 성분은 체인을 직접적으로 구동시키는 축의 성분을 의미한다. T 는 토크를 의미, D는 회전마찰을 의미, J는 관성모멘트를 의미한다.
체인이 등속운동을 하고 베어링이 원활하게 작동한다고 가정하여 회전마찰계수가 0이라고 가정하면, 체인에 직접적으로 전달되는 토크는 그림(g)과 같다. 스프로킷의 잇수 N의 경우 같은 크기(N = 10)를 사용하여 구동축에 동력을 전달할 것이기 때문에, T2 = TM 이라고 할 수 있다. 구동축 스프로킷에 가장 많은 힘이 요구되는 상황은 연속되는 발판 두개에 신발이 몰려있어, 신발의 무게를 이겨내며 체인 구동을 해야하는 상황이다. 신발과 발판을 포함한 질량이 최대 2kg 라고 가정하면, (신발 최대 질량은 전투화 무게 기준 – 약1.5kg) 2kg * 9.8m/s2 * 2 = 39.2N 이상의 힘을 체인에 전달해야한다. 구동축과 연결된 스프로킷의 피치원지름은 8.521cm 로, 구동축의 필요 토크 T = F * r = 39.2 * (8.521/2) = 167 N·cm =1.67N·m 이다. 다음으로 신발자의 발판이 원하는 속도로 작동하기 위해 RPM을 고려하였다. 스텝모터의 rpm이 증가하면 그에 따라 모터 인덕턴스와 모터 구동 전압 간의 관계에 영향을 받아, 속도가 증가함에 따라 토크가 감소한다. 사용하고자 하는 모터의 적합성을 따지기 위해서 RPM을 구하였다. 목표 수/출납 속도는 5초 이내이고, 모터를 양방향 제어를 한다는 점을 고려하면, 수/출납부에서 가장 멀리 떨어진 지점까지의 체인 상에서의 거리는 800cm 이다. 이를 바탕으로 RPM을 구하면 다음과 같다.(V : 체인 이동속도)

(h) RPM 계산 수식






구매하고자 하는 모터의 유지토크(holding torque) = 1.89N·m 이고, 모터 사양 견적서에서 확인한 결과 100 RPM 이하에서는 1.8 N ·m 이상의 토크를 가지고 있었다. 필요한 모터의 토크는 1.67N·m 이고, RPM = 35.87 이므로, 모터가 체인을 구동시키기에 적합한 사양을 갖고 있음을 확인할 수 있다.

나. 기구부 구현

주문한 재료를 초안 설계에 맞게 가공 및 조립하여 제작하였다. 알루미늄 프로파일로 기본 틀을 만들고, 프로파일과 호환되는 베어링을 통해 모터 구동축 및 스프로킷 회전축을 구현하였다. 조립과정에서 미세하게 규격이 맞지 않는 부품들은 밀링과 그라인딩으로 가공하여 조립에 이상이 없도록 하였다. 구입한 어태치먼트 체인의 경우, 길이가 1524mm로 개념설계 때 목표로 한 1600mm 보다 길이가 짧기 때문에, 어태치먼트 체인을 하나 더 구입하고 이를 분리한 후 나머지 두 체인에 이어 목표 체인 길이를 만족시킬 수 있었다.

(1) 스프로켓 형번
(2) 베어링 홀더 지지부 및 모터 브라켓 결합사진

기구부의 경우 스프로킷이 쇠 막대를 통해 한쪽 베어링에 외팔보와 같은 형태로 연결되어있는 형태이기 때문에, 처짐이 나타나 체인의 장력이 저하될 우려가 있다. 따라서 처짐 완화를 위해 경량화가 중요하다고 판단했고, 이를 위해 스프로킷의 형번 선택시 결합이 용이하다는 장점을 가진 B형 대신 보다 가벼운 A형을 선택하였고, 이를 축에 직접 용접해서 사용하였다.

모터 중심축의 처짐을 방지하기 위해 베어링 홀더를 사용하려하였으나, 일반적인 베어링 홀더의 중심축 높이는 모터의 중심축 높이와 일치하지 않는다는 문제점이 있었다. 이를 해결하기 위해 5T 금속 판을 가공하여 ㄷ자 형태의 금속 브라켓을 만들고, 이를 모터 지지부 프로파일에 장착함으로써 베어링 홀더의 높이를 높여 회전축을 지지할 수 있게 하였다.
프로파일끼리 수직으로 결합하기 위해서는 일반적으로 L자 브라켓을 이용하여 볼트 결합을 한다. 하지만 L자 브라켓은 그 자체의 부피 때문에 한 프로파일에 수직으로 연결된 두 프로파일 사이의 간격을 매우 가깝게 하기가 어렵다는 단점이 있다. 제작할 기구부의 경우 평기어를 통하여 모터로부터 체인 구동축으로 동력전달을 하려했기 때문에, 프로파일간 간격이 가까워야했다. 따라서 아래 그림과 같이 5t 금속판을 가공하여 T자 지지 브라켓을 제작하여 프로파일간의 간격을 좁힐수가 있었다.
신발을 보관하는 수납 발판의 경우 아크릴을 레이저 가공기로 절단하여 조립 제작할 예정이다. 조립의 용이성과 발판의 견고함을 위해 그림 8-(b) 와 같이 절단면에 홈을 넣어 조립 시 비틀림과 압력에 강한 구조로 제작할 수 있도록 하였다.
베어링의 축방향이 일정하게 고정될 것이라고 예상했던 것과 달리, 베어링의 내륜이 체인의 장력에 의해 기울어져 회전축이 지면과 수평을 이루지 않는 일이 발생하였다. 회전축이 기울어질 경우 체인의 장력이 저하되고, 회전축의 기울어짐으로 인하여 4개의 스프로킷이 평행하지 않게 된다면 체인 구동에 대한 저항력도 강화된다. 이를 해결하기 위해 회전축과 프로파일을 케이블 타이로 연결하여, 회전축이 지나치게 기울어지는 현상을 방지할 것이다.
체인과 모터를 기구부에 체결하고 동작을 확인했을 때, 체인 구동축의 스프로킷이 체인을 제대로 물고 회전하지 못하고 공회전을 하는 현상이 나타났다. 기존 설계 과정에서 체인 구동축을 양끝 스프로킷 회전축보다 살짝만 아래에 위치시켰는데, 이에 따라 구동축 스프로킷에 접촉하는 체인이 일직선(180도)에 가까워 회전 시 스프로킷이 무는 체인 링크의 개수가 적어 이러한 현상이 발생한 것이다. 이를 해결하기 위해 체인 구동축을 아래로 더 내려서 체인과의 접촉 면적을 더 넓혀 보다 더 많은 체인 링크를 스프로킷의 물 수 있도록 하였다, 구동축 위치 변경 후 다시 모터를 연결하여 테스트한 결과, 체인이 원활하게 잘 구동이 되는 것을 확인하였다. 하지만 체인 구동축이 내려감에 따라, 신발 수납부를 위한 공간이 줄어들었기 때문에, 신발장의 높이를 더 늘리는(10cm 정도) 방향으로 기구부를 수정하여 제작할 계획이다.

좌: 외장재 장착 전 HW 골격, 우: 외장재 장착 후 최종 기구부 완성

최종 설명설명설명ㄹㅇㄴㄹㄴㄹ

제어부 및 회로 구현

소프트웨어 설계 및 구현

가. 신발 종류 및 색상 구분

앱에서 사용자가 신발의 목록을 관리하고, 새 신발인지 구분하기 위해 수납 시 기기가 기존 신발에 해당하는지 확인하는 과정이 필요하다. 이번 프로젝트에서는 신발의 종류와 색상으로 모든 신발을 구분할 수 있다고 가정한다. 신발의 종류는 구두, 슬리퍼, 스니커즈 3종류로 하며 신발의 색상은 빨강, 초록, 파랑, 하양, 검정 5가지로 하여 총 15종류로 신발을 분류한다.

1. 신발 종류 구분

이번 프로젝트에서 여러 개의 신발 종류를 구분해내야 하므로 class가 여러 개인 Multi-class classification을 수행한다. 데이터셋으로는 kaggle의 shoe dataset을 사용하였고, 학습에 방해가 될 것으로 예상되는 이미지를 선별하는 작업을 수작업으로 진행하였다. 선별한 데이터셋을 train:valid:test = 6:2:2로 나누고, 베이스라인 모델로는 3층의 CNN 모델을 사용했다. 구두, 슬리퍼, 운동화 3종류의 신발들을 딥러닝 서버에서 학습시키고, 라즈베리파이에서 어떤 종류의 신발인지 추론한다. 실제 환경에서 촬영한 사진을 사용하여 transfer learning을 진행할 예정이다. 성능은 다음과 같다

2. 신발 색상 구분
신발 색상 검출 과정

신발 색상 검출의 경우 <신발 개수 파악>에서 촬영한 이미지를 활용하고, 각 색상에 대한 mask를 생성하여 넓이를 비교하여 이 신발을 가장 잘 나타낼 수 있는 색상 하나를 선택한다. mask 생성 예시는그림 (a)와 같다. 신발장에 넣는 신발은 누구나 보기에도 한 가지 색상으로 명확히 드러나는 신발로 한정한다. RGB(빨간색, 초록색, 파란색)을 사용한 신발의 경우 회색, 검은색을 같이 사용하는 경우가 많기 때문에, 회색/검은색이 더 넓은 범위를 차지하더라도 RGB을 우선시하기로 하였다. RGB색 중 가장 많은 면적을 갖는 색을 선택하고, 만약 3가지 RGB색 모두 기준치에 미치지 못할 경우 회색/검은색 중 한 가지로 판별한다. 알고리즘은 그림 (b)와 같다. 인식을 쉽게 하기 위해 발판의 색을 흰색으로 제작한다.

나. 신발 개수 파악

신발 색상 검출 과정

신발의 개수를 파악하기 위해 발판에 10개의 노란 색 스티커를 부착하고, 카메라로 촬영한 이미지에서 노란색 스티커의 개수를 감지하여 신발이 몇 개 올라가 있는지 파악한다. 감지 방법은 노란색의 범위를 지정하여 opencv 알고리즘을 통해 노란색 부분의 mask를 추출해 contour를 생성하고, contour의 개수를 리턴한다. 신발이 없을 경우는 그림 (a)에서 10개의 스티커가 모두 감지되고, 신발이 1짝일 경우는 그림 (b)에서 4개의 스티커가 감지된다. 그리고 신발이 2짝으로 올바르게 올라갈 경우 그림 (c)에서 모든 스티커가 가려 0개가 감지된다.
신발에 노란색 무늬가 존재할 경우 이것을 스티커로 인식하여 오동작을 일으킬 위험성이 있다. 이를 방지하기 위해 색상뿐만 아니라 contour의 넓이와 모양 또한 고려하기로 하였다. 똑같은 크기와 모양의 스티커를 바닥에 부착하고, 사전에 스티커의 크기를 계산하여 범위 내에 있는 경우만 인식한다. 모양의 경우 두 contour의 모양 일치 정도를 계산하는 cv2.matchShapes 함수를 사용한다. 사전에 바닥에 부착된 스티커 1장에서 contour를 뽑아내어 촬영한 신발 사진의 contour와의 모양 불일치 정도(distance)를 계산하여 임계값보다 낮을 경우만 카운트한다.

다. 데이터베이스

  • init collection
document field 설명
value difference shelf_location - shelf_num 값 저장하여
수납부, 출납부에 위치한 shelf_location 값 파악
  • shoe collection
field 이름 유형 설명 가능한 값
shoe_name string 사용자가 지정한 신발의 이름 -
shoe_type string 신발의 종류 shoes, slippers, sneakers
shoe_color string 신발의 색상 white, black,
red, green, blue
shelf_num number 신발이 저장된 발판 번호 1, 2, 3, 4
shelf_location number 신발의 발판이 신발장의 어떤
위치에 해당하는지 사전 정의된 숫자
1, 2, 3, 4
shelf_status boolean 신발이 저장되어 있는지 유무 True, False
order number 어플리케이션 화면에 신발 정보를
띄울 순서
1, 2, ... , 저장된 신발 개수
remain boolean 신발 정보를 삭제할지를
판단하기 위한 변수
True, False
  • signal collection
document field 설명
From_app_to_RPi DocName 사용자가 출납을 원하는 신발의
이름을 RPi에게 전달하기 위해 사용
Fcm_token FCM을 사용하기 위한 토큰
Request 출납 요청을 보낼 때 사용,
출납이 완료되기까지 앱의 동작을 막기 위함
Sign_question Sign_new 새로운 신발을 인식했을 때 RPi에서
사용자 응답을 기다리기 위해 사용
Firebase Storage에 저장된 신발 사진의 모습

Firebase 데이터베이스를 이용해 신발장의 작동에 필요한 신발, 발판의 정보와 신발 이미지를 한번에 관리한다. Firestore Database에는 이미지를 업로드할 수 없기에, storage에 이미지를 저장하고 Firestore Database에는 이미지의 주소를 저장한다. Firestore Database의 경우 collection, document, field로 이루어져 있다. 우선 init 이름의 collection을 만들어 현재 shelf_num과 shelf_location 값의 차이를 저장한다. 정보를 저장할 collection의 이름은 shoes로 하고, document의 이름은 신발의 이미지 이름으로 한다. 이미지 이름은 촬영한 시점의 날짜-시간.jpg로 하여 유일하므로 document에 사용 가능하다. 각 document에 저장할 field의 정보는 다음 표 5과 같다. shelf_num과 shelf_location의 경우 유형을 number로 하여 추후 신발장의 발판 수를 확장하는 것을 고려하여 코드를 구현할 계획이다. 수납부의 shelf_location은 3, 출납부의 shelf_location은 1로 한다.

초기에 발판이 모두 비어있는 경우 shelf_location(회색 상자의 숫자)의 갱신
shelf_location 2, 4 위치에 신발이 차 있는 경우 shelf_location의 갱신

shelf_location의 갱신을 그림으로 나타내면 위와 같다. 그림에서 회색 상자는 shelf_location을 의미하고, 빨강/노랑/초록/파랑 상자는 shelf_num을 의미한다. 초기에 발판이 모두 비어있는 경우에는 발판이 1칸(1번 발판이 3->2 위치로) 이동한다. shelf_location 2, 4 위치에 신발이 차 있는 경우에는 발판이 2칸(1번 발판이 3->1 위치로) 이동한다.

프로젝트 결과

최종 결과물

결과물 사진 혹은 시연 영상 등

미구현 내용

  • 신발 종류 파악 정확도 개선

- 현재 60%인 모델 성능을 85% 이상으로 개선

  • 여러 사용자 동시 이용 가능

- Firebase 구글 인증 과정을 추가하여 여러 사용자를 등록하고, 토큰 관리 방법 탐색

  • 예외 처리

- 신발 이외 의도치 않은 물건이 들어가는 경우 추가

프로젝트 평가

평가항목

평가 항목 평가 방법 적용 기준 개발 목표치 비중
발판 위치
정확성
10회씩 수납을 수행하며 발판 위치의
허용 오차 범위가 1cm 이내에
위치하는지 여부를 카운트
Accuracy 90% 이상 35%
신속성 10회의 출납 과정을 통해 사용자가
APP에서 신발을 고른 후 신발이
출납부에 위치할 때까지 걸린 시간
Time 10회 평균
5sec 이내
20%
신발 개수
감지 정확도
정상인 경우, 이상이 있는 경우
각각 10회 측정하여
제대로 판단하는지 카운트
Accuracy 90% 이상 20%
신발 종류
파악 정확도
20개의 신발 수납 과정에서
신발 종류 및 색상을 모두 정확히
판단하는지 카운트
Accuracy 85% 이상 15%
APP 연동성 수납/출납 후 신발 정보가 APP에
정확히 갱신되는지 수납/출납 각각
10회 진행하여 카운트
Accuracy 90% 이상 10%

평가결과

느낀점