WEEK1 - dingdongdengdong/astra_ws GitHub Wiki

graph TD
    subgraph User_Input ["User Input"]
        direction LR
        UI["Web Browser UI / Local Camera"] --> CamInput{"Camera Feed + User Actions"};
    end

    subgraph Non_ROS_Vision_Processing ["Non-ROS Vision Processing"]
        direction LR
        CamInput --> ATeleopProc["astra_teleop/process.py - ArUco Detection and Pose Estimation"];
        ATeleopProc --> ProcessedVisionData{"Processed Vision Data Marker Poses)"};

        subgraph Web_Interface ["non_ros_src/astra_teleop_web"]
            direction LR
            CamInputWeb["Web Client index.html, index.js, opencv.js"] -->|Marker Data, Pedal via WebRTC| WebServer["webserver.py"];
            WebServer --> Teleoperator["teleoprator.py"];
            Teleoperator -->|Uses| ATeleopProc;
            Teleoperator --> WebArmGoal{"Arm Goal Pose"};
        end
    end

    subgraph ROS2_System ["ROS2 System (ros_src)"]
        direction TB

        subgraph ROS_Input_Nodes ["ROS Input Nodes"]
            direction LR
            ProcessedVisionData --> TeleopNode["astra_controller/teleop_node.py"];
            WebArmGoal --> TeleopWebNode["astra_controller/teleop_web_node.py"];
        end

        subgraph ROS_Controllers ["ROS Controllers"]
            direction LR
            TeleopNode -->|Target Pose| AstraCtrl["astra_controller/astra_controller.py"];
            TeleopWebNode -->|Target Pose| AstraCtrl;
            AstraCtrl --> ArmCtrl["astra_controller/arm_controller.py"];
            AstraCtrl --> OtherCtrls["(Head, Gripper, Base Ctrls)"];
            ArmCtrl -->|Joint Commands| SimOrHW{"Simulated/Real Robot"};
            OtherCtrls -->|Joint Commands| SimOrHW;
        end

        subgraph Simulation_Setup ["Simulation - MoveIt povr Gazebo/RViz"]
            direction TB
            LaunchSim["astra_moveit_config/launch/demo.launch.py"] --> RVizGazebo["RViz / Gazebo"];
            RobotModel["astra_description (URDF)"] --> RVizGazebo;
            ROS2CtrlCfgs["astra_moveit_config/config/ros2_controllers.yaml"] --> SimCtrlManager["Simulated Controller Manager (e.g., FakeControllerManager or Gazebo Controllers)"];
            SimCtrlManager --> SimOrHW;
        end

        subgraph Main_Launch_File ["Main Launch"]
             StartLaunch["astra_controller/launch/start.launch.py"] --> AstraCtrl;
             StartLaunch --> TeleopNode;
             StartLaunch --> TeleopWebNode;
             StartLaunch -->|Can Include| LaunchSim;
        end
    end

    style User_Input fill:#E6E6FA,stroke:#333,stroke-width:2px
    style CamInput fill:#ADD8E6,stroke:#333,stroke-width:1px
    style Non_ROS_Vision_Processing fill:#FFFACD,stroke:#333,stroke-width:2px
    style ATeleopProc fill:#FAFAD2,stroke:#333,stroke-width:1px
    style ProcessedVisionData fill:#FFEFD5,stroke:#333,stroke-width:1px
    style Web Trinface fill:#F0FFF0,stroke:#333,stroke-width:1.5px
    style CamInputWeb fill:#98FB98,stroke:#333,stroke-width:1px
    style WebServer fill:#AFEEEE,stroke:#333,stroke-width:1px
    style Teleoperator fill:#AFEEEE,stroke:#333,stroke-width:1px
    style WebArmGoal fill:#FFE4E1,stroke:#333,stroke-width:1px
    style ROS2_System fill:#D3D3D3,stroke:#000,stroke-width:2px
    style ROS_Input_Nodes fill:#F5DEB3,stroke:#333,stroke-width:1.5px
    style TeleopNode fill:#FFEBCD,stroke:#333,stroke-width:1px
    style TeleopWebNode fill:#FFEBCD,stroke:#333,stroke-width:1px
    style ROS_Controllers fill:#E0FFFF,stroke:#333,stroke-width:1.5px
    style AstraCtrl fill:#B0E0E6,stroke:#333,stroke-width:1px
    style ArmCtrl fill:#B0E0E6,stroke:#333,stroke-width:1px
    style OtherCtrls fill:#B0E0E6,stroke:#333,stroke-width:1px
    style SimOrHW fill:#FFDAB9,stroke:#333,stroke-width:1px
    style Simulation_Setup fill:#F0E68C,stroke:#333,stroke-width:1.5px
    style LaunchSim fill:#FFF8DC,stroke:#333,stroke-width:1px
    style RVizGazebo fill:#F5F5DC,stroke:#333,stroke-width:1px
    style RobotModel fill:#F5F5DC,stroke:#333,stroke-width:1px
    style ROS2CtrlCfgs fill:#F5F5DC,stroke:#333,stroke-width:1px
    style SimCtrlManager fill:#F5F5DC,stroke:#333,stroke-width:1px
    style Main_Launch_File fill:#FFE4B5,stroke:#333,stroke-width:1.5px
    style StartLaunch fill:#FFDEAD,stroke:#333,stroke-width:1px

1์ฃผ์ฐจ ํ”„๋กœ์ ํŠธ ๊ฐœ์š” ๋ฐ ๊ตฌํ˜„ ํ๋ฆ„

๋ชฉํ‘œ: ์นด๋ฉ”๋ผ ๋น„์ „ ์ฒ˜๋ฆฌ(non_ros_src/astra_teleop ๋กœ์ง)๋ฅผ ํ†ตํ•ด ์–ป์€ ๋กœ๋ด‡ ํŒ” ์›€์ง์ž„ ๋ฐ์ดํ„ฐ๋ฅผ teleop_node๋กœ ์ „๋‹ฌํ•˜๊ณ , ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ MoveIt ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ์˜ Astra ๋กœ๋ด‡ ํŒ”์„ ์›€์ง์ด๋Š” ๊ธฐ๋ณธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ํŽ˜๋‹ฌ ์ž…๋ ฅ์„ ๋ฐ›์•„ ํ•˜๋ถ€ ์›€์ง์ž„ ๋ฐ ๊ทธ๋ฆฌํผ ์ œ์–ด๋ฅผ ์œ„ํ•œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ธฐ์ˆ : ROS2 ๋…ธ๋“œ ํ†ต์‹  (Topics), MoveIt ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ ๊ตฌ์„ฑ, Python ๊ธฐ๋ฐ˜ ROS2 ๋…ธ๋“œ ์ˆ˜์ • ๋ฐ ๊ฐœ๋ฐœ, Launch ํŒŒ์ผ ํ™œ์šฉ, ๋น„์ „ ์ฒ˜๋ฆฌ ์—ฐ๋™

goalPos๋…ธ๋“œ ํ๋ฆ„(์˜ˆ์‹œ).

graph TD
    %% Define nodes and main flow
    A[Source Node: Teleop] -->|Sends Goal Pose| B{IK Node: ik_node.py}
    B -->|"Joint Commands"| E[dry_run_node: Simulation]
    E -->|"Simulated Joint State"| F[MoveIt & RViz: Visualization]
    E -->|"Joint State Feedback"| C[MoveIt - move_group Node]

    %% Highlight critical data paths
    A -->|"goal_pose: PoseStamped"| B
    B -->|"JointCommand: astra_controller"| E
    E -->|"JointState: sensor_msgs"| F
    E -->|"JointState: sensor_msgs"| C

    %% Styling for clarity and readability
    classDef node fill:#f0f9ff,stroke:#333,stroke-width:2px
    classDef highlight fill:#fff3cd,stroke:#d4a017,stroke-width:2px
    class A,B,C,E,F node
    class E,C highlight

    %% Style feedback loop and goal_pose path
    linkStyle 3,5 stroke:#d4a017,stroke-width:2px

    %% Comments for additional clarity
    %% Source Node (Teleop) sends goal_pose to IK Node.
    %% IK Node computes joint commands using inverse kinematics.
    %% dry_run_node simulates joint motion and publishes states.
    %% MoveIt uses feedback to plan motion; RViz visualizes results.

๊ตฌํ˜„ ํ๋ฆ„๋„ :

graph LR
    A[Camera Input] --> B[Vision Processing\nnon_ros_src/astra_teleop logic]
    I[Pedal Input] --> J[Pedal Input Node]

    subgraph astra_controller
        C[teleop_node]
        D[moveit_relay_node]
        K[Base/Lift/Gripper Nodes]
    end

    B -->|Processed Arm Movement Data| C
    J -->|Pedal Data| C
    C -->|Arm Commands\nsensor_msgs/msg/JointState| D
    C -->|Base/Gripper Commands| K
    D -->|/joint_trajectory_controller/joint_trajectory| E[MoveIt / ros2_control\nSimulated Arm]
    K -->|Commands| F[ros2_control\nSimulated Base/Gripper]
    E -->|/joint_states Arm| G[Robot State Publisher\nJoint State Publisher]
    F -->|/joint_states Base/Gripper| G
    G --> H[RViz\nVisualization]
    E -->|/joint_states Feedback| C
    F -->|/joint_states Feedback| C

๊ธฐ์ˆ  ์„ค๋ช…

  • Camera Input: ๋กœ๋ด‡์— ์žฅ์ฐฉ๋œ ์นด๋ฉ”๋ผ๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ ์˜์ƒ์„ ํš๋“ํ•ฉ๋‹ˆ๋‹ค.
  • Vision Processing (non_ros_src/astra_teleop): ์นด๋ฉ”๋ผ ์˜์ƒ์„ ๋ถ„์„ํ•˜์—ฌ ์†์˜ ์œ„์น˜, ์ œ์Šค์ฒ˜ ๋“ฑ์„ ์ธ์‹ํ•˜๊ณ , ๋กœ๋ด‡ ํŒ” ์›€์ง์ž„ ๋ฐ์ดํ„ฐ(์˜ˆ: ๋ชฉํ‘œ ์กฐ์ธํŠธ ๊ฐ๋„, ์—”๋“œ์ดํŽ™ํ„ฐ ์ž์„ธ)๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋กœ์ง์€ non_ros_src/astra_teleop ํด๋”์— ํฌํ•จ๋˜๋ฉฐ, ์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ๋Š” teleop_node์˜ ์ฃผ ์ž…๋ ฅ์ž…๋‹ˆ๋‹ค.
  • Pedal Input Node: ํŽ˜๋‹ฌ ์žฅ์น˜๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ์ฝ์–ด ๋กœ๋ด‡ ํ•˜๋ถ€ ์›€์ง์ž„ ๋ฐ ๊ทธ๋ฆฌํผ ์ œ์–ด์— ์‚ฌ์šฉํ•˜๋ฉฐ, teleop_node๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. (์‹œ์Šคํ…œ์— ๋”ฐ๋ผ teleop_node์— ํ†ตํ•ฉ ๊ฐ€๋Šฅ)
  • teleop_node (src/astra_controller): rclpy.node.Node("teleop_node")๋กœ ์ •์˜๋œ ํ•ต์‹ฌ ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค. **๋น„์ „ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ(๋กœ๋ด‡ ํŒ” ์›€์ง์ž„ ๋ฐ์ดํ„ฐ)**์™€ ํŽ˜๋‹ฌ ์ž…๋ ฅ์„ ์ˆ˜์‹ ํ•˜์—ฌ, sensor_msgs/msg/JointState ๋ฉ”์‹œ์ง€๋กœ ๋ณ€ํ™˜ํ•ด /leader_arm/commands ํ† ํ”ฝ์— ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŽ˜๋‹ฌ ์ž…๋ ฅ์€ ํ•˜๋ถ€ ๋ฐ ๊ทธ๋ฆฌํผ ์ œ์–ด ๋ช…๋ น์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ํ•ด๋‹น ํ† ํ”ฝ์— ๋ฐœํ–‰๋ฉ๋‹ˆ๋‹ค.
  • moveit_relay_node (src/astra_controller): /leader_arm/commands ํ† ํ”ฝ์—์„œ JointState ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ MoveIt์˜ /joint_trajectory_controller/joint_trajectory ํ† ํ”ฝ์œผ๋กœ ์ „๋‹ฌ, ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋กœ๋ด‡ ํŒ”์„ ์›€์ง์ž…๋‹ˆ๋‹ค.
  • Base/Lift/Gripper Nodes (src/astra_controller): ํŽ˜๋‹ฌ ์ž…๋ ฅ ๊ธฐ๋ฐ˜ ๋ช…๋ น์„ ์ˆ˜์‹ ํ•˜์—ฌ ํ•˜๋ถ€ ์›€์ง์ž„ ๋ฐ ๊ทธ๋ฆฌํผ๋ฅผ ์ œ์–ดํ•˜๋ฉฐ, ros2_control ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.
  • MoveIt / ros2_control (Simulated Robot): MoveIt์€ ๋กœ๋ด‡ ๋ชจ๋ธ๊ณผ ์กฐ์ธํŠธ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ros2_control์˜ FakeSystem ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์›€์ง์ž„์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์„ ๋ฐ›์•„ ์กฐ์ธํŠธ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  /joint_states ํ† ํ”ฝ์— ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • Robot State Publisher & Joint State Publisher: /joint_states ํ† ํ”ฝ์„ ๊ตฌ๋…ํ•˜์—ฌ URDF/XACRO ๊ธฐ๋ฐ˜์œผ๋กœ ๋กœ๋ด‡์˜ 3D ์ž์„ธ(tf ๋ณ€ํ™˜)๋ฅผ ๊ณ„์‚ฐ ๋ฐ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • RViz (Visualization): /joint_states ๋ฐ tf ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋…ํ•˜์—ฌ ๋กœ๋ด‡ ๋ชจ๋ธ์„ 3D๋กœ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

1์ฃผ์ฐจ ๊ณผ์ œ ์ƒ์„ธ ํ•ด๊ฒฐ ๊ฐ€์ด๋“œ

๊ณผ์ œ 1.1: MoveIt ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ ์‹คํ–‰ ๋ฐ ๊ฒ€์ฆ

๋ชฉํ‘œ

astra_moveit_config ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด MoveIt ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ(๋กœ๋ด‡ ํŒ”, ํ•˜๋ถ€, ๊ทธ๋ฆฌํผ ํฌํ•จ)์„ ์‹คํ–‰ํ•˜๊ณ , RViz์—์„œ Astra ๋กœ๋ด‡ ๋ชจ๋ธ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ์„ค๋ช…

astra_moveit_config ํŒจํ‚ค์ง€๋Š” URDF/XACRO ๋ชจ๋ธ, SRDF, MoveIt ์„ค์ •, ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฐ RViz ์‹คํ–‰์šฉ Launch ํŒŒ์ผ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. demo.launch.py๋Š” ๋กœ๋ด‡ ์ƒํƒœ ๋ฐœํ–‰, ์กฐ์ธํŠธ ์ƒํƒœ ๋ฐœํ–‰, MoveIt ๋…ธ๋“œ, RViz๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋ถ€์™€ ๊ทธ๋ฆฌํผ๊ฐ€ URDF ๋ฐ MoveIt/ros2_control์— ๋ฐ˜์˜๋˜๋ฉด RViz์—์„œ ์ „์ฒด ๋ชจ๋ธ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ ๋‹จ๊ณ„

  1. ROS2 ์ž‘์—… ๊ณต๊ฐ„์˜ src ํด๋”๋กœ ์ด๋™ํ•˜์—ฌ astra_moveit_config ํŒจํ‚ค์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ์ž‘์—… ๊ณต๊ฐ„ ๋ฃจํŠธ(์˜ˆ: colcon_ws)์—์„œ colcon build --packages-select astra_moveit_config๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. source install/setup.bash๋กœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  4. ros2 launch astra_moveit_config demo.launch.py๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  5. RViz์—์„œ Astra ๋กœ๋ด‡ ๋ชจ๋ธ์ด ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  6. RViz์˜ Displays ํŒจ๋„์—์„œ RobotModel ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค.
  7. MoveIt MotionPlanning ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋กœ๋ด‡ ํŒ”, ํ•˜๋ถ€, ๊ทธ๋ฆฌํผ์˜ ๊ณ„ํš ๋ฐ ์‹คํ–‰์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ํŒŒ์ผ/๊ฐœ๋…

  • astra_moveit_config/launch/demo.launch.py
  • URDF/SRDF
  • robot_state_publisher
  • joint_state_publisher
  • move_group node
  • RViz

์˜ˆ์ƒ ๊ฒฐ๊ณผ

RViz์— Astra ๋กœ๋ด‡ ๋ชจ๋ธ์ด ์ •์ƒ ํ‘œ์‹œ๋˜๊ณ , MoveIt Planning์œผ๋กœ ๊ฐ ๋ถ€๋ถ„์„ ์›€์ง์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ ํŒ

  • ํ„ฐ๋ฏธ๋„ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • rqt_graph, ros2 topic list, ros2 node list๋กœ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๊ณผ์ œ 1.2: ๋น„์ „ ์ฒ˜๋ฆฌ, ํ…”๋ ˆ์˜คํผ๋ ˆ์ด์…˜, MoveIt Relay ๋…ธ๋“œ ๋ถ„์„

๋ชฉํ‘œ

non_ros_src/astra_teleop, teleop_node.py, moveit_relay_node.py, ํ•˜๋ถ€/๊ทธ๋ฆฌํผ ๋…ธ๋“œ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์—ญํ• , ํ†ต์‹  ์ธํ„ฐํŽ˜์ด์Šค, ๋น„์ „ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์˜ teleop_node ์ „๋‹ฌ ๋ฐฉ์‹์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ์„ค๋ช…

๋น„์ „ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์ธ ๋กœ๋ด‡ ํŒ” ์›€์ง์ž„ ๋ฐ์ดํ„ฐ๊ฐ€ teleop_node๋กœ ์ „๋‹ฌ๋˜์–ด ROS2 ๋ช…๋ น์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š” ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. moveit_relay_node ๋ฐ ํ•˜๋ถ€/๊ทธ๋ฆฌํผ ๋…ธ๋“œ์˜ ๊ธฐ๋Œ€ ๋ฉ”์‹œ์ง€๋„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ๋‹จ๊ณ„

  1. non_ros_src/astra_teleop/์˜ Python ํŒŒ์ผ(์˜ˆ: cam.py, process.py)์„ ๋ถ„์„ํ•˜์—ฌ ๋กœ๋ด‡ ํŒ” ์›€์ง์ž„ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ๋ฐ ์ „๋‹ฌ ๋ฐฉ์‹(ํŒŒ์ผ, ๋„คํŠธ์›Œํฌ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋“ฑ)์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.
  2. src/astra_controller/teleop_node.py๋ฅผ ๋ถ„์„:
    • ๋…ธ๋“œ ์ด๋ฆ„("teleop_node") ํ™•์ธ.
    • ๋น„์ „ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๋ฐ ํŽ˜๋‹ฌ ์ž…๋ ฅ ์ˆ˜์‹  ๋กœ์ง ํŒŒ์•….
    • /leader_arm/commands ํ† ํ”ฝ๊ณผ sensor_msgs/msg/JointState ๋ฐœํ–‰ ํ™•์ธ.
    • ํ•˜๋ถ€/๊ทธ๋ฆฌํผ ๋ช…๋ น ํ† ํ”ฝ ๋ฐ ๋ฉ”์‹œ์ง€ ํƒ€์ž… ํ™•์ธ.
    • ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋กœ์ง ๋ถ„์„.
  3. src/astra_controller/moveit_relay_node.py๋ฅผ ๋ถ„์„:
    • /leader_arm/commands ํ† ํ”ฝ ๋ฐ JointState ๊ตฌ๋… ํ™•์ธ.
    • JointState ๋ฉ”์‹œ์ง€๊ฐ€ /joint_trajectory_controller/joint_trajectory๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐฉ์‹๊ณผ ์‚ฌ์šฉ ํ•„๋“œ(position, velocity, effort) ํ™•์ธ.
  4. base_node.py, lift_node.py๋ฅผ ๋ถ„์„:
    • ๊ฐ ๋…ธ๋“œ ์—ญํ• (ํ•˜๋ถ€, ๋ฆฌํ”„ํŠธ/๊ทธ๋ฆฌํผ) ํŒŒ์•….
    • ๊ตฌ๋… ํ† ํ”ฝ ๋ฐ ๋ฉ”์‹œ์ง€ ํƒ€์ž…(์˜ˆ: geometry_msgs/msg/Twist, std_msgs/msg/Float64) ํ™•์ธ.

ํ•ต์‹ฌ ํŒŒ์ผ/๊ฐœ๋…

  • non_ros_src/astra_teleop/
  • src/astra_controller/teleop_node.py
  • src/astra_controller/moveit_relay_node.py
  • base_node.py, lift_node.py
  • sensor_msgs/msg/JointState
  • geometry_msgs/msg/Twist
  • Topics

์˜ˆ์ƒ ๊ฒฐ๊ณผ

๋กœ๋ด‡ ํŒ” ์›€์ง์ž„ ๋ฐ์ดํ„ฐ์˜ ์ƒ์„ฑ ๋ฐ ์ „๋‹ฌ ๋ฐฉ์‹, teleop_node์˜ ๋ฐ์ดํ„ฐ ์ˆ˜์‹  ๋ฐ ๋ช…๋ น ๋ณ€ํ™˜ ๊ณผ์ •์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ ํŒ

  • ๋น„์ „ ์ฒ˜๋ฆฌ์™€ teleop_node ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹์„ ๋ช…ํ™•ํžˆ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์ฃผ์„์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ณผ์ œ 1.3: ๋น„์ „ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๋กœ๋ด‡ ํŒ” ๋ช…๋ น ๋ฐœํ–‰ ๋…ธ๋“œ ๊ตฌํ˜„ ๋ฐ ํŽ˜๋‹ฌ ์ œ์–ด ์—ฐ๊ฒฐ

๋ชฉํ‘œ

teleop_node.py๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ **๋น„์ „ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ(๋กœ๋ด‡ ํŒ” ์›€์ง์ž„ ๋ฐ์ดํ„ฐ)**๋ฅผ sensor_msgs/msg/JointState๋กœ ๋ณ€ํ™˜ํ•ด /leader_arm/commands ํ† ํ”ฝ์— ๋ฐœํ–‰ํ•˜๊ณ , ํŽ˜๋‹ฌ ์ž…๋ ฅ์œผ๋กœ ํ•˜๋ถ€/๊ทธ๋ฆฌํผ ๋ช…๋ น์„ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ์—๋Š” ํŠน์ • ์กฐ์ธํŠธ ํ•˜๋‚˜๋งŒ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ์„ค๋ช…

๋น„์ „ ๋ฐ์ดํ„ฐ์™€ ํŽ˜๋‹ฌ ์ž…๋ ฅ์„ ๋ฐ›์•„ ROS2 ๋ฉ”์‹œ์ง€๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ฐ ์ œ์–ด ๋…ธ๋“œ์— ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋น„์ „ ๋ฐ์ดํ„ฐ๋Š” JointState์˜ position ๋˜๋Š” velocity๋กœ, ํŽ˜๋‹ฌ ์ž…๋ ฅ์€ Twist ๋ฐ ๊ทธ๋ฆฌํผ ๋ฉ”์‹œ์ง€๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ๋‹จ๊ณ„

  1. src/astra_controller/teleop_node.py๋ฅผ ์—ฝ๋‹ˆ๋‹ค.
  2. ๋ฉ”์‹œ์ง€ ํƒ€์ž… ์ž„ํฌํŠธ: sensor_msgs.msg.JointState, geometry_msgs.msg.Twist, std_msgs.msg.Float64.
  3. ๋น„์ „ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๋ฐ ํŽ˜๋‹ฌ ์ž…๋ ฅ ์ˆ˜์‹  ๋กœ์ง์„ ๊ตฌํ˜„(๊ณผ์ œ 1.2 ๊ธฐ๋ฐ˜).
  4. ๋กœ๋ด‡ ํŒ” ์ œ์–ด:
    • /leader_arm/commands ํ† ํ”ฝ์— JointState ๋ฐœํ–‰ ์„ค์ •.
    • ๋น„์ „ ๋ฐ์ดํ„ฐ(์˜ˆ: ์† ๋†’์ด)๋ฅผ ํŠน์ • ์กฐ์ธํŠธ(์˜ˆ: joint1)์˜ ๋ชฉํ‘œ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜.
    • JointState ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ(header.stamp, name, position/velocity).
    • ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰.
  5. ํ•˜๋ถ€/๊ทธ๋ฆฌํผ ์ œ์–ด:
    • /cmd_vel, /gripper_command ํ† ํ”ฝ์— ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰ ์„ค์ •.
    • ํŽ˜๋‹ฌ ์ž…๋ ฅ์„ ์†๋„ ๋ฐ ๊ทธ๋ฆฌํผ ๋ช…๋ น์œผ๋กœ ๋ณ€ํ™˜.
    • ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰.
  6. create_timer()๋กœ ์ฃผ๊ธฐ์  ์‹คํ–‰ ์„ค์ •.
  7. colcon build --packages-select astra_controller๋กœ ๋นŒ๋“œ.

ํ•ต์‹ฌ ํŒŒ์ผ/๊ฐœ๋…

  • src/astra_controller/teleop_node.py
  • ๋น„์ „/ํŽ˜๋‹ฌ ์ž…๋ ฅ ์ˆ˜์‹ 
  • sensor_msgs/msg/JointState
  • /leader_arm/commands
  • ROS2 Publisher/Subscriber/Timer

์˜ˆ์ƒ ๊ฒฐ๊ณผ

teleop_node๊ฐ€ ๋น„์ „ ๋ฐ์ดํ„ฐ ๋ฐ ํŽ˜๋‹ฌ ์ž…๋ ฅ์„ ๋ฐ›์•„ ๋ช…๋ น์„ ๋ฐœํ–‰ํ•˜๋ฉฐ, ros2 topic echo๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ ํŒ

  • ๋น„์ „ ๋ฐ์ดํ„ฐ ํ˜•์‹์ด teleop_node ๊ธฐ๋Œ€ ํ˜•์‹๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ.
  • ํ† ํ”ฝ ์ด๋ฆ„ ๋ฐ ๋ฉ”์‹œ์ง€ ํƒ€์ž… ์ ๊ฒ€.
  • ๊ฐ„๋‹จํ•œ ๋งคํ•‘์œผ๋กœ ์‹œ์ž‘.

๊ณผ์ œ 1.4: ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ ํ†ตํ•ฉ ์‹คํ–‰ ๋ฐ ๊ธฐ๋ณธ ๋™์ž‘ ํ™•์ธ

๋ชฉํ‘œ

์นด๋ฉ”๋ผ ๋“œ๋ผ์ด๋ฒ„, ๋น„์ „ ์ฒ˜๋ฆฌ, ํŽ˜๋‹ฌ ์ž…๋ ฅ, teleop_node, moveit_relay_node, ํ•˜๋ถ€/๊ทธ๋ฆฌํผ ๋…ธ๋“œ, MoveIt ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ Launch ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•˜๊ณ , ๋น„์ „ ์ž…๋ ฅ๊ณผ ํŽ˜๋‹ฌ ์กฐ์ž‘์— ๋”ฐ๋ผ RViz ๋กœ๋ด‡์ด ์›€์ง์ด๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ์„ค๋ช…

ROS2 Launch๋กœ ๋ชจ๋“  ๋…ธ๋“œ์™€ MoveIt ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. teleop_node๋Š” ๋น„์ „/ํŽ˜๋‹ฌ ์ž…๋ ฅ์„ ๋ช…๋ น์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , moveit_relay_node ๋ฐ ํ•˜๋ถ€/๊ทธ๋ฆฌํผ ๋…ธ๋“œ๋Š” ์ด๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋กœ๋ด‡์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ๋‹จ๊ณ„

  1. astra_controller/launch/teleop_vision_sim.launch.py๋ฅผ ์ƒ์„ฑ.
  2. ๋ชจ๋“ˆ ์ž„ํฌํŠธ:
    import os
    from ament_index_python.packages import get_package_share_directory
    from launch import LaunchDescription
    from launch_ros.actions import Node
    from launch.actions import IncludeLaunchDescription
    from launch.launch_description_sources import PythonLaunchDescriptionSource
    
  3. generate_launch_description() ์ •์˜.
  4. ์นด๋ฉ”๋ผ ๋“œ๋ผ์ด๋ฒ„ ๋…ธ๋“œ ์ถ”๊ฐ€:
    camera_node = Node(
        package='usb_cam',
        executable='usb_cam_node',
        name='camera_driver',
        output='screen'
    )
    
  5. ๋น„์ „ ์ฒ˜๋ฆฌ ๋…ธ๋“œ ์ถ”๊ฐ€(๋…๋ฆฝ์ ์ธ ๊ฒฝ์šฐ).
  6. ํŽ˜๋‹ฌ ์ž…๋ ฅ ๋…ธ๋“œ ์ถ”๊ฐ€(๋…๋ฆฝ์ ์ธ ๊ฒฝ์šฐ).
  7. teleop_node ์ถ”๊ฐ€:
    teleop_node = Node(
        package='astra_controller',
        executable='teleop_node',
        name='teleop_main',
        output='screen'
    )
    
  8. moveit_relay_node ์ถ”๊ฐ€:
    moveit_relay_node = Node(
        package='astra_controller',
        executable='moveit_relay_node',
        name='moveit_relay',
        output='screen',
        parameters=[{
            'command_topic_name': '/leader_arm/commands',
            'controller_topic_name': '/joint_trajectory_controller/joint_trajectory',
            'joint_names': ['joint1', 'joint2', 'joint3', 'joint4', 'joint5', 'joint6']
        }]
    )
    
  9. ํ•˜๋ถ€/๊ทธ๋ฆฌํผ ๋…ธ๋“œ ์ถ”๊ฐ€:
    base_node = Node(
        package='astra_controller',
        executable='base_node',
        name='base_controller',
        output='screen'
    )
    lift_node = Node(
        package='astra_controller',
        executable='lift_node',
        name='lift_controller',
        output='screen'
    )
    
  10. MoveIt ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํฌํ•จ:
    moveit_launch_file = os.path.join(
        get_package_share_directory('astra_moveit_config'),
        'launch',
        'demo.launch.py'
    )
    moveit_launch = IncludeLaunchDescription(
        PythonLaunchDescriptionSource(moveit_launch_file),
        launch_arguments={'use_sim_time': 'true'}.items()
    )
    
  11. LaunchDescription์— ์ถ”๊ฐ€:
    ld = LaunchDescription([
        camera_node,
        teleop_node,
        moveit_relay_node,
        base_node,
        lift_node,
        moveit_launch
    ])
    return ld
    
  12. setup.py์— Launch ํŒŒ์ผ ์ถ”๊ฐ€.
  13. colcon build --packages-select astra_controller astra_moveit_config usb_cam.
  14. source install/setup.bash.
  15. ros2 launch astra_controller teleop_vision_sim.launch.py ์‹คํ–‰.
  16. RViz์—์„œ ๋น„์ „ ์ž…๋ ฅ๊ณผ ํŽ˜๋‹ฌ ์กฐ์ž‘์— ๋”ฐ๋ฅธ ๋กœ๋ด‡ ์›€์ง์ž„ ํ™•์ธ.

ํ•ต์‹ฌ ํŒŒ์ผ/๊ฐœ๋…

  • astra_controller/launch/teleop_vision_sim.launch.py
  • launch_ros.actions.Node
  • launch.actions.IncludeLaunchDescription
  • ์นด๋ฉ”๋ผ/๋น„์ „/ํŽ˜๋‹ฌ ๋…ธ๋“œ
  • teleop_node, moveit_relay_node
  • astra_moveit_config/launch/demo.launch.py

์˜ˆ์ƒ ๊ฒฐ๊ณผ

Launch ํŒŒ์ผ๋กœ ์‹œ์Šคํ…œ์ด ์‹คํ–‰๋˜๋ฉฐ, ๋น„์ „ ์ž…๋ ฅ๊ณผ ํŽ˜๋‹ฌ ์กฐ์ž‘์— ๋”ฐ๋ผ RViz ๋กœ๋ด‡์ด ์›€์ง์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ ํŒ

  • ์‹คํ–‰ ๋กœ๊ทธ ํ™•์ธ.
  • rqt_graph, ros2 topic echo๋กœ ๋ฉ”์‹œ์ง€ ์ ๊ฒ€.
  • ์นด๋ฉ”๋ผ ์ž…๋ ฅ ๋ฐ ๋น„์ „ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ํ™•์ธ