프로그래밍/ROS

lepton 3.5 Flir 열화상 카메라에서 gain값 바꾸기(python)

스스배 2021. 4. 2. 16:25

언어 : 파이썬

사용하드웨어 :  Lepton 3.5

 

하드웨어 성능에서 분명

로우 게인 (low gain) 모드: -10 ~ 400°C; 하이 게인 (high gain) 모드: -10 ~ 140°C

위에 같이 하이게인 로우게인모드로 변환이 가능하다고 써있는데

공식문서에서도 

HIgh:0 Low:1 Auto:2

이렇게만 쓰여있고 정확히 어떻게 바꾸는지는 설명이 C로만 나와있음

(즉 libuvc.so를 직접 바꾸는 형식으로)

 

처음에는 

ken.tossell.net/libuvc/doc/group__ctrl.html#ga20d63b936216c25b6678048c3ca2a0b7

위에 사이트에서 set_gain_low(), get_gain_low()를 이용해서 바꾸려고 했지만

결과코드는 정상값(0)으로 잘 나오는데 값이 전혀 바뀌지 않고

직접 400도씨 인두기로 테스트해봐도 185도에서 온도가 안올라감

github.com/groupgets/purethermal1-uvc-capture

위에 나와있는

v4l2-ctl -l를 해봤을때 gain에 대한 파라미터가 없어서 여기 문제인가 생각해보고 찾아봄

github.com/groupgets/purethermal1-uvc-capture/tree/master/v4l2/uvcdynctrl

여기에 있는 pt1.xml을 이용해서

cd uvcdynctrl
uvcdynctrl -v -d /dev/video0 -i pt1.xml
v4l2-ctl -l

 이 구문을 실행하면 gain에 대한 파라미터 값이 떠서 이건가하고 

./uvc-radiometry.py를 실행해봤는데 열화상 카메라가 할당되어있던 /dev/video0가 사라짐

다른 장치로 바꼈나 확인하려고 diff로 /dev부분 실행전, 실행후로 확인을 해봤는데 따로 생긴곳은 없었음

장치문제가? 하고 계속 찾아봤는데 실행이되면 장치문제가 아니라고 판단해서 다시 찾아봄

 

결론은

github.com/fkfaisal/thermovision/blob/main/src/uvctypesParabilis_v2.py

 

fkfaisal/thermovision

Detect temperature rise using flir lepton3.5. Contribute to fkfaisal/thermovision development by creating an account on GitHub.

github.com

 

여기에 있는 아래코드를 이용해서 해결함

 

# 기존 코드
def set_extension_unit(devh, unit, control, data, size):
  return libuvc.uvc_set_ctrl(devh, unit, control, data, size, 0x81)

# 추가된 코드
def set_gain_low(devh):
    sizeData = 4
    gain_mode = (c_uint16)(1) #0=HIGH, 1=LOW, 2=AUTO
    setGainSDK = 0x49
    controlID = (setGainSDK >> 2) + 1 #formula from Kurt Kiefer
    print('controlID: ' + str(controlID))
    set_extension_unit(devh, SYS_UNIT_ID, controlID, byref(gain_mode), sizeData) #set_extension_unit(devh, unit, control, data, size)
    perform_manual_ffc(devh)

def set_gain_high(devh):
    sizeData = 4
    gain_mode = (c_uint16)(0) #0=HIGH, 1=LOW, 2=AUTO
    setGainSDK = 0x49
    controlID = (setGainSDK >> 2) + 1 #formula from Kurt Kiefer
    print('controlID: ' + str(controlID))
    set_extension_unit(devh, SYS_UNIT_ID, controlID, byref(gain_mode), sizeData) #set_extension_unit(devh, unit, control, data, size)
    perform_manual_ffc(devh)

 

코드해석

devh: 장치정보가 담긴 POINTER 객체

gain_mode : c_uint16으로된 객체

 

setGainSDK, controlID값의 의미

github.com/groupgets/purethermal1-uvc-capture/blob/master/v4l2/uvcdynctrl/ctrl_gen.py

위에 파일에서 우리가 바꿔야할 부분은 LEP_CID_SYS_GAIN_MODE값임

 

위에 파일을 보면 LEP_SYS_MODULE_BASE 유닛(Unut)에 속한 설정값들의 코드의 숫자가 16진수로 4씩 증가라는것을 볼 수 있음

0x0000, 0x0004 ... 0x0048(LEP_CID_SYS_GAIN_MODE)... 0x0058

LEP_CID_SYS_GAIN_MODE은 0x0048(1부터 19번째)임 

여긴는 잘 모르겠는데 값을 보내줄때는 10진수로 보내야됨

그래서 0x49에 오른쪽 쉬프트 연산 = 18에다가 1을 더해서 19를 맞춤

그리고 byref로 보내기용 pointer로 만든다음에 보내면 값이 바뀜

 

 

 

 

 

 

 

 

 

www.flirkorea.com/products/lepton/?model=3.5%20Lepton

 

Lepton | FLIR Systems

FLIR Lepton은 스마트폰에 들어 갈 만큼 작고(10센트 동전보다 작음) 라디오메트릭(radiometric) 측정 기능이 있는 장파장 적외선 (LWIR) 카메라 솔루션으로, 기존 적외선 카메라 비용의 10 분의 1만 소요

www.flirkorea.com

 

베이스 github : github.com/groupgets/purethermal1-uvc-capture

 

groupgets/purethermal1-uvc-capture

USB Video Class capture examples for PureThermal 1 / PureThermal 2 FLIR Lepton Dev Kit - groupgets/purethermal1-uvc-capture

github.com

수정한 파일장소

github.com/groupgets/purethermal1-uvc-capture/blob/master/python/uvctypes.py

 

groupgets/purethermal1-uvc-capture

USB Video Class capture examples for PureThermal 1 / PureThermal 2 FLIR Lepton Dev Kit - groupgets/purethermal1-uvc-capture

github.com

위에 파일이 c코드를 파이썬코드로 래핑하는 코드