so100arm rviz - dingdongdengdong/astra_ws GitHub Wiki

astra_ws ์ฝ”๋“œ ์ˆ˜์ • ๊ฐ€์ด๋“œ: so100-arm ํ†ตํ•ฉ

๊ธฐ์กด ๋กœ๋ด‡ ํŒ”์„ lerobot project์˜ so100-arm์œผ๋กœ ๊ต์ฒดํ•˜๊ธฐ ์œ„ํ•ด astra_ws ๋‚ด์—์„œ ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ƒ์„ธํžˆ ์•ˆ๋‚ดํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ๊ณตํ•ด์ฃผ์‹  astra_ws์˜ ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ, ํ•ด๋‹น ์‹œ์Šคํ…œ์€ ROS2๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ MoveIt!์„ ์ด์šฉํ•œ ๋ชจ์…˜ ํ”Œ๋ž˜๋‹, ๊ทธ๋ฆฌ๊ณ  ๊ฐ ํ•˜๋“œ์›จ์–ด(์–‘ํŒ”, ๋ฆฌํ”„ํŠธ, ๊ทธ๋ฆฌํผ ๋“ฑ)์— ๋Œ€ํ•œ ์ปค์Šคํ…€ Python ์ปจํŠธ๋กค๋Ÿฌ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํŒŒ์•…๋ฉ๋‹ˆ๋‹ค.

so100-arm์„ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฃผ๋กœ ๋กœ๋ด‡ ๋ชจ๋ธ ์ •์˜, MoveIt! ์„ค์ •, ๊ทธ๋ฆฌ๊ณ  ํ•˜๋“œ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค ๊ณ„์ธต์˜ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

1. ๋กœ๋ด‡ ๊ธฐ์ˆ (Description) ํŒจํ‚ค์ง€ ์ˆ˜์ •: astra_description

๋กœ๋ด‡์˜ ๊ธฐ๊ตฌํ•™์  ๊ตฌ์กฐ, ๊ด€์ ˆ ์ •๋ณด, ์‹œ๊ฐ ๋ฐ ์ถฉ๋Œ ๋ชจ๋ธ ๋“ฑ์„ ์ •์˜ํ•˜๋Š” ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค.

  • URDF (Unified Robot Description Format) ๋˜๋Š” XACRO ๊ต์ฒด/์ˆ˜์ •:

    • ํ˜„์žฌ ๋ชจ๋ธ ์œ„์น˜ ํŒŒ์•…: astra_controller/launch/start.launch.py ํŒŒ์ผ์—์„œ astra_description ํŒจํ‚ค์ง€์˜ publish_model.launch.py๋ฅผ ํฌํ•จํ•˜์—ฌ ๋กœ๋ด‡ ๋ชจ๋ธ์„ ๊ฒŒ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. astra_description ํŒจํ‚ค์ง€ ๋‚ด์˜ (urdf/ ๋˜๋Š” meshes/ ํด๋” ๋“ฑ) ๊ธฐ์กด ๋กœ๋ด‡ ํŒ”์˜ URDF ๋˜๋Š” XACRO ํŒŒ์ผ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • so100-arm ๋ชจ๋ธ ํ†ตํ•ฉ: ์ด ํŒŒ์ผ์„ so100-arm์˜ URDF/XACRO๋กœ ๊ต์ฒดํ•˜๊ฑฐ๋‚˜, ๊ธฐ์กด ์ „์ฒด ๋กœ๋ด‡ ๋ชจ๋ธ ํŒŒ์ผ ๋‚ด์—์„œ ํ•ด๋‹น ํŒ” ๋ถ€๋ถ„๋งŒ so100-arm์˜ ์ •์˜๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. so100-arm์šฉ ๋ชจ๋ธ ํŒŒ์ผ์€ [SO-100 Robot Arm ROS2 Package](https://github.com/brukg/SO-100-arm) ๋˜๋Š” ์ง์ ‘ ๋ณด์œ ํ•˜์‹  ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
    • ๋ฉ”์‹œ ํŒŒ์ผ: URDF/XACRO์—์„œ ์ฐธ์กฐํ•˜๋Š” 3D ๋ชจ๋ธ(STL, DAE ๋“ฑ) ํŒŒ์ผ ๊ฒฝ๋กœ๋„ so100-arm์˜ ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. astra_description/meshes/ ํด๋” ๋“ฑ์— ์ƒˆ๋กœ์šด ๋ฉ”์‹œ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ณ  URDF/XACRO์—์„œ ์ด ๊ฒฝ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ด€์ ˆ ์ด๋ฆ„ ๋ฐ ์„ค์ • ํŒŒ์ผ ์ˆ˜์ •:

    • astra_description/config/joint_names_astra_description.yaml: ์ด ํŒŒ์ผ์—๋Š” ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ด€์ ˆ ์ด๋ฆ„๋“ค์ด ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค (joint_r1 ๋ถ€ํ„ฐ joint_r7r/l, joint_l1 ๋ถ€ํ„ฐ joint_l7r/l ๋“ฑ). so100-arm์˜ ์‹ค์ œ ๊ด€์ ˆ ์ด๋ฆ„ (์ผ๋ฐ˜์ ์œผ๋กœ 6 DOF ์•” + 1 DOF ๊ทธ๋ฆฌํผ)์œผ๋กœ ์ด ๋ชฉ๋ก์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ด๋ฆ„๋“ค์€ MoveIt! ์„ค์ • ๋ฐ ํ•˜๋“œ์›จ์–ด ์ปจํŠธ๋กค๋Ÿฌ์™€ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. MoveIt! ์„ค์ • ํŒจํ‚ค์ง€ ์ˆ˜์ •: astra_moveit_config

MoveIt!์€ ๋ชจ์…˜ ํ”Œ๋ž˜๋‹, ์ˆœ/์—ญ๊ธฐ๊ตฌํ•™, ์ถฉ๋Œ ๊ฒ€์‚ฌ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๋ด‡ ๋ชจ๋ธ์ด ๋ณ€๊ฒฝ๋˜๋ฉด MoveIt! ์„ค์ •๋„ ๋ฐ˜๋“œ์‹œ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • MoveIt! Setup Assistant ์žฌ์‹คํ–‰ (๊ถŒ์žฅ): ๊ฐ€์žฅ ํ™•์‹คํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์€ ์ƒˆ๋กœ์šด so100-arm URDF/XACRO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MoveIt! Setup Assistant๋ฅผ ์‹คํ–‰ํ•˜๊ณ  astra_moveit_config ํŒจํ‚ค์ง€๋ฅผ ์žฌ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์ด๋ฆ„์œผ๋กœ ์„ค์ • ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋กœ๋ด‡ ๋ชจ๋ธ์— ๋งž๋Š” SRDF, IKfast/KDL ์„ค์ •, ๊ด€์ ˆ ์ œํ•œ, ํ”Œ๋ž˜๋‹ ๊ทธ๋ฃน ๋“ฑ์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜๋™ ์—…๋ฐ์ดํŠธ ์‹œ ์ฃผ์š” ํŒŒ์ผ: MoveIt! Setup Assistant๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ˆ˜๋™์œผ๋กœ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ ๋‹ค์Œ ํŒŒ์ผ๋“ค์„ ํ™•์ธํ•˜๊ณ  ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • config/kinematics.yaml: ์ƒˆ๋กœ์šด ํŒ”์˜ ํ”Œ๋ž˜๋‹ ๊ทธ๋ฃน ์ด๋ฆ„(์˜ˆ: so100_arm), ๋ฒ ์ด์Šค ๋งํฌ, ํˆด ๋งํฌ ๋“ฑ์„ ๋ช…์‹œํ•˜๊ณ , ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ธฐ๊ตฌํ•™ ์†”๋ฒ„ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ so100-arm์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์— right_arm์— ๋Œ€ํ•ด ์„ค์ •๋œ ๋ถ€๋ถ„์„ ์ƒˆ๋กœ์šด ํŒ”์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
    • config/joint_limits.yaml: so100-arm ๊ฐ ๊ด€์ ˆ์˜ ์‹ค์ œ ์œ„์น˜, ์†๋„, ๊ฐ€์†๋„ ์ œํ•œ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ๋ฌผ๋ฆฌ์  ์ œํ•œ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ ์ž‘๋™๊ณผ ์„ฑ๋Šฅ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
    • config/moveit_controllers.yaml ๋ฐ config/ros2_controllers.yaml: MoveIt!์ด ๋ชจ์…˜ ์‹คํ–‰์„ ์œ„ํ•ด ํ†ต์‹ ํ•  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. so100-arm์˜ ๊ด€์ ˆ ์ด๋ฆ„๋“ค๊ณผ ํ•˜๋“œ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ œ๊ณตํ•  ์ปจํŠธ๋กค๋Ÿฌ ์ด๋ฆ„(์˜ˆ: so100_arm_controller)์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. FollowJointTrajectory ์•ก์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, MoveIt! ์„ค์ • ํŒŒ์ผ์— ํ•ด๋‹น ์•ก์…˜ ์„œ๋ฒ„ ์ด๋ฆ„์„ ์ •ํ™•ํžˆ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • SRDF (Semantic Robot Description Format) ํŒŒ์ผ (config/<robot_name>.srdf): ์ผ๋ฐ˜์ ์œผ๋กœ config/ ํด๋” ๋‚ด์— astra_description.srdf์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ํ”Œ๋ž˜๋‹ ๊ทธ๋ฃน, ์—”๋“œ ์ดํŽ™ํ„ฐ ์ •์˜, ๊ธฐ๋ณธ ์ž์„ธ, ์ถฉ๋Œ ๋ฌด์‹œ ์Œ ๋“ฑ์„ ์ •์˜ํ•˜๋ฏ€๋กœ, so100-arm์˜ ๊ตฌ์กฐ์™€ ํ•„์š”์— ๋งž๊ฒŒ ์™„์ „ํžˆ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ๋Œ€ํญ ์ˆ˜์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (MoveIt! Setup Assistant๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ด ์ค๋‹ˆ๋‹ค).
    • Launch ํŒŒ์ผ๋“ค (launch/*.launch.py):
      • launch/rsp.launch.py: MoveItConfigsBuilder์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋กœ๋ด‡ ์ด๋ฆ„("astra_description") ๋ฐ URDF/XACRO ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ์ƒˆ ๋ชจ๋ธ์— ๋งž๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
      • launch/move_group.launch.py: ์œ„์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋กœ๋ด‡ ์ด๋ฆ„ ์ฐธ์กฐ ๋ฐ ํ•„์š”ํ•œ ์„ค์ • ํŒŒ์ผ ๋กœ๋”ฉ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. ํ•˜๋“œ์›จ์–ด ์ปจํŠธ๋กค๋Ÿฌ ํŒจํ‚ค์ง€ ์ˆ˜์ •: astra_controller

์ด ํŒจํ‚ค์ง€๋Š” ์‹ค์ œ ๋กœ๋ด‡ ํ•˜๋“œ์›จ์–ด์™€ ํ†ต์‹ ํ•˜๊ณ , ROS2์˜ ์ƒ์œ„ ๋ช…๋ น์„ ํ•˜๋“œ์›จ์–ด ๋ช…๋ น์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. so100-arm์€ Feetech ์„œ๋ณด ๋ชจํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์ด ๋ถ€๋ถ„์ด ํฌ๊ฒŒ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

  • astra_controller/arm_controller.py:

    • ํ˜„์žฌ ์ด ํŒŒ์ผ์€ ํŠน์ • ์‹œ๋ฆฌ์–ผ ํ”„๋กœํ† ์ฝœ(COMM_HEAD = 0x5A)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๋ด‡ ํŒ”๊ณผ ์ง์ ‘ ํ†ต์‹ ํ•˜๋Š” ๋กœ์ง์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ˆ˜์ • ์˜ต์…˜ 1: ๊ธฐ์กด ์ฝ”๋“œ ์ˆ˜์ •: so100-arm์˜ Feetech ์„œ๋ณด ๋ชจํ„ฐ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์— ๋งž๊ฒŒ ์‹œ๋ฆฌ์–ผ ๋ช…๋ น ์ „์†ก, ๋ฐ์ดํ„ฐ ํŒŒ์‹ฑ, ๋‹จ์œ„ ๋ณ€ํ™˜(to_si_unit, to_raw_unit ํ•จ์ˆ˜ ๋“ฑ) ๋กœ์ง์„ ์ „๋ฉด์ ์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Feetech ์„œ๋ณด ๋ชจํ„ฐ์˜ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.
    • ์ˆ˜์ • ์˜ต์…˜ 2: LeRobot ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” Feetech ROS2 ๋“œ๋ผ์ด๋ฒ„ ํ™œ์šฉ (๊ถŒ์žฅ):
      • LeRobot ์ง์ ‘ ์‚ฌ์šฉ: LeRobot ํ”„๋กœ์ ํŠธ๋Š” Feetech ๋ชจํ„ฐ๋ฅผ ํฌํ•จํ•œ ๋กœ๋ด‡ ์ œ์–ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ arm_controller.py์˜ ๋กœ์ง ๋Œ€์‹  LeRobot์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ arm_node.py๊ฐ€ LeRobot API๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. non_ros_src/lerobot/ ํด๋” ๋‚ด์˜ ์˜ˆ์ œ (์˜ˆ: examples/10_use_so100.md, scripts/control_robot.py)๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ์ด ๋ฐฉ๋ฒ•์€ LeRobot์˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ(๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋“ฑ)๊ณผ ํ†ตํ•ฉํ•˜๊ธฐ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
      • Feetech ROS2 ๋“œ๋ผ์ด๋ฒ„ ์‚ฌ์šฉ: ๋งŒ์•ฝ so100-arm ๋˜๋Š” Feetech ์„œ๋ณด๋ฅผ ์œ„ํ•œ ๋ฒ”์šฉ ROS2 ํ•˜๋“œ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด (์˜ˆ: [SO-100 Robot Arm ROS2 Package](https://github.com/brukg/SO-100-arm) ๋‚ด ๋˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ ์ œ๊ณต), ํ•ด๋‹น ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  arm_node.py๊ฐ€ ์ด ํ‘œ์ค€ ROS2 ์ธํ„ฐํŽ˜์ด์Šค(ํ† ํ”ฝ, ์•ก์…˜ ๋“ฑ)์™€ ํ†ต์‹ ํ•˜๋„๋ก ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ •์ ์ด๊ณ  ํ‘œ์ค€ํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. arm_node.py๋Š” ํ•ด๋‹น ๋“œ๋ผ์ด๋ฒ„ ๋…ธ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , MoveIt! (๋˜๋Š” ๋‹ค๋ฅธ ์ƒ์œ„ ์ œ์–ด๊ธฐ)์˜ ๋ช…๋ น์„ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • astra_controller/arm_node.py:

    • device ํŒŒ๋ผ๋ฏธํ„ฐ: so100-arm์— ์—ฐ๊ฒฐ๋œ Feetech ์„œ๋ณด ๋ชจํ„ฐ ํ†ต์‹ ์„ ์œ„ํ•œ ์‹ค์ œ ์‹œ๋ฆฌ์–ผ ํฌํŠธ (์˜ˆ: /dev/ttyUSB0 ๋˜๋Š” /dev/ttyACM0)๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • joint_names, gripper_joint_names ํŒŒ๋ผ๋ฏธํ„ฐ: ์ƒˆ๋กœ์šด URDF ๋ฐ MoveIt! ์„ค์ •์— ์ •์˜๋œ so100-arm์˜ ๊ด€์ ˆ ์ด๋ฆ„๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ arm_controller.py์˜ ๋กœ์ง ๋Œ€์‹  ์ƒˆ๋กœ์šด ๋“œ๋ผ์ด๋ฒ„๋‚˜ LeRobot API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ArmController ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„, ๊ทธ๋ฆฌ๊ณ  MoveIt! ๋“ฑ์œผ๋กœ๋ถ€ํ„ฐ์˜ ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋กœ์ง์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ๋Š” MoveIt!์˜ FollowJointTrajectory ์•ก์…˜ ์„œ๋ฒ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ์ˆ˜์ •๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
  • astra_controller/launch/start.launch.py:

    • ๋กœ๋ด‡ ๋ชจ๋ธ ๊ฒŒ์‹œ (publish_model.launch.py ํฌํ•จ) ๋ถ€๋ถ„์ด ์ƒˆ๋กœ์šด astra_description ํŒจํ‚ค์ง€ ๋˜๋Š” ์ˆ˜์ •๋œ URDF/XACRO ํŒŒ์ผ์„ ์ œ๋Œ€๋กœ ์ฐธ์กฐํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ๊ต์ฒดํ•˜๋ ค๋Š” ํŒ”(์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ)์— ํ•ด๋‹นํ•˜๋Š” arm_node ๋…ธ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ(device, joint_names ๋“ฑ)๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ์ƒˆ๋กœ์šด ํ•˜๋“œ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๊ธฐ์กด arm_node ๋Œ€์‹  ์ƒˆ ๋…ธ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๊ณ  ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ik_node: ๋งŒ์•ฝ ์ด๊ฒƒ์ด MoveIt!์˜ ๊ธฐ๊ตฌํ•™ ์†”๋ฒ„์™€ ๋ณ„๊ฐœ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ปค์Šคํ…€ IK ์†”๋ฒ„๋ผ๋ฉด so100-arm์˜ ๊ธฐ๊ตฌํ•™์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” MoveIt!์— ํฌํ•จ๋œ IK ์†”๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

4. LeRobot ํ”„๋กœ์ ํŠธ ํ†ตํ•ฉ (์„ ํƒ ์‚ฌํ•ญ)

๋งŒ์•ฝ lerobot project์˜ AI ๊ธฐ๋ฐ˜ ์ œ์–ด(๋ชจ๋ฐฉ ํ•™์Šต, ๊ฐ•ํ™” ํ•™์Šต ๋“ฑ) ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์ถ”๊ฐ€์ ์ธ ํ†ตํ•ฉ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • lerobot PyTorch ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • lerobot์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘, ์ •์ฑ… ํ•™์Šต ๋ฐ ๋กœ๋ด‡ ์ œ์–ด ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ์กด astra_controller์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ์ด๋‚˜ MoveIt! ๊ธฐ๋ฐ˜ ์ œ์–ด ๋ฐฉ์‹์„ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • astra_ws ๋‚ด์˜ non_ros_src/lerobot ํด๋”์— ํฌํ•จ๋œ LeRobot ๊ด€๋ จ ์ฝ”๋“œ ๋ฐ ๋ฌธ์„œ๊ฐ€ ์œ ์šฉํ•œ ์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. arm_node.py ๋˜๋Š” ๋ณ„๋„์˜ ROS ๋…ธ๋“œ์—์„œ LeRobot ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋กœ๋ด‡์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์กฐ์–ธ

  • ๋‹จ๊ณ„์  ์ ‘๊ทผ: ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๊ฒƒ์„ ๋ฐ”๊พธ๋ ค ํ•˜๊ธฐ๋ณด๋‹ค๋Š”, ๋กœ๋ด‡ ๋ชจ๋ธ ๊ฒŒ์‹œ(Rviz์—์„œ ์ƒˆ ํŒ”์ด ์ œ๋Œ€๋กœ ๋ณด์ด๋Š”์ง€ ํ™•์ธ)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ MoveIt! ์„ค์ •(Setup Assistant ์‚ฌ์šฉ ๊ถŒ์žฅ), ํ•˜๋“œ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค(Feetech ์„œ๋ณด์— ๋ช…๋ น์„ ๋ณด๋‚ด๊ณ  ์ƒํƒœ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธ) ์ˆœ์œผ๋กœ ๋‹จ๊ณ„์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ณ  ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ๋ฒ„์ „ ๊ด€๋ฆฌ: Git๊ณผ ๊ฐ™์€ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ด์ „ ์ƒํƒœ๋กœ ์‰ฝ๊ฒŒ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์‹ญ์‹œ์˜ค.
  • ๋ฌธ์„œํ™” ์ฐธ๊ณ : so100-arm ๋ฐ LeRobot ํ”„๋กœ์ ํŠธ์˜ ๊ณต์‹ ๋ฌธ์„œ, GitHub ์ €์žฅ์†Œ์˜ ์ด์Šˆ ๋ฐ ํ† ๋ก  ๋‚ด์šฉ์„ ์ ๊ทน์ ์œผ๋กœ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ํŠนํžˆ Feetech ์„œ๋ณด์˜ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ผ ํŒ” ์šฐ์„  ํ…Œ์ŠคํŠธ: ์–‘ํŒ” ์‹œ์Šคํ…œ์ธ ๊ฒฝ์šฐ, ๋จผ์ € ํ•˜๋‚˜์˜ ํŒ”(์˜ˆ: ์˜ค๋ฅธ์ชฝ ํŒ”)๋งŒ so100-arm์œผ๋กœ ๊ต์ฒดํ•˜์—ฌ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ตํ•ฉํ•œ ํ›„, ๋‹ค๋ฅธ ํŒ”์— ๋™์ผํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋””๋ฒ„๊น… ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ROS2 ํˆด ํ™œ์šฉ: rviz2, ros2 topic echo, ros2 node info, ros2 param dump ๋“ฑ ROS2 ๊ธฐ๋ณธ ํˆด์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ ๋…ธ๋“œ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋ถ„์„: ์ปดํŒŒ์ผ ๋˜๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ๊ณ  ๋ถ„์„ํ•˜์—ฌ ๋ฌธ์ œ์˜ ์›์ธ์„ ํŒŒ์•…ํ•˜์‹ญ์‹œ์˜ค. ROS ๊ด€๋ จ ์˜ค๋ฅ˜๋Š” ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
graph TD
    %% ์ „์ฒด ๊ทธ๋ž˜ํ”„ ๋ฐฉํ–ฅ ์„ค์ • (Set overall graph direction)
    direction TB

    %% ์‹œ์ž‘ ๋ฐ ํ•˜๋“œ์›จ์–ด ์ค€๋น„ (Start and Hardware Preparation)
    A[์‹œ์ž‘: ๋กœ๋ด‡ ํŒ” ๊ต์ฒด ๊ฒฐ์ •] --> B[1. so100-arm ํ•˜๋“œ์›จ์–ด ์ค€๋น„]

    %% ํŒ” ์„ ํƒ (Arm Selection)
    B --> C{๊ธฐ์กด ํŒ”์ด ์–‘ํŒ” ์ค‘ ํ•˜๋‚˜์ธ๊ฐ€?}
    C -->|"์˜ˆ"| D[๊ต์ฒดํ•  ํŒ” ๊ฒฐ์ • - ์˜ˆ: ์˜ค๋ฅธ์ชฝ ํŒ”]
    C -->|"์•„๋‹ˆ์˜ค - ๋‹จ์ผ ํŒ”"| D

    %% URDF ์ˆ˜์ • ์„œ๋ธŒ๊ทธ๋ž˜ํ”„ (URDF Modification Subgraph)
    subgraph "๋กœ๋ด‡ ๊ธฐ์ˆ  ํŒจํ‚ค์ง€ ์ˆ˜์ • (astra_description)"
        direction TB
        D --> E[2. URDF ํŒจํ‚ค์ง€ ์ˆ˜์ •]
        E --> E1[2.1. ๊ธฐ์กด URDF ๋ฐฑ์—…]
        E1 --> E2[2.2. so100-arm URDF, XACRO ์ค€๋น„]
        E2 --> E3[2.3. URDF ํŒŒ์ผ ๊ต์ฒด ๋˜๋Š” ์ˆ˜์ •]
        E3 --> E4[2.4. so100-arm ๋ฉ”์‹œ ๊ฒฝ๋กœ ์—…๋ฐ์ดํŠธ]
        E4 --> E5[2.5. joint_names.yaml ๊ด€์ ˆ ์ด๋ฆ„ ์ˆ˜์ •]
    end

    %% MoveIt! ์„ค์ • ์„œ๋ธŒ๊ทธ๋ž˜ํ”„ (MoveIt! Configuration Subgraph)
    subgraph "MoveIt! ์„ค์ • ์ˆ˜์ • (astra_moveit_config)"
        direction TB
        E5 --> F[3. MoveIt! ์„ค์ • ์ˆ˜์ •]
        F --> F1[3.1. MoveIt! ์„ค์ • ๋„๊ตฌ ์‹คํ–‰]
        F1 --> G
        F1 --> F2[3.2. ๊ธฐ์กด ์„ค์ • ์ˆ˜๋™ ์ˆ˜์ •]
        F2 --> F3[3.2.1. kinematics.yaml ์ˆ˜์ • - ํ”Œ๋ž˜๋‹, ์†”๋ฒ„]
        F3 --> F4[3.2.2. joint_limits.yaml ์ˆ˜์ • - ๊ด€์ ˆ ์ œํ•œ]
        F4 --> F5[3.2.3. moveit_controllers.yaml ์ˆ˜์ • - ์ปจํŠธ๋กค๋Ÿฌ, ๊ด€์ ˆ]
        F5 --> F6[3.2.4. ros2_controllers.yaml ์ˆ˜์ • - ์ปจํŠธ๋กค๋Ÿฌ, ์ธํ„ฐํŽ˜์ด์Šค]
        F6 --> F7[3.2.5. SRDF ํŒŒ์ผ ์ˆ˜์ • - ํ”Œ๋ž˜๋‹ ๊ทธ๋ฃน, ์—”๋“œ ์ดํŽ™ํ„ฐ]
        F7 --> F8[3.2.6. MoveIt! Launch ํŒŒ์ผ ๊ฒ€ํ† , ์ˆ˜์ •]
        F8 --> G
    end

    %% ์ปจํŠธ๋กค๋Ÿฌ ์ˆ˜์ • ์„œ๋ธŒ๊ทธ๋ž˜ํ”„ (Controller Modification Subgraph)
    subgraph "ํ•˜๋“œ์›จ์–ด ์ปจํŠธ๋กค๋Ÿฌ ์ˆ˜์ • (astra_controller)"
        direction TB
        G --> G1{์–ด๋–ค ์ œ์–ด ๋ฐฉ์‹ ์„ ํƒ?}
        G1 -->|"LeRobot ์‚ฌ์šฉ"| G2a[4.1a. LeRobot ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜, ์„ค์ •]
        G2a --> G3a[4.2a. arm_node.py ์ˆ˜์ • - LeRobot API ํ˜ธ์ถœ]
        G3a --> G4
        G1 -->|"ROS2 Control + ์ƒˆ ๋“œ๋ผ์ด๋ฒ„"| G2b[4.1b. Feetech ์„œ๋ณด ๋“œ๋ผ์ด๋ฒ„ ์ค€๋น„]
        G2b --> G3b[4.2b. arm_node.py ์ˆ˜์ • - ์ƒˆ ๋“œ๋ผ์ด๋ฒ„ ํ†ต์‹ ]
        G3b --> G4
        G1 -->|"๊ธฐ์กด arm_controller ์ˆ˜์ •"| G2c[4.1c. arm_controller.py ์ˆ˜์ • - Feetech ํ”„๋กœํ† ์ฝœ]
        G2c --> G4
        G4 --> G5[4.3. arm_node.py ๊ด€์ ˆ ์ด๋ฆ„ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜์ •]
    end

    %% ์‹œ์Šคํ…œ ํ…Œ์ŠคํŠธ ์„œ๋ธŒ๊ทธ๋ž˜ํ”„ (System Testing Subgraph)
    subgraph "์‹œ์Šคํ…œ ํ†ตํ•ฉ ๋ฐ ํ…Œ์ŠคํŠธ"
        direction TB
        G5 --> H[5. ์‹œ์Šคํ…œ ํ†ตํ•ฉ, ํ…Œ์ŠคํŠธ]
        H --> H1[5.1. start.launch.py ์ˆ˜์ • - arm_node ์„ค์ •]
        H1 --> H2[5.2. RViz ๋กœ๋ด‡ ๋ชจ๋ธ ์‹œ๊ฐํ™” ํ™•์ธ]
        H2 --> H3[5.3. MoveIt! ํ”Œ๋ž˜๋‹, ์‹คํ–‰ ํ…Œ์ŠคํŠธ - ์‹œ๋ฎฌ๋ ˆ์ด์…˜, ์‹ค์ œ]
        H3 --> H4[5.4. ์ €์ˆ˜์ค€ ์ œ์–ด ํ…Œ์ŠคํŠธ - ๊ด€์ ˆ, ๊ทธ๋ฆฌํผ]
        H4 --> I[์™„๋ฃŒ]
    end

    %% ์Šคํƒ€์ผ๋ง (Styling)
    classDef start_end fill:#F9E1E1,stroke:#D32F2F,stroke-width:2px
    classDef process fill:#D6EAF8,stroke:#2E86C1,stroke-width:2px
    classDef decision fill:#FFF9C4,stroke:#FBC02D,stroke-width:2px

    class A,I start_end
    class B,D,E,E1,E2,E3,E4,E5,F,F1,F2,F3,F4,F5,F6,F7,F8,G,G2a,G2b,G2c,G3a,G3b,G4,G5,H,H1,H2,H3,H4 process
    class C,G1 decision
Loading
โš ๏ธ **GitHub.com Fallback** โš ๏ธ