ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Bixby Studio] 지하철 알림이.capsule
    프로그래밍/Bixby Studio 2019. 7. 2. 23:47
    < 개요 >
    1. 빅스비 캡슐 챌린지란 ?
    2. 빅스비 스튜디오를 다루기 위한 기본소양
    3. 지하철 알림이.capsule 에 대한 간단한 설명
    4. 문제 해결

     

    빅스비 캡슐 챌린지란 ?


    삼성에는 빅스비라는 인공지능 기술이 있습니다. 캡슐(Capsule)이란 빅스비 지원 기기에서 이용할 수 있는 서비스로 빅스비 플랫폼 전용으로 개발된 서비스를 말합니다. 쉽게 말해서 이 캡슐을 개발하면 사용자가 원하는 빅스비 기능을 구현할 수 있는 것입니다.  

     

    이 대회의 참가자격은 개인, 단체, 법인까지 모두 참여가 가능합니다. 그렇기 때문에 일반적인 대학생 참가팀들은 경쟁력이 다소 부족할 수 있어 보입니다. 하지만 외부 개발자들은 기존에 만들어진 애플리케이션을 연동하여 사용하는 기능을 제한하였기 때문에 절대 이기지 못할 싸움은 아니라고 생각됩니다. 또한, 빅스비 스튜디오(Bixby Studio)라는 개발 프로그램 자체가 출시된 지 얼마 되지 않았고, 이 프로그램에 대한 정보가 거의 없기 때문에 모두가 동일선상에서 출발한다고 볼 수 있습니다.

     

     

     

    빅스비 스튜디오(Bixby Studio)를 다루기 위한 기본소양


    정말 계산기와 같이 가벼운 캡슐 개발이 아닌 이상 캡슐을 개발하기 위해서는 Assets, Code, Models, Resources, Capsule.bxb 이렇게 5가지의 구성요소가 필요합니다. Assets 은 결과 화면에서 필요한 이미지 파일 등을 보관하는 폴더입니다. 나머지 4개의 구성요소는 모두 소스파일입니다. 여기서 Code 라는 폴더에는 자바 스크립트(JAVA Script) 파일이 들어가고 나머지 3개의 구성요소는 모두 빅스비 개발 언어를 사용합니다. 그런데 빅스비 개발 언어 역시 자바 스크립트를 기본으로 만들어졌습니다.

     

    이제 어떤 언어를 공부해야 하는지 감이 오시나요? 빅스비 스튜디오를 다루기 위해서는 기본적으로 자바 스크립트를 알고 있어야 합니다. 저는 C/C++ 만을 사용하고 있었기 때문에 개발을 시작하는 단계에서 많은 어려움이 있었습니다. 특히, 메모리 관련 문제들이 가장 어려웠습니다. 이 문제에 대해서는 문제 해결 파트에서 자세히 설명드리겠습니다. 

     

    조금 더 말씀드리자면, 빅스비 개발언어는 다른 자바(JAVA), 파이썬(Python), C/C++  등의 프로그래밍 언어들보다 직관적이고 간단합니다. 다른 언어들은 범용이지만 빅스비 언어는 오직 캡슐 개발을 위한 언어이기 때문입니다. 임베디드나 전자공학을 전공으로 하는 학생들은 하드웨어와 컴퓨터 사이의 포트를 연결해주는 프로그램처럼 느끼실 수도 있습니다. 

     

     

     

    지하철 알림이


    지하철 알림이의 대표적인 기능은 말 한마디로 모든 지하철 정보를 알려주는 것입니다.

    실제로 빅스비에서 사용하기 위해서는 캡슐 호출 명인 "지하철 알림이" 라는 발화를

    같이 말해주셔야 합니다.

     

    < 트레이닝된 발화 >

    1. 신촌까지 알려줘

    2. 원인재에서 신촌까지 알려줘

    3. 10분 뒤 원인재에서 신촌까지 알려줘

     

    라는 명령을 하면 아래와 같은 결과가 출력됩니다.

     

     

     

     

    보시면 현재시간에서 가장 가까운 출발시간을 알려줍니다. 

    또한, 환승 노선정보를 바로 알 수 있도록 이미지로 표현하였습니다.

    2호선의 세부 노선을 확인하고 싶다면 2호선이 포함된

    네모칸을 클릭하시면 아래와 같은 화면이 출력됩니다.

     

     

     

     


     

    이제 폴더를 한번 훑어보겠습니다. 

     

     

     

     

    저희 팀도 역시 기본 구성요소를 만든 후 시작했습니다.

    Assets 부터 봅시다.

     

     

     

    images 폴더 안에는 지하철 호선 이미지들이 들어가 있습니다.

    ex) 1호선, 2호선 

     

     

    그리고 train.png 는 저희 지하철 알림이의 아이콘 이미지입니다. ㅎ

    이 글의 썸네일 이미지죠?

     

     

     

    Code 폴더입니다. 

    FindPath.js 에는 자바 스크립트로 구현된 지하철 최단거리 알고리즘이 있습니다.

    station.js 와 vertices.js 에는 지하철 역 번호, 다음 역과의 거리등의 정보가 있습니다.

     

    pathData 가 메모리 문제를 해결하기 위해 만들어진 폴더입니다.

    자세한 설명은 역시 문제 해결에서.

     

     

     

     

    models 폴더 안에 있는 actions 와 concepts 역시 기본 구성요소입니다.

    actions 의 FindPath 는 어떤 발화를 입력받아서 Code에 있는 js 파일에 넘겨줄 것인지 

    결정해주는 파일입니다. 

    가장 핵심적인 파일이라고 할 수 있습니다.

     

    concepts 에는 액션에서 사용되는 변수들을 만들어 놓은 폴더 정도로 생각하시면

    편할 것 같습니다. 저희 같은 경우 다양한 기능을 넣으려고 하다 보니

    concepts의 양이 굉장히 많아졌습니다. 

     

     

     

    resources 파일에 있는 모든 파일들이 중요하지만 몇 가지만 설명하고 넘어가겠습니다.

     

    1. base -> capsule.properties 

    저희는 지하철 정보를 가져오기 위해서 다양한 Open API 를 사용하였습니다.

    이러한 API 들을 호출하기 위한 링크들을 저장해놓은 공간입니다.

     

    2. base -> endpoints.bxb

    action 의 입출력 변수들과 code -> js 파일들의 입출력 값을 맵핑시켜주는 파일입니다.

    저는 이 부분에서 베릴로그라는 프로그래밍 언어의 포트 연결 작업과 

    많이 비슷하다는 생각을 했습니다.

     

    3. ko-KR -> training

    가장 캡슐의 기능을 직관적으로 확인이 가능한 파일입니다.

    보시면 아시겠지만 다른 일반적인 파일들과 다르게 독립적인 아이콘을 가지고 있습니다.

    이 파일에서는 개발자가 특정 발화에 대해서 학습을 시킬 수 있습니다.

     

     

    마지막으로 capsule.bxb 파일입니다.

     

     

     

    이 파일에는 캡슐의 버전 정보, 사용 언어 설정, 필요한 라이브러리 호출 등의 

    작업을 수행합니다.

     

     

     

     

     

    문제 해결


    첫 번째 문제는 알고리즘이었습니다.

    저희가 처음 지하철 최단거리 알고리즘을 구현하기 위해 사용한 알고리즘은 다익스트라 알고리즘이었습니다. 하지만 지하철의 노선은 상상 이상으로 복잡해서 간선의 가중치만으로는 정보가 부족했습니다.

     

    첫 번째 해결 :

     그래서 저희는 노선의 다양한 정보를 적극 활용하기 위해서 A* 알고리즘을 사용했습니다. OPEN API 를 통해서 지하철 정보를 가져와 간선의 가중치뿐만 아니라 위성 좌표를 통한 명확한 거리를 계산 값에 추가했습니다. 

     

    두 번째 문제는 메모리였습니다.

     C/C++ 의 경우 사용자가 필요한 경우 동적 메모리를 할당하고 사용하지 않는 경우 Delete 하는 것이 가능합니다. 하지만 자바 스크립트는 할당은 사용자가 하지만 Delete 하는 것은 자동으로 됩니다. 처음에는 편한 기능이라고 생각했지만, 복잡한 알고리즘을 구현할 때에는 숙련된 메모리 운용 능력이 없다면 굉장히 불편한 기능이었습니다.... 

     당연히 메모리를 고려하지 않고 알고리즘을 구현하였더니 Visual Studio 편집기에서는 디버깅이 잘되었지만, 빅스비 개발자 스튜디오에서는 메모리 에러가 발생했습니다. 그래서 저희는 메모리를 줄이기 위해 다양한 시도를 했고 이 과정에서 또 다른 문제가 발생했습니다.

     

    세 번째 문제는 팀 단위 개발경험의 부족이었습니다.

     다들 팀 단위 개발 경험은 조금씩 있었습니다. 하지만 각자 주력으로 사용하는 언어로 프로젝트를 했기 때문에 별다른 주석 없이도 다른 팀원의 소스코드를 이해하는 것이 가능했습니다. 하지만!!! 이번에 진행하게 된 빅스비 프로젝트는 달랐습니다. 네 명의 팀원이 모두 자바스크립트와 빅스비 언어에 대한 지식이 없는 상황에서 시작했기 때문입니다. 

     팀원들은 각자 자바스크립트로 알고리즘을 구현해서 모였고 가장 잘 작동하는 소스코드로 캡슐을 구성했습니다. 이때, 메모리 에러가 발생했고 이 문제를 해결하기 위해 모두가 소스코드를 분석했지만, 작성자를 제외한 나머지 3명은 코드를 이해할 수 없는 어이없는 상황이 발생했습니다.

     

    세 번째 문제 해결 :

     다들 주석의 중요성을 느꼈고 해당 소스코드의 작성자가 주석을 모두 달아주었습니다.

     

    두 번째 문제 해결 :

     이 문제는 해결하는 것이 가장 어려웠습니다. 빅스비 개발자 센터에 문의도 해보고 할당되는 메모리 증가를 요청도 해보았습니다. 또한, 알고리즘에서 발생하는 메모리도 줄여보려고 노력해보았지만 자바 스크립트 언어에 대한 지식이 깊지 않았기 때문에 불가능했습니다. 그렇게 만들게 된 폴더가 바로 PathData.js 입니다. 저희가 구현한 알고리즘은 환승역을 여러개 거쳐가는 길은 메모리 소모가 너무 커서 검색이 불가능 했습니다. 그래서 다른 편집기에서 모든 노드의 최단거리를 출력하여 파일로 만들었습니다. 그래서 시작 역은 행 번호 도착역은 열 번호로 입력하여 배열에 미리 저장되어 있는 최단거리 정보를 가져오는 방식으로 바꿨습니다. 이 문제가 완벽한 해결은 아니라고 생각했지만, 시간이 부족하여 이 정도로 마무리를 했습니다.

     


    여기까지 빅스비 캡슐 챌린지 2019 프로젝트의 내용입니다.

    혹시 궁금하신 점이나 도움이 필요하시면 댓글 남겨주세요. ㅎ

     

     

     

    댓글

Designed by Tistory.