캡스톤_졸업작품2019. 6. 22. 00:14

저희가 최종적으로 만든 코드 주소입니다. https://github.com/choinamki/plant_anomaly_detection_dji_spark_drone

 

choinamki/plant_anomaly_detection_dji_spark_drone

Contribute to choinamki/plant_anomaly_detection_dji_spark_drone development by creating an account on GitHub.

github.com

 

DJI media tutorial 코드를 참조했습니다.

https://developer.dji.com/mobile-sdk/documentation/android-tutorials/MediaManagerDemo.html

 

Creating a Media Manager Application - DJI Mobile SDK Documentation

If you come across any mistakes or bugs in this tutorial, please let us know by sending emails to dev@dji.com. Please feel free to send us Github pull request and help us fix any issues. In this tutorial, you will learn how to use the MediaManager to inter

developer.dji.com

윗 코드에서 필요없는 부분을 제거하고 파일을 전송하는 코드를 만들었습니다.

MediamanagerActivity 에서 여러가지 드론에 있는 파일을 관리할 수 있습니다.

MediamanagerActivity
socekt_setting

settingsoket 을 눌러서 아이피와 포트를 입력한 뒤 sendcompuetr 를 누르면 드론이 촬영한 영상과 gps데이터 텍스트파일을 설정한 서버에 보내도록 만들었습니다.

 

해당하는 tcp 소켓 코드는 해당 게시글을 통해 확인할 수 있습니다.

https://namki-learning.tistory.com/23?category=687501

 

안드로이드 java 서버컴퓨터 python tcp 통신

이정민 팀원과 같이 만들었습니다.https://jeongmin-lee.tistory.com/63 ⑦ TCP 통신 TCP 통신 Server는 Python으로 Client는 JAVA로 작성합니다. TCP통신 Client_JAVA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17..

namki-learning.tistory.com

서버소켓설정은 따로 만든 뒤 intent 를 통해 popup_textActivity 로 이동하고 입력받았습니다.

 

popup_textActivity
intent 를 통해 이동
intent 가 넘어왔을 때 조건

이렇게 해서 드론의 영상데이터와 gps데이터를 서버 컴퓨터로 보낼 수 있었습니다.

Posted by richcherry
캡스톤_졸업작품2019. 6. 21. 21:47

저희가 최종적으로 만든 코드 주소입니다. https://github.com/choinamki/plant_anomaly_detection_dji_spark_drone

 

choinamki/plant_anomaly_detection_dji_spark_drone

Contribute to choinamki/plant_anomaly_detection_dji_spark_drone development by creating an account on GitHub.

github.com

DJI 에 올라와있는 tutorial code 두가지를 참조했습니다.

https://developer.dji.com/mobile-sdk/documentation/android-tutorials/SimulatorDemo.html

 

DJI Simulator Tutorial - DJI Mobile SDK Documentation

If you come across any mistakes or bugs in this tutorial, please let us know by sending emails to dev@dji.com. Please feel free to send us Github pull request and help us fix any issues. In this tutorial, you will learn how to use the DJISimulator in your

developer.dji.com

https://developer.dji.com/mobile-sdk/documentation/android-tutorials/index.html

 

Creating a Camera Application - DJI Mobile SDK Documentation

If you come across any mistakes or bugs in this tutorial, please let us know using a Github issue or a post on the DJI forum. Please feel free to send us Github pull request and help us fix any issues. This tutorial is designed for you to gain a basic unde

developer.dji.com

첫 번째 링크에서 조이스틱 코드와 움직임 제어코드를 가져오고 두 번재 링크에서는 카메라 스트림과 동영상 촬영 기능을 가져와서 쓸데 없는 부분을 제외하고 두 코드를 합쳤습니다.

전체 클래스 사진입니다. 드론 동작제어와 카메라 영상을 위해서 사용되는 클래스는 총8개입니다.

ConnectionActivity 를 통해 DJI spark 와 연결하도록 하고 BaseProduct 클래스를 상속받은 변수를 선언하여 제품 sdk 인증을 한 뒤 그것을 통해 드론을 제어하는 형식입니다.

connectionactivity class 속 baseproduct클래스

실제 화면에서 인증을 마치면 open 버튼이 활성화되는것을 볼 수 있습니다.

 

제품이 등록되고 난 뒤에는 MainActivity 를 통해서 카메라와 feed를 볼 수 있고 드론을 조종할 수도 있습니다.

MainActivirty 실행화면

github 에 올려놓은 코드를 보고서 온클릭리스너 부분에 함수를 보면 해당 기능을 하는 부분을 찾아볼 수 있습니다.

 

모든 단추는 단추를 선언하고 레이아웃의 아이디를 붙인 뒤 리스너를 붙여서 onclick 부분에서 case문으로 함수가 실행되게 만들었습니다.

 

 

 

드론의 움직임은 3가지 Pitch Roll Yaw 로 정의됩니다. 

dji 는 이 3가지 움직임에 숫자를 넣어서 움직일 수 있습니다.

조이스틱과 가중치를 곱해서 Pitch Roll Yaw 값을 만들어주고 이것을 drone 에게 업데이트 해주면 드론이 움직이게 됩니다.

조이스틱
드론 움직임 업데이트

드론의 움직임은 이륙한 곳을 기점으로 카메라가 있는 곳이 정면이 되어 움직이게 됩니다.

maxspeed 값을 바꿔주는 것으로 드론의 속도를 제어해 줄 수 있습니다.

 

카메라 feed 는 앱이 만들어질 때 드론에서 바이트단위로 영상데이터를 전송받게 됩니다.

이렇게하면 드론의 카메라 영상을 보면서 드론의 움직임을 제어할 수 있는 앱을 만들 수 있습니다.

Posted by richcherry
캡스톤_졸업작품2019. 6. 21. 18:07

저희가 최종적으로 만든 코드 주소입니다. https://github.com/choinamki/plant_anomaly_detection_dji_spark_drone

 

choinamki/plant_anomaly_detection_dji_spark_drone

Contribute to choinamki/plant_anomaly_detection_dji_spark_drone development by creating an account on GitHub.

github.com

 

2019년 캡스톤2 을 진행하면서 제가 맡은 부분은 드론 동작제어였습니다.

 

사용한 드론으로는 DJI 사에 spark 드론입니다. https://www.dji.com/kr/spark

 

DJI 스파크 – 셀피 드론 – DJI

고급 제스처 인식 제어 기능으로 조종기 없이 DJI 스파크를 날려보세요. 인텔리전트 플라이트 모드 덕분에 손쉽게 드론 셀피도 촬영할 수 있습니다. 더 자세한 정보는 DJI.com에서 확인해보세요.

www.dji.com

DJI spark drone은 mobile sdk를 지원하며 ios와 android환경에서 돌아갑니다. 저는 android 환경에서 작업했습니다.

또한 제가 작업했을 때는 sdk 가 android 9.0 을 지원하지 않았습니다.

드론의 gps 데이터를 얻거나 드론을 수동으로 움직이거나 사진촬영, 동영상촬영 등을 할 수 있습니다.

들어올릴 수 있는 무게는 저희가 실험해보니 100g정도까지 들어올릴 수 있습니다. 더 자세한 것은 youtube 검색을 해보면 해외 사용자가 테스트 해본 결과가 올라와있습니다.

 

처음에 DJI 드론 위에다가 라즈베리파이와 5v 물펌프를 달아서 특정 잡초에게 제초제를 분사하는 드론을 만들려고 했습니다. 그러나 이륙중량의 한계로 다른 방식으로 프로젝트를 진행했습니다.

 

 

https://developer.dji.com/mobile-sdk/

 

DJI Developer

Revolutionize Industries with your Game-Changing App Using the Mobile SDK, create a customized mobile app to unlock the full potential of your DJI aerial platform.

developer.dji.com

DJI drone 을 개발할려면 DJI Developer 에 가입한 뒤 앱을 등록하고 api key 를 발급받아야 합니다. 

해당 홈페이지에 가입하신 뒤 오른쪽 상단 본인 프로필 아이콘의 developer center 를 들어갑니다.

create app 버튼을 눌러 앱을 등록합니다.

 

여기서 중요한 점은 Package Name 이 우리가 만들려는 app과 일치해야합니다. 그렇지 않으면 android sdk 등록이 제대로 되지 않습니다. 저는 com.dji.Myapplication 으로 했습니다.

앱을 만들면 이메일 인증을 해야합니다. 본인이 가입했던 메일로 날아온 메일의 링크를 누르면 앱이 정상적으로 등록됩니다.

윗 사진을 볼 수 있어야 합니다.

 

이제 안드로이드 스튜디오에 dji sdk 를 설치해야합니다.

 

https://developer.dji.com/mobile-sdk/documentation/application-development-workflow/workflow-integrate.html#android-studio-project-integration

 

Integrate SDK into Application - DJI Mobile SDK Documentation

The examples below import the DJI SDK into a new iOS and Android project. The same steps can be used for integration into an existing application. Xcode Project Integration Screenshots in this section are generated using Xcode 7.3. Create a New Application

developer.dji.com

해당 주소에 android 부분을 따라서 진행하시면 됩니다.

build gradle 파일에 튜토리얼에서 제공해주는 코드를 적은 뒤 안드로이드 스튜디오에 코끼리 모양 버튼을 누르면 동기화가 진행되면서 dji sdk 가 설치됩니다.

왼쪽 위 상단에 코끼리 모양 동기화 버튼을 볼 수 있습니다.

 

그리고 윗 주소 튜토리얼을 따라가면서 manifest 부분에 api key 입력 부분에 아까 발급받은 키를 등록하고 앱을 build 하면 튜토리얼 마지막 이미지를 볼 수 있습니다.

 

DJI sdk 를 사용하기 위해서는 한 번 단말기가 인터넷과 연결되어 인증을 받아야 합니다. 그래야지 인증받은 파일이 로컬에 저장되고 다음부터 인터넷이 연결되있지 않아도 앱이 성공적으로 build 됩니다. 저는 갤럭시s10 android 9.0 을 쓰고 있기 때문에 전 핸드폰인 s7 android 8.0 을 사용했습니다. 핸드폰이 인터넷에 연결되어 있지 않았기 때문에 sdk 인증이 되지 않는 오류가 발생했었습니다.

 

이렇게하면 DJI spark 를 위한 app 을 개발할 준비가 끝납니다.

 

 

-추가적으로 적습니다.

 

혹시 내가 가지고 있는 단말기를 usb로 컴퓨터와 연결했는데 인식이 안되는 경우도 있습니다.

 

그 때는 먼저 핸드폰에 개발자옵션에 들어가서 usb디버그를 켰는지 확인합니다.

해당 옵션을 체크한 뒤 핸드폰을 연결하면 해당 pc 디버그를 허용하겠냐는 물음이 나옵니다. 확인 버튼을 누른 뒤 

그리고 tool 메뉴에 connection assistant 를 들어가서 recan usb 를 누르고 그래도 안되면 next 버튼을 눌러서 요구사항을 진행하시면 성공적으로 안드로이드 스튜디오가 핸드폰 단말기를 잡아내는 것을 볼 수 있습니다.

Posted by richcherry
캡스톤_졸업작품2019. 6. 21. 15:02

이정민 팀원과 같이 만들었습니다.https://jeongmin-lee.tistory.com/63

 

⑦ TCP 통신

TCP 통신 Server는 Python으로 Client는 JAVA로 작성합니다. TCP통신 Client_JAVA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43..

jeongmin-lee.tistory.com

 

캡스톤2을 진행하면서 드론의 영상과 gps 데이터를 서버컴퓨터로 전송해야했습니다.

 

드론으로 dji spark 드론을 사용했습니다. spark 드론은 mobile sdk 만 지원했고 그에 맞춰서 java pthon 두 언어로 통신하는 코드를 만들었습니다.

 

 

java 를 client 로 python 을 sever 로 두고 만들었습니다.

 

server code

python 으로 만든 서버 코드입니다. 

 

소켓을 생성한 뒤 bind 부분에 ip와 포트번호를 넣어주고 listen 을 통해 몇 개의 연결을 대기시킬지 정하면 우리가 원하는 서버 소켓이 정의됩니다.

 

 

그런 다음 accept 를 하면 client에 연결 요청이 오기 전까지 대기상태가 됩니다. client 에 연결요청을 받으면 첫번째로 동영상을 받고 두번째로 gps 텍스트파일을 받습니다.

 

동영상은 용량이 커서 한번에 받을 수 없으므로 python 문법인 while else 문을 사용해서 소켓 버퍼에 데이터가 비워지는 시점까지 파일을 받습니다.

 

파일을 다 받으면 동영상을 opencv 를 통해 frame 단위로 잘라주고 dakent에 yolo 모델에 fit해서 이상이 있는 식물을 찾아냅니다.

 

client code

다음은 안드로이드 환경 java 로 짜여진 client code 입니다. 먼저 파일 통신을 하기 위해 외부저장소를 읽는 권한이 있는지 확인하고 특정 버튼을 누르면 파일통신이 진행되도록 했습니다.

 

서버 주소와 포트번호를 입력하게 만들었고 입력받은 정보를 통해 소켓을 만듭니다.

 

특정 디렉토리에 있는 파일의 리스트를 가져와서 inputstream 에 파일을 outputstream 에 서버를 연결해주고 write 를 하게 되면 파일이 보내집니다. 저 형식을 통해서 첫 번째로는 동영상 파일을 두 번째로는 드론 ps 텍스트 데이터를 전송했습니다.

 

여기서 주의할점이 catch를 통해서 사용자에게 오류가 났을 경우 toast 를 보내는 코드를 넣으면 오류가 납니다. 찾아보니까 메인쓰레드가 아닌 곳에서 toast 를 보낼 경우 오류가 나기 때문에 다른 방법을 통해서 보내야한다고 합니다. 

 

인터넷에 다른 언어들끼리 tcp통신하는 예제가 많이 보이지 않았습니다. 따라서 많은 시행착오를 거쳤습니다. 언어가 달라도 규격만 지켜주면 다른 언어와 환경에서 tcp 통신이 가능합니다.

 

Posted by richcherry
캡스톤_졸업작품2019. 6. 20. 16:05

천안 상명대학교 소프트웨어학과 캡스톤2 졸업작품을 진행했습니다.

 

팀원으로는 이영훈 학우와 이정민 학우와 함께 했습니다.

 

이영훈 https://dudgns7675.tistory.com 이정민(https://jeongmin-lee.tistory.com

 

이영훈의 개발 일상 블로그 입니다.

 

dudgns7675.tistory.com

 

'Capstone/2018-2 Capstone' 카테고리의 글 목록

 

jeongmin-lee.tistory.com

 

드론으로 농작물을 촬영한 뒤 영상과 드론이 움직인 gps데이터를 서버로 전송, 영상을 분석하여 문제가 있는 식물의 위치를 사용자에게 알려주는 시스템을 만들었습니다.

 

 

1. 드론이 mobile sdk 만 지원하기 때문에 안드로이드 모바일 환경에서 드론을 조종하고 파일을 받을 수 있게 만들었고,

 

2. 모바일 기기가 드론이 촬영한 영상과 gps 데이터를 받으면 받은 데이터를 서버 컴퓨터로 전송해줍니다.

 

3. 서버 컴퓨터에서는 받은 영상데이터와 gps데이터를 가지고 분석을 진행한 뒤 영상에 문제가 생긴 식물을 발견하면  문제가 생긴 곳을 지도위에 마커로 나타내주고, 마커를 클릭하면 문제의 이미지를 사용자에게 보여줍니다.

 

저는 드론 제어를, 이정민 팀원은 모델학습을 이영훈 팀원은 gui 환경을 만들었습니다.

 

작품 소개 영상입니다.

https://youtu.be/xmiLOTW-y_8

 

Posted by richcherry
캡스톤_졸업작품2018. 12. 23. 20:09

라즈베리파이 블루투스를 사용해봅니다.


1. 블루투스를 사용하기 위해 관련 라이브러리를 설치합니다.


sudo apt install bluez

sudo pip3 install pybluez pybleno


모두다 설치했으면 파이썬을 키고 import bluetooth 를 했을 때 정상적으로 작동합니다.



2. 블루투스를 통해 시리얼 통신을 해봅니다.


먼저 라즈베리 파이의 블루투스를 켭니다.


그리고 통신하고자 하는 블루투스 장치의 맥 주소를 알아봅니다. 저같은 경우는 이미 스마트폰을 통해서 아두이노 자동차의 블루투스 맥 주소를 알고 있었습니다. 장치를 켰다면 따로 라즈베리파이 명령어를 통해 맥 주소를 알 수 있습니다.



3. 코드를 통해 블루투스 통신을 해봅니다.


import bluetooth


blue_mac_addr = "20:18:07:13:0A:19"


port = 1
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
sock.connect((blue_mac_addr, port))
sock.send("S")

sock.close() 


네트워크 수업시간에 해봤던 소켓 프로그래밍과 매우 유사한 코드입니다. 블루투스 소켓을 만든 뒤 블루투스 맥 주소를 이용하여 연결하고 대문자 S를 보낸 뒤 소켓을 닫는 코드입니다.


이것을 통해 다른 팀원이 만든 아두이노 자동차의 움직임을 제어할 수 있었습니다.  

Posted by richcherry
캡스톤_졸업작품2018. 12. 23. 19:48

라즈베리파이로 모터 작동을 제어해 봅니다.


해당 홈페이지를 참조하여 진행했습니다.

https://www.hackster.io/stuman2000/control-a-12-volt-fan-with-a-rasberry-pi-and-a-transistor-53c06c


1. 준비물 빵판, NPN트랜지스터, 다이오드, 저항, 점퍼선


저항은 1킬로옴을 트랜지스터는 TIP 120을 사용했습니다.


다이오드는 역전류로 인한 라즈베리파이 손상을 위해서 전류가 한쪽 방향으로 흐르게 해줍니다.


저항은 B(베이스)에 과전류가 흘러 트랜지스터가 손상되는걸 방지합니다.


처음에 작은 트랜지스터를 사용했다가. 제대로 작동을 하지 않고 뜨겁게 과열되는 현상이 일어났습니다. 자기가 사용하고자 하는 트랜지스터를 구글에 검색한 뒤 메뉴얼을 찾아 알맞은 트랜지스터인지 찾아봐야 합니다. 또한 트랜지스터마다 베이스 콜렉터 이미터 위치가 다르기 때문에 이것도 찾아봐야 합니다.

 


제가 사용하고자 하는 트랜지스터의 메뉴얼입니다.



윗 그림은 NPN 트랜지스터의 회로도입니다. 

B(베이스) 에 일정 전압이 가해지면 C(콜렉터)의 흐르던 전류가 B의 전류와 합쳐져 E(이미터)로 흐르게 됩니다.  

라즈베리파이에서 디지털 출력을 하면 모터가 작동하는 회로를 만들려고 합니다. 해당하는 부분이 전압에 견딜 수 있는지 메뉴얼을 통해 확인합니다.


2. 선 연결하기




윗 사진은 제가 참조한 사진입니다. 여기에다가 따로 디지털 출력이 제대로 되는지 확인하고자 옆에다가 LED 를 달아놨습니다.




최종적으로 만들어진 빵판의 모습입니다.


윗 사진은 라즈베리 파이 b+ 의 핀 정보입니다.  원하는 GPIO 슬롯에다가 점퍼선을 연결한 뒤 base에다가 연결하면 됩니다. 저는 여기서 따로 LED를 키기 위해서 GPIO 하나와 접지 Ground 를 하나 더 사용했습니다. 



최종적으로 완성된 라즈베리파이 연결사진입니다. GPIO2와 GPIO3 접지 Ground 2개를 사용했습니다.


3. 코드 실행


import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

print("start")

GPIO.setup(2, GPIO.OUT)
GPIO.output(2, False)
GPIO.setup(3, GPIO.OUT)
GPIO.output(3, False)


time.sleep(10)

GPIO.output(2, True)
GPIO.output(3, True)

time.sleep(10)

GPIO.output(2, False)
GPIO.output(3, False)

raw_input('end")

GPIO.cleanup()


윗 코드를 통해서 GPIO 2와 3에 True 값을 주면 모터가와 LED 가 켜지면서 작동하고 False 를 주면 둘 다 작동을 멈추는 모습을 볼 수 있습니다.

Posted by richcherry
캡스톤_졸업작품2018. 12. 23. 18:50

라즈베리파이 Pi 카메라 사용 방법입니다.


해당 홈페이지를 참조하여 진행했습니다.

https://kocoafab.cc/tutorial/view/334


1. 라즈베리파이와 Pi 카메라를 준비합니다.


카메라는 (PP-A286) 라즈베리파이 카메라모듈 5MP 를 사용했습니다.

라즈베리파이 카메라 슬롯에 연결하여 간편하게 사용할 수 있습니다.





두가지 면을 가지고 있습니다. 라즈베이파이 카메라 슬롯에 연결할 때

파란면이 슬롯 검은색 부분에 가도록 선부분이 하얀색 부분에 가도록 연결하시면 됩니다.

연결할 때 힘으로 넣지 마시고 검은색 부분을 위로 들면 슬롯이 열립니다. 그 상태에서 카메라를 연결한 뒤 위로 올린 슬롯을 닫으시면 됩니다.



제대로 연결한 상태입니다.



2. 환경설정을 변경합니다.


라즈베리파이 카메라를 사용하기 위해서는 환경 설정을 바꿔줘야 합니다. 라즈베리파이를 막 받은 상태이면 카메라 설정이 disable 로 되어있습니다.


터미널을 켠 뒤 창에 sudo raspi-config  를 입력합니다. 



해당 창이 뜨게됩니다. 5번 Interfacing Options 으로 들어갑니다.



들어간 뒤 P1 Camera 를 선택하고 Enable 로 바꿔줍니다.


설정을 바꿔준 뒤 라즈베리 파이를 재부팅합니다.



3 Pi 카메라를 사용해봅니다.


터미널에 raspistill -o test_image.jpg 명령어를 입력하면 카메라가 촬영하여 해당 터미널 위치에 test_image.jpg 파일을 생성합니다. 




카메라가 정상적으로 작동하면 저렇게 불빛이 들어옵니다.

제대로 따라하셨는데 카메라가 작동하지 않고 오류를 내면 카메라가 라즈베리파이에 제대로 연결되어 있지 않거나 카메라 불량일 가능성이 있습니다. 실제로 카메라가 불량이어서 다시 하나 구해와야 했습니다.

Posted by richcherry