코딩일지(2024-02-04)
dcworks..너란 녀석.. 어렵다..
dcworks에서 기본코드 돌려보기
내가 만약 아래 dcworks 디렉토리에서 아래로 들어가 library/donkeycar라는 내부 디렉토리에 들어가게 되면은 아래와 같이 donkey라는 패키지 관리자 명령어를 사용할 수 있다.
donkey createcar --path ~/mycar
이때 ~/mycar를 하면 이 ~에 해당하는게 어딘지 추적해보니 아래와 같이 C:\Users\1
이라고 한다.
그래서 나는 dcworks디렉토리 아래 자식디렉토리로 mycar를 만들기 위해 일단 ~/dcworks로 경로 이사를 갔다.
그리고 ~/dcworks/mycar의 형태로 내차량의 생성위치를 잡아주었다.
아까 그냥 dcworks를 뒤져보다가 예전에 교수님께서 submoudle관련해서 말씀하신게 생각나서 들어가보았다.
.gitsubmodules
안에는 다음과 같이, 5가지의 서브모듈이 있었다.
이것들은 교수님이 만드신 dcworks 아래에 물려있는 서브모듈들에 대한 정보가 git_url로 담겨져 있는 정보다.
바로 위 텍스트파일이 있었기 때문에, 아래 명령어를 사용할 수 있었던 것이다.
git submodule update --init
다시 본론으로 돌아와서, test.py라는 파일을 만들고 donkeycar_docs에 있는 아래 코드를 넣어주었다.
import donkey as dk
#initialize the vehicle
V = dk.Vehicle()
#add a camera part
cam = dk.parts.PiCamera()
V.add(cam, outputs=['image'], threaded=True)
#add tub part to record images
tub = dk.parts.Tub(path='~/mycar/data',
inputs=['image'],
types=['image_array'])
V.add(tub, inputs=inputs)
#start the vehicle's drive loop
V.start(max_loop_count=100)
위 donkeycar는 자동차에 새로운 부품을 쉽게 추가할 수 있도록 설계되었는데, 그래서 카메라에서 이미지를 캡처하고 저장하는 자동차애플리케이션의 예제코드를 통해 테스트를 진행해볼 수 있다.
그리고 위와 같이 돌려봤는데, 계속 쪽박을 찬다. 분석을 좀 해보니, donkeycar라는 디렉토리에 두번 들어가며 parts라는 디렉토리가 있고, 여기서 차량에 들어가는 각 부품들에 대해서 파이썬코드로 만들어서(이미 만들어져 있기에 그냥 가져다 쓰면된다) manage.py라는 파일에 부품을 코드상으로 부착해서 쓸 수 있겠다.
근데 오류를 보니 picamera2가 없다고 하니, 지금 설정이 가상 카메라가 아니라 라즈베리파이 카메라로 설정된 것 같아 가상카메라로 변경하여 문제를 해결해보려고 한다.
여기서 camera.py를 들어가면 다양한 클래스들이 있다. 각 클래스는 카메라 종류별로 설정되어 있는 것 같다. 일단 모듈별로 정리해보겠다.
1. logging
로깅기능을 제공하는 모듈로, 코드 실행 중에 메세지를 기록하여 디버깅이나 로그 기록에 사용된다.
2. os
운영체제 관련 기능을 제공하는 모듈로, 파일 경로 조작이나 환경변수 접근과 같은 기능을 제공한다.
3. time
시간과 관련된 함수를 제공하는 모듈로, 시간 지연이나 현재시간을 얻는데 사용된다.
4. numpy
(imported as np)
수치계산을 위한 라이브러리로, 다차원 배열과 행렬을 다루는데 특화되어 있다.
5. PIL
(Python Imaging Library)
이미지 처리를 위한 라이브러리로, 이미지를 로드하고 저장하며 다양한 이미지 조작기능을 제공한다고 한다.
6.glob
파일 경로를 이용하여 디렉토리 내의 파일들을 검색하는데 사용되는 모듈입니다. 특히, 와일드카드를 사용한 파일 패턴 검색에 유용하다.
7.donkeycar.utils
DonkeyCar 프로젝트에서 사용되는 유틸리티 함수들을 모아 놓은 모듈이다. 여기서는 rgb2gray
함수를 사용하고 있다. 이 함수는 RGB 이미지를 그레이스케일로 변환하는데 사요오딘다. DonkeyCar 프로젝트는 오픈소스 자율주행 RC카를 구축하기 위한 프로젝트로, 이미지 처리 및 자동차 제어와 관련된 다양한 기능을 제공한다.
이번에는 클래스별로 정리해보겠다.
- CameraError(Exception)
- BaseCamera
- PiCamera(BaseCamera): RaspberryPi용 IMX219-160 카메라 제어 클래스
- Webcam(BaseCamera): 웹캠을 사용하여 이미지를 획득하는 클래스
- CSICamera(BaseCamera): Jetson Nano용 IMX219 카메라 제어 클래스
- V4LCamera(BaseCamera): V4L(Video4Linux)를 사용하여 이미지를 획득하는 클래스
- MockCamera(BaseCamera): 가상의 카메라를 제어하는 클래스(이미지 프레임을 회득하는 대신, 미리 지정된 정적 이미지 프레임을 반환함. 하드웨어 카메라가 없는 유니티 가상환경에서 코드를테스트하거나 디버깅할때 사용하는 용도임.)
- ImageListCamera(BaseCamera): 디렉토리에 저장된 이미지들을 가상의 카메라 출력으로 사용함.
이렇게 다양한 클래스들중에 우리가 사용하는 것은 가상카메라와 파이카메라뿐이다.
그리고 어렵게 생각할 필요도 없이 순서는 공통적으로 다음과 같다.
1.클래스 초기화 및 카메라 초기화 2.이미지 업데이트 3.이미지 반환 4.쓰레드 실행 및 처리 5.카메라 정지
이번에는 parts디렉토리에 있던 web_controller로 들어가서 조종용 웹사이트를 실행하는 web.py에 대해 분석해보았다.
일단 모듈별로 정리해보았다.
1. os
운영체제 관련 기능을 제공하는 모듈로, 파일 경로 조작이나 환경 변수 접근과 같은 기능을 제공합니다.
2. ‘json’
JSON(JavasScript Object Notation) 형식의 데이터를 다루기 위한 모듈로, JSON 데이터의 인코딩 및 디코딩을 제공합니다.
3. logging
로깅 기능을 제공하는 모듈로, 코드 실행 중에 메세지를 기록하여 디버깅이나 추적에 사용된다.
4. time
시간과 곤련된 함수를 제공하는 모듈로, 시간 지연이나 현재 시간을 얻는데 사용된다고 한다.
5. asyncio
비동기 프로그래밍을 지원하는 모듈로, 비동기 함수와 이벤트 루프를 통해 비동기 코드르 작성할 수 있게 합니다.
6. requests
HTTP 요청을 쉽게 보내고 받을 수 있게 해주는 모듈로, 웹 서버와 통신하는데 사용됩니다.
7. tornado.ioloop
Tornado의 I/O 루프를 제공하는 모듈로, 비동기 이벤트 핸들리을 가능하게 합니다.
8. tornado.web
Tornado의 웹 관련 클래스와 함수를 제공하는 모듈로, 웹 애플리케이션을 구축하는데 사용됩니다.
9. tornado.gen
비동기 코드를 작성할 때 사용되는 Tornado의 제너레이터 기반 도구를 제공하는 모듈로, @tornado.gen.coroutine
데코레이터 등이 있다.
10. tornado.websocket
Tornado에서 WebSocket을 지원하는 클래스와 함수를 제공하는 모듈로, 웹소켓 통신을 구현할 때 사용됩니다.
11. socket
네트워크 소켓을 생성하고 통신하는데 사용되는 모듈로, 호스트 이름과 관련된 정보를 얻을 수 있습니다.
이번에는 클래스별로 정리해보겠다.
- RemoteWebServer(): 차량의 상태 및 제어명령을 폴링방식으로 받아옴
- LocalWebController(tornado.web.Application): 웹서버를 전체적으로 설정하고 관리
- DriveAPI(RequestHandler): 차량의 운전상태 및 제어명령을 변경할 수 있는 웹페이지 제공
- WsTest(RequestHandler): 웹소켓을 테스트할 수 있는 웹페이지를 제공
- CalibrateHandler(ReuqestHandler): 차량의 칼리브레이션 설정을 변경
- WebSocketDriveAPI(tornado.websocket.WebSocketHandler): (차량과 서버간의 통신을 위한)웹 소켓 헨들러
- WebSocketCalibrateAPI(tornado.websocket.WebSocketHandler): (클라이언트와 서버간의 통신을 위한)웹 소켓 헨들러
- VideoAPI(RequestHandler): MJPEG(Motion JPEG) 스트리밍을 제공하는 웹 헨들러
- BaseHandler(ReuqestHandler): 웹페이지를 제공하는 기본 헨들러
- WebFpv(Application): Tornado웹프레임워크를 통한 실시간 FPV 웹서버 실행
댓글남기기