so100arm rviz - dingdongdengdong/astra_ws GitHub Wiki
๊ธฐ์กด ๋ก๋ด ํ์ lerobot project์ so100-arm์ผ๋ก ๊ต์ฒดํ๊ธฐ ์ํด astra_ws
๋ด์์ ์์ ํด์ผ ํ ์ฝ๋์ ๋ํด ์์ธํ ์๋ดํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ ๊ณตํด์ฃผ์ astra_ws
์ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ ๊ฒฐ๊ณผ, ํด๋น ์์คํ
์ ROS2๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ MoveIt!์ ์ด์ฉํ ๋ชจ์
ํ๋๋, ๊ทธ๋ฆฌ๊ณ ๊ฐ ํ๋์จ์ด(์ํ, ๋ฆฌํํธ, ๊ทธ๋ฆฌํผ ๋ฑ)์ ๋ํ ์ปค์คํ
Python ์ปจํธ๋กค๋ฌ ๋
ธ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ํ์
๋ฉ๋๋ค.
so100-arm์ ํตํฉํ๊ธฐ ์ํด์๋ ์ฃผ๋ก ๋ก๋ด ๋ชจ๋ธ ์ ์, MoveIt! ์ค์ , ๊ทธ๋ฆฌ๊ณ ํ๋์จ์ด ์ธํฐํ์ด์ค ๊ณ์ธต์ ์์ ์ด ํ์ํฉ๋๋ค.
๋ก๋ด์ ๊ธฐ๊ตฌํ์ ๊ตฌ์กฐ, ๊ด์ ์ ๋ณด, ์๊ฐ ๋ฐ ์ถฉ๋ ๋ชจ๋ธ ๋ฑ์ ์ ์ํ๋ ํจํค์ง์ ๋๋ค.
-
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! ์ค์ ๋ฐ ํ๋์จ์ด ์ปจํธ๋กค๋ฌ์ ์ผ๊ด๋๊ฒ ์ ์ง๋์ด์ผ ํฉ๋๋ค.
-
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
: ์์ ์ ์ฌํ๊ฒ ๋ก๋ด ์ด๋ฆ ์ฐธ์กฐ ๋ฐ ํ์ํ ์ค์ ํ์ผ ๋ก๋ฉ ๊ฒฝ๋ก๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค.
-
-
์ด ํจํค์ง๋ ์ค์ ๋ก๋ด ํ๋์จ์ด์ ํต์ ํ๊ณ , 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! (๋๋ ๋ค๋ฅธ ์์ ์ ์ด๊ธฐ)์ ๋ช ๋ น์ ๋๋ผ์ด๋ฒ๊ฐ ์ดํดํ๋ ํํ๋ก ๋ณํํ์ฌ ์ ๋ฌํ๋ ์ญํ ์ ํ ์ ์์ต๋๋ค.
-
LeRobot ์ง์ ์ฌ์ฉ: LeRobot ํ๋ก์ ํธ๋ Feetech ๋ชจํฐ๋ฅผ ํฌํจํ ๋ก๋ด ์ ์ด ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๊ฒฝ์ฐ
-
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 ์๋ฒ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
- ๋ก๋ด ๋ชจ๋ธ ๊ฒ์ (
๋ง์ฝ 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