배포 안내
이번 5.2.0 업데이트는 오토워크(Autowalk) 에러 대응 처리 개선, 안무(Choreography) 애플리케이션의 작업 편의성 및 프레임워크 대대적 개편(PyQt6 상향 등), 그리고 통신 단절 시 로봇의 비상 대응(Keepalive) 옵션 강화를 포함하고 있습니다. 페이로드 연동과 미션 제어 시스템을 운영하는 실무 담당자는 아래 사항을 확인하시기 바랍니다.
1. 주요 호환성 변경 (Breaking Changes)
⚠️ 개발자 주의 사항: 다가오는 5.2.0 환경으로 시스템을 마이그레이션할 때 기존 애플리케이션의 아래 사항을 점검하십시오.
Fluke SV600 관련 서비스 중단
이전 5.1.9 릴리즈의 지원 중단 예고에 명시되었던 SV600용 특정 음향 이미징 서비스들(acoustic-imaging-image, acoustic-imaging-video, acoustic-imaging-LeakQ-with-email)이 차단(Blocklisted) 처리되어 5.2.0부터 작동을 중지합니다.
- 해당 서비스를 기반으로 작성되었던 검사(Inspections) 미션이 있다면 모두 무효화됩니다.
- 태블릿 또는 SiteView에서 제공하는 기본 누출(Leak) 및 기계(Mechanical) 검사 기능을 사용하여 해당 검사 항목을 새롭게 다시 레코딩(Rerecord)해야 합니다.
2. 신규 기능 (New Features)
행동 오류(Behavior Faults) 상태 추가
- 로봇 시스템이 두 가지 새로운 카테고리의 행동 오류를 보고합니다. (BehaviorFault.Cause 참조)
- 명령 실패(Command failures): 다음 동작으로 진행하기 전 사용자의 확인(Acknowledgement)이 필수적으로 요구되는 소프트웨어 기반의 실패 상태입니다.
- 안전 제한(Safety restrictions): 주변에 사람이 감지되는 등 환경적 요인으로 인해 로봇의 안전 시스템이 자체적으로 하드웨어 기능을 강제 제한하고 있는 상태를 의미합니다.
안무 및 모션 제어 (Choreography)
- 스테이지 플래너(Stage Planner) 툴 추가: Choreographer 애플리케이션의 2D 댄스 미리보기 뷰에 추가되었습니다. 로봇 위치에 상대적인 무대 크기(Dimensions)를 시각적으로 확인할 수 있습니다.
- 프로젝트 폴더(Project Folders) 도입: 다양한 파일 타입별 기본 저장 위치가 포함된 프로젝트 폴더 기능이 추가되어, 여러 안무 프로젝트를 체계적으로 관리하고 구성할 수 있습니다.
통신 단절 대응 (Keepalive)
- Keepalive 정책(Policy)에 두 가지 새로운 비상 대응 액션이 추가되었습니다.
- ImmediateMotorsOff (즉시 모터 전원 차단): 앉기(Sit) 동작을 선행하지 않고 즉시 로봇 모터의 전원을 차단합니다. 이 액션은 AutoReturn이나 HaltRobot보다 높은 우선순위를 가집니다.
- HaltRobot (로봇 정지 및 대기): 로봇을 즉시 멈추고 현재 위치를 유지합니다. 기체가 앉거나 전원을 차단하지 않습니다.
- Keepalive 상태 조회(GetStatusResponse의 active_control_actions 필드) 시, 현재 특정 정책이 로봇을 능동적으로 제어하고 있는지, 그리고 어떤 액션(예: Halt 또는 즉시 모터 차단)이 실행 중인지 모니터링할 수 있습니다.
⚠️ 주의 사항: 로봇이 이미 앉아 있는 상태가 아니라면, ImmediateMotorsOff 실행 시 기체가 바닥에 떨어져 하드웨어 손상을 입을 수 있으므로 사용에 각별히 주의해야 합니다.
자율 주행 미션 및 오토워크 (Missions / Autowalk)
- 미션 중단(Interruption) 이벤트 레코딩 노드 추가: 미션이 예기치 않게 중단(일시 정지, 정지, 재시작, Lease 에러, 타임아웃, 자식 노드 실패 등)되었을 때 이벤트를 기록하는 새로운 미션 노드(BosdynRecordEventOnInterruption)가 추가되었습니다.
- 중단 발생 시 클라이언트가 원인별로 지정한 이벤트 파라미터가 기본 이벤트와 병합되어 기록됩니다.
- 시스템 에러 및 예외뿐만 아니라 '정상적인 자식 노드 실패(Normal child failures)'도 중단 조건으로 처리할 수 있습니다.
- DataAcquisitionOnInterruption 노드가 이제 에러/예외뿐만 아니라 정상적인 자식 노드 실패(Result.FAILURE) 시에도 데이터 수집을 트리거할 수 있도록 개선되었습니다.
- SimpleParallel 노드에서 틱(Tick) 발생 시, 기본 노드(Primary node)보다 보조 노드(Secondary node)를 먼저 틱하도록 설정하는 옵션이 추가되었습니다. (기본값은 Primary 우선 틱 방식 유지)
- DateToBlackboard 노드가 포맷팅된 ISO8601 문자열뿐만 아니라 google.protobuf.Timestamp 포맷으로도 현재 시간을 기록할 수 있도록 기능이 확장되었습니다. (bosdyn.mission.util의 관련 파이썬 헬퍼들도 함께 업데이트됨)
- 데이터 수집 쿼리 결과의 메타데이터(AssociatedMetadata)에 오토워크 리포트(Autowalk report) 존재 여부를 나타내는 플래그(is_autowalk_report_entry)가 추가되었습니다. 이를 통해 메타데이터를 파싱할 필요 없이 효율적으로 미션 리포트를 필터링할 수 있습니다.
3. 버그 수정 및 개선 사항 (Bug Fixes and Improvements)
로봇 팔 제어 (Arm)
- 암 관절 이동 명령(ArmJointMoveCommand.Request)에 초정밀 궤적 제어를 위한 추적 모드(TrackingMode)가 추가되었습니다.
- 적분 게인(Integral gain)을 사용하여 정상 상태 오차(Steady-state error)를 줄여주며, 매우 정밀하고 느린 궤적이 요구되는 작업에 적합합니다. (robot_command.py의 arm_joint_move_helper에 tracking_mode 파라미터가 추가되었습니다.)
시청각 제어 (Audio Visual)
- 오디오 시스템(AudioVisualSystemParams) 개선을 통해 부저(Buzzer)와 스피커(Speaker)의 최대 볼륨 제한을 각각 독립적으로 설정할 수 있습니다.
- 스피커로 수신되는 오디오의 자동 이득 제어(AGC) 및 노이즈 감소(NR) 기능을 비활성화할 수 있는 옵션이 추가되었습니다. (AudioVisualClient 및 관련 예제 코드 업데이트 완료)
안무 및 모션 제어 (Choreography)
- Choreographer 애플리케이션 개선:
- 실행 취소/다시 실행(Undo/Redo): 여러 탭과 뷰에 걸쳐 연속적인 Undo/Redo 프레임워크가 도입되었습니다.
- 프레임워크 업그레이드: 애플리케이션 프레임워크가 PyQt5에서 PyQt6로 전면 상향되었습니다.
- 댄스 미리보기(Dance Previews): 사용자의 변경 사항이 미리보기에 자동 업데이트됩니다. 색상이 포함된 가장 최신 버전의 Spot 3D 모델 지오메트리가 반영되었으며, 캐시(Cache) 익스포트 옵션이 추가되었습니다. 2D 뷰의 시퀀스 라벨 가시성(Hide/Show)을 토글할 수 있습니다.
- 타임라인(Timeline): 시퀀스 시작 시간과 미리보기 시각화의 디스플레이 요소(Red Slider 및 Start Marker)가 논리적으로 분리되었습니다. 툴바를 통해 특정 트랙을 숨기거나 표시할 수 있으며, 스크롤 동작이 대폭 개선되었습니다.
- UI 레이아웃 개편: 기존 'Workspaces' 메뉴가 제거되고, 툴들을 수동으로 크기 조절 및 접기(Collapse)할 수 있도록 변경되었습니다. 'Timeline'과 'Playback' 설정은 'Preferences' 메뉴로 통합되었습니다. 하단 버튼 바에 소급 로그(Retro log) 수집 버튼이 추가되었습니다.
- 경로 인자 수정: 애니메이션 파일 종속성과 관련된 타이밍 버그가 해결되었습니다. --dance-filepath 인자가 --filepaths로 변경되었으며, 개별 파일뿐만 아니라 디렉터리 경로도 지원합니다.
- Choreography SDK 개선:
- ChoreographyStatus RPC 호출 시, 현재 활성화된 안무 시퀀스에 대한 로봇 클록(Clock) 기준의 시작 시간이 보고됩니다.
- 로봇이 안무를 실행 중(Active)일 때 UploadAnimatedMove RPC로 새로운 모션 업로드를 요청하면, 안무 간섭을 막기 위해 STATUS_REJECTED_DANCE_ACTIVE 에러와 함께 업로드가 거부(Rejected)되도록 안전 로직이 추가되었습니다.
데이터 수집 (Data Acquisition)
- 데이터 수집(DAQ) 플러그인에서 개별 스토리지 RPC 호출 시 사용자 정의 타임아웃(Custom timeouts)을 지정할 수 있습니다.
- 대용량 페이로드 데이터를 저장할 때 발생하던 하드코딩된 기본 타임아웃(Default timeouts) 오류를 극복할 수 있습니다. (data_acquisition_plugin_service.py의 헬퍼 함수가 **kwargs를 수용하도록 업데이트되었습니다.)
로깅 및 SDK (Logging & SDK)
- 로깅 상태 세분화: 로그 시스템 상태에 '정지 진행 중(STATUS_STOPPING)' 상태가 추가되어, 정지 요청과 최종 완료 상태 사이의 과정을 명확하게 파악할 수 있습니다.
- gRPC 채널 자동 복구: Python SDK가 역직렬화(Deserialization) 오류나 연결 초기화 등으로 인해 불량 상태(Bad state)에 빠진 gRPC 채널을 자동으로 리셋(Reset)합니다. 실패한 RPC는 여전히 에러를 발생시키지만, 재시도 시에는 투명하게(Transparently) 새 채널을 사용하여 클라이언트 측의 개입 없이 안정성을 확보합니다. (InternalDeserializationError, ConnectionResetError 예외 타입 추가됨)
주변 환경 인지 (World Objects)
- AprilTag(마커) 인식 결과(AprilTagProperties)에 해밍 거리(Hamming distance) 및 관측 횟수(Observation count) 메트릭이 포함됩니다.
- 이 데이터를 활용하여 마커 인식으로 트리거되는 오토워크 인터럽트 구간에서 오탐(False positives)을 효과적으로 필터링할 수 있습니다.
4. 샘플 코드 업데이트 (Sample Code)
현장 구축 및 연동 테스트를 지원하기 위해 다음과 같은 예제 코드가 추가 및 갱신되었습니다.
Spot SDK - 신규 추가 (New)
- Graph Nav Download / Upload: 표준 파일 구조 및 명명 규칙을 준수하여 로봇의 Graph Nav 맵과 모든 스냅샷을 디스크로 다운로드하거나, 디스크에서 로봇으로 일괄 업로드(배치 처리 지원)할 수 있는 독립형 스크립트 및 헬퍼 함수가 추가되었습니다. (업로드 스크립트는 5.1.0 이상 버전 필수)
- Graph Nav Map to USD: 글로벌하게 최적화된 Graph Nav 맵을 로드하고, 포인트 클라우드 데이터를 USD(Universal Scene Description) 포맷으로 변환하여 내보내는 예제입니다. 출력물은 NVIDIA Omniverse나 블렌더(Blender) 등에서 시각화할 수 있습니다.
- CORE I/O GPIO: PWM 제어 관련 문서 내 Docker 실행 명령어의 이미지 이름 오기재(gpio_pwm → gpio_control)를 수정하고, 누락되었던 볼륨 마운트(-v /etc:/etc) 옵션을 추가했습니다.
- GPS Listener: Trimble SPS986 및 Leica GA03 센서에 대한 단계별 설정 지침이 추가되었습니다. Leica GA03 CORE I/O 익스텐션 배포 가이드 및 재부팅 시 발생하는 알려진 USB 재마운트(Remount) 이슈에 대한 메모가 포함되었습니다.
Spot SDK - 주요 업데이트 (Updated)
- A/V Params: 부저/스피커 최대 볼륨 설정 및 자동 이득 제어(AGC), 노이즈 감소(NR) 구성 옵션을 활용하는 예제가 업데이트되었습니다.
- GUI 기반 예제들의 PyQt6 업그레이드: BDDF Download GUI, Edit Autowalk, E-Stop GUI, Record Autowalk, Velodyne Client 예제들이 모두 PyQt5에서 PyQt6 기반으로 업그레이드되었습니다.
- Graph Nav Anchoring Optimization: 권장 Matplotlib 백엔드로 PyQt6를 명시하도록 문서가 갱신되었습니다.
Orbit SDK - 신규 및 업데이트
- 신규 (Orbit v1 API): requests 라이브러리를 사용해 Orbit v1 REST API를 순수 HTTP 호출로 연동하는 예제가 추가되었습니다. Bearer 토큰 인증, 로봇 및 SiteWalk 목록 조회, 페이지네이션(Pagination) 처리 및 v1 에러 핸들링을 다룹니다. (개발자의 직접적인 엔드포인트 연동을 돕기 위해, 의도적으로 구형 OrbitClient 패키지를 배제하고 작성되었습니다.)
- 업데이트 (Export SiteWalk Archives): "모두 다운로드(Download all)" 옵션 실행 시 잘못된 제로 베이스(Zero-based) 인덱스 참조로 인해 리스트의 마지막 SiteWalk 아카이브가 다운로드에서 누락되던 버그(Off-by-one error)가 완벽히 수정되었습니다.