head+actPolicy+rviz - dingdongdengdong/astra_ws GitHub Wiki
๋ก๋ด ํค๋ ์ ์ด ๊ตฌํ + LeRobot ACT Policy ํด๋จธ๋ ธ์ด๋ ๋ก๋ด ํ ๋์ RViz ์๊ฐํ ํ ์คํธ
๋ก๋ด ํค๋ ์ ์ด ๋ถ
ํต์ฌ ๊ตฌ์ฑ ์์:
-
head_controller.py
: ์ค์ ๋ก๋ด ํค๋ ํ๋์จ์ด(๋ชจํฐ)์ ์ง์ ํต์ ํ๊ณ ์ ์ดํ๋ ์ ์์ค ์ปจํธ๋กค๋ฌ์ ๋๋ค. ์๋ฆฌ์ผ ํต์ ์ ํตํด ๋ช ๋ น์ ์ ๋ฌํ๊ณ , ์์ฝ๋ ๊ฐ ๋ฑ์ ์ฝ์ด์ต๋๋ค. -
head_node.py
: ROS2 ๋ ธ๋๋ก์,head_controller.py
์ ROS2 ์์คํ ๊ฐ์ ์ธํฐํ์ด์ค ์ญํ ์ ํฉ๋๋ค. ๋ค๋ฅธ ROS2 ๋ ธ๋๋ก๋ถํฐ ์ ์ด ๋ช ๋ น์ ๋ฐ์head_controller.py
์ ์ ๋ฌํ๊ณ ,head_controller.py
๋ก๋ถํฐ ๋ฐ์ ํค๋์ ์ํ ์ ๋ณด๋ฅผ/joint_states
ํ ํฝ์ผ๋ก ๋ฐํํฉ๋๋ค. -
URDF (Unified Robot Description Format): ๋ก๋ด์ ๋ฌผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ(๋งํฌ, ์กฐ์ธํธ, ์ธํ ๋ฑ)๋ฅผ XML ํ์์ผ๋ก ๊ธฐ์ ํ ํ์ผ์
๋๋ค. RViz2๋ Gazebo์ ๊ฐ์ ์๋ฎฌ๋ ์ด์
๋ฐ ์๊ฐํ ๋๊ตฌ์์ ๋ก๋ด ๋ชจ๋ธ์ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. (
astra_description
ํจํค์ง์ ๊ด๋ จ ํ์ผ์ด ์์ ๊ฒ์ ๋๋ค.) -
robot_state_publisher
: URDF ํ์ผ๊ณผ/joint_states
ํ ํฝ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์, ๊ฐ ์กฐ์ธํธ์ ํ์ฌ ์ํ์ ๋ฐ๋ฅธ ๋ก๋ด ๊ฐ ๋ถ๋ถ์ 3D ์ขํ ๋ณํ ์ ๋ณด(TF, Transform)๋ฅผ ๋ฐํํ๋ ROS2 ๋ ธ๋์ ๋๋ค. - RViz2: ROS2์์ ์ฌ์ฉ๋๋ 3D ์๊ฐํ ๋๊ตฌ์ ๋๋ค. TF ์ ๋ณด์ ๋ก๋ด ๋ชจ๋ธ(URDF)์ ์ฌ์ฉํ์ฌ ๋ก๋ด์ ํ์ฌ ์์ธ๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๊ณ , ๋ค์ํ ์ผ์ ๋ฐ์ดํฐ(์นด๋ฉ๋ผ, ๋ผ์ด๋ค ๋ฑ)๋ฅผ ํจ๊ป ํ์ํ ์ ์์ต๋๋ค.
๊ตฌํ ๋ฐ ์คํ ํ๋ฆ ๋ค์ด์ด๊ทธ๋จ:
graph TD
%% Define overall graph direction
direction TB
%% Subgraph for ROS2 Control Stack
subgraph "ROS2 Control Stack"
direction LR
A["External Control\n(Teleop/MoveIt)"] -->|"JointCommand"| B[head_node.py]
B -->|"Set Position/Torque"| C[head_controller.py]
C -->|"Joint States (Raw)"| B
B -->|"/joint_states\n(sensor_msgs/JointState)"| D[robot_state_publisher]
E["URDF\n(astra_description)"] --> D
D -->|"/tf\n(tf2_msgs/TFMessage)"| F[RViz2]
E --> F
end
%% Subgraph for Hardware Interaction
subgraph "Physical/Simulated Hardware"
direction LR
C <-->|"Motor Control/Feedback"| G["Robot Head\n(Motors/Encoders)"]
end
%% Subgraph for Visualization
subgraph "Visualization"
direction LR
F -->|"Displays Robot Model"| H[User Interface]
end
%% Styling for visual clarity
classDef rosNode fill:#D6EAF8,stroke:#2E86C1,stroke-width:2px
classDef hardware fill:#FDEDEC,stroke:#CB4335,stroke-width:2px
classDef viz fill:#D5F5E3,stroke:#28B463,stroke-width:2px
classDef config fill:#E5E7E9,stroke:#566573,stroke-width:2px
class A,B,C,D rosNode
class G hardware
class F,H viz
class E config
ํ๋ฆ ์ค๋ช :
-
๋ช ๋ น ๋ฐ์ (A -> B):
- ์ฌ์ฉ์ ์
๋ ฅ(ํค๋ณด๋, ์กฐ์ด์คํฑ ๋ฑ)์ ์ฒ๋ฆฌํ๋ ์๊ฒฉ ์กฐ์ ๋
ธ๋(
teleop_node.py
๋ฑ)๋, ๋ณต์กํ ๊ฒฝ๋ก ๊ณํ์ ์ํํ๋ MoveIt!๊ณผ ๊ฐ์ ์์ ๋ ๋ฒจ์ ์ ์ด ๋ ธ๋(A)๊ฐ ๋ก๋ด ํค๋์ ๋ชฉํ ๊ด์ ์์น๋ฅผ ๋ด์astra_controller_interfaces.msg.JointCommand
๋ฉ์์ง๋ฅผ/joint_command
ํ ํฝ์ผ๋ก ๋ฐํํฉ๋๋ค. - (๋๋ ํ ํฌ ํ์ฑํ/๋นํ์ฑํ๋ฅผ ์ํ
std_msgs.msg.UInt8
๋ฉ์์ง๊ฐ/torque_enable
ํ ํฝ์ผ๋ก ๋ฐํ๋ ์ ์์ต๋๋ค.)
- ์ฌ์ฉ์ ์
๋ ฅ(ํค๋ณด๋, ์กฐ์ด์คํฑ ๋ฑ)์ ์ฒ๋ฆฌํ๋ ์๊ฒฉ ์กฐ์ ๋
ธ๋(
-
ROS2 ๋ ธ๋์์์ ๋ช ๋ น ์ฒ๋ฆฌ (B -> C):
-
head_node.py
(B)๋/joint_command
ํ ํฝ์ ๊ตฌ๋ ํ๊ณ ์๋ค๊ฐ ์๋ก์ด ๋ช ๋ น ๋ฉ์์ง๋ฅผ ์์ ํฉ๋๋ค. - ์์ ๋ ๋ฉ์์ง๋ก๋ถํฐ ๋ชฉํ ๊ด์ ์์น ๊ฐ(pan, tilt ๊ฐ๋)์ ์ถ์ถํฉ๋๋ค.
-
HeadController
ํด๋์ค์set_pos()
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌhead_controller.py
(C)์ ๋ชฉํ ์์น๋ฅผ ์ ๋ฌํฉ๋๋ค. - ๋ง์ฝ
/torque_enable
ํ ํฝ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ฐ์ผ๋ฉด,HeadController
์set_torque()
๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
-
-
ํ๋์จ์ด ์ ์ด (C <-> G):
-
head_controller.py
(C)๋set_pos()
๋๋set_torque()
๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด, ํด๋น ๋ช ๋ น์ ๋ก๋ด ํค๋ ๋ชจํฐ(G)๊ฐ ์ดํดํ ์ ์๋ ์๋ฆฌ์ผ ํ๋กํ ์ฝ ํ์์ผ๋ก ๋ณํํฉ๋๋ค. - ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ฆฌ์ผ ํฌํธ๋ฅผ ํตํด ์ค์ ๋ก๋ด ํค๋ ๋ชจํฐ ์ปจํธ๋กค๋ฌ์ ์ ์กํฉ๋๋ค.
- ๋์์,
recv_thread
๋ ํค๋ ๋ชจํฐ ์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ํ์ฌ ์์ฝ๋ ๊ฐ(raw data)๊ณผ ๊ฐ์ ํผ๋๋ฐฑ ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ์์ ํฉ๋๋ค.
-
-
์ํ ํผ๋๋ฐฑ (C -> B):
-
head_controller.py
(C)๋ ์์ ๋ raw ์์ฝ๋ ๊ฐ์ SI ๋จ์(๋ผ๋์)๋ก ๋ณํํ๊ณ , ์ด๋ฅผ ์ด์ฉํด ํ์ฌ ๊ด์ ์์น, ์๋, ์ถ์ ํ ํฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค. - ์ด ๊ณ์ฐ๋ ์ํ ์ ๋ณด๋
head_node.py
(B)์ ๋ฑ๋ก๋state_cb
์ฝ๋ฐฑ ํจ์๋ฅผ ํตํด ์ ๋ฌ๋ฉ๋๋ค.
-
-
์กฐ์ธํธ ์ํ ๋ฐํ (B -> D):
-
head_node.py
(B)์state_cb
์ฝ๋ฐฑ ํจ์๋head_controller.py
๋ก๋ถํฐ ๋ฐ์ ํ์ฌ ๊ด์ ์ํ(์์น, ์๋, ์ถ์ ํ ํฌ)๋ฅผsensor_msgs.msg.JointState
๋ฉ์์ง ํ์์ผ๋ก ์ฑ์๋๋ค. - ์ด
JointState
๋ฉ์์ง๋ฅผ/joint_states
ํ ํฝ์ผ๋ก ๋ฐํํฉ๋๋ค. ์ด ํ ํฝ์๋ ๋ก๋ด์ ๋ชจ๋ ์กฐ์ธํธ("joint_head_pan", "joint_head_tilt")์ ํ์ฌ ์ํ๊ฐ ํฌํจ๋ฉ๋๋ค.
-
-
TF ์ ๋ณด ๋ฐํ (D -> F):
-
robot_state_publisher
๋ ธ๋(D)๋ ๋ก๋ด์ URDF ๋ชจ๋ธ(astra_description
ํจํค์ง ๋ด)๊ณผ/joint_states
ํ ํฝ์ ๊ตฌ๋ ํฉ๋๋ค. -
/joint_states
ํ ํฝ์ผ๋ก๋ถํฐ ๊ฐ ์กฐ์ธํธ์ ํ์ฌ ๊ฐ๋ ๊ฐ์ ๋ฐ์ผ๋ฉด, URDF์ ์ ์๋ ๋ก๋ด์ ๊ฐ ๋งํฌ(link)๋ค ์ฌ์ด์ ์๋์ ์ธ 3D ๊ณต๊ฐ ๋ณํ ๊ด๊ณ(TF)๋ฅผ ๊ณ์ฐํฉ๋๋ค. - ๊ณ์ฐ๋ TF ์ ๋ณด๋
/tf
ํ ํฝ์ผ๋ก ๋ฐํ๋ฉ๋๋ค. ์ด ์ ๋ณด๋ ๋ก๋ด์ ๊ฐ ๋ถ๋ถ์ด ํ์ฌ ์ด๋ค ์์ธ๋ก ์์นํด ์๋์ง๋ฅผ ๋ํ๋ ๋๋ค.
-
-
RViz2์์์ ์๊ฐํ (E, F -> H):
- RViz2(F)๋ ์ฌ์ฉ์๊ฐ ์ค์ ํ ๋ด์ฉ์ ๋ฐ๋ผ ๋ค์ํ ํ ํฝ์ ์๊ฐํํฉ๋๋ค.
-
RobotModel Display: URDF(E)๋ฅผ ๋ก๋ํ๊ณ ,
/tf
ํ ํฝ(D๋ก๋ถํฐ ๋ฐํ๋จ)์ ์ฌ์ฉํ์ฌ ๊ฐ ๋งํฌ๋ฅผ ์ฌ๋ฐ๋ฅธ ์์น์ ์์ธ๋ก 3D ๊ณต๊ฐ์ ํ์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๋ ๋ก๋ด ํค๋๊ฐ ์ค์ ๋ก ์ด๋ป๊ฒ ์์ง์ด๋์ง ํ๋ฉด(H)์ ํตํด ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค. -
TF Display:
/tf
์ ๋ณด๋ฅผ ์ง์ ์๊ฐํํ์ฌ ๊ฐ ์ขํ๊ณ(frame)๋ค์ด ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋์ด ์๊ณ ์์ง์ด๋์ง ํ์ธํ ์ ์์ต๋๋ค. - (ํ์์ ๋ฐ๋ผ Grid, Camera Image ๋ฑ ๋ค๋ฅธ Display ํ์ ๋ ์ถ๊ฐํ์ฌ ํ์ฉํ ์ ์์ต๋๋ค.)
์คํ ๋จ๊ณ (ํฐ๋ฏธ๋ ๋ช ๋ น์ด ์์):
์ค์ ๋ก๋ด ํ๋์จ์ด๋ฅผ ์ฐ๊ฒฐํ ๊ฒฝ์ฐ์ ์๋ฎฌ๋ ์ด์ ๋ง ํ๋ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋จ๊ณ๊ฐ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ ๊ณต๋ ์ฝ๋๊ฐ ์ค์ ํ๋์จ์ด ์ ์ด๋ฅผ ๋ชฉํ๋ก ํ๋ฏ๋ก, ์ค์ ํ๋์จ์ด ์ฐ๊ฒฐ์ ๊ฐ์ ํ๊ณ RViz2์์ ์๊ฐํํ๋ ๋จ๊ณ๋ฅผ ์ค์ฌ์ผ๋ก ์ค๋ช ํฉ๋๋ค.
-
ROS2 ํ๊ฒฝ ์ค์ :
source /opt/ros/<your_ros_distro>/setup.bash source <path_to_your_astra_ws>/install/setup.bash
-
head_controller
์ ํต์ ํ ํ๋์จ์ด ์ฐ๊ฒฐ ๋ฐ ๊ถํ ํ์ธ:- ๋ก๋ด ํค๋ ์ปจํธ๋กค ๋ณด๋๊ฐ PC์ ์๋ฆฌ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๊ณ ,
head_node.py
์ ์ง์ ๋ ์ฅ์น ๊ฒฝ๋ก(device
ํ๋ผ๋ฏธํฐ, ์:/dev/tty_head
)๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธํฉ๋๋ค. - ํ์์ ํด๋น ์ฅ์น์ ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค (
sudo chmod 666 /dev/tty_head
๋ฑ).
- ๋ก๋ด ํค๋ ์ปจํธ๋กค ๋ณด๋๊ฐ PC์ ์๋ฆฌ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๊ณ ,
-
head_node
์คํ:-
head_node.py
๋head_controller.py
๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. - ๋ณดํต ROS2 launch ํ์ผ์ ํตํด ์คํํฉ๋๋ค.
astra_controller
ํจํค์ง ๋ด์head_node
๋ฅผ ์คํํ๋ launch ํ์ผ์ด ์๋์ง ํ์ธํ๊ฑฐ๋, ์ง์ ์คํํ ์ ์์ต๋๋ค. - ๋ง์ฝ launch ํ์ผ์ด ์๋ค๋ฉด (์:
astra_controller/launch/head.launch.py
):ros2 launch astra_controller head.launch.py
- ์ง์ ์คํํ๋ค๋ฉด (ํ๋ผ๋ฏธํฐ ์ค์ ํ์):
ros2 run astra_controller head_node --ros-args -p device:=/dev/tty_head
- ์ด ๋
ธ๋๊ฐ ์คํ๋๋ฉด
/joint_states
ํ ํฝ์ด ๋ฐํ๋๊ธฐ ์์ํฉ๋๋ค.
-
-
robot_state_publisher
์คํ:- ๋ก๋ด์ URDF ํ์ผ์ ๋ก๋ํ๊ณ
/joint_states
๋ฅผ ๋ฐ์ TF๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ๋ํ launch ํ์ผ๋ก ๊ด๋ฆฌ๋๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.astra_description
๋๋astra_moveit_config
๊ฐ์ ํจํค์ง์rsp.launch.py
(Robot State Publisher์ ์ฝ์) ๋๋ ์ ์ฌํ ์ด๋ฆ์ launch ํ์ผ์ด ์์ ์ ์์ต๋๋ค. - ์์ (์ค์ ํ์ผ๋ช
์ ๋ค๋ฅผ ์ ์์):
๋๋
ros2 launch astra_description robot_state_publisher.launch.py
astra_moveit_config
์ ํฌํจ๋rsp.launch.py
๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.ros2 launch astra_moveit_config rsp.launch.py
- ๋ก๋ด์ URDF ํ์ผ์ ๋ก๋ํ๊ณ
-
RViz2 ์คํ:
- ์ ํฐ๋ฏธ๋์ ์ด๊ณ RViz2๋ฅผ ์คํํฉ๋๋ค.
rviz2
- RViz2๊ฐ ์คํ๋๋ฉด ๋ค์ ์ค์ ์ ์งํํฉ๋๋ค:
-
Global Options:
Fixed Frame
์ ๋ก๋ด์ base_link (๋๋ odom ๋ฑ ๊ธฐ์ค์ด ๋๋ ํ๋ ์)๋ก ์ค์ ํฉ๋๋ค. URDF์ ์ ์๋ ํ๋ ์ ์ด๋ฆ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. -
Add Display: ์ผ์ชฝ ํ๋จ์ "Add" ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
-
By display type
ํญ์์RobotModel
์ ์ ํํ๊ณ OK๋ฅผ ๋๋ฆ ๋๋ค.-
Description Source
๊ฐTopic
์ผ๋ก ๋์ด์๋์ง ํ์ธํ๊ณ ,Description Topic
์ด/robot_description
(๋๋robot_state_publisher
๊ฐ ๋ฐํํ๋ ๋ก๋ด ๋ชจ๋ธ ํ ํฝ๋ช )์ผ๋ก ์ค์ ๋์๋์ง ํ์ธํฉ๋๋ค. -
TF Prefix
๋ ์ผ๋ฐ์ ์ผ๋ก ๋น์๋ก๋๋ค.
-
-
By display type
ํญ์์TF
๋ฅผ ์ ํํ๊ณ OK๋ฅผ ๋๋ฆ ๋๋ค (์ ํ ์ฌํญ, TF ์๊ฐํ).-
Show Names
,Show Axes
,Show Arrows
๋ฑ์ ์ทจํฅ์ ๋ง๊ฒ ์ค์ ํฉ๋๋ค.
-
-
-
Global Options:
- ์ ํฐ๋ฏธ๋์ ์ด๊ณ RViz2๋ฅผ ์คํํฉ๋๋ค.
-
(์ ํ ์ฌํญ) ํค๋ ์ ์ด ๋ช ๋ น ๋ฐํ ๋ ธ๋ ์คํ:
- ํค๋๋ฅผ ์ค์ ๋ก ์์ง์ฌ๋ณด๋ ค๋ฉด ์ ์ด ๋ช ๋ น์ ๋ฐํํ๋ ๋ ธ๋๊ฐ ํ์ํฉ๋๋ค.
- ๊ฐ๋จํ ํ
์คํธ๋ฅผ ์ํด
ros2 topic pub
๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ์ ๊ณต๋teleop_node.py
๋๋ ๋ค๋ฅธ ์ ์ด ํ๋ก๊ทธ๋จ์ ์คํํ ์ ์์ต๋๋ค. - ์์ (
ros2 topic pub
์ฌ์ฉ - pan 0.5 ๋ผ๋์, tilt 0.2 ๋ผ๋์์ผ๋ก ์ด๋):ros2 topic pub --once /joint_command astra_controller_interfaces/msg/JointCommand '{name: ["joint_head_pan", "joint_head_tilt"], position_cmd: [0.5, 0.2]}'
-
teleop_node.py
๊ฐ ์๋ค๋ฉด:(์คํ ๋ฐฉ๋ฒ์ ํด๋น ๋ ธ๋์ ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.)ros2 run astra_controller teleop_node
์ฃผ์์ฌํญ:
-
URDF ๊ฒฝ๋ก ๋ฐ ๋ด์ฉ:
robot_state_publisher
๊ฐ ์ฌ๋ฐ๋ฅธ URDF ํ์ผ์ ์ฐธ์กฐํ๋๋ก ์ค์ ํด์ผ ํฉ๋๋ค. URDF ํ์ผ ๋ด์ ์กฐ์ธํธ ์ด๋ฆ(joint_head_pan
,joint_head_tilt
)์head_node.py
์์/joint_states
๋ก ๋ฐํํ๋ ์กฐ์ธํธ ์ด๋ฆ๊ณผ ์ ํํ ์ผ์นํด์ผ ํฉ๋๋ค. -
Launch ํ์ผ ํ์ฉ: ์ผ๋ฐ์ ์ผ๋ก ์์์ ์ธ๊ธ๋ ๋
ธ๋๋ค์ ๊ฐ๋ณ์ ์ผ๋ก ์คํํ๊ธฐ๋ณด๋ค๋, ํ๋์ ํตํฉ๋ launch ํ์ผ์ ํตํด ํจ๊ป ์คํ๋ฉ๋๋ค.
astra_ws/src/astra_controller/launch/start.launch.py
์ ๊ฐ์ ํ์ผ์ด ์ ์ฒด ์์คํ ์ ์คํํ๋ ์ญํ ์ ํ ์ ์์ผ๋ ํ์ธํด๋ณด์๋ ๊ฒ์ด ์ข์ต๋๋ค. ํนํdemo.launch.py
๋moveit_rviz.launch.py
๊ฐ์ ํ์ผ์ RViz2์ ํจ๊ป ํ์ํ ๋ชจ๋ ๊ฒ์ ์คํํ๋๋ก ๊ตฌ์ฑ๋์ด ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. -
์๋ฎฌ๋ ์ด์
(Gazebo ๋ฑ): ๋ง์ฝ ์ค์ ํ๋์จ์ด ์์ด Gazebo์ ๊ฐ์ ์๋ฎฌ๋ ์ดํฐ์์ ๋ก๋ด์ ๊ตฌ๋ํ๋ ค๋ฉด,
ros2_control
๊ณผ Gazebo ํ๋ฌ๊ทธ์ธ์ ์ค์ ํ์ฌ ์๋ฎฌ๋ ์ด์ ํ๊ฒฝ ๋ด์์/joint_states
๋ฅผ ๋ฐํํ๊ณ/joint_command
๋ฅผ ๋ฐ์ ๋ชจํฐ๋ฅผ ์์ง์ด๋๋ก ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์ด๋ ๋ณ๋์ ์ค์ ๊ณผ launch ํ์ผ์ด ํ์ํฉ๋๋ค. ์ ๊ณต๋ ์ฝ๋์๋ros2_control
๊ด๋ จ ์ค์ ์ดastra_moveit_config/config/ros2_controllers.yaml
๋ฑ์ ์์ ์ ์์ต๋๋ค.
์ด ์ค๋ช
์ ๋ฐํ์ผ๋ก ์ ๊ณต๋ ์ฝ๋๋ฅผ ๋น๋ํ๊ณ ์คํํ์ฌ RViz2์์ ๋ก๋ด ํค๋๊ฐ ์ ์ด๋๋ ๋ชจ์ต์ ํ์ธํ์ค ์ ์์ ๊ฒ์
๋๋ค. ๊ฐ ํจํค์ง์ launch
ํด๋์ config
ํด๋๋ฅผ ์์ธํ ์ดํด๋ณด์๋ฉด ์ค์ ์คํ์ ํ์ํ ๊ตฌ์ฒด์ ์ธ ํ์ผ๋ค๊ณผ ์ค์ ์ ์ฐพ์ผ์ค ์ ์์ต๋๋ค.