프로젝트 정리/소프트웨어 공학

Mobile Robot Controller ADD-ON 개발

이번 학기에 수강하는 소프트웨어 공학 과목에서 주어진 팀 프로젝트인 '재난 구역 탐사에 사용하는 Mobile robot과 함께 사용할 ADD-ON 프로그램 개발'에 대해서 기록한다. 주어진 프로젝트의 시나리오는 다음과 같다.

 

 

  •  기존의 mobile robot의 움직임을 제어하는 시스템인 SIM은 오퍼레이터가 재난 지역의 정보를 전부 알고 있는 상태에서 로봇의 robot movement interface를 통해서 로봇의 동작을 수동으로 제어하는 시스템이다.
  •  SIM을 재사용하되 재난 지역에 대한 정보가 부족한 상태에서 로봇의 동작을 자동으로 제어할 수 있는 ADD-ON 시스템을 개발하는 것이 프로젝트의 목적이다.
  • ADD-ON은 SIM으로부터 3개의 입력 (위치 센서, 위험 감지 센서, 중요 지점 센서)를 받는다.
  • ADD-ON은 해당 입력들을 이용하여 SIM이 가지고 있는 robot movement interface를 통해서 로봇의 동작을 지시한다.
  • ADD-ON은 오퍼레이터로부터 각종 지도 정보 (맵의 크기, 로봇 시작 지점, 위험 지점, 목표 탐색 지점)을 입력받는다.
  • 로봇이 모든 목표 탐색 지점에 방문하면 탐색 작업이 종료된다

이때, 맵에는 주어진 지점들 외에 숨겨진 지점 (위험 지점, 중요 지점) 이 존재할 수 있다. 이 지점들은 로봇의 탐사 과정에서 발견될 수도, 발견되지 않을 수도 있다. 숨겨진 위험 지점은 로봇 전방 1칸의 위험 지점을 감지할 수 있는 위험 감지 센서를 통해 발견될 수 있으며, 이 경우 맵에 해당 좌표가 위험지점이라고 표시된다. 중요 지점은 로봇의 전후좌우 1칸의 중요 지점을 감지할 수 있는 중요 지점 센서를 통해 발견될 수 있으며, 이 경우 역시 맵에 해당 지점이 중요 지점이라고 표시된다.

 

 

ADD-ON은 SIM의 robot movement interface를 이용해서 로봇의 움직임을 제어할 수 있다. movement interface는 크게 두 가지로, 로봇을 앞으로 한 칸 이동시키거나 시계 방향으로 90도 회전시키는 명령을 내릴 수 있다. 앞으로 한 칸 이동시키는 명령은 때때로 작동되지 않거나, 앞으로 두 칸 이동할 수 있다. 

 

 

로봇의 이동 과정은 아래의 동영상에 나와있다.

 

 

지도의 크기가 4X5 일 때의 로봇의 이동과정. 아직 로봇의 오작동을 구현하지 않은 상태이다.

 

우리 팀은 Python 3.6버전을 사용하여 프로그램을 개발하였다.  맵을 표현하는 부분에는 matplotlib를 이용하였으며, 프로그램의 전체적인 틀은 pyQt5를 사용했다.

 

프로그램을 처음 실행하면 아래와 같은 메뉴화면이 나타난다.

 

 

기본 메뉴 화면.

메뉴 화면에는 4가지의 항목이 존재한다. Save data는 오퍼레이터가 ADD-ON에 맵 정보를 제공할 때 사용한다. Save data 버튼을 누르면 아래와 같은 창이 팝업된다.

 

맵 데이터 저장 화면.

 

이 창에 (x좌표 y좌표) 와 같은 형식으로 좌표를 적은 뒤 Save 버튼을 누르면 맵 데이터가 시스템에 저장된다. 예를 들어 Map에 (4 5), Start에 (1 2), Object에 ((4 2)(1 5)), Hazard에 ((1 0)(3 2))를 입력하면 맵 크기는 4X5, 로봇의 시작 지점은 (1, 2), 목표 지점은 (4, 2)와 (1, 5), 위험 지점은 (1, 0)과 (3, 2)인 맵이 만들어진다. 잘못된 값을 입력하거나 칸을 비워둔 채 Save 버튼을 누르면 오류 메시지를 띄워준다. 현재는 빈 칸을 남겼을 때만 구현을 해둔 상태이며, 잘못된 값을 거르는 과정은 곧 구현할 예정이다.

 

 

Show result 버튼을 누르면 위의 동영상과 같은 창이 팝업된다. 이 창에는 맵과 start, return to menu 버튼이 존재한다. 맵에는 오퍼레이터가 입력한 정보들에 기반하여 각종 지점들이 표시되며, 주어진 정보들을 기반으로 로봇의 탐색 경로를 빨간색 선으로 보여준다. 탐색 경로를 찾는 알고리즘으로는 a* 알고리즘을 사용했다. start 버튼을 누르면 로봇이 0.5초 간격으로 탐색을 시작한다. 화살표는 로봇이 현재 보고 있는 방향을 의미하며, 탐색 도중 중요 지점을 발견하면 해당 위치에 중요 지점을 표시한다. 경로상에서 숨겨진 위험 지점을 발견하면 발견 메시지 창을 띄우고 해당 지점을 표시한 뒤 새로운 경로를 만들어 기존 경로를 지우고 맵 상에 새 경로를 그려준다. 로봇의 비정상 작동은 아직 구현하지 못했으며, 빠른 시일 내에 구현할 예정이다. 모든 목표 지점을 발견하면 완료 메시지 창을 띄운다. return to menu 버튼을 누르면 팝업창을 닫고 시작 메뉴로 돌아간다.

 

 

Show map data 버튼을 누르면 저장되어 있는 맵 데이터를 보여준다. 이 부분은 아직 구현하지 못했다. Quit 버튼을 눌면 프로그램이 종료된다.

 

 

 

 

앞으로 해결해야 되거나, 구현할 것들은 이런 것들이 있다.

 

  •  맵의 크기가 커지면 각 지점들의 이미지가 겹쳐 보기 힘들어진다. 맵 크기에 맞게 이미지들의 크기를 재조정 해야할 것 같다.
  •  맵 데이터로 유효하지 않은 값 (맵 크기를 넘어가는 값이 입력되거나, 음수 값이 입력되는 경우, 또는 입력 형식에  맞지 않는 경우)을 걸러내야 한다.
  •  앞으로 한 칸 이동 명령을 내렸을 때 일정 확률로 가만히 있거나 앞으로 두 칸 이동하는 것을 아직 구현하지 않았다.
  • 저장하고 있는 맵 데이터를 보여주는 기능을 아직 구현하지 않았다.
  • 프로그램의 외형을 좀더 다듬을 필요가 있을 것 같다.

 

최종 제출 기한이 12월 6일까지이지만 보고서도 작성해야 하고 다른 과목 프로젝트들도 있다 보니 생각보다 남은 기한이 많진 않다. 미리 생각해놓은 기능들을 전부 구현할 수 있도록 노력해야겠다. 앞으로의 프로그램 구현 과정은 계속 포스팅할 예정이다.

'프로젝트 정리 > 소프트웨어 공학' 카테고리의 다른 글

12/13 15주차 수업내용 정리  (0) 2019.12.13
11/30 13주차 수업 내용 정리  (0) 2019.11.30
11/29 변경 사항  (0) 2019.11.30
11/28 변경 사항  (0) 2019.11.29