Omniverse

[Nvidia Omniverse] Articulation Joint 정리하기

pnltoen 2023. 1. 15.
반응형

Articulation Joint

Nvidia Omniverse


서론

 

개인 프로젝트를 하다가... 문제가 발생했다. Prismatic Joint로 내용을 진행하였는데. 예상된 문제가 발생하였다. 사실 뭐... 당연한 문제였는데 Prismatic의 경로를 어떻게 설정할까...와 같은 내용이었다.

 

 

여기서 확인한 내용은 Joint는 Global이 아닌 Local Axis를 기준으로 움직인다. 따라서 각도가 달라졌을 때, 대각선으로 올라가는 것을 확인함. 유니티와 달리 Isaac Sim 안에서는 Hiearchy 하위로 넣는 방법으로 조인트를 사용하지는 않는다. 이 방법이 Tree 자체가 깔끔해지긴하는데... 나는 시작이 유니티여서 그런지 뭔가 더 어색했다. 물론 Omniverse에서 사용하는 방법이 다중 조인트를 설정할 때 쉽긴함 근데 Exclude from joint root인가 설정은 이해를 못했다. 관련해서 시뮬레이션 해주는 Main Branch를 나눠주는 거라는데... 어떻게 공부할 수록 공부해야 할 내용이 늘어나는지 참... 얼른 Barracuda 하고 싶다.

 

서론이 길었는데 여튼... 거의 끝까지 온 것 같으니 빠르게 달려보도록 하자.

 

Omniverse Joint 정리

 

작년에는 Joint만 모아놓은 문서가 구글링했을 때 나왔는데 이제는 어디 숨어버렸다. 다행히 Rigid-Body Simulation 안에 Joint Table을 찾을 수 있었다.

 

목표는 Prismatic 조인트를 사용했을 때 각도가 변화하여도 오브젝트를 따라 이동할 수 있도록... 만들기!

 

내용은 알아도 recap 차원에서 한번씩 다 해볼 예정... 뭔가 문서에 있는 사진 복붙하면 양심에 찔리더라

 

Fixed Joint

 

가장 기본적인 개념, DOF=0이다. 체결을 하면 움직이지 않음. 경험상 Fixed Joint를 사용할 경우 2가지를 유의해야 한다.

 

첫째, 너무 많은 Fixed Joint를 걸고 이외에 외력이 행해지는 Joint가 체결되어 있을 경우 Time step에 따라서 진동하는 것과 같은 현상이 발생함. 옴니버스 뿐만 아니라 다른 소프트웨어에서도 마찬가지다. 간단하게 외력이 존재하는데 포지션을 잡으려고 하니 오브젝트의 position이 떠는 것 처럼 보임.

 

 

Joint의 Local Position을 정확히 알고 있어야 함. Fixed Joint에서는 이 개념이 생소할 경우 헷갈릴 수 있는데 가시화 된 Axis를 기준으로 Fixed된거다. 이거 헷갈리면 뒤에서 난리남. 유니티로 따지면 먼저 클릭한 오브젝트가 Parent가 되고 두번째로 클릭한 오브젝트가 Child가 되는 느낌...? 

 

 

 

Revolute Joint

 

사실 Prismatic과 함께 같이 가장 많이 쓰는 Joint라고 생각한다. 특정 축을 기점으로 회전 함.

간단하게 X축으로 한번 회전 시켜보자

 

 

 

번외이지만 Angular Damping값이 낮아서 아주 잘 돈다... 대략적으로 이런 느낌

귀찮아서 여기서는 설명안하는데 Revolute 조인트의 경우 CAD 파일의 Rotation default 값에 따라 보기 되게 힘들게 Joint 범위가 가시화 될 수 있다. 매우 직관적이지 않음. Local Rotation을 고려하지 않는 느낌.

 

Prismatic Joint

 

직선 운동하는 조인트이다. 특정 축으로 전방 후방 운동함. 조금 재밌었던 부분이 활동 범위가 가시화 된다. Local Axis 기준으로 운동하니 헷갈리지 말 것. 회전되어 있으면 해당 회전 된 것을 기준으로 움직인다.

 

 

 

Spherical Joint

 

Revolute Joint의 진화(?) 버전이다. 기존 1개의 축으로만 회전할 수 있었지면 Spherical Joint는 3개의 축 모두 회전할 수 있다.

 

 

Distance Joint

 

이거 약간 진자 운동 같은거 구현하는 느낌... 지정한 lower, upper limit 하에서 distnace 별로 움직인다. 그 거리 이하 이상 어딘가에도 다 움직일 수 있음. Default upper limit이 0으로 되어 있는데 대충 값 넣어주면 잘 움직인다.

 

 

이런 느낌... 사실 여기까지가 꿀 빨 수 있는 Joint 종류이다. 왜냐면 CAD와 유니티에 다 있는 종류의 Joint이기 때문 ㅋㅋ... 실제 중요한 내용은 Gear 와 Rack-pinion joint인데 이거 개념만 잘 공부하면 유니티에서도 써먹을 수 있지 않을까?

 

Gear Joint

 

내가 못찾는건가... 사용법 없는거 실화...?

 

 

 

조금 설명할 부분이 있다. 일단 기어비 같은 부분은 다 안다고 생각하고 넘어감.

 

각 오브젝트에 Revolute Joint를 만들어 주자. 이 때 body 0과 1을 신경 쓰지 않고 하나만 채우면 됨. Body 0을 채우든 body 1을 채우든 결과는 같았다.

 

 

 

이어서 Gear Joint의 Hinge 0 그리고 Hinge 1을 각각 선택해준다. Gear Ratio이라고 표현되어 있는 기어 비는 0.5로 설정하였음. 그 결과 Hinge 1이 1바퀴 돌 때 Hinge 0은 2바퀴 돈다. 자세한거는 영상 참조.

 

첨자는 귀찮아서 설정안함. di/do=0.5니까 do가 2배 더 빨리 돌아야 하는게 맞음. (빨간색 큐브가 di 검은색 큐브가 do)

 

 

Rack-and-pinion Joint

 

제발...여기서 됐으면 좋겠다. 예제에는 아래와 같이 일자로 되어 있는데 이거 각도 줬을 때 되려나...?

 

Omniverse Docs

 

우선 차근차근 가자. 기본 모형에서 되는지 부터 확인 - 어차피 콜라이더 충돌 감지 및 연산이 아닌 속력으로 계산하는것 같으니까 모델링은 신경 안씀.

 

역시 문서에 내용이 없다... Gear 하면서 배운 내용으로 해봐야지... Rack-and-Pinion은 회전운동을 병진운동으로 바꾸는거니까... 헬리컬 기어는 revolute로 그리고 rack은 prismatic으로 하면 되지 않을까?

 

 

대충 이렇게 설정함 기어게 왜 큐브냐고요? 원으로 하면 구르는거 보기 힘듬;

 

오늘 대충이라는 말을 많이 쓰는데 진짜 대충해서 그렇다. 참고 자료가 없으니까 개념 다 찾아서 하나하나 해봐야 하는데 진도가 너무 안나와서 머리아품... 나중에 내 글 보고 누군가 좋은 프로젝트하면 그거 따라 나도 더 좋은 프로젝트 해야지

 

 

이런식으로 구동한다. 음...음...음...! 역시나 내 프로젝트의 문제를 해결할 만한 단서는 찾지 못했음.

 

Reference

 

#1 Nvidia Omniverse Rigid-Body Simulation

 

Rigid-Body Simulation — Omniverse Create documentation

Rigid-Body Simulation Rigid bodies and static colliders are the foundational building blocks that you can use to add physics to your scene. You can add rigid body dynamics to a geometry in your scene so that it accelerates under gravity and collides with o

docs.omniverse.nvidia.com

 

반응형

댓글