Skip to content

55155/Crusher_IsaacSim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

41 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Crusher_IsaacSim

์•ฝํ’ˆ ๋ถ„์‡„๊ธฐ(Crusher) ์˜ Isaac Sim โ†’ MuJoCo ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐ ์ •์ œ(Tablet) ํ˜•์ƒ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ†ตํ•ฉ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.


๋ชฉ์ฐจ

  1. ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
  2. ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ
  3. ๋น ๋ฅธ ์‹œ์ž‘
  4. ๋ณ€๊ฒฝ ์ด๋ ฅ
  5. ์˜์กด์„ฑ ์„ค์น˜
  6. ์ฃผ์˜ ์‚ฌํ•ญ

โœ… 2026-05-29 ์—…๋ฐ์ดํŠธ โ€” Moving-window stall ๊ฐ์ง€ ๊ธฐ๋ฐ˜ ์–‘๋ฐฉํ–ฅ ํฌ๋žญํฌ ์—ญ์ „ (CCW โ†” CW ๋ฐ˜๋ณต), ์‹ค์‹œ๊ฐ„ ๋ฒ•์„  ๋ฐ˜๋ ฅ ํ”Œ๋กฏ (plt.ion()), ํฌ๋žญํฌ ๊ฐ์†๋„ ํ”Œ๋กฏ ์ถ”๊ฐ€.
โ†’ Crusher + Tablet ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฐ”๋กœ๊ฐ€๊ธฐ


ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

๊ตฌ์„ฑ ์š”์†Œ ์„ค๋ช…
Crusher_IsaacSim_description ROS URDF + Isaac Sim USD ์›๋ณธ ๊ธฐ์ˆ  ํŒŒ์ผ
MuJoCo_PlayGround Crusher ๋ชจ๋ธ์„ MuJoCo(MJCF)๋กœ ๋ณ€ํ™˜ยท์‹œ๋ฎฌ๋ ˆ์ด์…˜
tablets_stl ๊ฒฝ๊ตฌ์ •(Tablet) ํ˜•์ƒ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ธฐ๋ฐ˜ STL ์ƒ์„ฑยท์‹œ๊ฐํ™”ยท์ถฉ๋Œ ๋ถ„ํ•ด

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

Crusher_IsaacSim/
โ”‚
โ”œโ”€โ”€ README.md                          โ† ์ด ํŒŒ์ผ
โ”œโ”€โ”€ requirements.txt                   โ† Python ์˜์กด์„ฑ ๋ชฉ๋ก
โ”œโ”€โ”€ .gitignore                         โ† STL ๋ฐ”์ด๋„ˆ๋ฆฌ ์ œ์™ธ ์„ค์ •
โ”‚
โ”œโ”€โ”€ Crusher_IsaacSim_description/      โ† ROS ํŒจํ‚ค์ง€ ์›๋ณธ
โ”‚   โ”œโ”€โ”€ urdf/                          โ† URDF / xacro / USD ํŒŒ์ผ
โ”‚   โ”œโ”€โ”€ meshes/                        โ† ๋ถ€ํ’ˆ๋ณ„ STL ๋ฉ”์‹œ
โ”‚   โ””โ”€โ”€ Code/                          โ† ๋ณด์กฐ ์Šคํฌ๋ฆฝํŠธ (์งˆ๋Ÿ‰/๊ด€์„ฑ ๊ฒ€์‚ฌ, ์žฌ์งˆ ๋“ฑ)
โ”‚
โ”œโ”€โ”€ CODES/                             โ† ์ดˆ๊ธฐ Isaac Sim ๋””๋ฒ„๊ทธ ์Šคํฌ๋ฆฝํŠธ ๋ชจ์Œ
โ”‚
โ”œโ”€โ”€ 20260505/ ~ 20260513/              โ† ๋‚ ์งœ๋ณ„ Isaac Sim ์ž‘์—… ์Šคํฌ๋ฆฝํŠธ
โ”‚
โ”œโ”€โ”€ MuJoCo_PlayGround/                 โ† MuJoCo ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ž‘์—… ๊ณต๊ฐ„
โ”‚   โ”œโ”€โ”€ MJCF/
โ”‚   โ”‚   โ”œโ”€โ”€ Crusher_IsaacSim.xml       โ† ๊ธฐ๋ณธ MJCF (์ƒ‰์ƒ ์—†์Œ)
โ”‚   โ”‚   โ”œโ”€โ”€ Crusher_IsaacSim_colored.xml  โ† ์ƒ‰์ƒ + Ground + ํ๋ฃจํ”„ ์ œ์•ฝ ์™„์„ฑ๋ณธ
โ”‚   โ”‚   โ”œโ”€โ”€ Ground.stl                 โ† ๋ฐ”๋‹ฅ ๋ฉ”์‹œ
โ”‚   โ”‚   โ””โ”€โ”€ L*.stl / base_link.stl    โ† ๋ถ€ํ’ˆ ๋ฉ”์‹œ (42๊ฐœ)
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ 20260514/  view_mjcf.py        โ† ์ดˆ๊ธฐ MJCF ๋กœ๋”
โ”‚   โ”œโ”€โ”€ 20260515/  open_crusher.py     โ† ๊ธฐ๋ณธ XML ๋ทฐ์–ด (๊ฒฝ๊ณ  ์–ต์ œ ํฌํ•จ)
โ”‚   โ”œโ”€โ”€ 20260518/                      โ† ์ƒ‰์ƒ ํŒŒ์ดํ”„๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ
โ”‚   โ”‚   โ”œโ”€โ”€ apply_csv_to_mjcf.py       โ† mesh_colors.csv โ†’ MJCF material ์ ์šฉ
โ”‚   โ”‚   โ”œโ”€โ”€ extract_materials.py       โ† USD์—์„œ ์žฌ์งˆ ์ถ”์ถœ
โ”‚   โ”‚   โ”œโ”€โ”€ make_mesh_csv.py           โ† ๋ฉ”์‹œ-์ƒ‰์ƒ CSV ์ƒ์„ฑ
โ”‚   โ”‚   โ””โ”€โ”€ fusion360/                 โ† Fusion 360 appearances.json ๊ธฐ๋ฐ˜ ์ ์šฉ
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ 20260520/
โ”‚   โ”‚   โ””โ”€โ”€ open_crusher_colored.py   โ† โ˜… ์ƒ‰์ƒ+Ground XML Python ๋ทฐ์–ด (์‹ ๊ทœ)
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ 20260527/
โ”‚   โ”‚   โ””โ”€โ”€ crusher_tablet_sim.py     โ† โ˜… Crusher + Tablet ํ†ตํ•ฉ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (2-Phase)
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ mujoco.bat                     โ† โ˜… ๋”๋ธ”ํด๋ฆญ์œผ๋กœ ๋ทฐ์–ด ์‹คํ–‰ (์ƒ๋Œ€๊ฒฝ๋กœ ์ˆ˜์ •)
โ”‚   โ””โ”€โ”€ convert_urdf_to_mjcf.py        โ† URDF โ†’ MJCF ๋ณ€ํ™˜๊ธฐ
โ”‚
โ””โ”€โ”€ tablets_stl/                       โ† ์ •์ œ ํ˜•์ƒ ๋„๊ตฌ ๋ชจ์Œ
    โ”œโ”€โ”€ stl/
    โ”‚   โ”œโ”€โ”€ _tablet_index.csv          โ† 1000๊ฐœ ์ •์ œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
    โ”‚   โ””โ”€โ”€ tablet_R*.stl              โ† ์ƒ์„ฑ๋œ STL ํŒŒ์ผ (git ์ œ์™ธ)
    โ”‚
    โ””โ”€โ”€ Codes/
        โ”œโ”€โ”€ viewer_desktop.py          โ† โ˜… PyVista 3-์Šฌ๋ผ์ด๋” ํ˜•์ƒ ๋ทฐ์–ด + MuJoCo ์—ฐ๋™
        โ”œโ”€โ”€ launch_mujoco.py           โ† โ˜… STL โ†’ MuJoCo ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋Ÿฐ์ฒ˜
        โ”œโ”€โ”€ collision_viewer.py        โ† โ˜… ๋ณผ๋ก ๋ถ„ํ•ด 4-๋ชจ๋“œ ์ถฉ๋Œ ๋ทฐ์–ด
        โ”œโ”€โ”€ tablet_generator.py        โ† Fusion 360 AddIn (๋กœ์ปฌ ์‹คํ–‰ ๋ถˆ๊ฐ€, ์ฐธ์กฐ์šฉ)
        โ”œโ”€โ”€ viewer.html                โ† ์›น ๊ธฐ๋ฐ˜ STL ๋ธŒ๋ผ์šฐ์ €
        โ”œโ”€โ”€ start_viewer.bat           โ† viewer_desktop.py ์‹คํ–‰ ๋ฐฐ์น˜
        โ”œโ”€โ”€ run_collision_viewer.bat   โ† collision_viewer.py ์‹คํ–‰ ๋ฐฐ์น˜
        โ””โ”€โ”€ install_and_run.bat        โ† ์˜์กด์„ฑ ์„ค์น˜ + ๋ทฐ์–ด ์‹คํ–‰ ๋ฐฐ์น˜

๋น ๋ฅธ ์‹œ์ž‘

1. Crusher MuJoCo ๋ทฐ์–ด ์‹คํ–‰

# ๋ฐฉ๋ฒ• A โ€” ๋”๋ธ”ํด๋ฆญ (๊ถŒ์žฅ)
MuJoCo_PlayGround/mujoco.bat

# ๋ฐฉ๋ฒ• B โ€” Python ์Šคํฌ๋ฆฝํŠธ
conda activate isaac_sim
python MuJoCo_PlayGround/20260520/open_crusher_colored.py

mujoco.bat์€ .py ํŒŒ์ผ์„ ๊ฒฝ์œ ํ•˜์ง€ ์•Š๊ณ  python -m mujoco.viewer --mjcf ๋ช…๋ น์œผ๋กœ
์„ค์น˜๋œ MuJoCo ํŒจํ‚ค์ง€์˜ CLI ๋ทฐ์–ด๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

2. ์ •์ œ ํ˜•์ƒ ๋ทฐ์–ด ์‹คํ–‰

conda activate isaac_sim
python tablets_stl/Codes/viewer_desktop.py
  • ์Šฌ๋ผ์ด๋”๋กœ R / AR / CV ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐ์ • โ†’ ํ˜•์ƒ ์‹ค์‹œ๊ฐ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
  • [MuJoCo์—์„œ ์—ด๊ธฐ] ๋ฒ„ํŠผ โ†’ ์„ ํƒํ•œ STL์„ ๋ณ„๋„ ์ฐฝ์—์„œ ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

3. ์ถฉ๋Œ ๋ฉ”์‹œ ๋ถ„ํ•ด ๋ทฐ์–ด ์‹คํ–‰

conda activate isaac_sim
python tablets_stl/Codes/collision_viewer.py
  • 4๊ฐ€์ง€ ๋ณด๊ธฐ ๋ชจ๋“œ: ์›๋ณธ ๋ฉ”์‹œ / ๋ณผ๋ก ๊ป์งˆ / ๊ฒน์นจ ๋ณด๊ธฐ / ๋ฉด ๋ฒ•์„ 
  • ๊ฑฐ์นœ(8) / ํ‘œ์ค€(16) / ์ •๋ฐ€(32) / ์ตœ์ •๋ฐ€(64) hull ํ”„๋ฆฌ์…‹

5. Crusher + Tablet ํ†ตํ•ฉ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹คํ–‰

conda activate isaac_sim
python MuJoCo_PlayGround/20260527/crusher_tablet_sim.py <tablet.stl>

# ํŒŒ์ผ ์„ ํƒ ๋‹ค์ด์–ผ๋กœ๊ทธ๋กœ ์‹คํ–‰
python MuJoCo_PlayGround/20260527/crusher_tablet_sim.py

๋™์ž‘ ๋ฐฉ์‹

๋‹จ๊ณ„ ๋‚ด์šฉ
Phase 1 (๋ทฐ์–ด ์—†์Œ, 500 ์Šคํ…) lock_crank equality ํ™œ์„ฑ (โˆ’90ยฐ ๊ณ ์ •) โ†’ Crusher ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์•ˆ์ •ํ™”
Phase 2 โ€” ๋Œ€๊ธฐ (0 ~ 3 s) ๋ทฐ์–ด ์˜คํ”ˆ, ๋ชจํ„ฐ OFF. ์•Œ์•ฝ์€ mocap body๋กœ ์ถฉ๋ŒํŒ ๋ฒฝ๋ฉด์— ๊ณ ์ •
Phase 2 โ€” ์••์ถ• (3 s ~) lock_crank ํ•ด์ œ โ†’ Motor CCW โˆ’0.5 Nยทm ๊ตฌ๋™ โ†’ ์Šฌ๋ผ์ด๋” ์ „์ง„, ๋ฒ•์„  ๋ฐ˜๋ ฅ ์ธก์ •
Phase 2 โ€” ์—ญ์ „ (stall ๊ฐ์ง€) ํฌ๋žญํฌ ๊ฐ์†๋„ |ฯ‰| < 0.05 rad/s ๊ฐ€ 30 step ์—ฐ์† โ†’ ๋ฐฉํ–ฅ ์ „ํ™˜ (CCWโ†”CW ๋ฐ˜๋ณต)

ํ•ต์‹ฌ ๊ตฌ์กฐ

  • XML ํŒŒ์ผ ์—†์Œ โ€” Crusher_IsaacSim_colored.xml ์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํŒŒ์‹ฑ, Tablet body ๋…ธ๋“œ๋ฅผ ๋™์  ์‚ฝ์ž… ํ›„ MjModel.from_xml_string() ์œผ๋กœ ์ง์ ‘ ๋กœ๋“œ
  • ์•Œ์•ฝ ๊ณ ์ • ๋ฐฉ์‹ โ€” mocap body โ€” mocap="true" ์„ ์–ธ์œผ๋กœ MuJoCo๊ฐ€ ์•Œ์•ฝ์„ ๋ถˆ๊ฐ€์นจ ๊ฐ•์ฒด ๋ฒฝ์œผ๋กœ ์ธ์‹. data.mocap_pos / mocap_quat ์œผ๋กœ ์œ„์น˜ยท์ž์„ธ ์ œ์–ด. ๊ด€ํ†ต ์—†์Œ
  • ์ ‘์ด‰๋ ฅ ์ธก์ • โ€” data.contact + mj_contactForce() โ†’ contact frame โ†’ world frame ๋ณ€ํ™˜. ์•Œ์•ฝ์— ์ž‘์šฉํ•˜๋Š” ๋ฒ•์„  ๋ฐ˜๋ ฅ(F_Y) ์ˆ˜์ง‘
  • ํฌ๋žญํฌ ์ œ์–ด โ€” lock_crank equality (polycoef=โˆ’ฯ€/2) ๋Ÿฐํƒ€์ž„ ํ•ด์ œ (data.eq_active), moving-window stall ๊ฐ์ง€ ๊ธฐ๋ฐ˜ ์–‘๋ฐฉํ–ฅ ์ž๋™ ์—ญ์ „
  • ์•Œ์•ฝ ์ž์„ธ โ€” X์ถ• 90ยฐ + Y์ถ• 90ยฐ ํ•ฉ์„ฑ ์ฟผํ„ฐ๋‹ˆ์–ธ [0.5, 0.5, 0.5, โˆ’0.5] โ†’ ์žฅ์ถ•์ด ์ˆ˜์ง(world-Z) ๋ฐฉํ–ฅ
  • ์‹ค์‹œ๊ฐ„ ํ”Œ๋กฏ โ€” plt.ion() ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ F_Y ์ฐฝ์ด ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ๋™์‹œ ์—…๋ฐ์ดํŠธ (20 step ๋งˆ๋‹ค)
  • ์ถœ๋ ฅ โ€” ์œ„์น˜ยทํž˜ยท์ž„ํŽ„์Šคยท๊ฐ์†๋„ ๊ทธ๋ž˜ํ”„ 5์ข…์„ PNG๋กœ ์ €์žฅ

์•Œ์•ฝ ๋ฐฐ์น˜ ์ขŒํ‘œ (MuJoCo world frame)

์ถ• ๊ฐ’ ์˜๋ฏธ
X โˆ’47.879 mm ์ถฉ๋ŒํŒ ์ค‘์‹ฌ ์ •๋ ฌ
Y 336.199 mm ์ถฉ๋ŒํŒ(back wall) ๋ฉด์— ๋ฐ€์ฐฉ
Z 50.108 mm ์ˆ˜์ง ๋†’์ด

4. ์ •์ œ STL ์ƒ์„ฑ (Fusion 360 ์ „์šฉ)

tablets_stl/Codes/tablet_generator.py ์ฐธ์กฐ.
๋กœ์ปฌ์—์„œ ์ง์ ‘ ์‹คํ–‰ ๋ถˆ๊ฐ€ โ€” Fusion 360 ๋‚ด๋ถ€ AddIn์œผ๋กœ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


๋ณ€๊ฒฝ ์ด๋ ฅ

2026-05-29 โ€” Moving-window ์—ญ์ „ ์•Œ๊ณ ๋ฆฌ์ฆ˜ + ์‹ค์‹œ๊ฐ„ ๋ฐ˜๋ ฅ ํ”Œ๋กฏ

ํ•ต์‹ฌ ๋ณ€๊ฒฝ

ํ•ญ๋ชฉ ๋ณ€๊ฒฝ ์ „ ๋ณ€๊ฒฝ ํ›„
ํฌ๋žญํฌ ์—ญ์ „ ๋ฐฉ์‹ ์ ‘์ด‰๋ ฅ ์ž„๊ณ„(|F_Y| > 5 N) โ†’ CCWโ†’CW ๋‹จ๋ฐฉํ–ฅ, ๋ณต๊ท€ ์—†์Œ Moving-window stall ๊ฐ์ง€ โ€” ์–‘๋ฐฉํ–ฅ (CCWโ†”CW ๋ฐ˜๋ณต)
์—ญ์ „ ํŠธ๋ฆฌ๊ฑฐ ์กฐ๊ฑด ์ ‘์ด‰๋ ฅ ํฌ๊ธฐ ๊ธฐ๋ฐ˜ ํฌ๋žญํฌ ๊ฐ์†๋„ |ฯ‰| < 0.05 rad/s 30 step ์—ฐ์† ์œ ์ง€
์‹ค์‹œ๊ฐ„ ํ”Œ๋กฏ ์—†์Œ (์‹œ๋ฎฌ ์ข…๋ฃŒ ํ›„ ์ •์  PNG๋งŒ) plt.ion() ๊ธฐ๋ฐ˜ F_Y ์‹ค์‹œ๊ฐ„ ์ฐฝ (20 step ๊ฐ„๊ฒฉ ๊ฐฑ์‹ )
์ถœ๋ ฅ ๊ทธ๋ž˜ํ”„ 3์ข… (์œ„์น˜, ํž˜, XYZ ์„ฑ๋ถ„) 5์ข… โ€” ์œ„์น˜, ํž˜+์ž„ํŽ„์Šค, XYZ ์„ฑ๋ถ„, ์‹ค์‹œ๊ฐ„ ์Šค๋ƒ…์ƒท, ํฌ๋žญํฌ ๊ฐ์†๋„
์ฝ˜์†” ์ถœ๋ ฅ ์œ„์น˜ยทํž˜ยท์ ‘์ด‰ ์ˆ˜ ์œ„์น˜ยทํž˜ยท๊ฐ์†๋„ยทํ˜„์žฌ ๋ฐฉํ–ฅ([CCW]/[CW])

์ƒ์„ธ ๋‚ด์šฉ

โ‘  Moving-window stall ๊ฐ์ง€ ๊ธฐ๋ฐ˜ ์–‘๋ฐฉํ–ฅ ์—ญ์ „

STALL_WINDOW  = 30      # ์—ฐ์† ํŒ์ • ์Šคํ… ์ˆ˜ (0.002 s ร— 30 = 0.06 s)
STALL_VEL_THR = 0.05    # ํฌ๋žญํฌ ์†๋„ ์ž„๊ณ„ [rad/s]
  • deque(maxlen=30) โ€” ์ตœ์‹  30 ์Šคํ…์˜ |ฯ‰| < threshold ๋ถˆ๋ฆฌ์–ธ ๊ธฐ๋ก
  • all(stall_buf) ๊ฐ€ True ๋˜๋Š” ์ˆœ๊ฐ„ motor_dir = -motor_dir ์ „ํ™˜, deque ์ดˆ๊ธฐํ™”
  • ๋ถ€ํ˜ธ ๊ทœ์น™: data.ctrl[act_crank] = motor_dir ร— MOTOR_CTRL
    • motor_dir = +1 (CCW) โ†’ ctrl = โˆ’0.5 Nยทm
    • motor_dir = โˆ’1 (CW) โ†’ ctrl = +0.5 Nยทm
  • CCWโ†’CW, CWโ†’CCW ๋ชจ๋‘ ์ž๋™ ์ฒ˜๋ฆฌ. ์—ญ์ „ ํšŸ์ˆ˜ยท์‹œ๊ฐ ์ฝ˜์†” ์ถœ๋ ฅ ๋ฐ ํ”Œ๋กฏ ๋งˆ์ปค ๊ธฐ๋ก

โ‘ก ์‹ค์‹œ๊ฐ„ ๋ฒ•์„  ๋ฐ˜๋ ฅ ํ”Œ๋กฏ (plt.ion())

  • ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๋ทฐ์–ด์™€ ๋™์‹œ์— ๋ณ„๋„ ์ฐฝ์œผ๋กœ F_Y [N] ์‹ค์‹œ๊ฐ„ ํ‘œ์‹œ
  • 20 step(0.04 s)๋งˆ๋‹ค line_fy.set_data() + ax_rt.relim() + flush_events()
  • ๋ฐฉํ–ฅ ์ „ํ™˜ ์ด๋ฒคํŠธ ์ˆ˜์ง์„ (axvline)์„ ์‹ค์‹œ๊ฐ„ ๊ฐฑ์‹ 
  • ์‹œ๋ฎฌ ์ข…๋ฃŒ ํ›„ crusher_tablet_realtime_force.png ๋กœ ์ €์žฅ

โ‘ข ํฌ๋žญํฌ ๊ฐ์†๋„ ํ”Œ๋กฏ ์ถ”๊ฐ€ (๊ทธ๋ฆผ 4)

  • data.qvel[crank_vadr] ๋กœ๊ทธ๋ฅผ ์‹œ๊ฐ„ ์ถ•์œผ๋กœ ํ‘œ์‹œ
  • stall ์ž„๊ณ„์„  ยฑSTALL_VEL_THR ์ˆ˜ํ‰์„  ํ‘œ์‹œ
  • ๋ฐฉํ–ฅ ์ „ํ™˜ ์ด๋ฒคํŠธ ์ˆ˜์ง์„  ๋™๊ธฐํ™”

์ˆ˜์ • ํŒŒ์ผ

ํŒŒ์ผ ์ˆ˜์ • ๋‚ด์šฉ
MuJoCo_PlayGround/20260527/crusher_tablet_sim.py v5 โ€” moving-window ์—ญ์ „, ์‹ค์‹œ๊ฐ„ ํ”Œ๋กฏ, ๊ฐ์†๋„ ํ”Œ๋กฏ, ๋‹ค์ค‘ ์—ญ์ „ ์ด๋ฒคํŠธ ์ถ”์ 

2026-05-28 โ€” ์•Œ์•ฝ ๋ฌผ๋ฆฌ ๊ณ ์ • ๋ฐฉ์‹ ์ „ํ™˜ ๋ฐ ๋ฐ˜๋ ฅ ์ธก์ • ํŒŒ์ดํ”„๋ผ์ธ ์™„์„ฑ

ํ•ต์‹ฌ ๋ณ€๊ฒฝ

ํ•ญ๋ชฉ ๋ณ€๊ฒฝ ์ „ ๋ณ€๊ฒฝ ํ›„
์•Œ์•ฝ ๊ณ ์ • ๋ฐฉ์‹ freejoint + ๋งค ์Šคํ… qpos/qvel ๋ฎ์–ด์“ฐ๊ธฐ (kinematic hold) mocap="true" body โ€” ๊ด€ํ†ต ์—†๋Š” ๋ถˆ๊ฐ€์นจ ๊ฐ•์ฒด ๋ฒฝ
์ ‘์ด‰๋ ฅ ์ธก์ • cfrc_ext (๋ถ€์ •ํ™•, ์œ ๋ น body ๋ฌธ์ œ) data.contact + mj_contactForce() โ†’ world frame ๋ณ€ํ™˜
ํฌ๋žญํฌ ์ดˆ๊ธฐ ๊ฐ๋„ +90ยฐ โˆ’90ยฐ
๋ชจํ„ฐ ๋ฐฉํ–ฅ CW (+0.5 Nยทm) CCW (โˆ’0.5 Nยทm), 3์ดˆ ์ง€์—ฐ ํ›„ ๊ตฌ๋™
ํฌ๋žญํฌ ์—ญ์ „ ํŠธ๋ฆฌ๊ฑฐ gap ๊ธฐ๋ฐ˜ (์Šฌ๋ผ์ด๋” ์œ„์น˜) โ†’ ๋ฒฝ ์ ‘์ด‰ ์‹œ ๊ณ ์ฐฉ์œผ๋กœ ๋™์ž‘ ์•ˆ ๋จ ์ ‘์ด‰๋ ฅ ๊ธฐ๋ฐ˜ `
์•Œ์•ฝ ์ž์„ธ X์ถ• 90ยฐ (๋ˆ•ํž˜) X์ถ• 90ยฐ + Y์ถ• 90ยฐ ํ•ฉ์„ฑ โ†’ ์„ธ๋กœ(์ˆ˜์ง) ๋ฐฉํ–ฅ

์ƒ์„ธ ๋‚ด์šฉ

โ‘  mocap body ์ „ํ™˜ (๊ด€ํ†ต ๋ฌธ์ œ ํ•ด๊ฒฐ)

  • freejoint ๋ฐฉ์‹์—์„œ๋Š” MuJoCo contact solver๊ฐ€ ๋ถ„๋ฆฌ impulse๋ฅผ ๊ณ„์‚ฐํ•ด๋„ ๋งค ์Šคํ… qpos๋ฅผ ๋ฎ์–ด์จ์„œ ์Šฌ๋ผ์ด๋”๊ฐ€ ์•Œ์•ฝ์„ ๊ด€ํ†ตํ•˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
  • mocap="true" body๋Š” ๋ฌผ๋ฆฌ ์—”์ง„์ด ์ง์ ‘ ๋ถˆ๊ฐ€์นจ ๊ฐ•์ฒด๋กœ ์ทจ๊ธ‰ โ†’ ์Šฌ๋ผ์ด๋”๊ฐ€ ์•Œ์•ฝ์„ ๋ฐ€์–ด๋‚ด๊ณ  ์•Œ์•ฝ์€ ๊ณ ์ • ์œ ์ง€
  • ์œ„์น˜ยท์ž์„ธ ์ œ์–ด: data.mocap_pos[mocap_id], data.mocap_quat[mocap_id]

โ‘ก lock_crank equality ๋Ÿฐํƒ€์ž„ ํ† ๊ธ€

  • Crusher_IsaacSim_colored.xml ์˜ lock_crank (polycoef=โˆ’1.5708, solref=โˆ’100000) ๋กœ Phase 1์—์„œ ํฌ๋žญํฌ๋ฅผ โˆ’90ยฐ์— ๊ณ ์ •
  • Phase 2 ์‹œ์ž‘ 3์ดˆ ํ›„ data.eq_active[eq_lock_id] = 0 ์œผ๋กœ ํ•ด์ œ โ†’ ๋ชจํ„ฐ CCW ๊ตฌ๋™

โ‘ข ์ ‘์ด‰๋ ฅ ๊ธฐ๋ฐ˜ ํฌ๋žญํฌ ์—ญ์ „

  • ๊ธฐ์กด gap ๊ธฐ๋ฐ˜: ์Šฌ๋ผ์ด๋”๊ฐ€ mocap ๋ฒฝ์— ๋ง‰ํžˆ๋ฉด gap์ด ์ตœ์†Ÿ๊ฐ’์— ๊ณ ์ฐฉ โ†’ elif gap > min + 0.5mm ์กฐ๊ฑด ์˜์›ํžˆ ๋ถˆ์ถฉ์กฑ
  • ์ˆ˜์ •: |F_Y| > REVERSE_F_THRESHOLD (5 N) ์ดˆ๊ณผ ์‹œ์ ์— ctrl = +0.5 Nยทm (CW) ์—ญ์ „
  • ์—ญ์ „ ์‹œ๊ฐ, ์ ‘์ด‰๋ ฅ, gap ๊ฐ’์„ ์ฝ˜์†” ์ถœ๋ ฅ ๋ฐ ํ”Œ๋กฏ ๋งˆ์ปค๋กœ ๊ธฐ๋ก

โ‘ฃ ๋ฒ•์„  ๋ฐ˜๋ ฅ ํ”Œ๋กฏ ๊ฐœ์„ 

  • F_Y ๊ทธ๋ž˜ํ”„ ๋ ˆ์ด๋ธ”์„ "Normal Contact Force (World-Y)" ๋กœ ๋ช…ํ™•ํ™”
  • ๋ชจํ„ฐ ON ์‹œ๊ฐ, ํฌ๋žญํฌ ์—ญ์ „ ์‹œ๊ฐ์„ ์ˆ˜์ง์„ (axvline)์œผ๋กœ ํ‘œ์‹œ
  • ์••์ถ•(์–‘)/์ธ์žฅ(์Œ) ๊ตฌ๊ฐ„ fill_between ์ƒ‰ ๊ตฌ๋ถ„

โ‘ค Tablet Shape Viewer ๋‹จ์ถ•ํ‚ค ํŒจ๋„ ์ถ”๊ฐ€

  • viewer_desktop.py ์ขŒ์ธก ํŒจ๋„ ํ•˜๋‹จ์— PyVista ๋‹จ์ถ•ํ‚ค ์„น์…˜ ์ถ”๊ฐ€
  • ๋งˆ์šฐ์Šค ์กฐ์ž‘ / ๋ Œ๋”๋ง(W ์™€์ด์–ดํ”„๋ ˆ์ž„ โ˜…) / ์นด๋ฉ”๋ผ / ๊ธฐํƒ€ 4๊ฐœ ์„น์…˜

์ˆ˜์ • ํŒŒ์ผ

ํŒŒ์ผ ์ˆ˜์ • ๋‚ด์šฉ
MuJoCo_PlayGround/20260527/crusher_tablet_sim.py mocap body, lock_crank ํ† ๊ธ€, CCW ๋ชจํ„ฐ, ์—ญ์ „ ๋กœ์ง, ๋ฒ•์„  ๋ฐ˜๋ ฅ ํ”Œ๋กฏ
MuJoCo_PlayGround/MJCF/Crusher_IsaacSim_colored.xml lock_crank polycoef โˆ’1.5708 ๋ณต์›
tablets_stl/Codes/viewer_desktop.py PyVista ๋‹จ์ถ•ํ‚ค ํŒจ๋„ ์ถ”๊ฐ€

2026-05-27 โ€” Crusher + Tablet ํ†ตํ•ฉ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์™„์„ฑ

์‹ ๊ทœ ํŒŒ์ผ

ํŒŒ์ผ ๋‚ด์šฉ
MuJoCo_PlayGround/20260527/crusher_tablet_sim.py Crusher XML + Tablet STL์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์กฐํ•ฉํ•ด 2-Phase ํ†ตํ•ฉ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹คํ–‰. Phase 1(๋ฉ”์ปค๋‹ˆ์ฆ˜ ์•ˆ์ •ํ™”) โ†’ Phase 2(์•Œ์•ฝ ๊ณ ์ • + ์ ‘์ด‰๋ ฅ ์ธก์ • + ๊ทธ๋ž˜ํ”„ ์ €์žฅ)

์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ

ํ•ญ๋ชฉ ๋‚ด์šฉ
์•Œ์•ฝ ๊ณ ์ • ๋ฐฉ์‹ freejoint(6์ž์œ ๋„) + ๋งค ์Šคํ… kinematic hold (qpos/qvel ๋ฎ์–ด์“ฐ๊ธฐ) โ†’ ์•Œ์•ฝ์„ ๊ณต๊ฐ„์— ๊ณ ์ •ํ•˜๋ฉด์„œ cfrc_ext ์ ‘์ด‰ ๋ฐ˜๋ ฅ ์ธก์ • ๊ฐ€๋Šฅ
์•Œ์•ฝ ๋ฐฐ์น˜ Y ์ขŒํ‘œ๋ฅผ WALL_Y_MM(336.199 mm)์œผ๋กœ ์„ค์ • โ€” ์ถฉ๋ŒํŒ ๋ฒฝ๋ฉด์— ์ค‘์‹ฌ ๋ฐ€์ฐฉ
MJCF ๊ตฌ์„ฑ ๋ณ„๋„ XML ํŒŒ์ผ ์—†์Œ โ€” ๊ธฐ์กด Crusher XML์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํŒŒ์‹ฑ ํ›„ Tablet body / sensor ๋…ธ๋“œ ๋™์  ์‚ฝ์ž…
๋ทฐ์–ด site ๊ตฌ ์ œ๊ฑฐ sitegroup ์ „์ฒด False โ€” ์ค‘์‹ฌ๋ถ€ ๊ตฌ ํ˜•ํƒœ gizmo ๋น„ํ‘œ์‹œ

2026-05-26 โ€” Crank-Slider ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ง„๋‹จ ๋ฐ ์ขŒํ‘œ๊ณ„ ๋ถ„์„

ํ•ต์‹ฌ ๋ฐœ๊ฒฌ

ํ•ญ๋ชฉ ๋‚ด์šฉ
Equality Constraint ํƒ€์ž… ์˜ค๋ฅ˜ connect๋Š” ์œ„์น˜(3-DOF)๋งŒ ๊ตฌ์† โ†’ L7-L8 ์‚ฌ์ด ํšŒ์ „ ์ž์œ ๋„ ๋ฏธ๊ตฌ์†์œผ๋กœ ์ง„๋™ ๋ฐœ์ƒ. weld(์œ„์น˜+๋ฐฉํ–ฅ ์™„์ „ ๊ณ ์ •)๋กœ ๊ต์ฒด ํ•„์š”
Constraint Gap ์›์ธ ๋ถ„์„ anchor=0.027 ์„ค์ • ์‹œ L8 body์™€ 10 mm ๊ฐญ ๋ฐœ์ƒ โ†’ ์ œ์•ฝ๋ ฅ 500 N (์ค‘๋ ฅ 12.7 N์˜ 39๋ฐฐ) โ†’ CCW ๋น„์ •์ƒ ํšŒ์ „ ์œ ๋ฐœ
ํฌ๋žญํฌ ํšŒ์ „์ถ• ์˜คํ•ด XML axis="0 0 1" (body local Z) + quat="0.5 0.5 0.5 0.5" โ†’ ์‹ค์ œ world ํšŒ์ „์ถ• = [1, 0, 0] (world X). ์ค‘๋ ฅ(-Z)๊ณผ ์ˆ˜์ง์ด๋ฏ€๋กœ ์ตœ๋Œ€ ํ† ํฌ ๋ฐœ์ƒ
MuJoCo ์ขŒํ‘œ๊ณ„ ๋ณ€ํ™˜ quat="0.5 0.5 0.5 0.5" โ†’ R=[[0,0,1],[1,0,0],[0,1,0]] : URDF Xโ†’MuJoCo Y, URDF Yโ†’MuJoCo Z, URDF Zโ†’MuJoCo X

์‹ ๊ทœ ํŒŒ์ผ

ํŒŒ์ผ ๋‚ด์šฉ
MuJoCo_PlayGround/20260526/coordinate_gizmo.py MuJoCo ์›”๋“œ ์ขŒํ‘œ๊ณ„(XYZ ๊ธฐ์ฆˆ๋ชจ) ํ™•์ธ ์Šคํฌ๋ฆฝํŠธ. ๋ทฐ์–ด ์›์ ์— body frame ํ‘œ์‹œ
MuJoCo_PlayGround/20260526/open_urdf.py ์›๋ณธ URDF๋ฅผ MuJoCo๋กœ ์ง์ ‘ ๋กœ๋“œํ•ด ๊ฐ body ์›”๋“œ ์œ„์น˜ยทjoint ๋ชฉ๋ก ์ถœ๋ ฅ ๋ฐ ๋ทฐ์–ด ์‹คํ–‰

MJCF ์ˆ˜์ • ์ด๋ ฅ (Crusher_IsaacSim_colored.xml)

์ˆ˜์ • ๋‚ด์šฉ
L5-L6, L6-L7 hinge damping ์ถ”๊ฐ€ damping="0.5" โ€” ์ดˆ๊ธฐ ๋ถˆ์•ˆ์ • ์ง„๋™ ์–ต์ œ
L8 slide joint damping ์ถ”๊ฐ€ damping="5"
L8_Link3_Shaft_1 body pos ์ˆ˜์ • Rigid32 ์ ‘ํ•ฉ ์œ„์น˜ = (-0.048302, 0.236278, 0.049431) (URDF ์‹ค์ธก ๊ฒ€์ฆ ์™„๋ฃŒ)
Equality Constraint anchor URDF Rigid32 joint xyz=(0.037, 0, -0.005) ๊ธฐ์ค€. ๋‹ค์Œ ๋‹จ๊ณ„: connect โ†’ weld ๊ต์ฒด ์˜ˆ์ •
๋ทฐ์–ด ์„ค์ • mjVIS_CONVEXHULL=False, geomgroup[3]=False โ€” visual mesh ์ „์šฉ ํ‘œ์‹œ

2026-05-21 โ€” macOS ํ˜ธํ™˜์„ฑ ์ˆ˜์ • ๋ฐ tablet_generator Fusion 360 ๋“ฑ๋ก

ํŒŒ์ผ ๋ณ€๊ฒฝ ๋‚ด์šฉ
tablets_stl/Codes/viewer_desktop.py subprocess.CREATE_NEW_CONSOLE (Windows ์ „์šฉ) โ†’ platform.system() ๊ฐ์ง€ ํ›„ ์กฐ๊ฑด๋ถ€ ์ ์šฉ์œผ๋กœ macOS ํ˜ธํ™˜ ์ˆ˜์ •
tablets_stl/stl/_tablet_index.csv Fusion 360 tablet_generator AddIn ์‹คํ–‰์œผ๋กœ ์ •์ œ STL 1,000๊ฐœ ์ƒ์„ฑ ๋ฐ ์ธ๋ฑ์Šค ๊ฐฑ์‹ 

2026-05-20 โ€” MuJoCo ํ†ตํ•ฉ ์™„์„ฑ ๋ฐ ๊ตฌ์กฐ ์ •๋ฆฌ

MuJoCo_PlayGround

ํŒŒ์ผ ๋ณ€๊ฒฝ ๋‚ด์šฉ
mujoco.bat ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ ˆ๋Œ€๊ฒฝ๋กœ โ†’ %~dp0 ๊ธฐ๋ฐ˜ ์ƒ๋Œ€๊ฒฝ๋กœ๋กœ ์ „๋ฉด ์ˆ˜์ •; conda ํ™œ์„ฑํ™” ๊ฒฝ๋กœ๋„ %USERPROFILE% ๋ณ€์ˆ˜๋กœ ํฌํ„ฐ๋ธ”ํ™”
20260520/open_crusher_colored.py ์‹ ๊ทœ โ€” Crusher_IsaacSim_colored.xml(Ground.stl ํฌํ•จ)์„ Python API(mujoco.viewer.launch)๋กœ ์—ฌ๋Š” ์Šคํฌ๋ฆฝํŠธ; __file__ ๊ธฐ์ค€ ์ƒ๋Œ€๊ฒฝ๋กœ ์‚ฌ์šฉ

tablets_stl

ํŒŒ์ผ ๋ณ€๊ฒฝ ๋‚ด์šฉ
Codes/viewer_desktop.py [MuJoCo์—์„œ ์—ด๊ธฐ] ๋ฒ„ํŠผ ์ถ”๊ฐ€; STL ๋กœ๋“œ ์„ฑ๊ณต ์‹œ ํ™œ์„ฑํ™”, subprocess.Popen์œผ๋กœ ๋น„์ฐจ๋‹จ ์‹คํ–‰
Codes/launch_mujoco.py ์‹ ๊ทœ โ€” ์„ ํƒ๋œ STL์„ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด MJCF๋กœ ๋ณ€ํ™˜(from_xml_string + assets), ๋ฌผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ(๋ฐ€๋„ 1200 kg/mยณ, ๋งˆ์ฐฐ 0.5) ์„ค์ • ํ›„ ๋ทฐ์–ด ์‹คํ–‰
Codes/launch_mujoco.py ๋ฒ„๊ทธ ์ˆ˜์ • โ€” _print_params() ์ •๊ทœ์‹์ด ํŒŒ์ผ๋ช…์˜ .stl ํ™•์žฅ์ž๊นŒ์ง€ ์บก์ฒ˜ํ•˜์—ฌ float('0.20.') ์˜ค๋ฅ˜ ๋ฐœ์ƒ โ†’ os.path.splitext() ๋กœ ํ™•์žฅ์ž ์ œ๊ฑฐ ํ›„ ์ •๊ทœ์‹ ์ ์šฉ
Codes/collision_viewer.py ์‹ ๊ทœ โ€” ๋ณผ๋ก ๋ถ„ํ•ด(CoACD โ†’ VHACD โ†’ single hull fallback) ๋…๋ฆฝ ๋ทฐ์–ด; 4-๋ชจ๋“œ ์‹œ๊ฐํ™”

์ €์žฅ์†Œ ๊ณตํ†ต

ํŒŒ์ผ ๋ณ€๊ฒฝ ๋‚ด์šฉ
requirements.txt ์‹ ๊ทœ โ€” ๊ทธ๋ฃน๋ณ„ ์˜์กด์„ฑ ์ •๋ฆฌ (์ˆ˜์น˜์—ฐ์‚ฐ / 3D์‹œ๊ฐํ™” / ๋ฉ”์‹œ์ฒ˜๋ฆฌ / MuJoCo / JAX / ์ด๋ฏธ์ง€์ฒ˜๋ฆฌ); ๋น„pip ํŒจํ‚ค์ง€(Isaac Sim, Fusion 360, Blender) ์„ค์น˜ ์•ˆ๋‚ด ์ฃผ์„ ํฌํ•จ
.gitignore ์‹ ๊ทœ โ€” tablets_stl/stl/*.stl, tablets_stl/collision/*.stl ๋ฐ”์ด๋„ˆ๋ฆฌ ์ œ์™ธ; Python ์บ์‹œ ์ œ์™ธ

2026-05-18 โ€” Crusher ์ƒ‰์ƒ ํŒŒ์ดํ”„๋ผ์ธ ์™„์„ฑ

๋ณ€๊ฒฝ ๋‚ด์šฉ
Fusion 360 appearance JSON ์ถ”์ถœ ์Šคํฌ๋ฆฝํŠธ (extract_appearance.py)
mesh_colors.csv ๊ธฐ๋ฐ˜ MJCF material ์ž๋™ ์ ์šฉ (apply_csv_to_mjcf.py) โ€” RGB 0-255 โ†’ 0-1 ๋ณ€ํ™˜, ์กฐ๋ช… 3๊ฐœ ์ž๋™ ์ถ”๊ฐ€
Crusher_IsaacSim_colored.xml ์™„์„ฑ โ€” ์ƒ‰์ƒยท์กฐ๋ช…ยทGround.stlยทCrank-slider ํ๋ฃจํ”„ equality constraintยทMotor1_crank ์•ก์ถ”์—์ดํ„ฐยทL1_Slider_jig ํ”„๋ฆฌ์ฆˆ๋งคํ‹ฑ ์กฐ์ธํŠธ ํฌํ•จ

2026-05-15 โ€” MuJoCo ์ดˆ๊ธฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

๋ณ€๊ฒฝ ๋‚ด์šฉ
URDF โ†’ MJCF ๋ณ€ํ™˜ (convert_urdf_to_mjcf.py)
๊ธฐ๋ณธ ๋ทฐ์–ด ์Šคํฌ๋ฆฝํŠธ 20260515/open_crusher.py (MuJoCo UserWarning ์–ต์ œ)

2026-05-05 ~ 2026-05-13 โ€” Isaac Sim ๋””๋ฒ„๊ทธ ๋ฐ ๊ด€์ ˆ ์„ค์ •

์ž‘์—…
๊ตฌ๋™๋ถ€ ๊ด€์ ˆ(Drive, Prismatic, Mimic) ์„ค์ • ๋ฐ ์ง„๋‹จ ์Šคํฌ๋ฆฝํŠธ
Rack-and-Pinion ๊ธฐ์–ด ์—ฐ๊ฒฐ ๋””๋ฒ„๊ทธ
CoACD ์ถฉ๋Œ ๋ฉ”์‹œ ์ตœ์ ํ™”
์งˆ๋Ÿ‰/๊ด€์„ฑ ํ…์„œ ๊ฒ€์‚ฌ ๋ฐ ์ˆ˜์ •

์˜์กด์„ฑ ์„ค์น˜

conda activate isaac_sim
pip install -r requirements.txt

โš ๏ธ ์•„๋ž˜ ํŒจํ‚ค์ง€๋Š” pip์œผ๋กœ ์„ค์น˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • Isaac Sim (omni.*, carb, pxr) โ€” NVIDIA Isaac Sim ์„ค์น˜ ์‹œ ๋ฒˆ๋“ค ์ œ๊ณต
  • Fusion 360 API (adsk) โ€” Autodesk Fusion 360 ๋‚ด๋ถ€ ์‹คํ–‰ ์ „์šฉ
  • Blender Python (bpy) โ€” Blender ๋‚ด๋ถ€ ์‹คํ–‰ ์ „์šฉ

์ฃผ์˜ ์‚ฌํ•ญ

  • STL ๋ฐ”์ด๋„ˆ๋ฆฌ (tablets_stl/stl/*.stl) ๋Š” .gitignore์— ์˜ํ•ด Git์—์„œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.
    STL ํŒŒ์ผ์€ Fusion 360 AddIn(tablet_generator.py)์œผ๋กœ ๋กœ์ปฌ์—์„œ ์ƒ์„ฑํ•˜์„ธ์š”.
  • tablet_generator.py๋Š” adsk ๋ชจ๋“ˆ ์˜์กด์„ฑ์œผ๋กœ ์ธํ•ด Fusion 360 ์™ธ๋ถ€์—์„œ ์‹คํ–‰ ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    ํŒŒ์ผ ๋‚ด ์ฃผ์„์˜ ์„ค์น˜ ๊ฒฝ๋กœ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.
  • MuJoCo STL ๋‹จ์œ„๋Š” mm โ†’ m ์ž๋™ ๋ณ€ํ™˜ (scale 0.001)์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
    Fusion 360 ๊ธฐ๋ณธ STL ๋‚ด๋ณด๋‚ด๊ธฐ ๋‹จ์œ„๊ฐ€ mm์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors