pgv_tracing_mode ๋ PGV(R4 ๋ฑ) ๋ผ์ธ ์ผ์๊ฐ ํผ๋ธ๋ฆฌ์ํ๋ PoseStamped (x,y,yaw) ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ
๋ก๋ด์ ๋ผ์ธ ์์์ ์ ๋ ฌ / ์ฃผํ / ๋ฏธ์ธ ์์น ๋ณด์ ํ๋ ROS 2 (Humble) Python ํจํค์ง์
๋๋ค.
ํ๋ก๋
ธ๋ฏน(์ธก๋ฉด ์ด๋ ๊ฐ๋ฅ)๊ณผ ๋นํ๋ก๋
ธ๋ฏน(์ฐจ๋/์กฐํฅ) ํ๋ซํผ์ ๋ชจ๋ ์ง์ํ๋ฉฐ, ์๋น์คยทํ ํฝ ๊ธฐ๋ฐ์ ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ก
์๋/์ ๋ ์ด๋, yaw ์ ๋ ฌ, Y์ถ ๋จ๋
์ ๋ ฌ, ์๋ hold-to-run ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฃผ์ ํน์ง:
- Yaw ์ ๋ ฌ (ALIGN_YAW) + ์ ํ์ Slow Start ์ ์ง
- ์ ๋/์๋ X ๋ชฉํ ์ถ์ข (RUNNING) ๊ณผ Y=0 ์ ์ง
- ํ๋ก๋ ธ๋ฏน ์ ์ฉ Y์ถ ์ ๋ ฌ (ALIGN_Y_ONLY) + Yaw ํ์คํ ๋ฆฌ์์ค (๋ฏธ์ธ ๋๋ฆฌ๋๋ฆฌ ์ต์ )
- Hold-to-run ์๋ ์ /ํ์ง (teleop_speed / manual_timeout ๊ธฐ๋ฐ)
- Pose ์
๋ ฅ ํ์์์ ๊ฐ์ง + ์ฌ์ธ์ ํ Grace(์ ์) ์ ์ง (
post_timeout_grace_sec) - Reverse heading ํ์ฉ(ยฑ180ยฐ๋ฅผ ์ ๋ ฌ๋ก ์ธ์ ) ์ต์
(
allow_reverse_heading) - ยฑฯ ๊ฒฝ๊ณ ์ง๋ ์ต์ wrap band (
yaw_wrap_band_deg)๋ก yaw ๋ถํธ ์์ ํ - Slew rate(๊ฐ์) ์ ํ + ์๋/๊ฐ์๋ ํด๋จํ
- YAML ํ๋ผ๋ฏธํฐ / launch ํ์ผ ์ ๊ณต
- Dummy PGV ์๋ฎฌ๋ ์ดํฐ(
sim_dummy_pgv.py) ํฌํจ โ ์ค์ ์ผ์ ์์ด ํ๋ฃจํ ํ ์คํธ ๊ฐ๋ฅ
์ํ(Phase) ์์ฝ:
| Phase | ์ค๋ช |
|---|---|
| IDLE | ๋ชฉํ/์ ๋ ฌ ์์ฒญ ์์ (์ ์ง) |
| ALIGN_YAW | yaw ์ค์ฐจ๋ฅผ ์๊ณ๊ฐ ์ดํ๋ก ํ์ ๋ณด์ |
| SLOW_START | ์งง์ ์ ์ ์ ์ง (๊ธฐ๊ณ/์ผ์ ์๋ฐ์ ) |
| RUNNING | X ๋ชฉํ ์ถ์ข + Y, yaw ์์ ํ |
| ALIGN_Y_ONLY | ํ๋ก๋ ธ๋ฏน Y์ถ ์ ๋ ฌ (yaw ํ์คํ ๋ฆฌ์์ค ์ ์ฉ) |
| DONE | ์๋ฃ ํ ์ ์ง ์ ์ง |
ํ์คํ ๋ฆฌ์์ค:
- |yaw_err| > tol_yaw * yaw_hysteresis_factor โ yaw ๋ณด์ ํ์ฑ
- |yaw_err| <= tol_yaw โ ๋ณด์ ๋นํ์ฑ + ์์ deadband ๋ก ๋ฏธ์ธ ์ง๋ ์ต์
- ROS 2 Humble (>= 2022.05)
- Python 3.10
- C++17 toolchain
- ROS 2 packages:
rclpy,geometry_msgs,std_msgs,std_srvs,nav_msgs
| ํ์ผ / ๋ ธ๋ | ์ค๋ช |
|---|---|
pgv_tracing_mode/line_tracing_node.py |
ํต์ฌ ์ ์ด ๋ ธ๋ (LineDriveNode) |
pgv_tracing_mode/sim_dummy_pgv.py |
/cmd_vel ์ ๋ถ ํ PGV PoseStamped ๋๋ฏธ ๋ฐํ |
pgv_tracing_mode/one_shot_goal.py |
ํ ์คํธ์ฉ ๋จ๋ฐ ๋ชฉํ(์๋/์ ๋) ๋ฐ ์๋น์ค ํธ์ถ ์์ |
launch/line_drive.launch.py |
๊ธฐ๋ณธ ์ ์ด ๋ ธ๋ ๋ฐ์น |
launch/test_line_drive_sim.launch.py |
๋๋ฏธ + ์ ์ด + ๋ชฉํ ํตํฉ ํ ์คํธ ๋ฐ์น |
config/line_drive.params.yaml |
์ ์ด ํ๋ผ๋ฏธํฐ |
config/sim.params.yaml |
์๋ฎฌ๋ ์ดํฐ ํ๋ผ๋ฏธํฐ |
# ์ํฌ์คํ์ด์ค ์์ฑ ๋ฐ ํ์ฌ ํจํค์ง clone (์์)
mkdir -p ~/pgv_ws/src && cd ~/pgv_ws/src
git clone https://github.com/<your-org-or-user>/pgv_tracing_mode.git
cd ~/pgv_ws
rosdep update
rosdep install --from-paths src --ignore-src -r -y
colcon build --symlink-install
source install/setup.bashros2 launch pgv_tracing_mode line_drive.launch.pyros2 launch pgv_tracing_mode test_line_drive_sim.launch.py| ์ด๋ฆ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|
holonomic |
true |
true=ํ๋ก๋ ธ๋ฏน, false=๋นํ๋ก๋ ธ๋ฏน |
params_file |
config/line_drive.params.yaml |
์ ์ด ํ๋ผ๋ฏธํฐ YAML |
sim_params |
config/sim.params.yaml |
์๋ฎฌ๋ ์ดํฐ ํ๋ผ๋ฏธํฐ YAML |
use_relative |
true |
์๋(ฮx) ๋ชฉํ ์ฌ์ฉ ์ฌ๋ถ |
relative_goal |
1.5 |
์๋ ์ด๋ ๊ฑฐ๋ฆฌ (m) |
absolute_goal |
5.0 |
์ ๋ ๋ชฉํ x (m) |
goal_delay_sec |
1.0 |
๋ชฉํ ๋ฐํ ์ ์ง์ฐ (s) |
call_align_first |
true |
์์ ์ yaw ์ ๋ ฌ ๋จผ์ ์ํ |
config/line_drive.params.yaml ์ฐธ๊ณ . (์ผ๋ถ๋ง ๋ฐ์ท)
| ํ๋ผ๋ฏธํฐ | ๋จ์ | ์ค๋ช |
|---|---|---|
pose_topic |
str | PGV PoseStamped ์ ๋ ฅ ํ ํฝ |
cmd_topic |
str | Twist ์ถ๋ ฅ ํ ํฝ |
holonomic |
bool | ์ ์ด ๋ชจ๋ (ํ๋ก/๋นํ๋ก) |
yaw_align_threshold_deg |
deg | ALIGN_YAW ์ข ๋ฃ ๊ธฐ์ค |
tolerance_yaw_deg |
deg | ์์ yaw ํ์ฉ ์ค์ฐจ |
yaw_hysteresis_factor |
- | Y-only yaw ํ์คํ ๋ฆฌ์์ค ์ธ์ธก ๋ฐฐ์ (> |
tolerance_xy |
m | ๋ชฉํ/์ ๋ ฌ X,Y ํ์ฉ ์ค์ฐจ |
pose_timeout_sec |
s | Pose ์์ ํ์์์ (์์ ์ ์ง) |
post_timeout_grace_sec |
s | ํ์์์ ํ Pose ํ๋ณต ์ ์ถ๊ฐ ์ ์ง ์ ์ง ์ ์์๊ฐ |
control_rate |
Hz | ์ ์ด ๋ฃจํ ์ฃผํ์ |
max_lin_vel / max_ang_vel |
m/s, rad/s | ์๋ ์ํ |
accel_lin / accel_ang |
m/sยฒ, rad/sยฒ | Slew (๊ฐ์) ์ ํ |
slow_start_duration / slow_start_speed |
s, m/s | Slow start ์ค์ |
teleop_speed |
m/s | ์๋ hold-to-run ์๋ |
manual_timeout |
s | ์๋ TRUE ์ ์ง ์๊ฐ |
allow_reverse_heading |
bool | ยฑ180ยฐ ๋ฐฉํฅ๋ ์ ๋ ฌ ํ์ฉ (์ต์ ํ์ ๋ชฉํ ์ ํ) |
yaw_wrap_band_deg |
deg | ยฑฯ ๊ฒฝ๊ณ ๋ถ๊ทผ ๋ถํธ ๊ณ ์ ๋ฐด๋ ํญ (์ง๋ ์ต์ ) |
align_y_only_max_ang_vel |
rad/s | Y-only ๋จ๊ณ yaw ๋ฏธ์ธ ๋ณด์ soft ์ํ (์ฃผ์ ์ฒ๋ฆฌ ์ ๋นํ์ฑ) |
sensor_x_offset / sensor_y_offset |
m | ์ผ์ ์ฅ์ฐฉ ์์น ๋ณด์ |
sensor_yaw_offset_deg |
deg | ์ผ์ yaw ์คํ์ |
kp_x, kp_y, kp_yaw |
- | P ๊ฒ์ธ |
์ผ์ ์ค์ฌ์ ๋ผ์ธ ์ค์์ ๋ง์ถ๋ ๊ฒ์ด ๊ธฐ๋ณธ ๊ฐ์ . ์คํ์ ์ ๋ฃ์ผ๋ฉด ๋ก๋ด(๋๋ Base) ๊ธฐ์ค ์ ๋ ฌ๋ก ์ ํ.
_yaw_err() ๋ (yaw_meas - target) ํํ์ ์ค์ฐจ๋ฅผ ๋ฐํํฉ๋๋ค.
- ๊ธฐ๋ณธ target = 0 rad (+X).
allow_reverse_heading=true์ด๊ณconsider_reverse=True๋ก ํธ์ถ๋ ๋ฌธ๋งฅ์์๋ ํ๋ณด {0, ยฑฯ(์ธก์ yaw ๋ถํธ ์ ์ง)} ์ค |yaw - candidate|๊ฐ ๋ ์์ ๋ชฉํ๋ฅผ ์ ํ โ ์ต์ ํ์ ๋.- ํ์ ์ ์ด๋ ์์ ํผ๋๋ฐฑ
w = -kp_yaw * yaw_errํํ. yaw_err>0 (์ข์ธก(CCW)๋ก ๊ธฐ์ธ์์ ๋) โ ์์ ๊ฐ์๋(w<0) โ ์๊ณ๋ฐฉํฅ ํ์ ์ผ๋ก 0์ชฝ ์๋ ด. - ยฑฯ ๊ฒฝ๊ณ ๊ทผ์ฒ(| |yaw| - ฯ | < yaw_wrap_band_deg)์์๋ sign flip์ ์ต์ ํ๊ธฐ ์ํด ๊ธฐ์กด yaw ๋ถํธ๋ฅผ ๊ณ ์ (
yaw_sign_fixed).
Holonomic ๋ชจ๋์์๋ ์ ๋ ฌ ์ดํ ์ผ๋ฐ์ ์ผ๋ก w=0์ ์ ์งํ๋ฉฐ ํ์ ์ ๋ฏธ์ธ ๋ณด์ (ํ์ฌ ๊ธฐ๋ณธ ์ค์ ์์๋ ๋นํ์ฑํ). Non-holonomic์ y ์ค์ฐจ์ yaw ์ค์ฐจ๋ฅผ ๊ฐ์๋๋ก ๋์์ ๋ณด์ ํฉ๋๋ค.
pose_timeout_sec๋์ ์๋ก์ด Pose ๋ฏธ์์ โ ์ฆ์ STOP,timeout_active=True.- Pose๊ฐ ๋ค์ ๋ค์ด์ค๋ ์ฒซ ํฑ โ
post_timeout_grace_sec๋์ ์ถ๊ฐ ์ ์ง (์ผ์ ํ๋ ๊ฐ/์ฌ์ ๋ ฌ ์์ ํ๋ณด). - Grace ์งํ ์ค ์๋ hold-to-run ์ ๋ ฅ๋ ๋ฌด์๋๊ณ ์ฃผ๊ธฐ์ ์ผ๋ก ๋จ์ ์๊ฐ์ด ๋ก๊ทธ๋ก ์ถ๋ ฅ.
- Grace ์ข ๋ฃ ํ ์ํ ๋จธ์ ์ ์ ์ฌ๊ฐ.
๋ก๊ทธ ์์:
[safety] pose timeout detected -> STOP
[safety] pose recovered; holding still for 1.00s grace
[safety] grace active: 0.76s remaining
[safety] grace ended; resuming control
ALIGN_Y_ONLY ๋จ๊ณ์์ yaw ๋ณด์ ์ |yaw_err|๊ฐ tolerance_yaw_deg * yaw_hysteresis_factor ๋ณด๋ค ํด ๋๋ง ํ์ฑํํ๊ณ , ๋ค์ |yaw_err| โค tolerance_yaw_deg ๋ก ์์์ง๋ฉด ๋นํ์ฑํํ์ฌ ๋ฏธ์ธ ํ๋ค๋ฆผ์ ์ค์
๋๋ค. ๊ธฐ๋ณธ ์ฝ๋์์๋ w_cmd ๋ณด์ ๋ธ๋ก์ด ์ฃผ์ ์ฒ๋ฆฌ๋์ด vy๋ง ์ฌ์ฉํ ์์ Y ์ ๋ ฌ์ ์ํํฉ๋๋ค. ํ์ ์ ์ฃผ์์ ํด์ ํ๊ณ align_y_only_max_ang_vel ๋ก soft ํฌํ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
/line_drive/go_forward ๋๋ /line_drive/go_backward ์ TRUE ํ์ค๋ฅผ ๊ณ์ ๋ณด๋ด๋ฉด manual_timeout ๋ด์์ ํด๋น ๋ฐฉํฅ ์๋(teleop_speed)๋ก ์ ์ง๋ฉ๋๋ค. ์ ๋ฐฉํฅ์ด ๋์์ ํ์ฑ์ด๋ฉด ์์ ์ ์ํด ์ ์งํฉ๋๋ค.
| ๋ชฉ์ | ๊ถ์ฅ ์กฐ์ ํ๋ผ๋ฏธํฐ | ๋ฉ๋ชจ |
|---|---|---|
| ์ ๋ ฌ ๋น ๋ฅด๊ฒ | kp_yaw โ, yaw_align_threshold_deg โ (์กฐ๊ธ) | ๊ณผ๋ํ๋ฉด ์ง๋ โ |
| ์ ๋ ฌ ์์ | kp_yaw โ, yaw_wrap_band_deg โ | wrap ๋๋ฌด ํฌ๋ฉด ๋ฐ์ ๋ํ |
| ์ผ์ ํ ๋๋น | post_timeout_grace_sec โ | ๋๋ฌด ๊ธธ๋ฉด ์ฌ๊ฐ ์ง์ฐ |
| ์ธก๋ฉด ์๋ ด ์๋ | kp_y โ | ๊ณผ๋ํ๋ฉด oscillation |
| Holonomic ๋ฏธ์ธ yaw ๋ณด์ | align_y_only_max_ang_vel ์ค์ + w_cmd ๋ธ๋ก ํ์ฑ | ๊ธฐ๋ณธ์ ๋นํ์ฑ |
| Reverse ํ์ฉ ์ฌ๋ถ | allow_reverse_heading toggle | ๋ฌผ๋ฆฌ ๋ฐฉํฅ์ฑ ์๋ ๊ฒฝ์ฐ๋ง true ์ถ์ฒ |
๐ก ๊ธฐ๋ณธ ์ค๊ณ ์์น ์ผ์(R4)๊ฐ ๋ผ์ธ ์ค์์ ์์นํ๋๋ก ์ ์ดํ๋ ๊ฒ์ด ๋ชฉํ์ด๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก
sensor_*_offset = 0๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ์คํ์ ์ ์ง์ ํ๋ฉด โ๋ก๋ด ์ค์ฌโ์ด ๋ผ์ธ ์ค์์ ์ค๋๋ก ์ ์ด ๊ธฐ์ค์ด ๋ฐ๋๋๋ค.
| ํ ํฝ | ํ์ | ์ค๋ช |
|---|---|---|
pose_topic (๊ธฐ๋ณธ: /amr1/bcd_pose) |
PoseStamped | ์ผ์ ํฌ์ฆ ์ ๋ ฅ |
/line_drive/relative_x_goal |
Float64 | ์๋ ฮx ๋ชฉํ |
/line_drive/absolute_x_goal |
Float64 | ์ ๋ x ๋ชฉํ |
/line_drive/go_forward |
Bool | ์๋ ์ ์ง ํ์ค (hold) |
/line_drive/go_backward |
Bool | ์๋ ํ์ง ํ์ค (hold) |
| ํ ํฝ | ํ์ | ์ค๋ช |
|---|---|---|
cmd_topic (๊ธฐ๋ณธ: /cmd_vel) |
Twist | ์๋ ๋ช ๋ น (vx, vy, wz) |
| ์๋น์ค | ํ์ | ์ค๋ช |
|---|---|---|
/line_drive/align_to_line |
Trigger | Yaw ์ ๋ ฌ ์์ (ALIGN_YAW ํ๋ฆ) |
/line_drive/nudge_forward |
Trigger | Slow start ์ ์ง ๋จ๋ฐ (๋ง์ดํฌ๋ก) |
/line_drive/align_y_only |
Trigger | (ํ๋ก๋ ธ๋ฏน) Y-only ์ ๋ ฌ (ํ์์ yaw โ y) |
# (์๋) +1.2 m ์ ์ง
ros2 topic pub /line_drive/relative_x_goal std_msgs/Float64 '{data: 1.2}'
# (์ ๋) x = 5.0 m ์์น๊น์ง ์ด๋
ros2 topic pub /line_drive/absolute_x_goal std_msgs/Float64 '{data: 5.0}'# Yaw ์ ๋ ฌ๋ง ๋ค์ ์คํ
ros2 service call /line_drive/align_to_line std_srvs/srv/Trigger {}
# ๋ฏธ์ธ +x ์ ์ง (slow start ์๋/์๊ฐ์ผ๋ก ๋จ๋ฐ ์ํ)
ros2 service call /line_drive/nudge_forward std_srvs/srv/Trigger {}- Dummy PGV ์๋ฎฌ๋ ์ดํฐ ์คํ โ
/cmd_vel๋ช ๋ น์ ๋ฐ์ PoseStamped๋ฅผ ํผ๋ธ๋ฆฌ์ - Line Drive Controller โ PoseStamped๋ฅผ ๋ฐ์ ์ ์ด(์ ๋ ฌ โ ์ ์ง)
- One-shot Goal Node โ 1 ์ด ํ
/line_drive/relative_x_goal๋ฐํ
ros2 launch pgv_tracing_mode test_line_drive_sim.launch.py \
holonomic:=false use_relative:=true relative_goal:=2.0์คํ ํ ์ฝ์์์ ๋ค์ ์์๋ฅผ ๋ณผ ์ ์์ต๋๋ค:
[align] yaw aligned; entering slow-start[slow-start] complete; entering RUNNING[goal] reached
pgv_tracing_mode/
โโโ pgv_tracing_mode/
โ โโโ line_tracing_node.py # ํต์ฌ LineDriveNode ๊ตฌํ
โ โโโ sim_dummy_pgv.py # ๋๋ฏธ PGV ์๋ฎฌ๋ ์ดํฐ
โ โโโ one_shot_goal.py # ๋จ๋ฐ ๋ชฉํ/์๋น์ค ํ
์คํธ ๋
ธ๋
โ โโโ __init__.py
โโโ launch/
โ โโโ line_drive.launch.py
โ โโโ test_line_drive_sim.launch.py
โโโ config/
โ โโโ line_drive.params.yaml
โ โโโ sim.params.yaml
โโโ test/ (lint / style ํ
์คํธ)
-
์ผ์ ๊ธฐ์ค ์ ์ด (Default) ์ผ์๊ฐ ๋ผ์ธ ์ค์์ ์ค๋๋ก ์ ์ด โ PGV ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ฌ์ฉํ๋ฏ๋ก ๋ฐ์ ๋น ๋ฆ, ์ค์ ๋จ์. ์คํ์ 0์ผ๋ก ๋๋ฉด ๋ก๋ด์ โ์ผ์ ์ค์ฌ์ด ๋ผ์ธ ์โ๊ฐ ๋๋ ์์น์์ ๋ฉ์ถค.
-
๋ก๋ด ์ค์ฌ ๊ธฐ์ค ์ ์ด (Optional) ๋ง์ฝ โ๋ก๋ด ์ค์ฌ(base_link)โ์ ๋ผ์ธ ์ค์์ ์ ๋ ฌํด์ผ ํ๋ค๋ฉด, ์ผ์์ ์ค์ ์ฅ์ฐฉ ์์น๋ฅผ
sensor_x_offset,sensor_y_offset์ ์ ๋ ฅํด ๋ณด์ . -
Holonomic vs Non-holonomic Holonomic โ ์ธก๋ฉด ์ด๋ ๊ฐ๋ฅ ํ๋ซํผ(์: Mecanum, Omni). Non-holonomic โ ์ฐจ๋ยท์กฐํฅํ(์: Double Steering Drive). ๋์ผํ ์ ์ด ๊ตฌ์กฐ๋ก ๋ชจ๋ ๋์.
-
Reverse Heading ํ์ฉ ๋ผ์ธ ๋ฐฉํฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ
allow_reverse_heading=true๋ก ์ค์ ํ๋ฉด +X ๋๋ -X(ยฑฯ) ์ค ๋ ๊ฐ๊น์ด ๋ฐฉํฅ์ ์ ๋ ฌ ๋ชฉํ๋ก ์ผ์ ์ต์ ํ์ ๋๋ง ์ํํฉ๋๋ค. ๊ธด ํ์ ์๊ฐ์ ์ค์ด๊ณ ยฑฯ ๊ทผ์ฒ ๋ถ์์ ํ flip์ wrap band ๋ก ์ต์ ํฉ๋๋ค. -
Timeout Grace ๋ณต๊ตฌ ์ผ์ ์ผ์ ๋๊น ํ ๋ฐ๋ก ํญ์ฃผํ๋ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด pose ํ๋ณต ํ ์งง์ ์ ์์๊ฐ์ ๋์ด ์ ์ด ์ ๋ ฅ ์์ ํ/์ฌํ๊ฐ ์๊ฐ์ ํ๋ณดํฉ๋๋ค.
-
Yaw Error ์์ ํผ๋๋ฐฑ yaw_err = (yaw_meas - target) ์ ์ ํ w = -kp_yaw * yaw_err ๋ก ๋จ์/์ง๊ด ์์ ํผ๋๋ฐฑ์ ์ ์ฉํ์ฌ ๋ถํธ ํผ๋์ ์ ๊ฑฐํ์ต๋๋ค.
Maintainer: ์์ฌ๋ฝ (Jaerak Son)
๐ง jr@pitin-ev.com
์ด์ / ๊ฐ์ ์ ์์ GitHub Issues ๋ก ๋จ๊ฒจ์ฃผ์ธ์.
ํน๋ณํ ๋ช ์๊ฐ ์๋ค๋ฉด ํจํค์ง ๋ด ์์ค๋ Apache 2.0 ํธํ ๋ผ์ด์ ์ค(ROS 2 ๊ธฐ๋ณธ ์์ ๊ธฐ๋ฐ)๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ํ๋ก์ ํธ ์๊ตฌ์ ๋ฐ๋ผ LICENSE ํ์ผ์ ์ถ๊ฐํ์ธ์.
ํฅํ ๋ณ๊ฒฝ ์ฌํญ์ CHANGELOG.rst (ament ํ์ค) ์์ฑ ๊ถ์ฅ.
Happy tracing! ๐