drake - dingdongdengdong/astra_ws GitHub Wiki

Gazebo์™€ MoveIt์œผ๋กœ ๊ตฌ์„ฑ๋œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ Drake๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ ์ด์ƒ์˜ ์ž‘์—…์ด๋ฉฐ, ๊ฐ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ์ฒ ํ•™๊ณผ ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋…์„ ๋งคํ•‘ํ•˜๊ณ  ๊ธฐ๋Šฅ์„ Drake ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์žฌ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. astra_description๊ณผ astra_moveit_config์— ๊ธฐ์ˆ ๋œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ Drake๋กœ ์ด์ „ํ•˜๋Š” ์ฃผ์š” ๋‹จ๊ณ„์™€ ๊ณ ๋ ค ์‚ฌํ•ญ์„ ์•ˆ๋‚ดํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์ด์ „ ๋‹จ๊ณ„:

  1. ๋กœ๋ด‡ ๋ชจ๋ธ (URDF/Xacro ๋ฐ SRDF):

    • URDF/Xacro ๋กœ๋“œ:
      • Gazebo์™€ MoveIt์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋กœ๋ด‡ ๋ชจ๋ธ(URDF ๋˜๋Š” Xacro)์€ Drake์˜ MultibodyPlant๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • astra_ws ๋‚ด์—์„œ ๋กœ๋ด‡์˜ URDF ๋˜๋Š” Xacro ํŒŒ์ผ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ astra_description/urdf/ ๋˜๋Š” astra_description/robots/ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. astra_moveit_config/launch/rsp.launch.py ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๋ฉด robot_description ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ์‹ค์ œ ์‚ฌ์šฉ๋˜๋Š” Xacro ๋˜๋Š” URDF ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ๋งŒ์•ฝ .xacro ํŒŒ์ผ์ด๋ผ๋ฉด, ๋จผ์ € xacro ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ URDF ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
        ros2 run xacro xacro your_robot.xacro > your_robot.urdf
      • ๋ณ€ํ™˜๋œ URDF ํŒŒ์ผ์€ ์ด์ „ ๋‹ต๋ณ€์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ Drake์˜ Parser๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MultibodyPlant์— ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„ํ•˜๊ธฐ ์œ„ํ•ด parser.package_map().Add()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ROS ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
    • SRDF (Semantic Robot Description Format) ์ •๋ณด ํ™œ์šฉ:
      • MoveIt์€ ๋กœ๋ด‡์˜ ์˜๋ฏธ๋ก ์  ์ •๋ณด(ํ”Œ๋ž˜๋‹ ๊ทธ๋ฃน, ์—”๋“œ ์ดํŽ™ํ„ฐ, ๊ธฐ๋ณธ ์ž์„ธ, ์ถฉ๋Œ ๋น„ํ™œ์„ฑํ™” ์Œ ๋“ฑ)๋ฅผ SRDF ํŒŒ์ผ(astra_moveit_config/config/srdf/astra_description.srdf.xacro๋กœ ์ถ”์ •)์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
      • Drake๋Š” SRDF ํŒŒ์ผ์„ ์ง์ ‘ ํŒŒ์‹ฑํ•˜์ง€ ์•Š์ง€๋งŒ, SRDF์— ๋‹ด๊ธด ์ •๋ณด๋Š” Drake ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฐ ์ œ์–ด ์„ค์ •์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
        • ํ”Œ๋ž˜๋‹ ๊ทธ๋ฃน/์—”๋“œ ์ดํŽ™ํ„ฐ: Drake์—์„œ IK (Inverse Kinematics)๋‚˜ ๋ชจ์…˜ ํ”Œ๋ž˜๋‹ ์ž‘์—… ์‹œ ์–ด๋–ค ๋งํฌ์™€ ์กฐ์ธํŠธ๋“ค์„ ๊ณ ๋ คํ• ์ง€ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
        • ๊ธฐ๋ณธ ์ž์„ธ (Named Poses): Drake ์‹œ๋ฎฌ๋ ˆ์ด์…˜์—์„œ ๋กœ๋ด‡์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋‚˜ ๋ชฉํ‘œ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        • ์ถฉ๋Œ ๋น„ํ™œ์„ฑํ™” (Disabled Collisions): Drake์˜ MultibodyPlant์—์„œ ํŠน์ • ๋งํฌ ์Œ ๊ฐ„์˜ ์ถฉ๋Œ ๊ฒ€์‚ฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ๋•Œ ์ด ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (plant.ExcludeCollisionGeometriesWith() ๋“ฑ).
  2. ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ (World SDF):

    • Gazebo๋Š” ์›”๋“œ ํŒŒ์ผ (์ผ๋ฐ˜์ ์œผ๋กœ .sdf ๋˜๋Š” .world ํ™•์žฅ์ž)์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ(๋ฐ”๋‹ฅ, ๋ฒฝ, ์กฐ๋ช…, ์ž‘์—… ๋Œ€์ƒ ๋ฌผ์ฒด ๋“ฑ)์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ์›”๋“œ ํŒŒ์ผ์— ์ •์˜๋œ ํ™˜๊ฒฝ ์š”์†Œ๋“ค์„ Drake๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      • SDF ๋กœ๋“œ: ๋งŒ์•ฝ ํ™˜๊ฒฝ์ด SDF ํŒŒ์ผ๋กœ ๊ธฐ์ˆ ๋˜์–ด ์žˆ๋‹ค๋ฉด, Drake์˜ Parser๋Š” ๋กœ๋ด‡ ๋ชจ๋ธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ™˜๊ฒฝ SDF ํŒŒ์ผ๋„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. parser.AddModels(filename="path/to/your/world.sdf") (์ตœ์‹  Drake์—์„œ๋Š” AddAllModelsFromFile ๋˜๋Š” AddModelFromFile ๋ฐ˜๋ณต ์‚ฌ์šฉ).
      • ์ ˆ์ฐจ์  ์ƒ์„ฑ: ๊ฐ„๋‹จํ•œ ํ™˜๊ฒฝ(์˜ˆ: ํ‰ํ‰ํ•œ ๋ฐ”๋‹ฅ, ๊ฐ„๋‹จํ•œ ์žฅ์• ๋ฌผ)์€ Drake์˜ ํ˜•์ƒ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ(Sphere, Box, Cylinder, HalfSpace ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Python ์ฝ”๋“œ ๋‚ด์—์„œ ์ง์ ‘ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        # ์˜ˆ์‹œ: ๋ฐ”๋‹ฅ ์ถ”๊ฐ€
        ground_shape = DrakeShapes.Box([10, 10, 0.1]) # ๊ฐ€๋กœ, ์„ธ๋กœ, ๋†’์ด
        plant.RegisterVisualGeometry(plant.world_body(), RigidTransform([0,0,-0.05]), ground_shape, "ground_visual", diffuse_color=[0.5,0.5,0.5,1.0])
        plant.RegisterCollisionGeometry(plant.world_body(), RigidTransform([0,0,-0.05]), ground_shape, "ground_collision", CoulombFriction(1.0, 1.0))
      • ์ž‘์—… ๋Œ€์ƒ ๋ฌผ์ฒด๋“ค ์—ญ์‹œ URDF๋‚˜ SDF๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค๋ฉด Drake์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ปจํŠธ๋กค๋Ÿฌ (Controllers):

    • Gazebo/ROS์—์„œ๋Š” ros_control ๋˜๋Š” ์ปค์Šคํ…€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๋ด‡์„ ์ œ์–ดํ•˜๊ณ , MoveIt์€ ์ฃผ๋กœ FollowJointTrajectory ์•ก์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ปจํŠธ๋กค๋Ÿฌ์™€ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค. astra_controller ํŒจํ‚ค์ง€์— ํ•ด๋‹น ๋กœ์ง์ด ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
    • Drake์—์„œ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ LeafSystem์œผ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ Diagram์— ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค.
      • PID ์ปจํŠธ๋กค๋Ÿฌ: ros_control์˜ position_controllers/JointTrajectoryController ๋˜๋Š” velocity_controllers/JointTrajectoryController์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ Drake์—์„œ PidController ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์กฐ์ธํŠธ์— ๋Œ€ํ•ด PID ๊ฒŒ์ธ์„ ์„ค์ •ํ•˜๊ณ , ๋ชฉํ‘œ ์ƒํƒœ(์œ„์น˜, ์†๋„)๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ ํ† ํฌ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
      • ์—ญ๋™์—ญํ•™ ์ปจํŠธ๋กค๋Ÿฌ (InverseDynamicsController): Drake๋Š” ๋กœ๋ด‡์˜ ๋™์—ญํ•™ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์กฐ์ธํŠธ ๊ฐ€์†๋„๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ† ํฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” InverseDynamicsController๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋” ์ •๊ตํ•œ ์ œ์–ด์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
      • ์ปค์Šคํ…€ ์ œ์–ด ๋กœ์ง: astra_controller ๋‚ด์˜ ํŠน์ • ์ œ์–ด ์ „๋žต(์˜ˆ: ํž˜ ์ œ์–ด, ์ž„ํ”ผ๋˜์Šค ์ œ์–ด)์€ Drake์˜ LeafSystem์„ ์ƒ์†๋ฐ›์•„ Python์ด๋‚˜ C++๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์•ก์ถ”์—์ดํ„ฐ ๋ชจ๋ธ๋ง: URDF์— ์ •์˜๋œ ์กฐ์ธํŠธ ์ œํ•œ(์†๋„, ํž˜/ํ† ํฌ) ๋ฐ ๋™์  ํŠน์„ฑ(๋Œํ•‘, ๋งˆ์ฐฐ)์„ Drake์˜ MultibodyPlant์—์„œ ์œ ์‚ฌํ•˜๊ฒŒ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ์ปจํŠธ๋กค๋Ÿฌ ๋ ˆ๋ฒจ์—์„œ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  4. ์„ผ์„œ (Sensors):

    • Gazebo๋Š” URDF ๋‚ด <sensor> ํƒœ๊ทธ์™€ ๊ด€๋ จ ํ”Œ๋Ÿฌ๊ทธ์ธ(์˜ˆ: gazebo_ros_camera, gazebo_ros_imu)์„ ํ†ตํ•ด ์„ผ์„œ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.
    • Drake๋Š” ์ž์ฒด ์„ผ์„œ ๋ชจ๋ธ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ด๋ฅผ Diagram์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
      • ์นด๋ฉ”๋ผ (RgbdSensor): Gazebo์˜ ์นด๋ฉ”๋ผ ์„ค์ •์„ ์ฐธ์กฐํ•˜์—ฌ Drake์˜ RgbdSensor๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (ํ™”๊ฐ(FOV), ํ•ด์ƒ๋„, ํด๋ฆฌํ•‘ ๋ฒ”์œ„ ๋“ฑ). ๋ Œ๋”๋ง ์—”์ง„์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์™„๋ฒฝํžˆ ๋™์ผํ•œ ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜์˜ค์ง€๋Š” ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • IMU (ImuSensor): IMU์˜ ์œ„์น˜, ๋…ธ์ด์ฆˆ ํŠน์„ฑ ๋“ฑ์„ Drake์˜ ImuSensor์— ๋งž๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
      • ๊ธฐํƒ€ ์„ผ์„œ: Force/Torque ์„ผ์„œ ๋“ฑ๋„ Drake์—์„œ ๋ชจ๋ธ๋ง ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ์„ผ์„œ ๋ฐ์ดํ„ฐ๋Š” Drake ์‹œ์Šคํ…œ์˜ ์ถœ๋ ฅ ํฌํŠธ์—์„œ ์–ป์–ด์™€ ์ œ์–ด๋‚˜ ๋กœ๊น…์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  5. MoveIt ๊ธฐ๋Šฅ์˜ Drake ๋Œ€์ฒด:

    • ์šด๋™ํ•™ (Kinematics) ๋ฐ ์—ญ์šด๋™ํ•™ (IK):
      • MoveIt์€ IK ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Drake์˜ MultibodyPlant๋Š” ์ˆœ์šด๋™ํ•™ ๊ณ„์‚ฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, InverseKinematics ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ œ์•ฝ ์กฐ๊ฑด ํ•˜์— IK๋ฅผ ํ’€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SRDF์˜ ์—”๋“œ ์ดํŽ™ํ„ฐ ์ •๋ณด๊ฐ€ IK ๋ชฉํ‘œ ์„ค์ •์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ๋ชจ์…˜ ํ”Œ๋ž˜๋‹ (Motion Planning):
      • MoveIt์€ OMPL๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ํ”Œ๋ž˜๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
      • Drake๋Š” ์ฃผ๋กœ ์ตœ์ ํ™” ๊ธฐ๋ฐ˜์˜ ๋ชจ์…˜ ํ”Œ๋ž˜๋‹(MathematicalProgram, DirectCollocation, KinematicTrajectoryOptimization)์— ๊ฐ•์ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ๋ง ๊ธฐ๋ฐ˜ ํ”Œ๋ž˜๋„ˆ(RRT, PRM ๋“ฑ)๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—ฐ๋™ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์ž‘์—…์˜ ๊ฒฝ์šฐ, ์ผ๋ จ์˜ IK ๋ชฉํ‘œ์ ์„ ๊ณ„์‚ฐํ•˜๊ณ  ์ด๋ฅผ ๋ณด๊ฐ„ํ•˜์—ฌ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์ถฉ๋Œ ๊ฒ€์‚ฌ (Collision Checking):
      • MoveIt์€ PlanningScene์„ ํ†ตํ•ด ํ™˜๊ฒฝ์„ ์ธ์ง€ํ•˜๊ณ  FCL/Bullet ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ถฉ๋Œ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
      • Drake์˜ SceneGraph๋Š” ์ถฉ๋Œ ๊ฒ€์‚ฌ๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ, QueryObject๋ฅผ ํ†ตํ•ด ํŠน์ • ํ˜•์ƒ ๊ฐ„ ๋˜๋Š” ์ „์ฒด ์žฅ๋ฉด์— ๋Œ€ํ•œ ์ถฉ๋Œ ์—ฌ๋ถ€ ๋ฐ ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SRDF์˜ ์ถฉ๋Œ ๋น„ํ™œ์„ฑํ™” ์ •๋ณด๋Š” SceneGraph ์„ค์ •์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒํƒœ ํ‘œํ˜„ (State Representation):
      • MoveIt์€ RobotState ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Drake์—์„œ๋Š” ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๊ฐ€ Context ๊ฐ์ฒด์— ์ €์žฅ๋˜๋ฉฐ, plant.SetPositions(plant_context, ...) ๋“ฑ์œผ๋กœ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๊ณ  plant.GetPositions(plant_context) ๋“ฑ์œผ๋กœ ์ƒํƒœ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  6. ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹คํ–‰ ๋ฐ ๊ด€๋ฆฌ:

    • Gazebo/MoveIt ์‹œ๋ฎฌ๋ ˆ์ด์…˜์€ ROS launch ํŒŒ์ผ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๋…ธ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • Drake ์‹œ๋ฎฌ๋ ˆ์ด์…˜์€ ์ฃผ๋กœ ๋‹จ์ผ Python ์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ Diagram์„ ๊ตฌ์„ฑํ•˜๊ณ , Simulator๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์กฐ๊ฑด ์„ค์ •, ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„, ์™ธ๋ถ€ ์ž…๋ ฅ ๋“ฑ ๋ชจ๋“  ๊ฒƒ์ด ์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  7. ์‹œ๊ฐํ™” (Visualization):

    • ROS์—์„œ๋Š” RViz๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๋ด‡ ์ƒํƒœ, ์„ผ์„œ ๋ฐ์ดํ„ฐ, ํ”Œ๋ž˜๋‹ ๊ฒฐ๊ณผ ๋“ฑ์„ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • Drake๋Š” Meshcat์ด๋ผ๋Š” ์›น ๊ธฐ๋ฐ˜ 3D ์‹œ๊ฐํ™” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. MeshcatVisualizer๋ฅผ Diagram์— ์ถ”๊ฐ€ํ•˜๋ฉด SceneGraph์˜ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ์ •๋ณด๊ฐ€ Meshcat์œผ๋กœ ์ „์†ก๋˜์–ด ์‹œ๊ฐํ™”๋ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์ธ ๋””๋ฒ„๊น… ์ •๋ณด๋‚˜ ํ”Œ๋กฏ๋„ Meshcat์„ ํ†ตํ•ด ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๊ณผ์ • ์š”์•ฝ ๋ฐ ์กฐ์–ธ:

  • ๋‹จ๊ณ„์  ์ ‘๊ทผ: ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๊ฒƒ์„ ์˜ฎ๊ธฐ๋ ค ํ•˜์ง€ ๋ง๊ณ , ๋‹จ๊ณ„๋ณ„๋กœ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
    1. ๋กœ๋ด‡ ๋ชจ๋ธ์„ Drake์— ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๋“œํ•˜๊ณ  Meshcat์—์„œ ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    2. ๊ฐ„๋‹จํ•œ ํ™˜๊ฒฝ(์˜ˆ: ๋ฐ”๋‹ฅ)์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    3. ๊ธฐ๋ณธ์ ์ธ ์กฐ์ธํŠธ ์ œ์–ด(์˜ˆ: ๊ฐ ์กฐ์ธํŠธ๋ฅผ ํŠน์ • ๊ฐ๋„๋กœ ์ด๋™์‹œํ‚ค๋Š” PID ์ œ์–ด)๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    4. ์„ผ์„œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    5. ์ ์ฐจ ๋ณต์žกํ•œ ์ œ์–ด ๋กœ์ง๊ณผ ๋ชจ์…˜ ํ”Œ๋ž˜๋‹ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์—ฐ๋™ํ•ฉ๋‹ˆ๋‹ค.
  • astra_description ๋ฐ astra_moveit_config ํ™œ์šฉ: ์ด ํŒจํ‚ค์ง€๋“ค์˜ ์„ค์ • ํŒŒ์ผ(URDF, SRDF, ์ปจํŠธ๋กค๋Ÿฌ ์„ค์ • YAML ๋“ฑ)์€ Drake๋กœ ์ด์ „ํ•  ๋•Œ ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • Drake ๋ฌธ์„œ ๋ฐ ์˜ˆ์ œ ํ™œ์šฉ: Drake ๊ณต์‹ ๋ฌธ์„œ์™€ GitHub ์ €์žฅ์†Œ์˜ ์˜ˆ์ œ๋“ค์€ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ๋ฅผ ์ฐพ์•„ ์ฐธ๊ณ ํ•˜๋ฉด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์›: Drake๋Š” ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์–ด๋ ค์šด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์„ ๋•Œ Stack Overflow๋‚˜ Drake GitHub Discussions๋ฅผ ํ†ตํ•ด ์งˆ๋ฌธํ•˜๋ฉด ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Gazebo/MoveIt์—์„œ Drake๋กœ์˜ ์ด์ „์€ ์ƒ๋‹นํ•œ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜์ง€๋งŒ, Drake๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋™์—ญํ•™ ์—”์ง„, ์ตœ์ ํ™” ๋„๊ตฌ, ์œ ์—ฐํ•œ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ๋Šฅ๋ ฅ ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋” ๊นŠ์ด ์žˆ๋Š” ์—ฐ๊ตฌ์™€ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ