파라미터 조절 패널(hik_camera_panel) 패키지 추가
(이전 커밋 6eeb6a8 요약)
카메라 온보드 ExposureAuto/GainAuto가 항상 풀프레임을 측광해서 하늘이 있으면
바닥이 어두워지는 문제(camera_exposure_design_notes.md 4절)를 풀기 위해
hik_camera_node.cpp에 gain_auto(온보드 자동 게인), use_software_ae +
ae_roi_top_ratio(ROI 제한 소프트웨어 측광 — SDK에 측광 전용 ROI 노드가 없어
직접 구현), 노출 우선/게인 최후수단 순서, sync_role(master/slave) 기반
노출·게인 동기화를 추가했었다.
(이번 커밋 — 패널 기능 추가)
- hik_camera_node.cpp: dynamicParametersCallback()이 gain_auto_max_db,
ae_roi_top_ratio, ae_target_percentile, ae_target_dn,
ae_saturation_percentile, ae_saturation_dn, ae_step_gain을 런타임에도
받아들이도록 확장했다. 기존엔 이 파라미터들이 시작 시에만 반영되고
ros2 param set으로는 "Unknown parameter"로 거부되던 것을 고쳤다 — 패널에서
슬라이더로 조절하려면 반드시 필요한 변경.
- 새 패키지 hik_camera_panel (ament_python, python_qt_binding 기반): cam1/cam2/
cam3 탭으로 구성된 GUI. 노출/게인/ROI 등 파라미터를 슬라이더 또는 직접 숫자
입력으로 실시간 조절할 수 있고, /<camera_name>/image를 구독해 ROI(측광 제외
상단 비율) 경계선을 이미지 위에 오버레이로 보여준다. sync_role/
sync_master_camera_ns는 노드 시작 시에만 반영되는 값이라 조회 전용으로 막아
뒀다. 노출/노출상한/하한처럼 범위가 넓은(15us~100ms) 값은 슬라이더를 로그
스케일로 매핑했다.
새 파라미터는 전부 기본값이 기존 동작을 유지하도록 해서 하위호환된다.
개발 PC(macOS)에는 ROS 2/python_qt_binding이 없어 문법 검사와 슬라이더↔값
변환 로직의 순수 파이썬 라운드트립 테스트만 돌려봤다 — 실제 rclpy 파라미터
서비스 호출, Qt 위젯 동작, 이미지 렌더링은 로봇 PC에서 검증 필요.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
camera_params_cam1/2/3.yaml에 새로 추가된 sync_role/gain_auto/use_software_ae/
ae_* 파라미터를 실제로 채워넣었다. cam2(가운데)는 sync_role: "master"로 두고
게인 자동조절·소프트웨어 ROI 측광 관련 파라미터를 미리 선언해뒀다(조리개/초점이
아직 확정 전이라 gain_auto/use_software_ae 자체는 꺼둔 상태 — 값만 준비).
cam1/cam3는 sync_role: "slave" + sync_master_camera_ns: "cam2"만 추가했다
(슬레이브에서는 나머지 AE 파라미터가 무시되므로 넣지 않음). 이 상태만으로도
cam2의 실제 적용 노출/게인이 방송되어 3대가 항상 같은 값을 쓰게 된다.
README.md를 영어에서 한글로 전면 재작성하고, 마스터 off/on에 따라 슬레이브가
고정값을 쓰는지 실시간으로 추종하는지에 대한 동작 요약을 추가했다.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
카메라 온보드 ExposureAuto/GainAuto가 항상 풀프레임을 측광해서 하늘이
있으면 바닥이 어두워지는 문제(camera_exposure_design_notes.md 4절)를
풀기 위해 hik_camera_node.cpp에 4가지 기능을 추가했다.
- gain_auto: 기존에는 GainAuto가 코드에서 항상 강제 Off였는데, 이제
온보드 Continuous 자동 게인을 켤 수 있음
- use_software_ae + ae_roi_top_ratio: SDK에 측광 전용 ROI 노드가 없어
(캡처 크롭용 AOI만 있음, 확인 완료) 온보드 auto를 끄고 프레임 하단
일부만 퍼센타일로 측광해 ExposureTime/Gain을 직접 계산해 적용
- 우선순위: 밝게 할 땐 노출을 상한까지 먼저 늘리고 그다음에만 게인
사용, 어둡게 할 땐 반대로 게인을 먼저 줄이는 순서를 명시적으로 구현
(게인은 노이즈 비용이 있어 항상 마지막 수단)
- sync_role(master/slave) + ae_exposure_time_us/ae_gain_db 토픽: 가운데
카메라를 master로 지정하면 그 카메라의 실제 적용 노출/게인(SDK가
매 프레임 주는 값)을 나머지 slave 카메라들이 그대로 따라가도록 함
새 파라미터는 전부 기본값이 기존 동작을 유지하도록 해서 기존 배포
설정과 하위호환된다. package.xml에 std_msgs 의존성 추가, README에
전체 파라미터 설명 반영. 로봇 PC에서 colcon build 검증 필요 — 특히
AutoGainLowerLimit/AutoGainUpperLimit 노드명은 기존 Exposure 쪽과
같은 명명 규칙일 것으로 가정하고 썼을 뿐 실기기로 확인된 값은 아님.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1차 현장 테스트(f/5.6, Auto Exposure/Gain) 결과 실내에서 이미지가 밝게
나오는 문제를 확인, 조리개·초점 조절 작업을 위해 3대(cam1/2/3) 모두
exposure_auto를 false로 바꾸고 노출/게인을 수동 고정값으로 전환했다.
화이트밸런스도 조리개/초점 조절 중 색 보정이 판단을 방해하지 않도록
balance_ratio R/G/B를 1024(중립)로 꺼 두었다. 기존 cam1-cam2 겹침
기준 값은 주석으로 남겨 나중에 3대 겹침 매칭을 다시 잡을 때 참조한다.
.gitignore에 .obsidian/ 추가 (doc/ 폴더를 Obsidian vault로 여는 로컬
설정 파일이 저장소에 섞여 들어가는 것을 방지).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Design notes for multi-camera + LiDAR SLAM exposure tuning, plus a
question/answer pair that verifies the notes' assumptions (gain ceiling,
lens sweet spot, blur budget, 12-bit raw capture) against the actual
MV-CS016-10UC camera and VM0420MP5 lens datasheets and the driver source.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Hikvision MV-CS016-10UC ROS2 driver used for the dual/triple camera rig:
hardware-triggered acquisition, per-camera exposure/gain/white-balance
params, and self-calibrating device-clock timestamping (anchored to the
shared LiDAR/GPS clock domain via /timeshare) to keep image timestamps
tightly synced across cameras during motion. Includes the vendored
Hikvision MVS SDK (hikSDK/) needed to build.