๐ฆ MicroDuck RL Locomotion Policies (ONNX)
์ด ์ ์ฅ์๋ 2์กฑ ๋ณดํ ์ด์ํ ๋ก๋ด MicroDuck์ ์ํ ๊ฐํํ์ต(Reinforcement Learning) ๊ธฐ๋ฐ ๋ชจ์
์ ์ด ์จ์ค(ONNX) ์ ์ฑ
๋ชจ๋ธ ๋ชจ์์
๋๋ค.
MuJoCo ์๋ฎฌ๋ ์ดํฐ ํ๊ฒฝ ๋ฐ ์ค์ ํ๋์จ์ด ๋ก๋ด(Sim2Real)์์ ์ค์๊ฐ์ผ๋ก ๊ตฌ๋๋ฉ๋๋ค.
๐ฆ MicroDuck Custom Walking Policy (Simulation Rollout at 60 FPS)
๐ ํฌํจ๋ ๋ชจ๋ธ ํ์ผ ๋ชฉ๋ก (Policies)
| ํ์ผ๋ช | ์ฃผ์ ์ญํ (Behavior) | ์ค๋ช |
|---|---|---|
my_microduck_walking.onnx |
์ฌ์ฉ์ ํ์ต ๋ณดํ (Custom Walking) | ์ง์ ํ์ต๋ MicroDuck ์ ์ง/ํ์ ๋ณดํ ์ ์ด ์ ์ฑ |
alpha_walking.onnx |
๊ธฐ๋ณธ ๋ณดํ (Default Walking) | ์๋ ๋ช ๋ น(vx, vy, vyaw) ์ถ์ข ๋ณดํ ์ ์ฑ |
alpha_stand.onnx |
๊ธฐ๋ฆฝ ๋ฐ ์์ธ ์ ์ด (Standing & Pose) | ์ ์๋ฆฌ ๊ท ํ ์ ์ง ๋ฐ ์ ์ฒด 6์ถ(z, pitch, roll ๋ฑ) ์ ์ด |
alpha_sitstand.onnx |
์๊ธฐ / ์๊ธฐ (Sit โ Stand) | ๋ถ๋๋ฌ์ด ์๊ธฐ ๋ฐ ๋ค์ ์ผ์ด์๊ธฐ ์ํ ์ ํ ์ ์ด |
alpha_ground_pick.onnx |
๋ฐ๋ฅ ๋ฌผ์ฒด ์ค๊ธฐ (Ground Pick) | ํ๋ฆฌ๋ฅผ ์์ฌ ๋ฐ๋ฅ ๋ฌผ์ฒด๋ฅผ ์ง์ด ์ฌ๋ฆฌ๋ ๊ถค์ ์ ์ด |
roulade.onnx |
์๊ตฌ๋ฅด๊ธฐ (Forward Roll) | ๋ค์ด๋ด๋ฏน ์๊ตฌ๋ฅด๊ธฐ ํ ์๋ ๊ธฐ๋ฆฝ ๋ณต์ ๋์ |
ball_kick_left.onnx |
์ผ๋ฐ ๊ณต์ฐจ๊ธฐ (Left Ball Kick) | ์ ๋ฐฉ ๊ณต ํ๊ฒฉ ๋ชจ์ |
ball_kick_right.onnx |
์ค๋ฅธ๋ฐ ๊ณต์ฐจ๊ธฐ (Right Ball Kick) | ์ ๋ฐฉ ๊ณต ํ๊ฒฉ ๋ชจ์ |
roller.onnx |
๋กค๋ฌ์ค์ผ์ดํธ ์ฃผํ (Roller Skates) | ๋กค๋ฌ ์ ๋ฐ ์ฅ์ฐฉ ์ ๊ณ ์ ์ฃผํ ์ ์ด |
roller_crouch.onnx |
๋กค๋ฌ ์ ํฌ๋ฆฌ๊ธฐ (Roller Crouch) | ๋กค๋ฌ ์ฃผํ ์ค ๋ฌด๊ฒ์ค์ฌ์ ๋ฎ์ถ๋ ์์ธ |
โ๏ธ ๋ชจ๋ธ ์ ์ถ๋ ฅ ๊ท๊ฒฉ (Model Specification)
๋ชจ๋ ์ ์ฑ ๋ชจ๋ธ์ **ํต์ผ๋ 61์ฐจ์ ๊ด์ธก(Observation)**๊ณผ 14์ฐจ์ ์ก์ (Action) ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
์ ๋ ฅ (Observation):
[1, 61](float32)imu_ang_vel(3D): IMU ๊ฐ์๋ (X, Y, Z rad/s)projected_gravity(3D): ๋ชธ์ฒด ๊ธฐ์ค ์ค๋ ฅ ๋ฒกํฐjoint_pos_rel(14D): ๊ธฐ๋ณธ ์ ์๋ ์์ธ ๋๋น ํ์ฌ 14๊ฐ ๊ด์ ๊ฐ๋ ์ค์ฐจ (rad)joint_vel(14D): 14๊ฐ ๊ด์ ๊ฐ์๋ (rad/s)last_action(14D): ์ด์ ์คํ ์ก์ ์ถ๋ ฅ๊ฐcommand(13D):- ์ ์๋/๊ฐ์๋ ๋ช
๋ น:
[vx, vy, vyaw](3D) - ๋จธ๋ฆฌ ๋ฐฉํฅ ๋ช
๋ น:
[neck_pitch, head_pitch, head_yaw, head_roll](4D) - ๋ชธ์ฒด ์์ธ ๋ช
๋ น:
[x, y, z, roll, pitch, yaw](6D)
- ์ ์๋/๊ฐ์๋ ๋ช
๋ น:
์ถ๋ ฅ (Action):
[1, 14](float32)- 14๊ฐ ๋ค์ด๋๋ฏน์ XL330 ์ก์ถ์์ดํฐ์ ๋ชฉํ ๊ฐ๋ ์คํ์ (Delta angle)
์ ์ด ๋ฃจํ (Control Loop):
- ์ ์ด ์ฃผ๊ธฐ: 50 Hz (0.02์ด ๊ฐ๊ฒฉ)
- ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์
์คํ
: 0.005์ด (
decimation = 4) - ๋ชจํฐ ํ๊ฒ ๊ณ์ฐ:
target_position = default_pose + action * action_scale
๐ ํ์ด์ฌ์์ ONNX ๋ชจ๋ธ ๋ก๋ ๋ฐ ์ถ๋ก ์์
import numpy as np
import onnxruntime as ort
# ONNX ๋ชจ๋ธ ๋ก๋
session = ort.InferenceSession("my_microduck_walking.onnx")
# 61์ฐจ์ ๊ด์ธก๊ฐ ๋ฒกํฐ ์์ฑ (์์)
obs = np.zeros((1, 61), dtype=np.float32)
# ์ถ๋ก ์คํ (14์ฐจ์ ์ก์
ํ๋)
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name
action = session.run([output_name], {input_name: obs})[0]
print("์ก์
์ถ๋ ฅ (14๊ฐ ๊ด์ ):", action)