박봉달의 개발생활

<드론 프로그래밍>#4 카메라와 키보드 실제 활용해보기 본문

Projects/Drone

<드론 프로그래밍>#4 카메라와 키보드 실제 활용해보기

박봉달 2021. 8. 24. 23:24
728x90

안녕하세요, 저번 시간에는 간단하게 드론을 프로그래밍 하는 법을 알아보았습니다. 여러가지 메서드가 있었는데, 드론 연결과 상하좌우 이동, 그리고 이착륙에 대해 다뤄보았습니다. 이번 시간에는 드론에 달려있는 카메라를 노트북에서 받아보는 방법과, 키보드 키 입력으로 드론을 실제로 활용해보는 방법을 다뤄보도록 하겠습니다.

그럼 시작하겠습니다!


1. 드론 카메라에 접근하여 화면을 노트북에 띄우기

텔로 드론에는 기본적으로 카메라가 달려있습니다. 스마트폰과 연결하면 드론 카메라가 화면에 연동되어 보이는데요, 노트북에서도 그 화면을 가져와서 프로그래밍할 때 움직이는 동선을 확인할 수 있습니다. 먼저는 새로운 Image라는 파이썬 파일을 만들어주었습니다. 그리고는 드론을 연결하는 기본 과정까지는 작성해주시면 됩니다.

드론 객체를 만들어주었고, 드론을 연결하는 과정과 연결되었을 시 배터리를 출력하는 과정까지 코드를 작성해주었습니다. 여기서 cv2라는 라이브러리도 함께 사용할건데, 이는 이미지 관련 라이브러리입니다.

이젠 drone.streamon()이라는 메서드를 작동시키려 합니다. 이는 드론에 있는 비디오 스트림을 동작시키는 메서드로 카메라에 접근할 수 있도록 도와줍니다. 우리는 사진을 받아올 것이 아니라 영상을 받아올 것이기 때문에 프레임을 받아올 수 있도록 코드를 반복시켜줄겁니다. While 문을 사용하겠습니다.

여기서 img는 변수로, get_frame_read() 메서드를 통해 카메라로 받아오는 프레임을 img에 저장하고, 저장한 img를 cv2.resize()를 통해 크기를 바꾸는 작업을 하였습니다.

img를 저장하고 크기를 바꾸기만 한다면 사진 확인은 어떻게 할 수 있을까요? cv2.imshow()라는 메서드를 이용해서 창을 띄우고, 받아온 프레임들을 화면에 송출시켜보겠습니다. "Image"는 창 이름이 되며, img는 송출시킬 이미지가 될 것입니다.

그리고 마지막으로 cv2.waitKey(1) 메서드를 사용할 것입니다. 이는 창에 딜레이를 만들어주는 코드인데, 딜레이를 만들어주지 않으면 사실상 프레임을 창으로 확인하기 전에 창이 닫혀버려서 화면 송출되는 것을 보기 어렵습니다.

이렇게 코드를 작성하셨다면 한번 드론을 연결시켜 실행시켜보세요. 스마트폰과 연결하여 화면 공유가 되는 것처럼, 컴퓨터 창에서도 실제로 드론 카메라에 접근하여 송출이 가능하게 됩니다.


2. 키보드 모듈 만들기 (소스 코드)

새로운 파이썬 파일 KeyBoard를 만들어주었습니다. 이번에는 키보드 입력을 드론 움직임에 적용시켜보려고 합니다.

 

먼저는 pygame 패키지가 설치되어있는지 확인해봅니다. 저번에 djitellopy를 설치할 때 같이 설치가 되었을텐데, 혹여나 설치가 되지 않았다면 +버튼을 클릭해 설치해주면 됩니다. pygame이란 게임 만들기위한 패키지라 생각하시면 되며, 게임도 만드실 수 있습니다.

이제 pygame을 임포트해주고, 함수 하나를 만들어줍니다. init()이란 함수인데, 이는 pygame을 초기화시키며, 디스플레이를 설정해줍니다. 그리고 if __name__ == '__main__' 코드는, 이 파일이 메인 함수로 실행되었을 때 init() 함수를 실행시킨다는 말입니다.

한번 실행을 시켜주면 실행되면서 창이 떴다가 사라지는 것을 볼 수 있습니다.

그럼 이제 키보드에서 키를 입력받는 함수도 만들어보겠습니다. getKey로 설정하였고, 입력받는 매개변수도 keyName이라고 설정해주었습니다. 그리고 키가 입력 되었을 때 True 로 바꾸기위해 기본값은 False로 설정해주었습니다.

여기서 알아두어야할 점은, 지금 작성해보는 이 코드는 드론 프로그래밍에 필요한 코드라기보다, 키보드를 입력받을 수 있도록 해주는 부가적인 것이기 때문에 간단히만 이해하시고 넘어가시면 되겠습니다.

이제 우리는 for 루프로 어떤 이벤트(상황)이 일어나는지를 확인 할 겁니다. 그걸로 무엇을 할 것은 아니기에 pass 시켜줍니다. KeyInput에서는 키보드가 눌렸는지 안눌렸는지 참/거짓으로 확인해야하기에 get_pressed() 를 사용하여 확인하겠습니다. myKey에서는 특정 값을 얻을 건데, 만약 왼쪽 키를 눌렀다면 "K_LEFT"의 형식으로 저장되도록 getattr() 메서드를 사용하여 작성해주었습니다.

키보드가 입력 되었다면 True로 바꿔주고 display를 update해주면 됩니다. 다시한번 말씀드리지만, 이는 드론 프로그래밍을 위한 코드가 아닌, 키보드 입력을 위한 코드이기에 간단히 넘어가시면 되겠습니다.

한번 main 함수를 만들어 시험삼아 해보도록 하겠습니다. 실행을 시켜보면 a 키가 눌리는지 안눌리는지 True 혹은 False 로 확인해볼 수 있습니다. 그럼 이 파일을 모듈로 만들어서 실제 코드 작성시에 사용해보도록 하겠습니다.


3. 실제 활용해보기

이제는 실제로 활용해보도록 하겠습니다. 드론을 이착륙 시키고 움직이는 것을 배웠었고, 카메라를 연동시키는 것과, 키보드의 입력을 받도록 해주는 코드를 차근차근 배워보았으니, 이젠 한번에 활용해보도록 하겠습니다.

Control 이라는 파일을 만들어줍니다. 전 강좌에서 배웠던 것처럼 필요한 라이브러리를 임포트해줍니다. 그리고 방금 작성한 키보드 입력 모듈도 이름에 맞게 임포트 해줍니다. (전 KeyBoard 라고 저장해서 그대로 import 해주었습니다)

기본 강좌에서 배웠던 것처럼, 텔로 드론을 연결시켜주는 코드까지 작성해줍니다. 그리고 키보드 모듈에서 작성했던 초기화 메서드를 작성해줍니다. 이젠 키보드의 입력을 받고 입력 값에 따라 특정 방향으로 이동시키는 함수를 작성해보겠습니다.

getInput이라고 함수이름을 설정하고, send_rc_control을 사용할 것이기에 그 값을 정해줄 변수들을 설정해주었습니다. send_rc_control에서는 4개의 매개변수가 있던것 기억하시나요? 각각 좌우, 앞뒤, 상하, 시계/반시계 였습니다. 이 값들에 수치를 전해줄 변수를 설정하는 겁니다.

이제 아까 짰던 키보드 입력 코드에서 getKey 함수를 이용하여 입력되는 값을 판별할겁니다. a가 입력되었다면 왼쪽으로 갈 수 있게 -30을, d는 오른쪽으로 갈 수 있게 30을 넣어줄 것이고, 앞 뒤는 w와 s가 입력되는지를 파악하여 각각 30/-30의 값을 넣어주겠습니다. 위 아래는 k와 l가 입력되는지 확인되도록 넣어주었습니다. 회전은 상승 하강과 비슷한 위치로 i와 o로 키를 설정해주었습니다.

그리고 키보드 위아래 방향키를 이용해 이착륙을 입력받도록 하겠습니다. 여기서 if_elif를 사용하지 않은 이유는, 직관적으로 눌렸는지 안눌렸는지를 판단하는 것은 굳이 elif 문으로 들어가 설정하지 않는것이 빠를 것이라 생각했기 때문입니다.

이렇게 키를 인식하여 그에 상응하는 값을 반환해주는 함수를 만들었습니다. 반환 값은 리스트에 넣어서 한번에 접근할 수 있게 만들어주었습니다.

이젠 카메라 접근 코드를 가져와서 함수로 만들어보도록 하겠습니다. video_stream 이라고 해주었고, 카메라 접근 코드와 동일하게 만들어주었습니다. 그럼 이 함수들을 이제 적용시켜야겠죠?

드론을 연결시켜주는 코드를 작성하고, 키보드 시작코드와 카메라 접근 코드를 작성해줍니다. 화면 송출 함수를 작성해주고, 작성한 키 입력 메서드를 실행시켜 반환되는 반환값을 results에 넣어주고, 그 반환된 값을 인덱스 값으로 [0]부터 접근해서 send_rc_control 에 넣어주면 키에 따라 이동하는 코드 완료! 혹시 모르는 안전사고를 위해 sleep(1)도 추가해줍니다.

실행시켜보면 카메라와 키보드 입력으로 잘 움직이는 것을 볼 수 있습니다. 이렇게 따라오시면서 생각했던것보다는 복잡하진 않았길 바랍니다.


이렇게 하면 키보드와 카메라를 활용하여 드론 조종하는 코드를 작성하였습니다. 복잡하면서도, 따라하다보면 이해되는 여러분을 발견하실 수 있으실겁니다. 이제 기초와 기본적인 활용방법은 다 학습하셨습니다. 이 코드들을 기반으로 원하시는 코드를 작성해가시며 즐겁게 프로그래밍 하시면 좋겠습니다. 감사합니다:)

728x90
반응형