로봇 경로 만들기

Python을 이용하는 아주 간단한 예를 공부해 볼까요?
여기에서 공부하게 될 코드는 저도 논문쓸 때 자주 사용한답니다.



강의들은 모두 무료입니다. 단, 저작권은 키클 코딩랩 에 있으며, 무단 복제 및 배포를 엄금합니다.
이를 어길 시, 본 사이트의 서버가 미국에 있으므로, 미국법에 의해 처벌될 수도 있습니다.




라이브러리 matplotlib 설치

시작하기 전에 한가지 당부드릴게요.
앞으로 강의들에서는, 제가 익숙한 로봇 등의 공학적인 사례들을 중심으로 풀어나갈 거예요. 하지만, 그것들은 어디까지나 "예"일 뿐이라는 것 잊지마세요. 강의에서 다루는 코드들은 수많은 다른 대상에 적용할 수 있답니다.

자, 그럼 본격적인 Python강의를 시작해 볼까요?
코딩을 하다보면, 그 목적이 어떤 결과를 다른사람들이나 자기 자신에게 "보여주기" 위한 경우가 많아요. 예를 들어, 가계부를 코딩할 경우 1년간의 지출 추세를 보고 싶다거나, 주식 분석을 할 경우 어떤 주식 종목의 주가 추세를 보고 싶은 경우 등이죠.
그래서 첫 Python강의를 그래프 그리는 것으로 시작해 볼까 해요.

Python으로 그래프를 만드는 것은 쉽고 아주 편리하답니다.
이 방법을 익혀 놓으면, 써 먹을 곳이 굉장히 많지요. 학교 숙제/과제로 그래프를 그려 넣어야 한다면, Python을 이용한 방법이 아주 좋은 해결책이 될 수 있지요. 저도, 논문에 그래프를 삽입해야 할 경우, Python으로 만들어서 이미지 파일로 저장 후 그 이미지 파일을 사용한답니다.

단, Python으로 그래프를 그리려면, matplotlib라는 라이브러리를 하나 설치 해야 해요.
걱정하지 말아요. "강의. Python 시작~!"에서도 말했지만, Ubuntu에서는 굉장히 쉽게 설치 할 수 있어요.
라이브러리(Library)란, 어떤 기능을 하는 코드들을 묶어 놓은 것을 의미해요. 예를 들어, "덧셈", "뺄셈", "곱하기", "나누기"의 기능을 하는 코드들을 작성하고, 그 코드들을 "사칙연산"이라는 이름으로 묶으면, "사칙연산" 라이브러리가 되는 것이지요. matplotlib 라이브러리는 그래프를 그리는데 관련된 많은 기능을 하는 코드들을 포함하고 있답니다.

"강의. Python 시작~!"에서 언급했던 것처럼 터미널을 열어보세요. 그리고 아래에서 처럼 두가지 명령을 연달아 실행 시키면 matplotlib설치가 완료된답니다.
주의할 점 한가지. 아래에서 "gildong...$"은 터미널의 입력하는 커서 앞에 나오는 사용자@컴퓨터이름:현위치경로$ (예: gildong@gildong-VirtualBox:~$) 부분을 의미하는 거예요. 고로, 이 부분은 명령어가 아니니 타이핑 하지 마세요.
줄1에서는 pip을 설치하는 것이고, 줄2에서는 pip을 이용해서 matplotlib를 설처하는 거예요.
pip 이란, Python으로 작성된 라이브러리와 같은 소프트웨어들을 설치하고 관리할 수 있게 도와주는 시스템이랍니다.

다만, 줄2의 명령를 실행했는데, 아래와 같이 pip 버전에 관련된 에러가 뜰지도 몰라요.

그러면, 아래와 같이 pip을 업그레이드 하는 명령을 실행한 후, 위 줄2의 명령을 다시 실행하세요. 문제가 해결될 거예요.

우리는 Python3를 사용한다고 "강의. Python 시작~!"에서 말했었죠? 그래서 위의 python3와 pip3 명령어들의 끝에 3이 붙는 건데요.
Python3에서 matplotlib를 사용하려면, 아래 명령을 실행해서 python3-tk라는 패키지를 하나 더 설치해줘야 한답니다. 이 명령까지 다 실행한다면, 그래프를 그리기 위한 준비는 끝난거예요.




로봇 경로 만들기

먼저, 원하는 곳에 폴더를 생성하세요. 폴더를 생성하는 방법은 두 가지가 있어요.

"강의. Python 시작~!"에서 언급했던 노틸러스 파일 브라우져를 연 후, 원하는 경로 (예를 들면, 아래 그림과 같이 노틸러스의 왼쪽 상단에 Home을 클릭 후 Documents 폴더 더블클릭)로 더블클릭해서 들어가 보세요.

그리고 아래 그림과 같이, 빈 공간에서 마우스 오르쪽 버튼을 누르면 나오는 팝업메뉴에서 "New Folder"를 클릭하면 폴더를 생성할 수 있어요.

폴더를 생성하는 두번째 방법은 다음과 같아요.
위에서 한 것과 같이, 노틸러스에서 마우스 오른쪽 버튼을 누르면 나오는 팝업메뉴에서 "Open in Terminal"를 클릭하세요. 그러면, "강의. Python 시작~!"에서 언급했던 터미널이 열릴 거예요. 그리고 터미널 명령어 mkdir을 이용해서 아래와 같이 폴더를 만들 수 있어요. (저는 my_folder라는 이름의 폴더를 만들었어요.)

터미널 명령어 mkdir에 대해 잠시 살펴 볼까요?

[터미널 명령어]

위에 설명되어 있는 것처럼 터미널 창에서 "mkdir 폴더명"이라고 치고 Enter키를 누르면 원하는 폴더를 생성할 수 있어요.
한가지 주목해 주세요. 위 설명에서 "$"는 터미널에서 명령어를 입력할 수 있는 커서 앞부분을 의미한다는 것을. 즉, 터미널에 보이는, "gildong...$"에서 "$"를 의미하는 거랍니다.
그리고, 위 설명은 Linux 메뉴의 터미널 명령어 하위 메뉴에서도 볼 수 있어요.

이제 생성된 폴더로 들어가 볼까요? 아래처럼 "cd 폴더명"을 이용하면 생성된 폴더로 들어갈 수 있어요.

다음의 터미널 명령어 노트로 "cd" 명령어랑 조금 더 친해져봐요.

[터미널 명령어]

자, 이제 Python 코드를 작성할 파일을 하나 만들어 보지요.
터미널에서 아래와 같이 입력해 보세요.

이것이 무슨 의미이냐..?
바로, gedit이라는 문서편집기를 이용해서 lec1_graph.py 파일을 만들겠다는 의미랍니다.
위에서 처럼 실행하면, gedit 문서편집기 창이 새로 뜨지요? 여기에서 Python 코딩을 할 거랍니다.

자, 우리의 첫 Python 코딩을 시작해 보지요.
앞서 matplotlib 라이브러리를 설치했지요? 그 안에 pyplot이라는 객체가 있어요. 이 객체는 그래프를 그리는데 도움을 주지요.
객체(Object)란, 나중에 설명하게 될 클래스라는 것이 메모리에 실제로 구현된 것을 지칭하는 것인데요. 지금 이야기 하기에는 다소 어려우니, 더 자세한 내용은 후에 다른 강의에서 자세히 설명 하도록 할게요.
그럼, 제일 처음으로 "우리는 matplotlib 라이브러리에 있는 pyplot이라는 객체를 사용할거다"라고 알리는 코드를 써보지요.

참고로, 라이브러리는 많은 경우 여러 객체들로 구성이 되요. 예를 들어, 망치와 못이 공구함에 들어있다고 하면, 공구함은 라이브러리인 것이구요, 망치와 못은 객체인 것이랍니다.

위에서 보았듯, 어떤 라이브러리를 사용할 때는 import라는 키워드를 사용해서 선언을 해요.
그리고 문장 뒷 부분에 "as plt"는 "pyplot 객체를 앞으로 plt로 부를거다"라고 말하는 거예요.
아래의 문법 노트를 이용해서 머리 속에 잘 정리해 보세요. 문법 노트는 Python 메뉴의 문법 노트 하위메뉴를 통해서도 볼 수 있어요.

[문법] import

그럼, 이제 로봇이 이동한 경로를 만들어 볼까요? 실제 프로젝트에서는 보통 로봇의 경로를 별도 파일에 저장하고, 추후에 그 파일로 부터 경로를 읽어서 그래프로 그리는 경우가 대부분이예요.
하지만, 우리는 이제 첫걸음이고 하니, 파일을 이용하는 것은 나중에 해보기로 하고, 지금은 임의의 경로를 우리가 직접 만드는 거로 할게요.
2차원 평면을 로봇이 다닌다고 가정하고, (x, y) 좌표을 이용해서 로봇의 경로를 만들어 볼까요?
로봇의 경로 생성을 위해서 Python의 리스트 (List)라는 데이터 타입을 사용해 볼게요.
리스트가 무엇이냐? 문법 노트 가서 확인해 보세요....라고 하면, 귀찮아서 안 가볼거죠?
그래서 아래에 또 가져다 놨어요. 아래에 있는 문법 노트 안으로 들어가 볼까요?

[문법] List

자, 리스트가 무엇인지 잘 알았죠?
다음 단계로 넘어가기 전에, 위 설명에서 사용한 "="에 대해서 명확히 짚고 넘어갈 필요가 있어요. 수학에서 사용하는 등호 "="와 쓰임새가 같아 보이지만, 엄밀히 말하면, 코딩에서 사용하는 "="는 "할당 연산자"라는 다소 다른 의미가 있답니다.

[문법] 할당 연산자

그럼, 이제 리스트를 이용해서 로봇의 이동경로 좌표 다섯 지점을 정해 볼까요?
아래 줄3과 4에서처럼 원하는 다섯 지점의 x좌표와 y좌표를 리스트를 이용해서 지정해 보세요.
"#" 표시가 무엇인지 궁금하지요? "#"는 커멘트(comment)/주석 처리하는 표시예요. 즉, "#" 이후의 코드는 무엇을 쓰던지, Python이 실행을 하지 않는 답니다.
그래서, 코드에 대한 설명이나, 그 코드에서 기억해야할 점등을 적어 놓는데 사용해요.

원하는 로봇의 경로 좌표를 잘 정했나요? 저는 다섯 지점을 정했는데, 원하면 열개, 백개의 지점을 정해도 되요.




그래프 만들기

이제 경로를 그래프로 만들어 보지요.
그래프를 만들때에는 pyplot객체의 plot()함수를 이용해요. 그런데, 위에서 pyplot를 plt이라는 별명으로 부를 거라고 했었죠?
그래서 아래 줄7에서처럼 plot함수를 plt라는 별명을 이용하여 호출한답니다.
주목할 점이 몇가지 있어요.
첫째, 함수(Function)는 어떤 정보를 받아서 특정한 처리를 수행하고 처리 결과를 넘겨주는 코드들의 덩어리를 의미해요. 객체는 보통 여러 함수들의 모임으로 이루어져 있답니다. 함수에 대한 자세한 내용은 나중에 설명하도록 할게요. 혹, 미리 조금 더 자세히 알고 싶으면, 여기로 가서 이런게 있구나 정도로만 알아두세요.
또 다른 주목할 점은요, 어떤 객체에 속한 함수를 호출할 때에는 "."을 이용하여 "객체명.함수명"이라는 형태로 호출한다는 것이랍니다.

위 줄7에서 보이는 것처럼, plot함수는 호출될 때 여러가지 정보를 요구해요. 이러한 정보를 argument (전달인자)라고 하는데요.
우리는 x좌표, y좌표, 색 정보, 그래프 선의 스타일, 선의 굵기를 argument로 건네주었어요.
즉, 줄7은 우리가 정한 x, y좌표 리스트 들을 주면서, 그래프를 빨강색 (color="red")으로 하고, 선 스타일을 '--'로 (linestyle="--") 하고, 선의 굵기는 2로 (linewidth=2) 해달라고 말하는 것이죠.
참고로, matplotlib 라이브러리가 지원하는 더 많은 종류의 선이나 색상을 알고 싶다면 라이브러리 노트로 가서 확인해 보세요.

한편, plot함수는 선 그래프를 만들고, 만들어진 그 선이 갖는 고유의 값(핸들/handle 값이라고 합니다)을 우리에게 다시 건네줘요. 이런식으로 어떤 함수가 특정 정보를 되돌려 주는 것을 리턴(return)이라고 하는데요.
줄7에서 보듯이, 우리는 plot함수의 리턴값을 hdl이라는 이름으로 받았답니다. 이번 강의에서 hdl을 특별히 사용하는 일은 없어요. 그저, '함수의 리턴이라는 것이 이렇게 이루어지는구나'하고 넘어가기로 하지요.
마지막으로, 지금까지 설정한 그래프를 보고자 하면 show라는 함수를 호출해 줘야 하는데요.
줄9에서 show 함수의 호출코드를 넣었답니다. 즉, 그래프는 이미 줄7에서 생성이 다 된것이고, 줄9에서 보여주기만 하는 것이랍니다.

자, 지금까지 코딩한 내용을 실행해 볼까요? 먼저 코딩한 것을 저장해야 겠죠?
아래에 보이는 것처럼, gedit 문서편집기를 보고 있는 상태에서 노란색 화살표가 가리키는 지역으로 마우스 커서를 옮기면, File메뉴를 볼 수 있어요.
File메뉴를 클릭하면 나오는 하위메뉴 중 Save를 누르면 저장이 된답니다.
그리고, 아래 노란네모가 가리키는 지점에 있는 "x"를 눌러서 gedit을 닫으세요.

이제 터미널 창으로 가서 아래처럼 "python3" 명령어를 이용해서 우리가 만든 Python 파일을 실행해 볼게요.

아래와 같이 그래프가 만들어 진거 보이죠?
만약, 이 그래프를 보고서나 논문에 삽입할 목적으로, png나 jpg같은 이미지 파일로 저장하고 싶으면, 아래 빨간 화살표로 표시된 부분을 누르면 된답니다.

그래프를 보면, 뭔가 좀 허전하죠? 로봇 경로라는데, 어디가 시작점이고 끝인지 알지도 못하고...
그럼, 로봇 경로의 시작점과 도착점을 추가해 볼까요?
먼저, 위에서 했던 것처럼 gedit을 이용해서 python 파일을 열어보세요.
아래 줄8과 줄9에서 처럼 plot함수를 다시 사용해서 시작점과 도착점을 추가해 볼게요. 단, 앞서 plot함수를 사용했던 방법과 몇가지 다른 점이 있으니 짚어볼게요.

먼저, 줄8에서 시작점을 추가했어요. 시작점이니, 경로 좌표들 중에 제일 처음 값들만 필요하니, x[0]와 y[0]를 사용했지요. 색상은 cyan을 사용했구요. 그런데, 이번에는 선을 사용하지 않고, marker를 사용했어요. 네모를 뜻하는 "s"를 사용하여 marker의 모양을 설정했어요. 그리고, markersize를 이용하여, 크기를 10으로 설정했지요.
시작점에 대한 plot의 리턴값은 hdl_start라는 이름으로 받았어요.

줄9에서 도착점을 어떻게 처리했나 볼까요?
리스트를 읽을때, 맨 마지막 부터 읽으면 인덱스 번호가 -1부터 시작한다고 List 문법 노트에서 말했었죠? 그래서 줄9에서는 도착점을 가리키는 x[-1]과 y[-1]를 사용했답니다. 색상은 blue로 했고, marker의 모양은 동그라미를 뜻하는 "o"를 사용했어요. 크기는 시작점과 동일한 10으로 설정했지요.
도착점에 대한 plot의 리턴값은 hdl_end라는 이름으로 받았어요.

자, 이제 앞서 했던 것처럼 수정한 코드를 저장하고 gedit를 닫은 후 python3 명령어로 실행시켜 볼까요?
그러면, 아래와 같은 그래프를 볼 수 있어요.

그런데, 문제가 몇 가지 더 있네요. 시작점과 도착점의 marker들이 잘 보이지 않고, 그래프의 x축과 y축이 무엇을 의미하는지도 모르겠네요.
문제를 해결해 볼까요?

위 그래프를 보면, x축의 보여지는 범위가 1~5이고, y축은 범위가 0~5이죠? 이 범위들을 확대하면, 시작점과 도착점이 보이겠죠?
두 축들의 범위를 설정하려면, xlim과 ylim함수를 사용하면 되요.
이 함수들을 사용할때는, 아래 줄11과 12에서 보이는 것처럼 설정하고자 하는 범위의 최소값과 최대값을 argument로 전달해 주면 되요.
즉, 줄11과 12에서 x축과 y축의 범위를 -1~6으로 설정한 것이죠.

이제는 각 축이 무엇을 의미하는지 그래프에 덧붙여 볼까요?
우리한테 각 축은 경로의 x좌표와 y좌표를 의미하죠? 그래프에 축의 이름을 붙일때는 xlabel과 ylabel이라는 함수를 사용해요.
줄13과 14에서 이 함수들을 사용했는데요, 좌표를 의미하는 coordinate과 미터 (m) 단위를 의미하는 [m]를 이용해서 각 축의 이름을 정했답니다.

줄15를 보면 알겠지만, 한 가지 더 추가해 봤어요.
바로 선과 네모, 동그라미가 무엇을 의미하는지 간단한 설명을 추가하는 것인데요, 이럴 때는 legend함수를 사용한답니다.

legend함수의 첫 번째 argument, [hdl[0], hdl_start[0], hdl_end[0]], 를 잠시 살펴볼까요?
줄7~9에서 plot으로 부터 저장해 놓았던 경로, 시작점, 도착점에 대한 리턴값들을 사용했죠? 무엇보다 이 리턴값들이 리스트 (List)형태로 리턴되기 때문에, 리스트의 첫 번째 값을 가리키는 [0]를 덧붙였답니다.
그리고 plot의 리턴값들을 또 다른 리스트 형태로 legend함수에 전달하기 위해, hdl[0], hdl_start[0], hdl_end[0]을 "[ ]"로 감쌌답니다.

두번째 argument로는 무엇을 전달했나요?
네, 맞아요. hdl[0], hdl_start[0], hdl_end[0] 각각에 대한 설명을 또 다른 리스트로 전달했답니다.

그리고, 설명을 그래프에 표기할 때 글씨 크기를 중간크기로 설정하기 위해 fontsize="medium"을 세 번째 argument로 전달했지요.

자, 이제 다시 앞서 했던 것처럼 수정한 코드를 저장하고 gedit를 닫은 후 python3 명령어로 실행시켜 보세요.
그러면, 아래와 같은 그래프를 볼 수 있어요.
각 축의 범위가 -1~6으로 설정이 되었고, 우측 상단에 각 그래프 개체에 대한 설명이 잘 삽입되었네요.

강의에서 작성된 소스 코드 (source code)를 다운받으려면, 다음 링크를 클릭하세요: 소스 코드 다운로드

혹시, 이해가 잘 안되는 부분에 대한 질문이 있거나 다루어 줬으면 하는 주제가 있으면, 화면 오르쪽 하단에 "질문하기" 버튼을 이용해 주세요.






발자취

2019-09-11 "키클 코딩랩 - 미국 공학박사 아빠의 코딩 연구소"로 이름 변경
2019-06-28 코딩 교실 공개
2019-03-18 코딩 교실 제작 시작

바로가기
Python 배움터
C/C++ 배움터
About
Contact
Privacy Policy
강의목록
질문하기
처음으로