2022년 7월 27일 수요일

인공지능+영상처리+OceanOptics USB2000+Flir Camera 를 위한 시스템 설정

# 작업 시스템

윈도우즈 11, 64bits

# 설치 소프트웨어

## Python 3.8.xx

64bit 버전으로 설치하고, 현 시점에 최신 버전은 3.10이지만, 인공지능을 위한 tensorflow가 지원하는 최신 버전인 3.9.13버전이고 Spinnaker라는 Camera 소프트웨어는 3.8.xx버전을 지원한다.

### pip(Python Install Package) 설치

설치하고 가장 먼저해야할 작은 pip(Python Install Package)를 업그레이드 하는 것이다.

PS D:\python -m pip install --upgrade pip

그럼 tensorflow를 설치할 수 있는 환경이 조성되었다.

### tensorflow 와 tensorflow-cpu 설치 

PS D:\python -m pip install tensorflow

설치된 tensorflow를 확인해보자.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import tensorflow as tf

2022-07-27 11:53:34.911913: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found

2022-07-27 11:53:34.912570: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.

>>> quit()

CUDA 런타임 라이브러리가 없다고 에러를 발생시킨다. 그래서 cpu전용 구동할 수 있는 tensorflow-cpu를 추가 설치한다.

PS D:\> python -m pip install tensorflow-cpu

다시, 설치된 tensorflow의 버전을 확인해 보자.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import tensorflow as tf

>>> tf.__version__

'2.9.1'

>>> quit()

### PySide6 설치

PS D:\> python -m pip install PySide6

설치된 버전 확인한다.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import PySide6

>>> PySide6.__version__

'6.3.1'

>>> quit()

### OpenCV 설치

PS D:\> python -m pip install opencv-python

설치된 버전 확인한다.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import cv2

>>> cv2.__version__

'4.6.0'

>>> quit()

## Visual Studio Code 설치

아래의 사이트를 방문해서 해당 시스템에 알맞은 설치파일을 다운로드 받는다.

https://code.visualstudio.com/download

설치 후 PySide6 예제를 코딩하고 실행해 본다.


## FLIR 카메라를 위한 환경 설정

과거의 Point Gray사의 카메라를 사용하기 위해서 현재는 FLIR로 합병된 Spinnaker SDK를 설치해야한다.

SpinnakerSDK_FULL_2.7.0.128.x64.exe 파일을 다운로드하고 설치한다.

그리고,  Python 에서 카메라를 운용하기 위해서 spinnaker_python-2.7.0.128-cp38-cp38-win_amd64.zip 파일도 다운로드하고, 다음의 명령어로 설치한다.

PS D:\> python -m pip install .\spinnaker_python-2.7.0.128-cp38-cp38-win_amd64.whl

그리고 설치확인한다.


import os
import PySpin
import sys

if __name__ == '__main__':
    # Retrieve singleton reference to system object
    system = PySpin.System.GetInstance()

    # Get current library version
    version = system.GetLibraryVersion()
    print('Library version: %d.%d.%d.%d' % (version.major, version.minor, version.type, version.build))

    # Retrieve list of cameras from the system
    cam_list = system.GetCameras()

    num_cameras = cam_list.GetSize()

    print('Number of cameras detected: %d' % num_cameras)


## Ocean Optics의 USB 4000을 위한 환경 설정

사전설치 사항으로 SpectraSuite가 설치되어 WinUSB 드라이버가 작동하고 있어야 한다.

그렇지 않다면, libusb-win32를 설치하고 수작업으로 드라이버를 설정하고 설치해야 한다.

아직은 seabreeze가 libusb-1.0을 지원하고 있지는 않는 것 같아. 위의 방법이 유일한 것 같다.

그럼 python에서 usb4000을 운용할 seabreeze를 설치한다.

PS D:\> python -m pip install seabreeze

설치된 버전을 확인한다.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import seabreeze

>>> seabreeze.use('cseabreeze')

>>> from seabreeze.spectrometers import list_devices, Spectrometer

>>>  devices = list_devices()

  File "<stdin>", line 1

    devices = list_devices()

IndentationError: unexpected indent

>>> devices = list_devices()

>>> devices

[<SeaBreezeDevice USB4000:USB4U30285>]

설치는 잘 된 것 같다. 



2022년 7월 20일 수요일

[번역] 바닥 난방 시스템 (Radiant floor hydronic (water) heating system)

 원본: https://www.instructables.com/RADIANT-FLOOR-HOT-WATER-HEATING-SYSTEM/



이 문서는 slab 바닥(철근 콘크리트 구조의 바닥판을 의미) 시스템에 물을 이용한 바닥 난방을 적용하는 방법을 다루고 있다.

새집을 지어지는 동안 나무 프레임 바닥위에 콘크리트 를 부어 바닥을 만들고 거기에 다시 바닥 난방을 적용할 수 있었다.

이 시스템은 pex 파이프, 작은 펌프, 온수기, 그리고 온도 조절기를 통해서 동작한다. 


1단계: 시스템 설계



부품을 구입한 공급업체(PexSupply.com)에서 전체 시스템에 대한 디자인을 구했습니다. 그들은 당신이 난방시스템에 필요로 하는 사양에 따른 무료의 Layout과 부품의 리스트도 제공합니다. 나는 바닥, 벽 및 천장에 대해 원하는 단열값과 함께 평면도를 제공하라는 요청을 받았습니다.

여러분은 또한 Uponor에서 무료 프로그램을 다운로드하여 여기에 포함 된 것보다 더 많은 정보를 읽을 수 있습니다. 저는 980 평방 피트(feet^2)의 단층 주택을 위해 단일 펌프, 단일 구역 시스템을 선택했지만 각 방에 물 공급량을 낮춤으로써 제어 할 수있는 별도의 시스템 구역을 선택했습니다.


2단계: 충분한 단열 공급




첫 번째 단계는 기초벽(옹벽) 내부에 자갈로 바닥을 깔고 그위에 수증기를 막아줄 장벽을 설치한다. 그런 다음 단열을 수행하였습니다. 나는 온기가 땅속으로 내려가지 않고 위쪽으로 올라가도록 돕기위해 추가의 (견고한)단열재 – R15 –를 사용했습니다. 


3단계: 보강 와이어 설치와 파이프 배치 준비



콘크리트 보강 와이어라고하는 6×6의 용접된 와이어 패브릭 (WWF)을 추가하고 이를 사용하여 파이프를 묶는데 사용하였습니다. 나는 1/2"의 pex 파이프 1,000 피트의 롤을 샀습니다. 더 작은 롤(여러개)를 사용할 수 있지만, 나는 콘크리트 바닥에 파이프의 연결부를 만들기를 원지 않았습니다. 파이프는 이렇게 긴 코일형태로 다루기가 매우 어려운데, 큰 스풀(공간)을 만들고 돌리 바퀴를 추가해서 내가 파이프를 풀면 내 주위에 따라오도록 만들었다. 이러한 방식은 집안에 배선을 할때 유용했습니다. 


4단계: 전체 공간을 연속적으로 배선하기





유틸리트 코어의 pex 파이프의 각 길이는 설치할 공간에 회로 형태를 이루도록 되어 있고, 원래의 시작된 곳으로 되돌아 와서 closed-loop 열시스템을 통해서 물이 순환하도록 되어 있습니다. 나는 펙스 파이프를 묶기 위해 지퍼 타이를 사용했습니다. 도면/계획에서 보듯이 모든 파이프는 다이어그램 / 계획에 따라 모든 파이프는 유틸리티 코어에서 끝나고 내부의 복사 바닥 시스템에 연결됩니다.

나는 파이프가 벽을 세우는 데 필요한 3/4 "전기 도관 각도를 통해 파이프를 미끄러 뜨린 다음 3/4"PVC 파이프로 미끄러 져서 건축 과정에서 똑바로 유지하고 보호했습니다. 구역 (주방, 욕실, 거실 등)에 따라 PVC 파이프에 라벨을 붙였습니다.

우리는 모든 파이프가 떨어진 곳을 정확히 기억할 수 있도록 많은 레이아웃 사진을 찍었습니다. 벽장 용 접시에 못을 박고 난방 시스템에 구멍을 뚫고 싶지 않았습니다. 

5단계: 콘크리트 슬라브에 대한 준비 완료


드디어, 나는 콘크리트 받침블럭을 설치하고, 철근을 묶었다. 이 모든 것은 콘크리트 바닥을 위한 표준적인 작업이다.

6단계: 누수 확인



나는 또한 모든 파이프를 함께 묶고, 내부에 공기로 압력을 가하였다. 나는 그져 파이프 위에 4" 높이의 콘크리트를 붓기전에 누수가 없는지 확인하고자 하였다.

7단계: Slab 붓기





그리고 이제 모든 부분이 덮여지게 된다! 작업을 잘 알고 있는 작업자들이 4" Slab를 붓고 확인하였다. 이 작업은 아주 훌룡하게 마무리 되었습니다. 이 작업이 마무리된 후에, 집을 지어 올리는 작업으로 전환하였다. 나는 내 패이스로 아주 많은 작업을 혼자 해왔기 때문에, 이 난방시스템을 설치하는데 소요된 시간은 2년정도 걸렸다.

8단계: 설정하기!




나는 두 개의 온수기로 많은 방을 감당하는 큰 utility core를 만들었다; 한 개는 낮은 온도로 설정하게 될 마루를 위한 것이고, 다른 것은 나를 위해 온도를 조절 할 수 있게 시스템화 되어 있다. 순간 온수를 위한 옵션도 있다. 하지만, 그러한 비용을 쓰고 싶지 않았다. 난 그져 표준 40갤론의 온수기를 2백달러를 구매했다.

9단계: 연결하기!




난방 시스템은 온수 흐름을 제어하는 릴레이 스위치가 연결된 온도계로 구성되어 있다. 온도계는 거실에 위치해 놓았다. 거실은 집의 정 중앙에 위치해있다. 나는 집을 처음부터 지어왔기 때문에, 벽에 전선을 넣고 utility core로 뽑아내는데 수월할 수 있었다. 릴레이는 동작할 때 시스템에 알려준다. 펌프가 동작하고 물이 온수기를 통해서 마루 바닥으로 이동한다. 다시 마루 바닥의 물은 다시 온수기로 되돌아 온다. 여러분들이 사진과 같은 게이지 숫자를 확인할 수 있다면, 공급되는 물은 100도이고 되돌아 오는 물은 80도 정도임을 확인 할 수 있다.

10단계: 문제 대응




첫 번째 이슈는 한 번 모든 것이 연결되면 내부의 공기는 다 배출된 하지만, 파이프에 남아 있는 공기는 이 첫번째 이슈를 야기한다. 나는 공기가 다 빠져 나갈때까지, 거품을 빼는 작업을 하였다. 두 번째 이슈는 펌프의 크기이다. 설계된 시스템에 적합한 한 개의 펌프로 나의 집에 충분히 온수를 공급할 것으로 믿었다. 하지만, 그렇지 않았다. 펌프는 900피트의 1/2" 파이프에 수압을 견딜 수 있도록 충분히 강해야 한다.
여러분은 head의 길이를 계산함으로써 사전에 요구사항을 결정할 수 있다. 마지막으로 펌프의 연결 부위를 짧게하고, 펌프를 추가 주문해서 두 개로 운용해서 시스템은 훌룡하게 동작하고 있다. 펌프는 그리 자주 틱틱거리지 않고 집은 따뜻하게 유지된다. 나는 CenTech 적외선 온도로 잘동작 하는지 확인했다.

11단계: 포근한 집을 즐기세요!




애완동물은 마루의 아주 따뜻한 부분에 누워서 어디에 파이프가 위치하고 있는지를 알려준다. 집 내부는 consistent 68도로 유지되면서 온 겨울내내 훌룡한 나날을 보냈다. 작은 펌프에서는 조용한 흠...하는 소리이외는 다른 잡음은 없이 통상적인 온수기 소리가 나온다. 통풍구에서 뜨꺼운 먼지 바람도 없고, 너무 뜨겁거나 너무 춥거하 하는 나무 난로를 켜지 않아도 되었다. 그리고 효율 측면에서 980평방 피트의 단열이 잘된 집에서 서부 Oregon주의 가장 추운 달동안 평균 33KW정도 소비하였다. 우리의 전기 회사의 에너지 전문가가 "Wow!"라고 이야기 했고, 이 의미는 좋은 의미로 이야기 하였다.

나는 비상시를 위해서 여분의 펌프와 소모될 수 있는 유일한 부품은 온수기를 구매했다. 나에게 모든 작업을 하는데 소요된 총비용은 $1,700정도이다.

이 이야기의 짧은 버전은 나의 블로그에서 볼 수 있다. Wildcat Man.

2022년 7월 10일 일요일

FreeCad, Debian Test에서 사라지다.

 어느날 부터인가 libboost가 업그레이드가 안되더니 수작업으로 업그래드 한 후 갑자기 freecad가 자동으로 사라져 버렸다. test 리포지터리에서 사라진것 같다. 

 freecad 홈페이지에 가 보았더니 처음에 experimental로 올리고 나중에 testing으로 전환된다고 한다. 아마도 지금은 experimental에서 testing으로 전화되기 중간과정에서 기존 버전을 내리는 과정에 있는 것 같다. 언제 올라올지 몰라서 현재 패키지 리포지터리에 unstable 을 추가하고, freecad만 설치한후 다시 unstable 소스 리포지터리를 주석처리해서 다른 패키지에 영향을 안주도록 만들었다.


deb http://ftp.us.debian.org/debian/ testing main contrib non-free
# deb-src http://ftp.us.debian.org/debian/ testing main contrib non-free

deb http://security.debian.org/debian-security testing/updates main contrib non-free
# deb-src http://security.debian.org/debian-security testing/updates main contrib non-free

deb http://ftp.us.debian.org/debian/ unstable main contrib non-free
# deb-src http://ftp.us.debian.org/debian/ unstable main contrib non-free

2022년 3월 4일 금요일

NodeJS 버전 문제 해결 방안

 NodeJS를 데비안 패키지 관리자로 유지해서 사용하면 버전이 12로 설치된다. 

이것저것 하다보면 npm install 단계에서 NodeJS가 버전업하면서 변경된 부분에서 문제를 발생시킨다.

stack Error: `make` failed with exit code: 2

를 위시로하여 많은 문제점들을 보여준다.

/usr/include/nodejs/deps/v8/include/v8config.h:328:3: note: in definition of macro ‘V8_DEPRECATED’

이건 Chrome’s V8 JavaScript engine의 기능 중 지원 중단된 기능이 있다고 경고해 주는 메시지로 보인다. 아마도 현재사용하는 NodeJS의 버전이 과거 버전이라고 알려주는 것으로 파악된다.

../../nan/nan_object_wrap.h:124:26: error: ‘class Nan::Persistent<v8::Object>’ has no member named ‘IsNearDeath’
  124 |     assert(wrap->handle_.IsNearDeath());

이것도 같은 맥락으로 보여지는데 v8::Object의 메서드 중 IsNearDeath이 없다고 하는 에러이고, 이외에도 v8기능이 존재는 하는데 요구되는 기능에 대응하는 메서드가 없거나 약간 다른 형태로 존재해서 문제가 발생하거나 하는 에러메시지들이다.

npm ERR! ../../nan/nan_implementation_12_inl.h:103:42: error: cannot convert ‘v8::Isolate*’ to ‘v8::Local<v8::Context>’
npm ERR!   103 |   return scope.Escape(v8::Function::New( isolate
npm ERR!       |                                          ^~~~~~~
npm ERR!       |                                          |
npm ERR!       |                                          v8::Isolate*
npm ERR! In file included from /usr/include/nodejs/src/node.h:67,
npm ERR!                  from ../src/addon.cpp:1:

이건, /usr/include/nodejs/src/node.h에 있는 기능과 설치할 패키지의 소스가 요구하는 기능이 서로 맞지 않아서 생기는 문제로 보인다. 아무튼 이러한 종류의 문제들이 많다.

그래서, NodeJS의 LTS(Long Term Support )버전인 16을 설치해 보아야 하는 것이 옳은 결정인것 같다. 하지만, 이 문제가 아닐 경우 되돌릴 수 있는 방법도 생각해 보아야 하기 때문에, 바로 설치 하기 보담, nvm이라고 하는 NodeJS Version Manager라는 것을 설치하고 여러 버전의 NodeJS를 설치하고 관리하는 방법으로 시도해 보고자 한다.

먼저, nvm을 설치해야 한다. 데비안 패키지 관리자를 통해서 설치해 보려고 하는데 없다. 직접 다운로드하거나, nvm의 공식 사이트에서 제공하는 소스트리를 통해서 설치해야 한다. 그래서 공식 사이트에서 제공하는 소스트리를 추가하고 데비안 패키지 관리자를 통해서 설치해 본다.

사전 준비 작업

$ sudo apt update && sudo apt install curl -y
nvm 제공 사이트에서 nvm설치, 시스템 설정 및 환경 설치해주는 스크립트 다운로드
$ curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash 
그럼 새롭게 설정된 환경 변수를 다시 로딩한다.
$ source ~/.profile 
현시점에서 사용가능한 NodeJS 버전 살펴보기
$ nvm ls-remote
시도해볼 버전을 설치해본다. 여기선 v16으로 해본다.
$ nvm install v16.14.0
여기까지 하면 현재 시스템에 두개의 버전(현재 설치되어 있던 v12와 새로설치된 v16)이 동시에 존재하게 된다.
이 부분은 다음 명령어로 확인할 수 있다.
$ nvm list
그럼 사용하고 싶은 버전으로 변경은 다음의 명령어로 할 수 있다. 여기선 v16.14.0으로 변경해 본다.
$ nvm use 16.14.0
그리고 필요없는 버전은 다음의 명령어로 제거할 수 있다.
$ nvm uninstall v9.5.0
 

2022년 2월 2일 수요일

Linux System Management

 # Avoid clicking sound from hdd
$ hdparm -B 254 -S 241 /dev/sda
## /etc/hdparm.conf
/dev/sda {
    apm = 254
    apm_battery = 254
    spindown_time = 241
}

# Grub screen resolution
## /etc/default/grub
uncomment as GRUB_GFXMODE=800x600
$ update-grub

# Keyboard remapping; capslock into ctrl, and swap Left Window with Left Alt
## Check available options
$ grep alt /usr/share/X11/xkb/rules/evdev.lst | grep win
## /etc/default/keyboard
XKBOPTIONS="ctrl:nocaps, altwin:swap_lalt_lwin"

# Install vscode
$ curl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main"
$ sudo apt install code

# Install emacs
$ sudo apt install emacs-nox
## emacs goodies
$ apt install elpa-irony elpa-flycheck elpa-ggtags

# Install KeePassXC, Gaculator, Visual Studio Code, LimeSuite GUI, Meld, QtCreator, Sublime Text, Spinnaker, FreeCad, GIMP, ImageJ, LibreCad, Shotwell, Meshlab, Chromeium, Firefox, ThunderBird, Skype, Remote Viewer, Telegram, Kicad, Fish, Disk Usage Analyzer, GParted, CuteCom, libvirt, Vitual Machine Viewer, Barrier,

# Install LibreOffice
Prof-XFCE-theme-1.2, Papirus-Light,

pycharm,


# Delete APT cache
$ apt autoclean

# Delete unneccessary APT packages
$ apt autoremove

# Delete systemd journal logs
$ journalctl --disk-usage
$ journalctl --vacuum-time=3d

# Delete log files
$ rm -v /var/log/*log*

# Analyze booting process in terms of time cosuming
$ systemd-analyze blame
## In case of too long consuming service
$ systemctrl disable $(service_name)

# Disabling tracker for your user only
Enter the directory ~/.config/autostart, create it if it does not exist
Create a file named tracker-miner-fs-3.desktop
Paste the following into the file, save and exit:
[Desktop Entry]
Encoding=UTF-8
Name=Tracker
Hidden=true

or

$ systemctl --user unmask tracker-store.service tracker-miner-fs-3.service tracker-miner-rss.service tracker-extract-3.service tracker-miner-apps.service tracker-writeback.service


# Error starting domain: Requested operation is not valid: network 'default' is not active
Type help for instructions on how to use fish
$ virsh net-list --all
 Name      State      Autostart   Persistent
----------------------------------------------
 default   inactive   no          yes

$ virsh net-start default
Network default started

$ virsh net-autostart --network default
Network default marked as autostarted

# find the UUID of disk
$ blkid | grep UUID

# Clone disk
$ dd if=/dev/sda of=/dev/sdb bs=4096 conv=noerror,sync

# Firmware update
$ fwupdmgr get-devices
$ fwupdmgr refresh
$ fwupdmgr update

2021년 12월 3일 금요일

Go Ethereum 구축

 # Go 컴파일러 설치

https://go.dev/doc/install 에 가서 설치 파일이 아닌 바로 시스템에 맞은 바이너리를 다운로드한다.

처음에 시스템의 파티션을 너무 작게 설정하는 바람에 사용자 계정의 루트에 설치해야 한다.

어짜피 나혼자 쓰는 시스템이니 이렇게 해 놓아도 무방하다.

$ rm -rf $HOME/daysleep/go && tar -C $HOME/daysleep -xzf go1.17.3.linux-amd64.tar.gz

 자 설치는 다 되었으니 시스템 경로에 go를 추가한다.

$HOME/.profile에 다음의 라인들을 추가한다.

if [ -d "$HOME/go/bin" ] ; then
    PATH="$HOME/go/bin:$PATH"
fi

이제 터미널을 열어서 설치와 설정이 제대로 되어 있는지 확인해 보자. 다음과 같이

$ go version

go version go1.17.3 linux/amd64
 

# 간단한 Go 언어 문법 살펴보기

 

# Go Ethereum 설치

 go 는 자체 빌드 절차를 가지고 있는 듯하다 그냥 보기엔 git이 통합되어져 있는 것 같다.

아무튼 이질적이라 거부감이 든다. 그래서 전통적인 git으로 땡겨와서 make로 설치하는 방법이 정신건강에 좋을 것 같다.

$ git clone https://github.com/ethereum/go-ethereum.git
$ cd go-ethereum
$ make geth

위와 같이 문제없이 수행되면 geth라는 실행파일이 go-ethereum/build/bin에 생성되고 시스템에서 사용할 수 있게 시스템 PATH에 추가해 주면 된다.

아직은 geth라는 것이 뭔지 모르겠지만, 시작은 geth로 시작해 보아야 겠다. 나머지 많은 프로그램 꾸러미들이 있는데 그걸 다 생성하려면 make all 하면 되지만 잠시 미루어 두기로 하자. 머리 아프다.

오 이런 $GOPATH를 요구한다. 이건 뭐하는 놈인지?

$ go env 하니깐 GOPATH="/home/daysleep/go" 이라고 나오네 아마도 go로  build 안해서 생기는 추가 요구사항인것 같다.

그럼 다시 $HOME/.profile의 go 설정에 추가해 주자 다음과 같이.

if [ -d "$HOME/go/bin" ] ; then
    PATH="$HOME/go/bin:$PATH"
    GOPATH="$HOME/go"
fi

멀쩡한 터미널 닫고 다시 열어서 반복해야 겠다. 오 아니다. 이걸로 해결이 안된다. 

역시 수작업은 문제가 있다. 설치한 go의 환경을 지우고 debain 패키지로 제공되는 gccgo-go를 설치해야 결과를 볼 수 있다.

$ apt install gccgo-go

그리고 다시 위의 설치를 다시 수행해 본다. 뭔지 모르지만 엄청 많은 패키지들을 git으로 땡겨오고 난리다. 그래도 안된다.

이제 잘란다.








 

2021년 8월 1일 일요일

Line Scan Imaging을 위한 buffer 다루기와 Thread의 설계

# Memory 설계

기본적으로 메모리 사용량의 효율성 보다 서로 다른 Thread가 하나의 메모리 공간을 가지고 경쟁하는 상황을 피하기 위해서,

라인 스캔된 영상들은 하나의 영역을 구성하는 기본 영상을 저장하는데 필요한 크기보다 큰 circular buffer(boost::circular_buffer)에 차곡차곡 쌓아 놓아야 한다. 이를 통해서 영상을 획득하는 Thread(Acquisition Processing)는 circular buffer에 적재만 하고 ciruclar buffer가 어떻게 사용되는지는 고려하지 않아도 된다. 그리고 영상이 완성된 이후의 영상처리 기능을 분산하기 위해서 라인 스캔된 영상단위로 처리할 수 있는 영상처리를 수행하고 처리된 결과를 저장할 추가적인 circular buffer를 마련해서 computing cost를 분산시킨다.

# Thread 설계 

라인 스캔 영상을 처리학 위해서 최소한 3개의 Thread가 필요하다. 첫째는 라인 스캔된 영상을 획득하고 circular buffer에 적재하는 Thread(+가능하다면 라인스캔 단위로 처리할 영상처리를 수행), 둘째는 하나의 기본단위 영상 크기에 대한 영상처리 thread, 그리고 마지막 셋째는 영상 처리 결과를 30혹은 60hz 주기로 GUI에 뿌려주는 Thread로 구성하면된다.

이와 같은 Thread가 순차적으로 동작하도록 하기 위해선 QThreadPool과 QRunnable이라는 Qt 인스턴스를 활용해야한다.

# 최적화

속도의 문제가 발생할 수 있는 우려되는 영역은 영역 단위의 영상처리 Thread의 수행 속도이다. 이 부분의 우려를 불식시키기 위해서는 병렬처리를 고려해 볼 수 있다. 기본적으로 OpenCV를 사용할 경우 GPU나 SIMD를 활용한 Custom 라이브러리를 사용하는 것을 첫번째로 고려하고 아니면 수작업으로 SIMD나 CUDA를 이용한 방법을 고려해보자.

# 배워야할 거리들

boost::circular_buffer, QThreadPool, QRunnable, OpenCV with SIMD, and CUDA enabled, SIMD, CUDA