๐งฉNewton
This post is a translated article of the original news.
Reference
- https://github.com/newton-physics/newton
- https://deepwiki.com/newton-physics/newton
- https://newton-physics.github.io/newton/guide/overview.html
Newton was initiated by Disney Research, Google DeepMind, and NVIDIA.
1 NVIDIA Isaac Lab ๋ฐ Newton์ผ๋ก Quadruped ๋ณดํ ์ ์ฑ ์ ํ์ตํ๊ณ ์ฒ(์ท๊ฐ) ์กฐ์์ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ
(์๋ฌธ: โTrain a Quadruped Locomotion Policy and Simulate Cloth Manipulation with NVIDIA Isaac Lab and Newtonโ)
๊ฒ์์ผ: 2025๋ 9์ 29์ผ ์ ์: Mohammad Mohajerani, Aravindh Shanmuganathan, Eric Heiden, Anka Chen, Gilles Daviet, Milad Rakhsha, Antoine Richard.
๋ฌผ๋ฆฌ(Physics)๋ ๋ก๋ด ์๋ฎฌ๋ ์ด์ ์์ ๋งค์ฐ ์ค์ํ ์ญํ ์ ํ๋ฉฐ, ๋ก๋ด ๋์๊ณผ ํ์ค์ ์ธ ํ๊ฒฝ ๋ด ์ํธ์์ฉ์ ์ ํํ๊ฒ ๊ฐ์์ผ๋ก ํํํ๋ ๊ธฐ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ํตํด ์ฐ๊ตฌ์์ ์์ง๋์ด๋ ๋ก๋ด ์ ์ด ์๊ณ ๋ฆฌ์ฆ์ ํ์ตยท๊ฐ๋ฐยทํ ์คํธยท๊ฒ์ฆํ๊ณ , ํ๋กํ ํ์ ์ ์์ ํ๊ณ ๊ฐ์ํ๋ ๋ฐฉ์์ผ๋ก ์คํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ฎฌ๋ ์ด์ ์ ์ข ์ข ํ์ค๊ณผ ์์ ํ ์ผ์นํ์ง ์๋๋ฐ, ์ด๋ฅผ sim-to-real gap(์๋ฎฌ๋ ์ด์ โํ์ค ์ฐจ์ด)์ด๋ผ๊ณ ํฉ๋๋ค. ๋ก๋ณดํฑ์ค ๊ฐ๋ฐ์๋ค์ ๋ค์ํ ์๋ฒ๋ฅผ ์ง์ํ๋ ํตํฉ ๊ฐ๋ฅํ๊ณ , ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ, ์ปค์คํฐ๋ง์ด์ฆ ๊ฐ๋ฅํ ๋ฌผ๋ฆฌ ๋ชจ๋ธ๋ง ์๋ฃจ์ ์ ํ์๋ก ํฉ๋๋ค. ์ด ๊ธ์์๋ NVIDIA Isaac Lab ๋ด์์ Newton์ ์ฌ์ฉํด ์ฟผ๋๋ฌํ๋ ๋ก๋ด์ ํ ์ง์ ์์ ๋ค๋ฅธ ์ง์ ์ผ๋ก ์ด๋์ํค๋ ๋ณดํ(Locomotion) ์ ์ฑ ์ ํ์ตํ๋ ๋ฐฉ๋ฒ๊ณผ ์ฐ์ ์ฉ ๋งค๋ํฐ๋ ์ดํฐ(Franka)๋ก ์ฒ(Cloth)์ ์ ๋ ๋ฑ ๋ค์ค ๋ฌผ๋ฆฌ(multi-physics) ์๋ฎฌ๋ ์ด์ ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์๋ดํฉ๋๋ค.
1.1 Newton์ด๋ ๋ฌด์์ธ๊ฐ?
Newton์ NVIDIA, Google DeepMind, Disney Research๊ฐ ๊ณต๋ ๊ฐ๋ฐํ๊ณ Linux Foundation์์ ๊ด๋ฆฌํ๋ ์คํ ์์ค, ํ์ฅ ๊ฐ๋ฅํ ๋ฌผ๋ฆฌ ์์ง์ผ๋ก ๋ก๋ด ํ์ต ๋ฐ ๊ฐ๋ฐ์ ์ง์ ์ํค๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. Newton์ NVIDIA Warp ๋ฐ OpenUSD ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ผ๋ฉฐ, MuJoCo Playground๋ Isaac Lab ๊ฐ์ ๋ก๋ด ํ์ต ํ๋ ์์ํฌ์ ํธํ๋ฉ๋๋ค.
Newton์ ํต์ฌ์ ์์น์ ์ ๋ถ๊ณผ ์ ์ฝ(constraint) ํด๊ฒฐ์ ์ํ ์ฌ๋ฌ ์๋ฒ ๋ชจ๋(solver modules) ์ ๋๋ค. ์ด ์๋ฒ๋ค์ ์ ์ฝ ๊ธฐ๋ฐ์ด๊ฑฐ๋ ํ(force) ๊ธฐ๋ฐ์ผ ์ ์๊ณ , ์ง์ ๋ฒ(direct) ๋๋ ๋ฐ๋ณต๋ฒ(iterative)์ ์ฌ์ฉํ๋ฉฐ, ์ต๋์ขํ(maximal) ๋๋ ์ถ์์ขํ(reduced) ํํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ณตํต ์ธํฐํ์ด์ค์ ๊ณต์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ฉด MuJoCo Warp, Disney Research์ Kamino ์๋ฒ ๋๋ ์ปค์คํ ์๋ฒ ๋ฑ ์ด๋ ๊ฒ์ ์ฌ์ฉํ๋ Newton์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ค๋ฃฐ ์ ์์ด ์ถฉ๋ ์ฒ๋ฆฌ, ์ญ๊ธฐ๊ตฌํ, ์ํ ๊ด๋ฆฌ, ํ์์คํ ๋ก์ง์ ์ฌ์์ฑํ ํ์ ์์ด ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ต(Training)์ ์ํด Newton์ ๋ฌผ๋ฆฌ ์ํ๋ฅผ PyTorch ๋ฐ NumPy ํธํ ๋ฐฐ์ด๋ก ๋ ธ์ถํ๋ ํ ์ ๊ธฐ๋ฐ API๋ฅผ ์ ๊ณตํด ๋ฐฐ์นญ(batch) ์ฒ๋ฆฌ์ Isaac Lab ๊ฐ์ ๋ก๋ด ํ์ต ํ๋ ์์ํฌ์์ ํตํฉ์ ํจ์จ์ ์ผ๋ก ์ง์ํฉ๋๋ค. Newton Selection API๋ฅผ ํตํด ํ์ต ์คํฌ๋ฆฝํธ๋ ๊ด์ ์ํ๋ฅผ ์ง์ํ๊ณ (action) ์ ์ฉํ๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ํ์ต ์๊ณ ๋ฆฌ์ฆ์ ํผ๋๋ฐฑํ ์ ์์ต๋๋ค. MuJoCo Warp(๊ตฌ๊ธ ๋ฅ๋ง์ธ๋ ๊ฐ๋ฐ)๋ Newton ์๋ฒ๋ก ์์ ํตํฉ๋์ด ์์ผ๋ฉฐ, MJX ๋ฐ Playground์์๋ ์ฌ์ฉ๋ฉ๋๋ค. Newton ๋ฐ ์ฐ๊ด ์๋ฒ๋ค์ Apache 2.0 ๋ผ์ด์ ์ค๋ก ๊ณต๊ฐ๋ฉ๋๋ค.
1.2 Newton ๋ฒ ํ(ฮฒ) ๋ฆด๋ฆฌ์ค์ ํ์ด๋ผ์ดํธ
- MuJoCo Warp(์ฃผ์ Newton ์๋ฒ)๋ GeForce RTX 4090์์ ๋ก์ฝ๋ชจ์ (๋ณดํ)์ ๋ํด ์ต๋ 152๋ฐฐ, ์กฐ์(manipulation)์ ๋ํด ์ต๋ 313๋ฐฐ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ณด์ ๋๋ค. (NVIDIA RTX PRO 6000 Blackwell Series๋ MuJoCo Warp์ ๋ํด ์ต๋ 44% ์ถ๊ฐ ์๋, MJX์ ๋ํด 75% ์ถ๊ฐ ์๋ ์ ๊ณต)
- Newton ๋ฒ ํ๋ ์ฐจ์ธ๋ Isaac Lab ๋ฐฑ์๋๋ก ์ฌ์ฉ๋ ๋, MuJoCo Warp ๋๋น PhysX๋ณด๋ค ์ธํธ๋(dexterous) ์กฐ์์์ ์ต๋ 65% ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ฌ์ฑํฉ๋๋ค.
- ์์ ๋ณํ์ฒด(์: ์๋ณต)์ฉ Vortex Block Descent(VBD) ์๋ฒ์, ์ ์ ๊ธฐ๋ฐ ์ฌ๋ฃ(์: ํยท์๊ฐ)์ฉ ์์์ Material Point Method(MPM) ์๋ฒ์ ์ฑ๋ฅ ๋ฐ ์์ ์ฑ ํ์ฅ์ด ํฌํจ๋ฉ๋๋ค.
1.3 Isaac Lab์์ Newton์ ์ฌ์ฉํด ์ฟผ๋๋ฌํ๋ ๋ณดํ ์ ์ฑ ์ ํ์ตํ๋ ๋ฐฉ๋ฒ(๊ฐ์)
Isaac Lab์ ํตํฉ๋ Newton ๋ฌผ๋ฆฌ ์์ง์ ๋ก๋ด ์ฐ๊ตฌ ๊ฐ๋ฐ์ ์ํ ๋ ๋น ๋ฅด๊ณ ๊ฐ๊ฑดํ ์ํฌํ๋ก๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋๋ ์ฟผ๋๋ฌํ๋(ANYmal-D ๋ก๋ด ์ฌ์ฉ ์)๋ฅผ ๋์์ผ๋ก ํ ์๋ ํฌ ์๋(train โ validate โ deploy) ์์์ ๋๋ค.
1.3.1 Step 1 โ Newton์ผ๋ก ๋ณดํ ์ ์ฑ ํ์ตํ๊ธฐ
- ๋ ํฌ์งํ ๋ฆฌ ์ค์ : Isaac Lab ์ ์ฅ์๋ฅผ ์ค์ ํฉ๋๋ค(๋ ํฌ์งํ ๋ฆฌ ์
์
๋งํฌ:
https://isaac-sim.github.io
์ฐธ์กฐ). - ํ์ต ์คํฌ๋ฆฝํธ ์คํ: Isaac Lab์ RL ์คํฌ๋ฆฝํธ(์:
rsl_rl
)๋ฅผ ์ฌ์ฉํด ANYmal-D๋ฅผ ํ์ง์์ ๊ฑท๋๋ก ํ์ตํฉ๋๋ค. GPU ๋ณ๋ ฌํ๋ฅผ ํตํด ์์ฒ ๊ฐ์ ๋ณ๋ ฌ ํ๊ฒฝ์์ ๋น ๋ฅด๊ฒ ์๋ ด์ํฌ ์ ์์ต๋๋ค. - ํค๋๋ฆฌ์ค(headless) ๋ชจ๋์์ ํ์ต(์ต๋ ์ฑ๋ฅ ๊ถ์ฅ) โ ์์ ์ปค๋งจ๋(๊ทธ๋๋ก ์ฌ์ฉ):
./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py \
--task Isaac-Velocity-Flat-Anymal-D-v0 --num_envs 4096 --headless
- Newton Visualizer(๊ฒฝ๋ ๋ชจ๋ํฐ๋ง ๋๊ตฌ): ์ ์ฒด Omniverse GUI ์ค๋ฒํค๋ ์์ด ํ์ต ์งํ์ ์๊ฐ์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ ค๋ฉด
--newton_visualizer
ํ๋๊ทธ๋ฅผ ์ถ๊ฐํฉ๋๋ค:
./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py \
--task Isaac-Velocity-Flat-Anymal-D-v0 --num_envs 4096 --headless \
--newton_visualizer
ํ์ต์ด ์๋ฃ๋๋ฉด .pt
ํ์์ ์ ์ฑ
์ฒดํฌํฌ์ธํธ๊ฐ ์์ฑ๋ฉ๋๋ค.
1.3.2 Step 2 โ Sim2Sim ์ ์ด ๊ฒ์ฆ(Validation with Sim2Sim transfer)
- Sim2Sim ์ ์ด๋ ์ ์ฑ ์ด ํน์ ๋ฌผ๋ฆฌ ์์ง ํน์ฑ์ ๊ณผ์ ํฉ(overfit)๋์ง ์์๋์ง ํ์ธํ๋ ํ์ ๊ฒ์ฆ์ ๋๋ค. ์๋ก ๋ค๋ฅธ ์๋ฎฌ๋ ์ดํฐ(์: PhysX โ๏ธ Newton) ๊ฐ ์ ์ด๊ฐ ์ฑ๊ณตํ๋ฉด ์ค์ ๋ก๋ด์์๋ ๋์ํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค.
- ์๋ก ๋ค๋ฅธ ๋ฌผ๋ฆฌ ์์ง์ USD๋ฅผ ํ์ฑํ๋ ๋ฐฉ์์ด๋ ๊ด์ ์์๊ฐ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก, ๊ด์ฐฐ(observation)๊ณผ ํ๋(action)์ ์ฌ๋งคํํ๋ ๊ฐ๋จํ YAML ๋งคํ ํ์ผ๋ก ์ด๋ฅผ ํด๊ฒฐํฉ๋๋ค.
- Newton์์ ํ์ตํ ์ ์ฑ ์ PhysX ๊ธฐ๋ฐ Isaac Lab์์ ์คํํ๋ ค๋ฉด ์ ๊ณต๋๋ ์ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ธ์:
./isaaclab.sh -p scripts/newton_sim2sim/rsl_rl_transfer.py \
--task=Isaac-Velocity-Flat-Anymal-D-v0 \
--num_envs=32 \
--checkpoint <PATH_TO_POLICY_CHECKPOINT> \
--policy_transfer_file scripts/sim2sim_transfer/config/newton_to_physx_anymal_d.yaml
ํด๋น ์ ์ด ์คํฌ๋ฆฝํธ๋ Isaac Sim / IsaacLab GitHub ๋ ํฌ์งํ ๋ฆฌ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
1.3.3 Step 3 โ Sim2Real ๋ฐฐํฌ ์ค๋น(Prepare for Sim2Real)
- ์๋ฎฌ๋ ์ด์ ์์ ํ์ตํ ์ ์ฑ ์ ์ค์ ๋ก๋ด์ผ๋ก ์ด์ ํ๋ ๋ง์ง๋ง ๋จ๊ณ์ ๋๋ค. ์ด ์์์์๋ ์ ์ฑ ํ์ต ์ IMU, ๊ด์ ์ธ์ฝ๋์ ๊ฐ์ ์ค์ ๋ก๋ด์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ด์ฐฐ๊ฐ๋ง ์ฌ์ฉํ๋๋ก ์ ํํ์ฌ ํน๊ถ ์ ๋ณด(privileged info)๋ฅผ ์ฌ์ฉํ์ง ์์์์ ๋ช ์ํฉ๋๋ค.
- ETH Zurich Robotic Systems Lab(RSL)์ ํ๋ ฅ์ผ๋ก ํด๋น ์ ์ฑ ์ ๋ฌผ๋ฆฌ์ ANYmal ๋ก๋ด์ ์ง์ ๋ฐฐํฌ๋์ด ๊ฑท๋ ๋์์ ์ฑ๊ณต์ ์ผ๋ก ์ํํ์ต๋๋ค(ํ๋์จ์ด ํ ์คํธ ๋น๋์ค ์ฐธ์กฐ). ์ด๋ Isaac Lab์์์ ํ์ต์ด ์ค์ธ๊ณ ํ ์คํธ๋ก ์ด์ด์ง๋ ์ง์ ์ ์ธ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฌ์ค๋๋ค.
1.4 Newton ๋ ๋ฆฝ(standalone) ์์ง์ ์ด์ฉํ ๋ฉํฐํผ์ง์ค(Multiphysics)
๋ฉํฐํผ์ง์ค ์๋ฎฌ๋ ์ด์ ์ ๊ฐ์ฒด(์: ๋ก๋ด ์)์ ๋ณํ์ฒด(์: ์ฒ/์ท๊ฐ) ๊ฐ์ ๊ฒฐํฉ๋ ์ํธ์์ฉ์ ํ๋์ ํ๋ ์์ํฌ์์ ์บก์ฒํ์ฌ, ๋ก๋ด ์ค๊ณยท์ ์ดยทํ์คํฌ ์ฑ๋ฅ์ ๋ณด๋ค ํ์ค์ ์ผ๋ก ํ๊ฐํ๊ณ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. Newton์ Isaac Lab๊ณผ ํจ๊ป ๋์ํ ๋ฟ ์๋๋ผ, ๋ ๋ฆฝ Python ๋ชจ๋๋ก๋ ์ฌ์ฉํ์ฌ ๋ณต์กํ ๋ฌผ๋ฆฌ ์์คํ ์ ์คํํ ์ ์์ต๋๋ค.
1.4.1 Franka ์(๋ก๋ด ํ) + Cloth(์ฒ) ๋ฐ๋ชจ ์คํ ์์
- Newton ์ ์ฅ์ ๋ฃจํธ์์ ๋ฐ๋ชจ๋ฅผ ํ ๋ช ๋ น์ผ๋ก ์คํํ ์ ์์ต๋๋ค.
- ํ๊ฒฝ ์ค์ :
- Franka ์๊ณผ ์ฒ ๋ฐ๋ชจ ์คํ:
๋ฐ๋ชจ๋ ์ค์๊ฐ GPU ๊ฐ์ ์๋ฎฌ๋ ์ด์ ์ ๋ณด์ฌ์ฃผ๋ ์ธํฐ๋ํฐ๋ธ ๋ทฐ์ด๋ฅผ ์ด๋ฉฐ, Franka-cloth ๋ฐ๋ชจ๋ GPU ๊ธฐ๋ฐ VBD Cloth ์๋ฒ๋ฅผ ์ฌ์ฉํฉ๋๋ค. RTX 4090์์ ์ฝ 30 FPS๋ก ์คํ๋๋ฉฐ ์๋ฎฌ๋ ์ด์ ๋ด ์นจํฌ(penetration) ์๋ ์ ์ด์ ๋ณด์ฅํฉ๋๋ค. ๋ค๋ฅธ GPU ๊ธฐ๋ฐ ์นจํฌ-์ ๊ฑฐ ์๋ฎฌ๋ ์ดํฐ(์: GPU-IPC)์ ๋น๊ตํด 300๋ฐฐ ์ด์์ ์ฑ๋ฅ ์ฐ์๋ฅผ ๋ฌ์ฑํ๋ ๋ฑ, ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ ์นจํฌ-ํ๋ฆฌ(fully penetration-free) ์ฒ ์กฐ์ ๋ฐ๋ชจ ์ค ๋งค์ฐ ๋น ๋ฅธ ํธ์ ๋๋ค.
1.4.2 ๋ฉํฐํผ์ง์ค ๊ฒฐํฉ ์ดํดํ๊ธฐ
- ์ด ๋ฐ๋ชจ๋ ์๋ก ๋ค๋ฅธ ๋์ญํ์ ๊ฑฐ๋์ ๊ฐ์ง ์์คํ
์ ๊ฒฐํฉํ๋ ๋ฉํฐํผ์ง์ค ์์์
๋๋ค. ๊ฐ ๊ตฌ์ฑ์์์ ์ ๋ฌธํ๋ ์๋ฒ๋ฅผ ํ ๋นํจ์ผ๋ก์จ ๊ตฌํ๋ฉ๋๋ค. ์์ ์คํฌ๋ฆฝํธ(
example_cloth_franka.py
)์์ ์๋ฒ ์ด๊ธฐํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
# ๋ก๋ด์ฉ Featherstone ์๋ฒ ์ด๊ธฐํ
self.robot_solver = SolverFeatherstone(self.model, ...)
# ์ฒ์ฉ Vertex-Block Descent (VBD) ์๋ฒ ์ด๊ธฐํ
self.cloth_solver = SolverVBD(self.model, ...)
- ๋ก๋ด ์๋ฒ๋ฅผ
SolverFeatherstone
๋์SolverMuJoCo
์ฒ๋ผ ๊ฐ์ฒด ์๋ฎฌ๋ ์ด์ ์ ์ง์ํ๋ ๋ค๋ฅธ ์๋ฒ๋ก ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์์ต๋๋ค. - ์์ ๋ ๋จ๋ฐฉํฅ(one-way) ๊ฒฐํฉ์ ์ฌ์ฉํฉ๋๋ค(๊ฐ์ฒด๊ฐ ๋ณํ์ฒด์ ์ํฅ์ ๋ฏธ์น์ง๋ง, ๋ฐ๋ ๋ฐฉํฅ ์ํฅ์ ๋ฌด์). ์ฒ ์กฐ์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ์ฒ์ด ๋ก๋ด ๋์ญํ์ ๋ฏธ์น๋ ์ํฅ์ด ๋ฌด์๋ ์ ์์ด ์ด ์ ๊ทผ์ด ํ์ฉ๋ฉ๋๋ค. ์๋ฎฌ๋ ์ด์ ๋ฃจํ(๋จ์ํ๋ ํํ)๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
def simulate(self):
for _step in range(self.sim_substeps):
# 1. ๋ก๋ด ์๋ฒ๋ฅผ ํ ์คํ
์งํ
self.robot_solver.step(self.state_0, self.state_1, ...)
# 2. ๋ก๋ด๊ณผ ์ฒ ์
์ ๊ฐ ์ถฉ๋ ์ฒดํฌ
self.contacts = self.model.collide(self.state_0, ...)
# 3. ๋ก๋ด์ ์ถฉ๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ์ฌ ์ฒ ์๋ฒ ํ ์คํ
์งํ
self.cloth_solver.step(self.state_0, self.state_1, ..., self.contacts, ...)
- ์ด์ฒ๋ผ ์ฌ์ฉ์๊ฐ ์ ์ดํ๋ ๋ฃจํ๋ ์๋ก ๋ค๋ฅธ ๋ฌผ๋ฆฌ ์์คํ ์ด ์ด๋ป๊ฒ ๊ฒฐํฉ๋๋์ง๋ฅผ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์๊ฒ ํด ์ค๋๋ค. ํ์ ํฅํ ์๋ฐฉํฅ(two-way) ๊ฒฐํฉ(์: ํยท์งํ๊ณผ ๊ฐ์ ๋ณํ์ฑ ์ง๋ฉด ์์์์ ๋ณดํ ์ ์ง๋ฉด์ด ๊ฐ์ฒด์ ์ญ์ผ๋ก ํ์ ๊ฐํ๋ ๊ฒฝ์ฐ) ๋ฐ ์ผ๋ถ ์๋ฒ ์กฐํฉ์ ๋ํ ์์์ (implicit) ๊ฒฐํฉ์ ํ์ํด ๋ ์๋ํ๋ ํ ๊ตํ ๊ด๋ฆฌ๋ฅผ ๊ตฌํํ ๊ณํ์ ๋๋ค.
1.5 Newton์ ์ํ๊ณ(์์ฝ์์คํ )์ด ์ด๋ป๊ฒ ์ฑํํ๊ณ ์๋?
Newton ์คํ ์ํ๊ณ๋ ๋น ๋ฅด๊ฒ ํ์ฅ ์ค์ด๋ฉฐ, ์ฌ๋ฌ ๋ํ ๋ฐ ๊ธฐ์ ๋ค์ด ํนํ๋ ์๋ฒ์ ์ํฌํ๋ก์ฐ๋ฅผ ํตํฉํ๊ณ ์์ต๋๋ค. ์ด๊ฐ ์ผ์ฑ(tactile sensing)์์ ์ฒ ์๋ฎฌ๋ ์ด์ , ์ฌ์ธํ ์กฐ์(dexterous manipulation)์์ ๊ฑฐ์น ์งํ(locomotion over rough terrain)์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ํ์ ์ด ์งํ๋๊ณ ์์ต๋๋ค. ์ฃผ์ ์ฌ๋ก:
- ETH Zurich Robotic Systems Lab (RSL): ๋ํ ์ฅ๋น ์๋ํ(earthmoving) ๊ด๋ จ ๋ฉํฐํผ์ง์ค ์๋ฎฌ๋ ์ด์ ์ Newton์ ์ ๊ทน ํ์ฉ. ์์์ MPM ์๋ฒ๋ฅผ ์ฌ์ฉํด ํ ์ยท์๊ฐยท๋ ๊ฐ์ ์ ์ ์ํธ์์ฉ์ ์บก์ฒ. ๋ํ Warp๋ฅผ ๋ก๋ณดํฑ์คยท๊ทธ๋ํฝ์ค ์ฐ๊ตฌ ์ ๋ฐ์ ํ์ฉ(๋ฏธ๋ถ ๊ฐ๋ฅํ ์๋ฎฌ๋ ์ด์ , ๊ถค์ ์ต์ ํ, ๋๊ท๋ชจ 3D ์๋ฅ ๋ชจ๋ธ๋ง ๋ฑ).
- Lightwheel: SimReady ์์ ๊ฐ๋ฐ ๋ฐ ๋ณํ์ฒด(soil, cables ๋ฑ) ์๋ฒ ์ต์ ํ์ ๊ธฐ์ฌ. ANYmal ์ฟผ๋๋ฌํ๋๊ฐ ๋ค์ค ์ฌ์ง๋ก ๊ตฌ์ฑ๋ ๋น๊ฐ์ฒด(non-rigid) ์งํ(๋ชจ๋ยท์๊ฐ ๋ฑ) ์๋ฅผ ์ด๋ํ๋ ๋ฐ MPM ์๋ฒ๋ฅผ ์ ์ฉํ๋ ๋ฐ๋ชจ๋ฅผ ์ ์.
- Peking University (PKU): IPC ๊ธฐ๋ฐ ์๋ฒ(Taccel)๋ฅผ Newton์ ํตํฉํด ๋น์ ๊ธฐ๋ฐ ์ด๊ฐ ์ผ์ฑ ์๋ฎฌ๋ ์ด์ ์ ํ์ฅ. Newton์ GPU ๊ฐ์ยท๋ฏธ๋ถ ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ฅผ ํ์ฉํด ์ฌ์ธํ ์ ์ด ์ํธ์์ฉ์ ๋ชจ๋ธ๋ง.
- Style3D: ์๋ฅยท์ฐ์ฑ์ฒด ์๋ฎฌ๋ ์ด์ ๊ธฐ์ ์ Newton์ผ๋ก ํตํฉ, ์๋ฐฑ๋ง ์ ์ ์์ค์ ๋๊ท๋ชจ ์๋ฎฌ๋ ์ด์ ์ ์ง์ํ๊ธฐ ์ํ API ๋ ธ์ถ ๊ณํ.
- TUM (Technical University of Munich): ์ค์ ๋ก๋ด์์ ๊ฒ์ฆ๋ ์๋ จ๋ ์กฐ์ ์ ์ฑ ์ ์๋ฎฌ๋ ์ด์ ์์ ๋ค์ ์ฌ์(์๋ฎฌ๋ ์ด์ ๊ฒ์ฆ)ํ๋ ์์ ๋ฑ์ ์งํ ์ค์ด๋ฉฐ, MuJoCo Warp์์ 4,000 ๋ณ๋ ฌ ํ๊ฒฝ์ผ๋ก ํ์ตํ๋ ๊ฒ๋ ์ด๋ฏธ ๊ฐ๋ฅํ๋ค๊ณ ๋ณด๊ณ . ํฅํ ํ๋์จ์ด๋ก์ ์ ์ก ๋ฐ ๊ณต๊ฐ ๋ถํด ์ด๊ฐ(Spatially resolved tactile skin)์ ์ด์ฉํ ๋ฏธ์ธ ์กฐ์(fine manipulation)์ผ๋ก ํ์ฅ ์์ .
1.6 Newton ์์ํ๊ธฐ(Get started)
- Newton ๋ฌผ๋ฆฌ ์์ง์ ๋ชจ๋ํยทํ์ฅํยท์๋ฎฌ๋ ์ดํฐ ๋ฌด๊ดํ(simulator-agnostic) ์ค๊ณ๋ฅผ ํตํด ๋ก๋ด ํ์ต์ ์ํ ๋ค์ํ ์๋ฒ ๊ฒฐํฉ์ ๊ฐ๋จํ ๋ง๋ญ๋๋ค.
- ์คํ ์์ค ์ปค๋ฎค๋ํฐ ์ฃผ๋ ํ๋ก์ ํธ๋ก์ ๊ฐ๋ฐ์๋ค์ Newton์ ์ฌ์ฉยท๋ฐฐํฌยทํ์ฅํ๊ณ , ์ปค์คํ ์๋ฒ๋ฅผ ์ถ๊ฐํด ์ํ๊ณ์ ๊ธฐ์ฌํ ์ ์์ต๋๋ค.
์ฐธ๊ณ (์ฃผ์ ๋ ํฌ์งํ ๋ฆฌ/์๋ฃ)
- Newton standalone Beta ์์: GitHub ๋ ํฌ์งํ ๋ฆฌ
newton-physics/newton
โ https://github.com/newton-physics/newton. - Isaac Lab์์ Newton ์ฌ์ฉํด๋ณด๊ธฐ: Isaac Lab GitHub โ https://github.com/isaac-sim/IsaacLab.
- Newton Developer(์ถ๊ฐ ์๋ฃ): (์๋ฌธ ๋ด ๋งํฌ: Newton Developer).
1.7 ํ์ฌ ๋ฐ ์ฑ๋ฆฐ์ง ๊ด๋ จ ์ ๋ณด
- ๋ณธ ๊ธ์ ์๊ฐ๋ ์ฐ๊ตฌ๋ 2025๋ 9์ 27์ผ~10์ 2์ผ ์์ธ์์ ์ด๋ฆฌ๋ CoRL ๋ฐ Humanoids์์ ์ ์๋ฉ๋๋ค.
- ๋ํ 2025 BEHAVIOR Challenge(๊ฐ์ ์ฉ ์์ 50๊ฐ ๋ฐ 10,000๊ฐ ์๊ฒฉ์กฐ์ ๋ฐ๋ชจ ํฌํจ)์ ์ฐธ์ฌํด ๋ณผ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
1.7.1 ์๋ฌธ ์ฐธ์กฐ
- ์๋ฌธ ๊ธฐ์ฌ: https://developer.nvidia.com/blog/train-a-quadruped-locomotion-policy-and-simulate-cloth-manipulation-with-nvidia-isaac-lab-and-newton/
- Newton GitHub: https://github.com/newton-physics/newton
- Isaac Lab (GitHub / ๋ฌธ์): https://github.com/isaac-sim/IsaacLab ๋ฐ https://isaac-sim.github.io (๋ฌธ์ ํ์ด์ง)
- Newton Visualizer: (์๋ฌธ์ ์ธ๊ธ๋ Newton Visualizer ๋งํฌ) โ https://isaac-sim.github.io (๊ด๋ จ ํ์ด์ง).
์๋๋ NVIDIA ๊ฐ๋ฐ์ ๋ธ๋ก๊ทธ ๊ธฐ์ฌ ์ค Sim2Sim ์ ์ด(transfer) ๊ด๋ จ ์น์ ๊ณผ cloth ์์ (
example_cloth_franka.py
)์ ๋์ค๋ ์ฝ๋/์ค๋ช ๋ถ๋ถ์ ์์ธํ๊ฒ ์ง์ญ(์ฝ๋ ์ฃผ์ ํฌํจ)ํ ๊ฒ์ ๋๋ค.
2 Sim2Sim ์ ์ด (์๋ฌธ ์น์ : Step 2: Validate the policy with Sim2Sim transfer)
์๋ฌธ ์์ง(ํ ๋ฌธ์ฅ ์์ฝ) Sim2Sim ์ ์ด๋ ์ ์ฑ ์ด ํน์ ๋ฌผ๋ฆฌ ์์ง ํน์ฑ์ ๊ณผ์ ํฉ(overfit)๋์ง ์์๋์ง ํ์ธํ๋ ์ค์ํ ๊ฒ์ฆ ๋จ๊ณ์ ๋๋ค. ์๋ก ๋ค๋ฅธ ์๋ฎฌ๋ ์ดํฐ(์: PhysX์ Newton) ์ฌ์ด์์ ์ ์ ์ด๋๋ ์ ์ฑ ์ ์ค์ ๋ก๋ด์์๋ ์ฑ๊ณตํ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
2.1 ์ง์ญ (์์ธ)
Sim2Sim ์ ์ด๋ ๋จ์ผ ๋ฌผ๋ฆฌ ์์ง์ ํน์ ํน์ฑ์ ์ ์ฑ ์ด ๊ณผ์ ํฉ๋์ง ์์๋์ง ํ์ธํ๊ธฐ ์ํ ์ค์ํ ์ ํฉ ๊ฒ์ฆ(sanity check)์ ๋๋ค. PhysX์ Newton๊ณผ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์๋ฎฌ๋ ์ดํฐ ์ฌ์ด์์ ์ฑ๊ณต์ ์ผ๋ก ์ ์ด๋๋ ์ ์ฑ ์ ์ค์ ๋ก๋ด์์ ๋์ํ ๊ฐ๋ฅ์ฑ์ด ํจ์ฌ ๋์ต๋๋ค.
ํ ๊ฐ์ง ํต์ฌ์ ์ธ ๋ฌธ์ ๋ ์๋ก ๋ค๋ฅธ ๋ฌผ๋ฆฌ ์์ง์ด ๋ก๋ด์ USD๋ฅผ ํ์ฑ(parsing)ํ ๋ ๊ด์ (joint)์ ์์๋ฅผ ๋ค๋ฅด๊ฒ ์ ๋ ฌํ ์ ์๋ค๋ ์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๋จํ YAML ๋งคํ ํ์ผ์ ์ฌ์ฉํ์ฌ ์ ์ฑ ์ ๊ด์ธก(observations)๊ณผ ์ก์ (actions)์ ์ฌ๋งคํ(remap)ํจ์ผ๋ก์จ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
PhysX ๊ธฐ๋ฐ Isaac Lab์์ Newton์ผ๋ก ํ์ต๋(๋๋ ๋ฐ๋ ๋ฐฉํฅ์) ์ ์ฑ ์ ์คํํ๋ ค๋ฉด ์ ๊ณต๋ ์ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์(์๋ฌธ ๋ช ๋ น์ด ํ์):
# Newton์์ ํ์ตํ ์ ์ฑ
์ PhysX ๊ธฐ๋ฐ Isaac Lab์์ ์คํ (์์)
./isaaclab.sh -p scripts/newton_sim2sim/rsl_rl_transfer.py \
--task=Isaac-Velocity-Flat-Anymal-D-v0 \
--num_envs=32 \
--checkpoint <PATH_TO_POLICY_CHECKPOINT> \
--policy_transfer_file scripts/sim2sim_transfer/config/newton_to_physx_anymal_d.yaml
์ด ์ ์ด ์คํฌ๋ฆฝํธ๋
isaac-sim/IsaacLab
GitHub ์ ์ฅ์์์ ์ ๊ณต๋ฉ๋๋ค.
์ฐธ๊ณ ๋ฐ ์ ํ ์ฌํญ (์๋ฌธ ๋ด์ฉ์ ์ง์ญ)
- ์ด ์ ์ด ๋ฐฉ๋ฒ์ Unitree G1, Unitree Go2, Unitree H1, ๋ฐ ANYmal-D ๋ก๋ด์ผ๋ก ํ ์คํธ๋์์ต๋๋ค.
- PhysXโNewton ์ ์ด๋
physx_to_newton_*.yaml
๋งคํ ํ์ผ์ ์ฌ์ฉํฉ๋๋ค. NewtonโPhysX ์ ์ด๋newton_to_physx_*.yaml
๋งคํ ํ์ผ์ ์ฌ์ฉํฉ๋๋ค. - ๊ด์ธก ์ฌ๋งคํ(observation remapping)์ ๊ธฐ๋ณธ(base) ๊ด์ธก ๋ค์์ ๊ด์ ๊ด์ธก์ด ์ค๋(locomotion layout) ํํ๋ฅผ ๊ฐ์ ํฉ๋๋ค. ๋ค๋ฅธ ๊ด์ธก ๋ ์ด์์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
scripts/sim2sim_transfer/rsl_rl_transfer.py
ํ์ผ์get_joint_mappings
ํจ์๋ฅผ ์์ ํด์ผ ํฉ๋๋ค. (์์ด์ ์ฌ) - ์ ๋ก๋ด์ด๋ ๋ฐฑ์๋๋ฅผ ์ถ๊ฐํ ๋๋ ์์ค์ ํ๊น(์: PhysX vs Newton)์์ ๋์ผํ ๊ด์ ์ด๋ฆ์ ๊ฐ์ง๋ฉฐ YAML ๋ชฉ๋ก์ด ๊ฐ ๋ฐฑ์๋๊ฐ ๊ด์ ์ ์ ๋ ฌํ๋ ๋ฐฉ์๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค.
3 cloth ์์ (example_cloth_franka.py
) ๊ด๋ จ ๊ธฐ์ ์ค๋ช
๋ฐ ์ฝ๋ ์ค๋ํซ ์ง์ญ
์๋ฌธ ์์ง(ํ ๋ฌธ์ฅ ์์ฝ) Newton์ standalone ์์ ์๋ Franka ๋ก๋ด์ด ์ฒ(cloth)์ ์กฐ์ํ๋ ๋ฐ๋ชจ๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, ์๋ก ๋ค๋ฅธ ์๋ฒ(์: ๋ก๋ด์ฉ Featherstone, ์ฒ์ฉ VBD)๋ฅผ ์กฐํฉํด ๋ฉํฐํผ์ง์ค(multiphyics) ์๋ฎฌ๋ ์ด์ ์ ๊ตฌ์ฑํฉ๋๋ค.
3.1 ์ง์ญ (์์ธ)
Newton์ ์๋ก ๋ค๋ฅธ ๋ฌผ๋ฆฌ ํน์ฑ์ ๊ฐ์ง ์์คํ
(์: ๊ฐ์ฒด ๋ก๋ด๊ณผ ๋ณํ์ฒด์ธ ์ฒ)์ด ์ํธ์์ฉํ๋๋ก ๋ฉํฐํผ์ง์ค ์๋ฎฌ๋ ์ด์
์ ์ง์ํฉ๋๋ค. ์ด ๋ฐ๋ชจ๋ ๊ฐ ์ปดํฌ๋ํธ์ ํนํ๋ ์๋ฒ๋ฅผ ํ ๋น(assign)ํจ์ผ๋ก์จ ์ด๋ฅผ ๋ฌ์ฑํฉ๋๋ค. example_cloth_franka.py
ํ์ผ์ ๋ณด๋ฉด ์๋ฒ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ด๊ธฐํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค:
# ๋ก๋ด์ฉ Featherstone ์๋ฒ ์ด๊ธฐํ
self.robot_solver = SolverFeatherstone(self.model, ...)
# ์ฒ์ฉ Vertex-Block Descent (VBD) ์๋ฒ ์ด๊ธฐํ
self.cloth_solver = SolverVBD(self.model, ...)
์๋ฌธ ์ค๋ช
์ ๋ฐ๋ฅด๋ฉด, ๋ก๋ด ์๋ฒ๋ฅผ SolverFeatherstone
๋์ SolverMuJoCo
๊ฐ์ ๋ค๋ฅธ ๊ฐ์ฒด ์๋ฎฌ๋ ์ด์
์ ์ง์ํ๋ ์๋ฒ๋ก ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ํต์ฌ์ ์๋ฎฌ๋ ์ด์
๋ฃจํ์์ ์ด๋ค ์๋ฒ๋ฅผ ์ด๋ป๊ฒ ์กฐ์ ํ๋์ง์
๋๋ค. ์ด ์์ ๋ ์ผ๋ฐฉํฅ ๊ฒฐํฉ(one-way coupling)์ ์ฌ์ฉํฉ๋๋ค โ ์ฆ, ๊ฐ์ฒด๊ฐ ๋ณํ์ฒด(์ฒ)์ ์ํฅ์ ์ฃผ์ง๋ง ์ฒ์ด ๋ก๋ด์ ๋์ญํ์ ๋๋๋ ค์ฃผ๋ ์ํฅ์ ๋ฌด์ํฉ๋๋ค. ์ด๋ ์ฒ ์กฐ์(cloth manipulation) ์ฌ๋ก์์๋ ์ฒ์ด ๋ก๋ด ๋์ญํ์ ๋ฏธ์น๋ ์ํฅ์ด ๋ฌด์ ๊ฐ๋ฅํ๋ค๊ณ ํ๋จ๋ ๋ ํฉ๋ฆฌ์ ์ธ ์ ๊ทผ์
๋๋ค.
์๋ฌธ์ ๋์ค๋ ์๋ฎฌ๋ ์ด์ ๋ฃจํ(๋จ์ํ๋ ํํ)๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
# example_cloth_franka.py์ ๋จ์ํ๋ ์๋ฎฌ๋ ์ด์
๋ฃจํ ๋ณด๊ธฐ
def simulate(self):
for _step in range(self.sim_substeps):
# 1. ๋ก๋ด ์๋ฒ๋ฅผ ์์ผ๋ก ํ ์คํ
์งํ
self.robot_solver.step(self.state_0, self.state_1, ...)
# 2. ๋ก๋ด๊ณผ ์ฒ ์ฌ์ด์ ์ถฉ๋(contacts)์ ๊ฒ์ฌ
self.contacts = self.model.collide(self.state_0, ...)
# 3. ๋ก๋ด ์ถฉ๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ์ฌ ์ฒ ์๋ฒ๋ฅผ ํ ์คํ
์งํ
self.cloth_solver.step(self.state_0, self.state_1, ..., self.contacts, ...)
(์๋ ์๋ฌธ์ ์๋ ๊ฐ๋จํ๋ ์ฝ๋ ๋ธ๋ก์ ์ง์ญ์ ๋๋ค.) ์ด ๋ช ์์ (explicit), ์ฌ์ฉ์ ์ ์ดํ ๋ฃจํ๋ ์๋ก ๋ค๋ฅธ ๋ฌผ๋ฆฌ ์์คํ ์ด ์ด๋ป๊ฒ ๊ฒฐํฉ๋๋์ง์ ๋ํด ์ฐ๊ตฌ์์๊ฒ ๋ฏธ์ธํ ์ ์ด๊ถ(fine-grained control)์ ์ ๊ณตํฉ๋๋ค. ์๋ฌธ ํ์ ์์ผ๋ก ์ํธ ์ํฅ(two-way coupling) ๋๋ ์๋ฌต์ (implicit) ๊ฒฐํฉ ๋ฐฉ์์ ๋ ํ๊ตฌํ์ฌ, ์๋ฅผ ๋ค์ด ๋ก๋ด์ด ํ ์์ด๋ ์งํ ๊ฐ์ ๋ณํ์ฑ ์ง๋ฉด ์๋ฅผ ๊ฑธ์ ๋์ฒ๋ผ ๋ ์์คํ ์ด ์๋ก์ ๊ฐํ๊ฒ ์ํฅ์ ๋ฏธ์น๋ ์ํฉ์ ๋์ํ๊ณ ์ ํ๋ค๊ณ ๋ฐํ๊ณ ์์ต๋๋ค.
3.2 ์คํ ๋ฐฉ๋ฒ(์๋ฌธ์์ ์๋ดํ ๋ช ๋ น์ด ๋ณด์กด)
Newton ์ ์ฅ์ ๋ฃจํธ์์ ๋ค์ ๋จ์ผ ๋ช ๋ น์ผ๋ก Franka-์ฒ ๋ฐ๋ชจ๋ฅผ ์คํํ ์ ์์ต๋๋ค(์๋ฌธ ๋ช ๋ น์ด ๊ทธ๋๋ก ๋ณด์กด):
# Newton ์์ ํ๊ฒฝ ์ค์ (์๋ฌธ)
uv sync --extra examples
# Franka arm + cloth ๋ฐ๋ชจ ์คํ (์๋ฌธ)
uv run -m newton.examples cloth_franka
์๋ฌธ์ ๋ํ ์ด ๋ฐ๋ชจ๊ฐ GPU ๊ธฐ๋ฐ VBD Cloth ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ฉฐ, RTX 4090 ๊ธฐ์ค์ผ๋ก ์ฝ 30 FPS ์ ๋๋ก ๋์ํ๊ณ ์นจํฌ ์๋(penetration-free) ์ ์ด์ ๋ณด์ฅํ๋ค๊ณ ๊ธฐ์ ํฉ๋๋ค. ๋ํ ๋ค๋ฅธ GPU ๊ธฐ๋ฐ ์๋ฎฌ๋ ์ดํฐ(์: GPU-IPC)์ ๋น๊ตํด ์ด ๋ฐ๋ชจ๊ฐ ๋งค์ฐ ๋์ ์ฒ๋ฆฌ๋(performance)์ ๋ฌ์ฑํ๋ค๊ณ ์ค๋ช ํฉ๋๋ค.
4 ์ฐธ๊ณ (์๋ฌธ ๋งํฌ๋ค โ ์๋ฌธ์์ ๊ทธ๋๋ก ๋ณด์กด)
- ๊ธฐ์ฌ ์๋ฌธ: https://developer.nvidia.com/blog/train-a-quadruped-locomotion-policy-and-simulate-cloth-manipulation-with-nvidia-isaac-lab-and-newton/
- Isaac Lab Sim2Sim ๋ฌธ์(๊ด๋ จ): https://isaac-sim.github.io/IsaacLab/โฆ (๋ฌธ์ ๋ด Sim2Sim ์ค๋ช ๊ณผ ์คํฌ๋ฆฝํธ ๊ฒฝ๋ก๋ฅผ ์ฐธ์กฐ). (์์ด์ ์ฌ)
- Newton GitHub: https://github.com/newton-physics/newton (์์ ์คํ ๋ฐฉ๋ฒ ๋ฐ
cloth_franka
์์ ๊ฐ ์ ์ฅ์ ์์ ๋ชฉ๋ก์ ๋์ต๋๋ค). (GitHub)