본문 바로가기
Devices/ZED

ZED-Unity-Skeleton

by wenect 2023. 3. 2.

 


# ZED 바디 트래킹

Unity에서 ZED SDK의 Body 추적 모듈을 사용하는 방법을 보여줍니다. 신체 추적에는 ZED 또는 ZED Mini가 *아닌* ZED2가 필요합니다.


## 신체 추적이 무엇인가요?

ZED SDK Body 추적 모듈은 고도로 최적화된 AI 모델을 사용하여 인체 골격을 실시간으로 감지하고 추적합니다. 깊이를 사용하면 유사한 알고리즘보다 한 단계 더 나아가 2D 이미지 내에서뿐만 아니라 세계에서 객체의 3D 위치를 계산합니다.

개체 감지가 실행 중일 때 ZED는 Unity에서 ObjectsFrameSDK 개체로 수신되는 프레임 개체를 정기적으로 출력합니다. 여기에는 일부 메타데이터와 개별 개체 탐지 목록이 포함되어 있습니다.
ObjectDataSDK의 배열에서 각 감지에는 다음 정보가 포함됩니다.

- ID - 프레임 사이에서 개체를 추적하기 위해 각 개체에 할당된 고유 ID입니다.
- 범주 - 개체가 사람 또는 차량인 경우.
- 추적 상태 - 물체의 위치가 바닥/세계를 기준으로 이해되는 경우.
- Confidence - 0에서 99까지 척도에서 이 개체가 존재한다는 SDK의 확신 정도입니다.
- 2D 경계 상자 - 이미지에서 개체가 있는 위치를 정의하는 ZED 이미지의 네 모서리에 대한 2D 좌표입니다.
- 3D 위치 - 카메라가 3D 공간에 있는 위치입니다.
- 3D Velocity - 물체가 움직이는 방향과 속도.
- 3D 경계 상자 - 개체를 캡슐화하는 상자를 구성하는 8개 모서리의 3D 좌표입니다.
- 3D 스켈레톤 관절 - 관절의 3D 좌표.
- Unity 좌표계에서 이미 변환된 모든 스켈레톤 데이터를 포함하는 구조체(SkeletonFormatData).

이 샘플은 ZED SDK에서 보낸 관절 방향을 사용하고 이를 3D 모델의 해당 뼈대에 적용합니다. 이렇게 하면 실시간으로 애니메이션화할 수 있습니다.

## 신체 추적 설정:

하드웨어 측면에서는 바닥의 상당 부분이 보이도록 ZED2를 가리키고 싶을 것입니다. 이는 ZED SDK가 시작할 때 바닥을 감지하고 이를 사용하여 3D에서 물체의 위치와 움직임을 더 잘 이해하기 때문입니다.

스크립팅을 하지 않고 자신만의 장면을 만들려면 다음을 수행하십시오.

- ZED_Rig_Mono 프리팹을 장면에 넣습니다.
- 추적 옵션에서 ZEDManager에 추적 활성화 및 초기 위치 추정이 활성화되어 있는지 확인합니다.
- 객체 감지 모델을 HUMAN_BODY_FAST 또는 HUMAN_BODY_ACCURATE로 설정합니다.
- *(선택 사항)* 심도 모드를 ULTRA로 설정하고 최소 1080p 해상도를 사용하여 최고 품질의 감지를 보장합니다.
- ZEDSkeletonTrackingViewer 컴포넌트가 부착된 오브젝트를 만들고 ZED -> Examples -> SkeletonTracking -> Ressources -> Prefabs에서 해당 프리팹으로 Avatar 값을 채웁니다. **Use Avatar** 매개변수를 비활성화할 수도 있습니다.
시각화 모드를 변경하고 스켈레톤만 볼 수 있습니다. 키보드의 **Space** 키를 누르면 아바타와 3D 스켈레톤 모드 사이를 전환할 수 있습니다.

## 나만의 3D 모델 사용

Body 추적 샘플 장면에서 자신의 3D 모델을 사용할 수도 있습니다.

  - Unity 내에서 모델을 가져옵니다. **반드시** 조작해야 합니다. 그렇지 않으면 사용할 수 없습니다.
  - 가져오기 설정에서 **애니메이션 유형**을 **인간형**으로 설정합니다.
  - 프리팹을 만들고 거기에 **Animator** 구성 요소를 추가합니다.
  - ZEDSkeletonTrackingViewer 스크립트에서 방금 생성한 프리팹으로 **Avatar**를 변경합니다.



## 구성

ZEDManager의 Inspector에는 개체 감지/골격 추적 전용 섹션이 있습니다. 여기에는 Init 및 Runtime이라는 두 가지 매개변수 범주가 있습니다. 개체 감지가 시작되기 전에 초기화 매개변수를 설정해야 합니다. 런타임 매개변수는 원할 때마다 조정할 수 있으며 즉시 적용됩니다.

### 초기화 매개변수:

- **객체 추적 활성화:** 활성화되면 ZED SDK는 프레임 사이의 객체를 추적하여 더 정확한 데이터를 제공하고 속도와 같은 더 많은 정보에 대한 액세스를 제공합니다.
- **바디 피팅 활성화** 바디 피팅을 활성화합니다. 3D 모델에 애니메이션을 적용하려면 **반드시** 활성화해야 합니다.

### 런타임 매개변수:

- **신뢰도 임계값**: 감지된 개체가 게시할 최소 신뢰도 값을 설정합니다. 예: 40으로 설정하면 ZED SDK는 감지된 개체가 존재한다고 40% 이상 확신해야 합니다.

끝에 있는 "개체 감지 시작" 버튼에 유의하십시오. 개체 감지에는 많은 성능이 필요하므로 ZEDManager에 자동으로 시작하는 옵션이 없습니다. 시작하려면 해당 버튼을 직접 누르거나 스크립트가 시작하도록 해야 합니다. ZEDSkeletonTrackingViewer 스크립트는 Inspector에서 이 옵션이 선택되어 있으면 이 작업을 수행합니다.

## 객체 감지 데이터 액세스

개체 감지 데이터를 사용하기 위해 자체 스크립트를 작성하는 경우 여러 가지 방법으로 얻을 수 있습니다.

첫째, SDK에서 *직접* 가져온 데이터가 Unity 내에서 사용하도록 설계되지 않았다는 점에 주목할 가치가 있습니다. 이 데이터는 ObjectsFrameSDK 및 ObjectDataSDK 구조체에 저장됩니다. 이러한 구조체의 많은 값이 Unity에서 유용하려면 추가 변환이 필요합니다. 예를 들어 많은 3D 좌표는 월드 공간에 있지 않으며 2D 좌표는 Unity 규칙에서 반전된 Y 값을 가집니다. 구조체이기 때문에 도우미 기능도 부족합니다. 그러나 이러한 구조체는 C++ ZED SDK에 표시되는 방식과 매우 유사하므로 개체 감지가 내부에서 작동하는 방식을 이해하는 데 유용할 수 있습니다.

거의 항상 DetectionFrame 및 DetectedObject 클래스를 사용하는 것이 좋습니다. 이들은 데이터 표시/변환 옵션을 제공하는 추가 도우미 기능과 함께 Unity 표준 방식에 훨씬 더 부합하는 형식으로 데이터에 대한 액세스를 제공하는 ObjectsFrameSDK 및 ObjectDataSDK의 추상화된 버전입니다. 또한 각각은 생성된 원래 ObjectsFrameSDK 또는 ObjectDataSDK 개체에 대한 참조를 가지고 있으므로 필요한 경우 항상 이러한 클래스에서 "원본" 데이터를 가져올 수 있습니다.

ZEDManager에서 객체 감지 데이터를 가져오고 객체 감지가 시작되면 액세스할 수 있습니다. 옵션은 다음과 같습니다.

- GetDetectionFrame(): 가장 최근에 감지된 프레임에서 추상화된 DetectionFrame 개체를 반환합니다.
- GetSDKObjectsFrame(): 가장 최근에 감지된 프레임에서 원래 ObjectsFrameSDK 객체를 반환합니다.
- OnObjectDetection: 추상화된 DetectionFrame 개체를 인수로 사용하여 새 프레임이 감지될 때마다 호출되는 이벤트입니다.
- OnObjectDetection_SDKData: 원래 ObjectsFrameSDK 개체를 인수로 사용하여 새 프레임이 감지될 때마다 호출되는 이벤트입니다.

'Devices > ZED' 카테고리의 다른 글

ZED-X vs ZED  (3) 2023.04.27
ZED - Unity  (0) 2023.02.27
ZED - Study  (0) 2023.02.23
ZED - Get Started with ZED  (1) 2023.02.20
ZED installation  (0) 2023.02.20

댓글