Unity/Physics & Meshes

Unity Articulation Body 이해하기 (2022.2 Alpha) - 초급

pnltoen 2022. 7. 17.
반응형

Articulation Body

Unity Technologies

 


포스팅 작성 목적

 

유니티를 시뮬레이터로 사용하기 위해서는 단순 유니티 지식 뿐만 아니라, 물리 그리고 적용하고자 하는 분야의 도메인 지식이 필수입니다. 하지만 이 두 분야를 모두 알고 있기는 어렵기 때문에 유니티 공식 문서에 있는 내용을 이해하기 매우 어렵습니다. 특히 Articulation Body의 필수적인 몇몇 값 (Target, Target Velocity 그리고 Joint)가 뜻하는 내용이 매우 불분명하였습니다. 따라서 다음의 부분을 모두 정리해서, Articulation Body가 쉽게 사용될 수 있도록 포스팅을 진행하고자 합니다.

 

주의 : 본 포스팅에서는 물리 관련 또는 코딩은 다루고 있지 않습니다. 추 후 포스팅을 참고해주시길 바랍니다.

Rigidbody가 아닌 Articulation Body를 사용해야하는 이유

 

유니티를 게임엔진이 아닌 시뮬레이션으로 사용함에 있어서 꼭 알아야하는 컴포넌트는 Articulation Body입니다. 

기존 유니티를 사용하셨던 분들이라면 Articulation Body (관절) 보다는 Rigidbody (강체) 컴포넌트가 익숙하실 것입니다. 하지만 Rigidbody는 실시간 게임 엔진에서 좋은 성능을 제공하였지만, 이는 게임 성능에 최적화되어 있어서 시뮬레이션 용도로 사용하기에는 적절하지 않았습니다. 

 

대표적인 문제점

 

1. 충돌요소가 많아지는 문제

반복 횟수, 상대 질량 차이, 복잡도로 인해 부분적인 해결책만 제시가 가능하였습니다.

 

2. Impulse 값이 달라지는 문제

Rigidbody를 사용할 경우, 오차 보정 동작 과정에서 마치 스프링의 감쇠효과를 발생하였습니다.

 

Articulation Body 사용 방법

 

본 포스팅에서는 2022.2.0a18 버전을 사용하고 있습니다. 다소 불안정한 버전이지만, Articulation Body에 추가된 기능이 많고 특히 Drive Type이 직관적이여서 해당 버전을 사용하도록 하겠습니다.

 

1. Hierarchy 정리

아래의 예시처럼, Hierarchy를 순차적으로 정리해주시길 바랍니다. Articulation Body는 부모-자식 개념을 활용하여, 오브젝트간의 연결을 구현합니다. 

 

 

위 Hierarchy는 Articulation Body 데모에서 캡쳐한 내용입니다. 위의 대모의 경우 AB_Root가 Root 오브젝트가 됩니다. 

여기서 Root 오브젝트란 유일하게 움직이지 않는 (Immoveable)를 설정할 수 있는 오브젝트입니다. 따라서 로봇팔의 최 하단 부와 같이 고정해야하는 오브젝트에 설정합니다. Root 오브젝트는 하이어리키 최상단에 있는 오브젝트가 Root로 설정됩니다.

 

그림으로 예를 들어서 설명드리겠습니다. 다음과 같이 회전하는 물체에서 Root Object는 맨 밑 오브젝트입니다. 중앙 링크가 회전할 때 어느 한 곳은 고정되어야 합니다. 

 

고정을 하지 않는다면 어떻게 될까요? 중력을 사용하는 경우 오브젝트 자체가 중력의 영향력을 받아 떨어지게 됩니다.

 

 

이를 해결하기 위해서는 중력을 사용하지 않는 방법이 있으나.... 실 시뮬레이션에서 중력의 크기를 조절하는 경우는 있어도, 중력 자체를 사용하지 않는 경우는 매우 적을 것으로 생각됩니다.

 

2. Articulation Body 추가

1에서 Hierarchy를 정리하였습니다. 이 때 최 상단의 오브젝트가 Root로 되는 것을 배웠습니다. 이제는 Articulation Body를 추가할 차례입니다.

 

다음과 같이 추가할 오브젝트를 Hierarchy에서 클릭하고, Inspector 창에서 Add Component - Articulation Body를 추가합니다. 이 후 각각의 오브젝트를 확인하면 다음과 같이 Articulation Body가 추가된 것을 확인할 수 있습니다.

 

자동으로 최상단의 오브젝트가 Root Body of the Aritulation으로 설정되는 것을 확인할 수 있습니다.

 

 

다른 오브젝트들은 다음과 같이 Root Body of the Aritulation으로 표시되지 않습니다.

 

3. Articulation Joint Type 설정

 

Root를 제외한 Articulation Body에 보면, 다음과 같이 Articulation Joint Type을 확인할 수 있습니다.

 

 

기본적으로 Fixed 값을 사용하고 있고, 클릭 시 4가지 조인트를 지원하는 것을 알 수 있습니다. 각각에 대해 표로 정리해보았습니다.

 

구분 Joint Type DOF - 역할
1 Fixed (고정) DOF : 0, 부모 오브젝트와 고정
2 Prismatic (선형) DOF : 1, 특정 축을 기준으로 직선 운동에 사용, 선형
3 Revolute (회전) DOF : 1,  특정 축을 기준으로 회전운동에 사용
4 Spherical (구형) DOF : 3, 선형 X, 상대적 회전 허용

 

Shperical (구형) 조인트의 경우 상대적으로 사용 빈도가 낮습니다. 가장 많이 사용하는 Fixed, Prismatic, Revloute Joint에 대해 설명드리겠습니다.

 

설명전 AR_Root 오브젝트가 Root Body로 그리고 하위 (자식)인 AB_Link_1를 통해 설명드리도록 하겠습니다. Hierarchy는 아래와 같습니다.

 

 

이미지로 나타내면 다음과 같습니다.

 

 

Fixed Joint

 

부모 조인트와 결합하는 Joint입니다. 별도의 추가 설정이 존재하지 않습니다. 움직이지 않는 (동력이 없는) 부품을 연결할 때 사용합니다. 움직일 수 없기 때문에 자유도는 0입니다.

 

 

Prismatic Joint

 

Anchor 기준으로 선형 운동을 하는 조인트입니다. Axis 그리고 X Drive가 나타나 있는데, 개인적으로 CAD 프로그램을 사용하다보니 기준 축이 헷갈려서... 가시화된 Gizmo를 사용합니다.

 

 

상단의 Edit Joints를 누르면 회전 Gizmo를 알 수 있습니다. 아래의 버튼을 눌러서 Gizmo를 활성화시킵니다.

 

 

다음과 같이 실선으로 현재 조인트 설정에서 움직일 경로가 표시됩니다. 해당 축을 바꾸고 싶다면, 축을 Y 또는 Z로 설정해줍니다.

 

각각 X, Y, Z Axis

Revolute Joint

 

개인적으로 가장 많이 사용하는 Revolute Joint입니다. Joint Type을 Revolute로 설정 후 Gizmo를 켜보면, 다음과 같이 회전 기준 (Anchor Position) 및 방향 (Anchor Rotation)이 나타납니다. CAD로 모델링한 데이터를 넘겨울 경우가 많을텐데.... 이 때 꼭 원점 설정을 회전 기준으로 맞춰주셔야 합니다. 관련된 글을 작성하였으니 해당 포스트를 참고해주시길 바랍니다.

 

 

유니티 Articulation Body Joint와 회전축 그리고 질량중심 (Center Of Mass) 설정이 중요한 이유

Articulation Body와 질량중심 STEP, OBJ, FBX, SAT 본 포스팅은 Unity Articulation Body 또는 여러 Joint (Hinge 등등)에서 회전 기준점을 CAD에서 쉽게 지정하기 위해 작성하였습니다. 가장 일반적인 질량중심..

pnltoen.tistory.com

 

 

위의 경우 AB_Link_1가 Root인 AB_Root를 기준으로 회전 기준이 잡혀있는 것을 알 수 있습니다. XDrive라고 되어있어서 헷갈리실 수도 있지만, 회전 반경을 바꾸고 싶은경우, Anchor Rotation을 회전 기준 점을 바꾸고 싶은 경우 Anchor Position을 수정하시면 됩니다. 하지만! 유니티는 기존 게임엔진으로써 치수를 재는 것이 편리하지 않음으로, 독자분들께서 가장 편하신 CAD 프로그램에서 꼭 원점을 잡고 유니티로 넘기시는 것을 추천드립니다. 참고로 Position의 단위는 m 그리고 Rotation의 단위는 Deg입니다.

 

 

Joint Limit 설정 (Prismatic & Revolute)

 

예로 사람 아바타의 경우, 특정 각도 이상으로 팔을 굽힐 수 없고, 특정 로봇의 경우 특정 범위를 Joint가 넘을 수 없습니다. 이를 제한하기 위해서 Motion을 설정할 수 있습니다. 해당 설정은 Joint Type 밑에 있습니다.

 

 

Motion을 Free가 아닌 Limited로 설정할 경우, Lower Limit과 Upper Limit이 나타납니다. 마찬가지로 Gizmo를 켜주시고 해당 값을 수정하거나, Gizmo에서 조절해서 회전 반경 또는 선형 반경을 설정할 수 있습니다.

 

 

Collision Detection

 

얼마나 더 정확한 시뮬레이션을 할 것인지에 대한 설정입니다. 

 

구분 종류 역할
1 Discrete 정확도 ↓,  최적화
최적화를 고려한 시뮬레이션, 다소 정확도 낮음
2 Continuous Continous Dynamics와 충돌하는 오브젝트에 사용
즉 빠르게 움직이는 오브젝트와 충돌하는 오브젝트에 사용
3 Continuous Speculates Continuous가 성능적으로 부담될 때 사용 Discrete와 Continous Dynamics의 사이의 정확도와 최적화 성능
4 Continuous Dynamics 정확도 ↑,  최적화 ↓
빠르게 움직이는 물체에 사용, 가장 정확한 시뮬레이션

 

여기까지 Articulation Body의 설정을 끝냈습니다. 이제는 실제로 움직일 수 있도록 설정해보도록 하겠습니다.

 

Articulation Body Drive

 

Fixed Joint가 아닌 경우, Joint의 Anchor Position과 Anchor Rotation을 적절하게 설정해주었다면, X Drive는 무시하셔도 됩니다. 해당 부분이 가장 헷갈렸는데 만약 Y Drive 또는 Z Drive를 사용해야 할 경우, 코드에서 명시적으로 사용하거나 Spherical Joint를 사용하면 됩니다.

 

물리를 아무것도 몰라도 사용할 수 있도록 Damping은 20 그리고 Target Velocity는 10으로 설정하도록 하겠습니다.

 

 

플레이 하면 정상적으로 움직이는 것을 확인할 수 있습니다. 문양이 없어서 잘 도는 건지 애매했는데 Scene에서 확인하니까 잘 도는 것을 확인할 수 있었습니다.

 

 

지금까지 기본적인 Articulation Body의 사용법에 대해 알아보았습니다. 하지만 실제 시뮬레이션을 하기 위해서는 보다 많은, 코드 및 물리 개념이 필요합니다. 다음 포스팅에서는 각각의 Stiffness 그리고 Damping, Force Limit 등이 무엇을 뜻하는지 알아보도록 하겠습니다.

 

참고문헌

 

#1 ArticulationBody를 사용하여 현실감 있는 모션과 동작을 구현한 산업용 프로토타입 제작

 

ArticulationBody를 사용하여 현실감 있는 모션과 동작을 구현한 산업용 프로토타입 제작 | Unity Blog

관절이 갖는 특별한 장점은 시뮬레이션의 품질이 연결된 바디의 질량비로부터 직접적인 영향을 받지 않는다는 것입니다. 리지드바디와 고정 조인트를 사용했을 때, 연결된 바디 간 질량비가 10:

blog.unity.com

 

반응형

댓글