언어 : 파이썬
사용하드웨어 : 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코드를 파이썬코드로 래핑하는 코드
'프로그래밍 > ROS' 카테고리의 다른 글
ROS) 노드로 안쓰는 코드 라이브러리화 하기 (0) | 2021.07.05 |
---|---|
ROS에서 serial 통신하는 경우 보내거나 받은 실제 hex 데이터 확인 방법 (0) | 2021.06.24 |
ROS에서 nodelet을 사용하는 이유 (0) | 2021.04.27 |
ROS를 VS code에서 디버깅하기 (0) | 2021.04.19 |
커스텀 msg를 리스트로 요소로써 가지고 있는 srv 만들기 (0) | 2021.04.07 |