본문 바로가기

Isaac Gym

시뮬레이션 오답 노트. #6-1 [Quadruped Robot Failed - Custom Model]

728x90

#Intro

그간 4족 보행 task를 수행해 보고자 많은 노력을 기울여 봤다. 

가장 큰 task로는 두가지를 주제로 잡았는데

 

1.나의 Custom Model을 어떻게 시뮬레이션에 넣을까?

2. Quadruped Robot을 어떻게 강화학습과 접목시킬까?

 

오늘은 그간 뭘 하고 지냈고 어느 포인트에서 이렇게 오래 막혔는지 단계를 나눠서 설명하고

나의 한계점과 개선 방안에 대해 검토해 보았다.

 

1. Custom Model

#URDF Background

Simulation에 모델을 넣는 경험은 기본적으로 CAD파일을 연다와 많이 달랐다.

앞선 간단한 tutorial들을 통해 어느정도 익혔다고 생각했지만 URDF라는 포멧은 생각보다 

많은 지식을 요구했다.

 

이 부분을 익히기위해 거의 2주간을 소모했으며, 처음부터 복잡한 12자유도의 모델을 소화하다 보니

Simulation내에서 생성이 아예되지 않는 문제들 부터 허공으로 날아가는 문제까지 

다양한 에러들이 존재했다. 

 

이에 대한 해결방안을 얻기 위해 다양한 커뮤니티를 활용하였는데 그중 가장 도움이 됐던 커뮤니티는

1. ROS 오픈 카톡 커뮤니티

https://open.kakao.com/o/gAeOb2nc

2. Isaac Gym 커뮤니티 두개가 대표적으로 도움이 됐다. 

https://forums.developer.nvidia.com/t/gymapi-assetoptions-fix-base-link-false-urdf-has-gone/201942

 

gymapi.AssetOptions().fix_base_link = False -> URDF has gone

I use Joint_monkey.py and convert file with Solidworks → URDF by ROS’s convert program (sw_urdf_exporter - ROS Wiki) gymapi.AssetOptions().fix_base_link = False → Model Gone gymapi.AssetOptions().fix_base_link = True → Model show up python file: jo

forums.developer.nvidia.com

위의 내용중 2번은 내가 직접 URDF편집을 해보면서 찾아낸 오류의 원인과 해결책들이다. 

 

어언 2주를 소비하면서 URDF 자체는 빠삭해졌다고 자신하는데

나는 Solidworks -> URDF로 converting하는 방법을 사용하여 Custom 모델들을 Simulation안에 넣었다. (https://github.com/ros/solidworks_urdf_exporter/releases)

처음에는 도대체 무슨말이고 뭘 원하는지, 내 모델은 어째서 입력이 안되고 중력의 영향을 안받는지 굉장히 난해하고

정답도 없었는데, 마땅한 커뮤니티가 없는 만큼 스스로 모든 코드들을 지웠다 썼다 변경해보면서 변화 되는 환경을 차례로 적어 나가며 

파일 포맷을 이해하게 됐다. 

 

- 간단하게 요약하면

1. 좌표계, 중심점, 회전축  3요소를 직접 찍는것을 매우 강력하게 추천하고 

그림 1. 좌측의 트리 처럼 하나하나 만들어주는 과정을 추천한다.

2. urdf변환 후 joint 파트 중 내가 선택한 joint type의 필수 요소를 입력했는지 꼭 확인하길 바란다. (위 2. Isaac Gym 포럼 링크 참조)

<joint link='' type='revolute'>					  
	<limit effort='number' velocity='number'/>    <- type에 따른 필수요소들이 있다.
</joint>

 

그리고 나서 가장 해결할 수 없던 문제가 하나 생겼는데 

 

#Collision & Inertial

그 부분이 바로 URDF에서 Collision과 Inertial 파트 였다. 

문제는 inertial에서 시작되는데, 내가 만든 모델의 inertial가 정확한지에 대한 계산이 불분명하다.

Solidworks에서는 내가 만든 CAD모델을 임의로 최대한 간소화 시키는데

이 과정에서 제공되는 Inertial값이 정말 옳은가? 이부분이 해결이 되질 않았다.

만일 inertial가 올바르게 입력되지 않으면 model이 날아다니는 문제가 생긴다. 

그림 2. Inertial 문제 발생시 날아다님

 

 

그래서 다른 논문의 모델을 해체해 봤는데, 취리히 공대에서는 간단한 도형을 사용하여 Collision을 제작 하였다.  

URDF에서는 복잡한 inertial계산을 줄이고자 제공되는 간단한 도형은 아래 처럼 대표적으로 3가지가 있다.

1. <box size=''/>
2. <cylinder radius='' length=''/>
3. <sphere radius=''/>

NVIDIA에서 제공된 코드[1]에서 사용한  'a1' 로봇은  이 대표적인 도형 3가지 중 box와 sphere를 활용하여

Quadruped 로봇의 trunk, thigh, calf, foot 4가지 요소를 간단하게 모델링하였다.

그림 3. URDF-Collision 단순화

 

하지만 이렇게 되면 내가 처음 만든 CAD모델이 결국 의미가 없다는 얘기가 되고, (visual적인 멋 외엔 용도가 사라진다.)

결국 복잡한 자유도의 Robot을 simulation에 넣기 위해서는

Collision을 위주로 모델을 만들어야 한다는 뜻이 된다.

그래서 울며 겨자먹기로 visual로 만든 모델을 커다란 box를 덮어씌워서 모델링을 다시하고

손으로 직접 URDF collision파트를 하나하나 수정해주었다.

 

이 방법이 정말 옳은 방법인지에 대한 검증이 불가능하여 가려운 구석으로 남았다.

 

#Conclusion

일단 1. Custom Model에 대한 task는 위와같은 문제들이 있었다.

그래도 해당하는 문제들은 복잡한 로봇이 아닌 간단한 모델내에서는 크게 문제가 되진 않았다.

(Maipulation정도는 커버하는 모습을 보인다. 이 이상으로 자유도가 많아지면 역학적인 근거가 담긴 설계가 필요하다.)

 

다음 글에서는 2. Quadruped Robot이 강화학습을 만났을 때 생긴 문제점들을 써보겠다.

 

[Code]
[1] https://github.com/leggedrobotics/legged_gym

 

GitHub - leggedrobotics/legged_gym: Isaac Gym Environments for Legged Robots

Isaac Gym Environments for Legged Robots. Contribute to leggedrobotics/legged_gym development by creating an account on GitHub.

github.com