본문 바로가기

Isaac Gym

시뮬레이션 하고 싶다. #5-1 [Tensor API-Rigid Body States]

728x90

#Intro

그림 1. Cartpole Data 불러오기

Quadruped Robot 중 하나인 a1을 해석하기 위해서 기본적인 디버깅을 할 수 있어야 하지 않을까 하는 생각에

gym에서는 data가 어떤식으로 흘러가는지 알아보고자 했다.

 

간단한 예제로 시작하기 위해 기본적으로 제공되는 dof_controls.py를 사용했다. 

디렉터리 isaacgym/python/example/dof_controls.py

그림 2. 설치 시 기본적으로 제공되는 예제들

#Dof_controls.py

1) 코드 실행 방법과 결과 (directory 맞추고)

python dof_controls.py

 

그림 3. dof_contorls.py 실행 결과

2) 코드 열어보기

그림 4. 각 env에 대한 값 설정.

Line 88~104   : env0-빨간색(red)

Line 106~121 : env1-연두색(green)

[env2 : 파란색(blue), env3 : 노란색(yellow)]

 

Line 91,92의 create_env 와 create_actor는  시뮬레이션하고 싶다. #3-1에서 자세히 다뤘으니 넘어간다.

그 외의 set으로 시작하는 코드들은 추후에 업로드하겠다.

간략하게는 그림 3. 에서의 Cartpole 행동을 정하는 명령어들이다.

 

요점은 다양한 env를 생성한 simulation 정도로 이해하면 될 거 같다. 

 

3-1) Tensor API (functions)

그림 5. #9 Tensor API 삽입 부

데이터를 읽어 오는 방식은 Nvidia Release Note에서 Programming 부분 Tensor API에 보면 자세하게 나와 있다.

 

일단 첫째로 Simulation을 실행하기 이전에 env에 대한 모든 설정을 마치고 난 뒤 

gym.prepare_sim(sim)	# Setting for envs informatinos
			#※ sim = gym.create_sim(,,,,)

1. 위 명령어로 내가 설정한 simulation에서 envs들의

rigid information들을 불러올 준비를 해준다.

gym.acquire_rigid_body_state_tensor(sim)        # Get the info from envs
gymtorch.wrap_tensor(_rb_tensor)		# Make the tensor to torch form

2. 그러고 나서 해당하는 info들을 가져오면 되는데,

simulation과 소통하기 위해 data를 tensor로 보기 쉽게 불러오려면

isaac에서 제공되는 gymtorch.wrap기능을 사용하여 sim에서 나온 state tensor를

torch tensor형태로 변환해야 한다.

 

gym.refresh_rigid_body_state_tensor(sim)

3. 그리고 simulation에서 set행동에 대한 변화값들을 매번 새롭게 불러와야 한다.

중력을 받고 position이 변경될 텐데 이에 대한 데이터들을 매번 갱신해줘야 하므로

Line 193에 꼭 꼭 꼭 반드시 써줘야 하는 걸 잊지 말자.

 

3-2) Tensor API (Format)

그림 6. 텐서 형식

Line 169 ~ 172 부분을 보면 희한한 규칙으로 tensor를 slicing 했는데, 각각 우측의 주석처리된 말을 의미한다.

자세한 설명은 그림 6. 에 첨부한 공식 docs를 읽어보면 이해가 쉽다.

Data 한 줄로 연산하는 것이 전체 코드상 연산하는데 이점이 있어서 저렇게 만든 거 같다.

 

이 부분을 while 반복문에서 print 하게 되면

그림 7. rb_tensor 데이터들

위와 같은 형태로 모든 env들의 Data가 출력된다. 

하나의 env마다 왜 (3,3)의 shape을 갖는지는 아래에서 설명한다.

 

3-3) Tensor API (Names)

그림 8. actor 한개에 생성된 rigid list

rb_name을 print 해보면 사용된 urdf(actor)의 link name들이 출력된다. (이건 전체 env가 아니라 보고 싶은 env를 지정 <env0>)

그림 9. rb_names0

그림 7. 에서 한 개의 env당 (3,3)의 shape를 갖는 이유는

그림 9. 에서 봤듯이 <env당 3개의 Rigid * (x, y, z)> 좌표이다. (3x3)

그림 10. tensor 해석

#Conclusion

이렇게 Cartpole 예제를 통해 원하는 rigid states들을 불러오고 분석하는 방법을 알아봤다. 

이런 데이터를 토대로 Quadruped Robot의 Control에서 Code flow을 더 자세히 분석해보려 한다.

 

Isaac Forum을 통해서 상하이 교통대학에서 박사학위를 마치신 분이

같이 Isaac에 관한 정보나 trouble에 대해 같이 공유하자고 컨택이 됐다.

솔직히 따라가자니 조금 벅차 보이지만, 그래도 상사를 두고 일한다는 기분으로

Quadruped Robot 'a1'의 DRL Framework를 분석해 나가기로 했다.