4 분 소요

스로틀링 문제를 해결중이다.

config.py코드 둘러보기

이전까지는 Pi-Racer에서 뒤로가기, 즉 후전을 하지 못했었는데, 성준이 형이 드디어 해결했다.

image-20240208181639081

위와 같이 THROTTLE_REVERSE_PWM속성에 속성값을 220(기본값)에서 10~50사이로 조정해봤더니, 후전이 구현되는 것을 확인하였다.

원래 이걸로 학습데이터를 수집하고 학습결과로 “pilot.h5”모델을 export해야 하는데, 아직 그렇게 못했다.

그래서 일단은 트레이닝을 어떻게 시키는지에 대해 알아보는 중이다.

그래서 지금 launch.json파일을 보고 있다.

우리가 실행에 사용해야 할 파일들이 뭔지 파악해보고 있다.

그리고 이거를 보고 알게 된것이 있는데, 우리가 보통 shell상에서 주행을 시작할때, 다음과 같이 명령어를 떄린다.

python manage.py drive

위 명령어를 해석하면 다음과 같다.

python -> python패키지 관리자를 통해서 실행하려는 파일을 앞에 적는다. 그러면 관리자가 해당 파일(여기서는 manage.py)을 파이썬 인터프리터에 넣어서 돌리게 된다.

manage.py -> 패키지관리자가 실행해야 할 목적이 되는 파일명이다. 여기서는 manage.py를 넣었다. 이를 통해 해당 파일을 실행할 수 있다.

drive -> python 패키지 관리자는 파일명 뒤에 있는 것을 무조건 상수(args)로 인식한다.

그래서 위 조건을 launch.json에 vscode상의 버튼으로 구현해본다면 다음과 같다.

{
    "name":"donkeycar_sim_2 drive",
    "type":"python",
    "request":"launch",
    "program":"${workspaceFolder}/app/donkeycar_sim_2/manage.py",
    "cwd": "${workspaceFolder}/app/donkeycar_sim_2",
    "args": ["drive"],
    "console":"integratedTerminal"
},

그 외에 좀더 보다가 알게 된것이, main이 되는 워크스페이스(dcworks)을 vscode상에서 열었을때, 이상하게 가상환경을 담당하는 env 디렉토리가 사라진 것이었다. 파일탐색기로 들어가면 존재했음에도 불구하고 말이다.

image-20240208192323100

그래서 env파일을 편집하기 위해 env로 폴더열기를 해서 기본이 되는 루트위치를 바꿔놨다.

뭐… 이상한 삽질하다가, 지금은 다른 삽질 중이다.

미니콘다로 가상환경 구축을 다시 진행해보자.

미니콘다에다가 가상환경을 테스트해볼려고 시험중이다.

나는 home 디렉토리(C:\Users\1) 안에 있는 miniconda3에서 가상환경에 접근해보았다.

image-20240208223447414

위와 같이 env안에 donkey라는 디렉토리가 있다. 여기에는 너무 다양한 디렉토리가 있지만, 나중에 다시 미니콘다에다가 작업을 하는 경우가 또 있을 것 같다. 이걸로 작업 시도중이다.

지금 뒤져보다가 한가지 알게 된것이 일단,

Lib에는 디렉토리 형태로(패키지형태라 해야하나?) 라이브러리 파일들이 정리되어 있는 것을 보았고,

Library에는 bin,include,lib,ssl라는 총 네개의 디렉토리가 있었다. 잘은 모르겠는데, openssl이라는 파일들이 많이 있었다. 그래서 조금 찾아봤다.

OpenSSL은 TLS와 SSL의 오픈소스 구현판이라 한다. 이 프로그램은 암호화 기능과 유틸리티 함수들이 들어가 있다고 한다. 그리고 C언어로 작성되어 있다고 한다.

참고로 TLS와 SSL은 데이터 통신에 쓰이는 프로토콜 일종이다. 그냥 이정도만 알아두자.

일단 그렇다 한다ㅋㅋ

그리고 이렇게 가상환경을 확인해보았으면 이번에는 프로젝트를 가져와보는 코드들을 리뷰해보자.

(사실 이거는 예전에 1월30일자 코딩일지에 기록했던 내용들이다.)

(donkey) C:\Users\1>

위와 같이 가상환경에 접속후 홈디렉토리에 들어간 이후,

mkdir projects
cd projects
git clone https://github.com/autorope/donkeycar
cd donkeycar
git checkout main
pip install -e .

이후 버전충돌 문제를 아래와 같이 해결했다.

pip install h5py==2.10.0 packaging==20.9 wrapt==1.12.1
conda install -c conda-forge h5py

마지막으로 동키카 프로젝트에서 사용할 나의 작업용 동키카를 하나 생성해주었다.

찾아보니 mycar는 총 두가지 템플릿 중 하나를 설치할 수 있다고 한다. 그래서 나는 고민하다가,

두개를 깔아보자고 생각했다. 아래와 같이 말이다.

image-20240208232319913

1.딥러닝 템플릿 동키카

donkey createcar --template=path_follow --path ~/projects/cars/car_dl

image-20240208232501954

2.컴퓨터비전 템플릿 동키카

donkey createcar --template=cv_control --path ~/projects/cars/car_cv

image-20240208232522896

이후 car_cv에 들어가서 python manage.py drive 명령어를 쳐주었다. 참고로 python은 패키지 관리자를 뜻하고, manage.py를 실행을 목표로 하는 파일대상, drive는 여기에 먹일 인수(args)이다.

근데 다음과 같은 오류가 떴다.

image-20240208233033011

이때 pip install cv2를 쓰니 오류가 떠서, conda install -c conda-forge opencv를 썼다. 그러니 이슈를 해결했다.

이후,

conda update -n base -c defaults conda
conda install -c conda-forge .

이 부분은 포기했다. 일단 doc를 보기로 했다.


동키카 DOC

이전에 이 config.py가 기본값이라는 것을 알고 있었고, myconfig.py는 어떻게 쓰는지 몰랐는지 이번에 DOC를 보면서 알게 되었다. 다음 내용을 보자.

새 버전의 당나귀차로 업데이트할 때는 애플리케이션 폴더를 새로 고쳐야 합니다. 동일한 명령으로 이 작업을 수행할 수 있지만 –overwrite를 추가하여 myconfig.py 파일을 지우지 않도록 합니다.

donkey createcar --template=cv_control --path=~/mycar --overwrite

어쨋든 config.py는 그냥 그대로 두고, myconfig.py를 편집후 덮어쓰기(overwrite)를 하는 방식으로 작업을 해야 한다고 한다.

경로(선) 추적기

내장된 알고리즘으로 하여금 Pi-Camera를 사용하여 선을 추적하여 따라갈 수 있다고 한다.

기본적으로 노란색 선으로 조정되어 있지만 어찌어찌 조정하면 추적하는 색상을 구성할 수 있다고 한다.

더 나아가 알고리즘의 다른 많은 측면도 조정할 수 있다고 한다. 아래는 알고리즘에 대한 설명과 구성값을 사용하는 방법에 대한 내용이라 한다. 값 자체는 뒤에 나열되어 설명되어 있다고 한다.

Donkey Command-line Utilities

1.Create Car

donkey createcar --path <dir> [--overwrite] [--template <donkey2>]

2.Find Car

(env) C:\Users\1\Documents\dcworks\library\donkeycar>donkey findacar
________             ______                   _________
___  __ \_______________  /___________  __    __  ____/_____ ________
__  / / /  __ \_  __ \_  //_/  _ \_  / / /    _  /    _  __ `/_  ___/
_  /_/ // /_/ /  / / /  ,<  /  __/  /_/ /     / /___  / /_/ /_  /
/_____/ \____//_/ /_//_/|_| \___/_\__, /      \____/  \__,_/ /_/
                                 /____/

using donkey v5.0.dev3 ...
Usage: The available commands are:
['createcar', 'findcar', 'calibrate', 'tubclean', 'tubplot', 'tubhist', 'makemovie', 'createjs', 'cnnactivations', 'update', 'train', 'models', 'ui']

3.Calibrate Car (차량 보정하기)

donkey calibrate --channel <0-15 channel id>

4.Clean data in Tub

donkey tubclean <folder containing tubs>

5.Train the model

donkey train --tub=<tub_path> [--config=<config.py>] [--model=<model path>] [--type=(linear|categorical|inferred)] [--transfer=<transfer model path>]

6.Make Movie from Tub

donkey makemovie --tub=<tub_path> [--out=<tub_movie.mp4>] [--config=<config.py>] [--model=<model path>] [--model_type=(linear|categorical|inferred|rnn|imu|behavior|localizer|3d)] [--start=0] [--end=-1] [--scale=2] [--salient]

7.Plot Predictions

donkey tubplot --tub=<tub_path> --model=<model_path> [--limit=<end_index>] [--type=<model_type>] 

8.Tub Histogram

donkey tubhist --tub=<tub_path> --record=<record_name> --out=<output_filename>

9.Joystic Wizard(조이스틱 생성기)

donkey createjs

10.Visualize CNN filter activations

Usage:

donkey cnnactivations [--tub=<data_path>] [--model=<path to model>]

Example:

donkey cnnactivations --model models/model.h5 --image data/tub/1_cam-image_array_.jpg

11.Show Models database

Note: This is only available in donkeycar >= 4.3.1

Usage:

donkey models [--group] 

12.Donkey UI

Note: This section only applies to version >= 4.2.0


config.py파일 분석하기

현재 donkey-gym(가상환경)에 대한 부분을 분석중이다.

일단 이전 donkey-gym부분에 대한 코드이다.

DONKEY_GYM = True   
DONKEY_SIM_PATH = "C:\\Users\\1\\DonkeySimWin\\donkey_sim.exe" 
#"/home/tkramer/projects/sdsandbox/sdsim/build/DonkeySimLinux/donkey_sim.x86_64" when racing on virtual-race-league use "remote", or user "remote" when you want to start the sim manually first.
DONKEY_GYM_ENV_NAME = "donkey-generated-roads-v0" 
# ("donkey-generated-track-v0"|"donkey-generated-roads-v0"|"donkey-warehouse-v0"|"donkey-avc-sparkfun-v0")

그리고 이후 donkey-gym부분에 대한 코드이다.

 DONKEY_GYM = True
 
 # DONKEY_SIM_PATH = "/home/tkramer/projects/sdsandbox/sdsim/build/DonkeySimLinux/donkey_sim.x86_64" when racing on virtual-race-league use "remote", or user "remote" when you want to start the sim manually first.
 if (platform.system() == 'Windows'):
     #dspath = "C:\\Users\\1\\DonkeySimWin\\donkey_sim.exe"
     dspath = "~/DonkeySimWin/donkey_sim.exe"
     dspath = os.path.abspath(dspath)
     if not os.path.exists(dspath):
         dspath = "../../../../../DonkeySimWin/donkey_sim.exe"
         dspath = os.path.abspath(dspath)
     DONKEY_SIM_PATH = dspath
 elif (platform.system() == 'Darwin'):
     dspath = "~/Applications/donkey_sim.app/Contents/MacOS/donkey_sim"
     dspath = os.path.expanduser(dspath)
     dspath = os.path.abspath(dspath)
     DONKEY_SIM_PATH = dspath
 else: # 'Linux'
     dspath = "~/donkey_sim"
     dspath = os.path.expanduser(dspath)
     dspath = os.path.abspath(dspath)
     DONKEY_SIM_PATH = dspath
 
 DONKEY_GYM_ENV_NAME = "donkey-generated-track-v0" 
 # ("donkey-generated-track-v0"|"donkey-generated-roads-v0"|"donkey-warehouse-v0"|"donkey-avc-sparkfun-v0")

위 코드를 보았을때 나는 한가지 의문이 들었던게 있었다.

왜 굳이 dspath라는 변수를 하나 더 써서 변화된 값을 받아들일까? 나중에 생각해보고 알게 된 것이 최종적인 경로설정을 잡아주기 위함인 것이었다.

뭔말이냐면, 말 그대로 DONKEY_SIM_PATH는 상수로서 한번 값을 넣으면 그 값울 쭉~ 사용하는 것이다.

그리고 여기서 한가지 알아둘게, DONKEY_GYM_ENV_NAME는 나의 차량이 처음 어떤 경기장에 놓이게 할지를 설정하는 거다. 아래와 같다.

  1. donkey-generated-track-v0

image-20240209115239018

  1. donkey-generated-roads-v0

image-20240209115329986

  1. donkey-warehouse-v0

image-20240209115205671

  1. donkey-avc-sparkfun-v0

image-20240209115402924

만약 config.py파일에 DONKEY_GYM_ENV_NAME = "donkey-generated-roads-v0"이라 있을지라도, myconfig.py파일에 DONKEY_GYM_ENV_NAME = "donkey-avc-sparkfun-v0"이라고 되어 있으면, config.py파일에 myconfig.py파일의 내용들이 덮어씌어지게 된다. 즉 override되는 것이었다.

이런 원리로 동작하므로 config.py파일은 건드리지 말고 myconfig.py파일만 건드리자.

이왕 이런 원리로 동작하는 걸 알게 되었으니 myconfig.py파일에 있는 다른 코드들도 주석을 해제해보았다.

GYM_CONF = { "body_style" : "bare",
			"body_rgb" : (0, 128, 128),
            "car_name" : "JackSmith",
            "font_size" : 100}

그러더니 아래와 같이 나의 차체가 바뀌었다. 차 이름도 바뀌었고 말이다.

image-20240209120723599

이번에는 조금 더 바꿔보았다.

GYM_CONF = { "body_style" : "car01",
			"body_rgb" : (128, 64, 64),
            "car_name" : "SungWoong",
            "font_size" : 50}

image-20240209121056199

config.py파일은 여기까지 보고 이제 train.py파일을 보고 있다.

train.py파일 분석하기

#!/usr/bin/env python3
"""
Scripts to train a keras model using tensorflow.
Basic usage should feel familiar: train.py --tubs data/ --model models/mypilot.h5

Usage:
    train.py [--tubs=tubs] (--model=<model>)
    [--type=(linear|inferred|tensorrt_linear|tflite_linear)]
    [--comment=<comment>]

Options:
    -h --help              Show this screen.
"""

from docopt import docopt
import donkeycar as dk
from donkeycar.pipeline.training import train


def main():
    args = docopt(__doc__)
    cfg = dk.load_config()
    tubs = args['--tubs']
    model = args['--model']
    model_type = args['--type']
    comment = args['--comment']
    train(cfg, tubs, model, model_type, comment)


if __name__ == "__main__":
    main()

이 train.py는 텐서플로우를 사용하여 케라스 모델을 훈련시키는 스크립트라고 나와있는 것 같다.

기본 사용을 위한 명령어는 다음과 같다고 나와 있다.

train.py –tubs data/ –model models/mypilot2.h5

근데 이상하게 작동이 안되고 꺼져 버려서 공식문서를 보았더니 이렇게 하라고 나와있었다.

image-20240209194859462

donkey train –tub ./data –model ./models/mypilot.h5

그러더니 아래와 같이 훈련을 작동시킬 수 있었다.

image-20240209194043369

20분 정도 학습을 시켰는데 진행상황이 Epoch:10/100이었다. 충격적이었다. 계산해보면, 대략 10배의 시간을 쏟아야 한다는 계산이 나오고 그러면 총 200분, 즉 3시간 20분이 걸린다는 계산이 나온다.

이미 models라는 파일 있고 그안에 h5파일이 만들어져 있기에 여기서 학습을 중단하기로 했다.

댓글남기기