2021년 9월 1일 수요일

Jetson Nano 세팅 및 알아두어야 할 것들

 

1. 전원 공급

  • Jetson Nano는 Micro-USB 또는 AC Adapter 중 하나만을 전원공급으로 사용함
  • J48에 점퍼를 끼우면 AC Adapter로만 전원 공급을 받게 할 수 있고 반대로 점퍼가 없으면 Micro-USB를 전원 공급으로 사용함
  • 2GB는 M.2 Key 슬롯이 없고 어댑터를 사용하지 않으며, Micro-USB만 가지고 있음

그림1. Jetson Nano 다이어그램

2. OS(우분투) 포팅

Jetson 장치 패밀리를 위한 우분투 기반 리눅스 배포판 JetPack이 Nvidia에서 지원됨

3. WiFi 세팅

와이파이 모듈은 Jetson Nano 보드의 SODIMM 모듈을 고정하는 상단 좌우 나사 두개를 풀고 좌우 고정핀을 당겨 J2에서 제거한 후 J18에 장착 (그림1 참조)

4. 원격데스크톱 및 SSH 세팅

접속방법

  • Wi-Fi
  • Micro-USB (해당 경우 192.168.55.1로 접근)
  • 이더넷

원격 데스크톱

  • Jetson Nano에서 다음을 설정

    sudo vim /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml
    # Vino 스키마 수정
    
    <key name='enabled' type='b'>
    	<summary>Enable remote access to the desktop</summary>
    	<description> If true, allows remote access to the dekstop via the RFB protocol. Users on remote machines may then connect to the desktop using a VNC viewer.</description>
    	<default>true</default>
    </key> 
    # 다음 내용을 붙여넣고 저장
    
    sudo glib-compile-schemas /usr/share/glib-2.0/schemas
    # 스키마 업데이트
    
    # 검색에서 Startup application를 찾아 실행 후 Vino 추가, 파일 위치는 /usr/lib/vino-server
    
    gsettings set org.gnome.Vino require-encryption false
    gsettings set org.gnome.Vino prompt-enabled false
    gsettings set org.gnome.Vino enabled true
    
  • 클라이언트에서는 VNC 접속 프로그램으로 Jetson Nano에 원격 데스크톱 연결을 수행하면 됨

  • 2021/09/02 문제점 - 계정에서 로그아웃 될 경우 vino가 죽음

SSH

  • 이더넷 및 와이파이의 경우 해당 Jetson Nano에 할당된 IP로 접속

  • Jetson Nano에서 실행

    sudo vim /etc/ssh/sshd_config
    
    Port *[원하는 포트번호]* 
    Host /etc/ssh/ssh_host_rsa_key
    SyslogFacility AUTH
    LogLevel INFO
    
    LoginGraceTime 2m
    PermitRootLogin yes
    StrictModes yes
    
    PubkeyAuthentication yes
    
    HostbaseAuthentication no
    IgnoreRhosts yes
    PermitEmptyPasswords no
    ChallengeResponseASuthentication no
    
  • 접속 클라이언트에서 실행

    # 리눅스 및 macOS 환경
    
    ssh-keygen -b 2048
    # SSH키 생성
    ssh-copy-id [생성한 키 위치] [Jetson Nano 사용자 이름]@[Jetson Nano 주소] -p [SSH설정 포트]
    # 생성한 SSH 키 중 Public 키를 Jetson Nano에 전송
    # macOS는 HomeBrew를 통해 ssh-copy-id를 다운로드 가능
    
    vim ~/.ssh/config
    
    Host *[별칭]*
    	HostName [Jetson Nano 주소]
    	Port [SSH 설정 포트]
    	User [Jetson Nano 사용자 이름]
    	IdentityFile [생성한 키 위치]
    
    # Option: ssh 접속 별칭 설정하는 과정, ssh *[별칭]*으로 접속 가능. 
    

5. 삼바 세팅

6. 카메라 연동 테스트

VNC 또는 장치에서 접속

카메라 영상 보기

gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM), \
width=(int)1920, height(int)=1080, format=(string)NV12, \
framerate=(fraction)30/1' ! nvoverlaysink -e

카메라 영상을 이미지로 분할 저장

# %~nd에서 n은 채워질 총 자리수를 의미하고, 앞에 있는 0의 갯수 만큼 0으로 미리 채워넣는다.
gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM), \
width=(int)1920, height=(int)1080, format=(string)NV12, \
framerate=(fraction)30/1' ! nvjpegenc ! multifilesink location=img-%00005d.jpg

카메라 영상을 H.264로 저장

gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM), \
width=(int)1920, height=(int)1080, format=(string)NV12, \
framerate=(fraction)30/1' ! nvv4l2h264enc bitrate=8000000 ! h264parse ! \
qtmux ! filesink location=video.mp4 -e

Python에서 GStreamer 사용하기

  • OpenCV

  • Gst-Python

    # 설치
    sudo apt-get install python-gst-1.0 python-gi
    
    # 예시 Python script
    import gi
    gi.require_version('Gst', '1.0')
    from gi.repository import Gst
    
    import matpoltlib.pyplot as plt
    
    Gst.init(None)
    
    pipeline = Gst.parse_launch('nvarguscamerasrc sensor-id=0 name=cam0 \
    aelock=true awblock=true wbmode=0 ! video/x-raw(memory:NVMM), \
    width=(int)1280, height=(int)720, format=(string)NV12, \
    framerate=(fraction)5/1 ! nvvidconv flip-method=0 !\
    video/x-raw,width=640,height=480,format=BGRx ! \
    nvvidconv ! video/x-raw,width=640,height=480 ! \
    videoconvert ! queue leaky=downstream max-size-buffers=1 !
    appsink max-buffers=1')
    
    # 0번 카메라를 얻고, 자동 화이트 밸런스, 노출 기능 잠금.
    # 카메라를 1280x768 해상도와, NV12, 프레임레이트 5/1로 설정하고
    # NV12의 포멧을 BGR의 포멧으로 GPU에서 변경하고
    # BGR를 다시 RGB의 포멧으로 변경함 (GPU 사용 안함)
    # 이 데이터를 Gst에 sink함
    
    sink = pipeline.get_by_name('appsink0')
    sample = sink.emit('pull-sample')
    buffer = sample.get_buffer()
    caps = sample.get_caps()
    
    img = np.ndarray((caps.get_structure(0).get_value('height'), caps.get_structure(0).get_value('width'), 3),
    			buffer=buffer.extract_dup(0, buffer.get_size()),
    			dtype=np.uint8)
    # sink된 데이터를 가져옴
    
    plt.imshow(img)
    plt.show()
    # 이미지 출력
    

참고자료

댓글 없음:

댓글 쓰기

[번] Callback 지옥, Promises, 그리고 Async/Await

원문:  https://blog.avenuecode.com/callback-hell-promises-and-async/await  Callbacks와 promises, 그리고 async/await을 쓰는 비동기 자바스크립트는 반환하는데 시간이 소요되는...