LOE
[Isaac sim Tutorial] Part 7. H1 휴머노이드 policy 제어 본문
출처
https://docs.isaacsim.omniverse.nvidia.com/5.0.0/ros2_tutorials/tutorial_ros2_rl_controller.html
Running a Reinforcement Learning Policy through ROS2 and Isaac Sim — Isaac Sim Documentation
Now the asset is set up, you can run the ROS2 policy. First build the ROS 2 workspace and source the setup.bash file. Note This ROS2 package computes observations and actions using the ROS messages that we are publishing above and the flat terrain locomoti
docs.isaacsim.omniverse.nvidia.com
Tutorial 13: Rigging a Legged Robot for Locomotion Policy — Isaac Sim Documentation
Tutorial 13: Rigging a Legged Robot for Locomotion Policy The objective of this tutorial is to explain the process of rigging a legged robot to match the configuration specified by the locomotion policy. The isaac sim Policy Controller Class for inference
docs.isaacsim.omniverse.nvidia.com
H1 휴머노이드를 위한 joint 설정


- 이후 모든 관절을 선택한 후 Add > Physics > Joint State Angular와 Add > Physics > Angular drive를 추가합니다.


- 위의 파일은 H1의 policy 환경 정의 file입니다. 해당 file의 각 관절에 해당하는 target pose와 target vel에 맞도록 각 joint의 angular target position과 velocity를 수정합니다. velocity는 전부 0으로 하고 pitch, ankle, knee, elbow와 같은 joint만 로봇의 시작 position으로 수정해줍니다.
- 지면이 없기 때문에 play시에 로봇이 바닥으로 무한히 떨어지는 것을 방지하기 위해 torso_link에서 Create > Physics > Joint > Fixed JointCreate>Physics>Joint>Fixed Joint 로 로봇을 고정시켜줍니다.



- Edit > Preference를 클릭한후 Physics에서 Reset Simulation on Stop을 uncheck하여 stop버튼을 누를때마다 시뮬레이션이 멈추는 것을 그만둡니다.
- 이제 stop을 눌러도 로봇이 마지막 상태 그대로로 고정됩니다.
- 이후 simulation on stop을 다시 check해준 후 torso_link에 생성했던 fixed_joint를 제거합니다. 이후 ctrl + s로 저장합니다. (!!중요 이후에 play버튼을 누르면 로봇이 바닥으로 떨어지므로 play하면 안됩니다)

Setting Joint Configuration
위의 h1_env.yaml 파일에서 scene:robot:actuators 의 관절 값들을 isaac sim에서 설정해 줍니다.
- stifness, damping : yaml파일에는 rad단위의 값이 적혀있습니다. 따라서 isaac sim에는 각도 단위의 값으로변경해주기 위해 pi/180의 값을 곱하여 입력하여 줍니다. ( 150 -> 2.617, 해당 단위를 움직이는데에 필요한 힘)
- effort_limit : max force에 해당 값을 넣어줍니다.
- Armature, Joint Friction : Raw USD Properties 에서 Advanced tab에 있지만 null값이므로 0으로 설정해 줍니다.
- Maximum Joint Velocity : velocity_limit 속성에 180/pi를 곱하여 넣어줍니다.

- 이후 Window > script Editor에서 아래와 같은 스크립트를 실행하여 true 값과 비교합니다.
from isaacsim.core.prims import SingleArticulation
prim_path = "/h1"
prim = SingleArticulation(prim_path=prim_path, name="h1")
print(prim.dof_names)
print(prim.dof_properties)


Add IMU sensor
IMU 센서를 추가하여 body의 선형 가속도, 각 속도, 방향등을 알 수 있습니다. flat terrain policy가 선 속도, 각속도, 중력벡터를 요구하므로 IMU sensor를 pelvis link에 추가하도록 합니다.

H1 휴머노이드를 위한 ROS2 node 만들기
우리가 만드는 ROS2 node는 로봇의 state를 발행하고 isaac sim으로부터 action을 받는 노드입니다. 해당 노드를 구축하기 위해 아래의 정보가 필요합니다.
- Body frame linear velocity
- IMU 데이터를 가공하여 얻을 수 있습니다.
- Body frame angular velocity
- IMU 데이터를 가공하여 얻을 수 있습니다.
- Body frame gravity vector
- IMU 데이터를 가공하여 얻을 수 있습니다.
- Command (linear and angular velocity)
- ROS2의 Twist메세지로부터 가져올 수 있습니다.
- Relative joint position
- simulation 내부의 joint state라는 토픽으로 얻을 수 있습니다.
- Relative joint velocity
- simulation 내부의 joint state라는 토픽으로 얻을 수 있습니다.
- Previous Action
- action은 joint의 state를 나타내는 dictionary로 원하는 position을 담고 있다.
omni graph만들기


- Stage에서 우클릭후 Create > Scope 를 생성하고 Graph로 이름을 변경합니다.
- Create > Visual Scriptin > Action Graph를 생성한 후 이름을 ROS_Imu로 변경합니다.
- 이후 속성에서 Raw USD Properties의 pipelineStage를 pipelineStageOnDemand 로 변경합니다.
- 결과로 시뮬레이션 시간이 dt만큼 진행될 때마다 실행되도록 지정됩니다.


- On Physics Step : dt마다 tick을 발생시켜 전체 그래프를 실행 시키게 됩니다.
- ROS2 QoS Profile : ROS2 node의 QoS profile을 설정합니다.
- Isaac Read IMU Node : 이 노드는 isaac sim으로 부터 imu데이터를 받아옵니다.
- Isaac Publish IMU : IMU 데이터를 ROS2토픽으로 발행시킵니다.
- Isaac Read IMU Node 에서 IMU prim을 아까 추가한 /h1/pelvis/Imu_Sensor 로 변경합니다. readGravity속성을 uncheck하여 imu데이터가 gravity를 pelvis link로 부터 읽어오지 않게 합니다.
- simulation time 노드의 Reset on stop 속성을 체크해줍니다.
joint state publiser 노드 만들기

- ROS2 Publish Joint State 노드와 Articulation root의 target을 /h1으로 해주고 joint state의 발행과 구독자 토픽명이 /joint_states, /joint_command인지 확인합니다.
- simulation time에서 Reset on Stop을 체크합니다.
ROS clock 만들기

- Simulation time에 reset on stop버튼을 체크합니다.
환경 load 및 policy load와 teleop 해보기

- 이후 isaacsim/environments/Simple_warehouse에서 warehouse.usd환경을 load합니다.


joint states 와 tf 추가해보기
ros2 topic echo /joint_states --once
header:
stamp:
sec: 25
nanosec: 714999425
frame_id: ''
name:
- left_hip_yaw
- right_hip_yaw
- torso
- left_hip_roll
- right_hip_roll
- left_shoulder_pitch
- right_shoulder_pitch
- left_hip_pitch
- right_hip_pitch
- left_shoulder_roll
- right_shoulder_roll
- left_knee
- right_knee
- left_shoulder_yaw
- right_shoulder_yaw
- left_ankle
- right_ankle
- left_elbow
- right_elbow
position:
- 0.0306
- -0.0651
- 0.0325
- 0.0004
- -0.006
- 0.3054
....
TF 추가


- 이전 회차에 배웠던 대로 휴머노이드 로봇의 tf를 추가해보려고 한다.
- Tf Publisher 노드를 추가한다.
- target Prim을 /h1_ROS로 설정해준다.
- parent prim을 World로 설정해준다.
- 이미 tf 를 발행하고 있는 node가 있다면 Add to an existing node를 선택해주고 node의 path를 추가해준다.
graph shortcut 으로 lidar topic 확인해보기
'isaac sim & lab' 카테고리의 다른 글
| [isaacLab tutorial] Assets을 import하고 Scene을 만든는 법 (0) | 2025.12.04 |
|---|---|
| [Unitree go2] Part 1. URDF import (0) | 2025.12.04 |
| [Isaac sim Tutorial] Part 6. ROS2 Joint Control (0) | 2025.12.02 |
| [Isaac sim Tutorial] Part 5. ROS2 Publish rate, Qos 조정 (0) | 2025.12.01 |
| [Isaac sim Tutorial] Part 4. TF trees and Odometry (0) | 2025.11.28 |