Skip to content

mach0312/pgv_tracing_mode

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

20 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

pgv_tracing_mode (๋ผ์ธ ํŠธ๋ ˆ์ด์‹ฑ / ์ •๋ ฌ ํŒจํ‚ค์ง€)

pgv_tracing_mode ๋Š” PGV(R4 ๋“ฑ) ๋ผ์ธ ์„ผ์„œ๊ฐ€ ํผ๋ธ”๋ฆฌ์‹œํ•˜๋Š” PoseStamped (x,y,yaw) ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋กœ๋ด‡์„ ๋ผ์ธ ์œ„์—์„œ ์ •๋ ฌ / ์ฃผํ–‰ / ๋ฏธ์„ธ ์œ„์น˜ ๋ณด์ •ํ•˜๋Š” ROS 2 (Humble) Python ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ํ™€๋กœ๋…ธ๋ฏน(์ธก๋ฉด ์ด๋™ ๊ฐ€๋Šฅ)๊ณผ ๋น„ํ™€๋กœ๋…ธ๋ฏน(์ฐจ๋™/์กฐํ–ฅ) ํ”Œ๋žซํผ์„ ๋ชจ๋‘ ์ง€์›ํ•˜๋ฉฐ, ์„œ๋น„์Šคยทํ† ํ”ฝ ๊ธฐ๋ฐ˜์˜ ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ƒ๋Œ€/์ ˆ๋Œ€ ์ด๋™, yaw ์ •๋ ฌ, Y์ถ• ๋‹จ๋… ์ •๋ ฌ, ์ˆ˜๋™ hold-to-run ์ œ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


๐Ÿงญ ๊ฐœ์š” (Overview)

์ฃผ์š” ํŠน์ง•:

  • 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 ๋กœ ๋ฏธ์„ธ ์ง„๋™ ์–ต์ œ

โš™๏ธ ์˜์กด์„ฑ (Dependencies)

  • 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 ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ํŒŒ๋ผ๋ฏธํ„ฐ

๐Ÿ› ๏ธ ์„ค์น˜ (Installation)

# ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ ๋ฐ ํ˜„์žฌ ํŒจํ‚ค์ง€ 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.bash

๐Ÿš€ ์‚ฌ์šฉ๋ฒ• (Usage)

โ–ถ ๊ธฐ๋ณธ ์‹คํ–‰ (YAML ํŒŒ๋ผ๋ฏธํ„ฐ ๊ธฐ๋ฐ˜)

ros2 launch pgv_tracing_mode line_drive.launch.py

โ–ถ ํ†ตํ•ฉ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (Dummy PGV + Controller + Goal)

ros2 launch pgv_tracing_mode test_line_drive_sim.launch.py

โ–ถ ์ฃผ์š” Launch Arguments

์ด๋ฆ„ ๊ธฐ๋ณธ๊ฐ’ ์„ค๋ช…
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 ์ •๋ ฌ ๋จผ์ € ์ˆ˜ํ–‰

๐Ÿ“ฆ ์ฃผ์š” ํŒŒ๋ผ๋ฏธํ„ฐ (Parameters)

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 ์ œ์–ด ๋ฐ Reverse Heading

_yaw_err() ๋Š” (yaw_meas - target) ํ˜•ํƒœ์˜ ์˜ค์ฐจ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ธฐ๋ณธ target = 0 rad (+X).
  2. allow_reverse_heading=true ์ด๊ณ  consider_reverse=True ๋กœ ํ˜ธ์ถœ๋œ ๋ฌธ๋งฅ์—์„œ๋Š” ํ›„๋ณด {0, ยฑฯ€(์ธก์ • yaw ๋ถ€ํ˜ธ ์œ ์ง€)} ์ค‘ |yaw - candidate|๊ฐ€ ๋” ์ž‘์€ ๋ชฉํ‘œ๋ฅผ ์„ ํƒ โ†’ ์ตœ์†Œ ํšŒ์ „๋Ÿ‰.
  3. ํšŒ์ „ ์ œ์–ด๋Š” ์Œ์˜ ํ”ผ๋“œ๋ฐฑ w = -kp_yaw * yaw_err ํ˜•ํƒœ. yaw_err>0 (์ขŒ์ธก(CCW)๋กœ ๊ธฐ์šธ์—ˆ์„ ๋•Œ) โ†’ ์Œ์ˆ˜ ๊ฐ์†๋„(w<0) โ†’ ์‹œ๊ณ„๋ฐฉํ–ฅ ํšŒ์ „์œผ๋กœ 0์ชฝ ์ˆ˜๋ ด.
  4. ยฑฯ€ ๊ฒฝ๊ณ„ ๊ทผ์ฒ˜(| |yaw| - ฯ€ | < yaw_wrap_band_deg)์—์„œ๋Š” sign flip์„ ์–ต์ œํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด yaw ๋ถ€ํ˜ธ๋ฅผ ๊ณ ์ •(yaw_sign_fixed).

Holonomic ๋ชจ๋“œ์—์„œ๋Š” ์ •๋ ฌ ์ดํ›„ ์ผ๋ฐ˜์ ์œผ๋กœ w=0์„ ์œ ์ง€ํ•˜๋ฉฐ ํ•„์š” ์‹œ ๋ฏธ์„ธ ๋ณด์ •(ํ˜„์žฌ ๊ธฐ๋ณธ ์„ค์ •์—์„œ๋Š” ๋น„ํ™œ์„ฑํ™”). Non-holonomic์€ y ์˜ค์ฐจ์™€ yaw ์˜ค์ฐจ๋ฅผ ๊ฐ์†๋„๋กœ ๋™์‹œ์— ๋ณด์ •ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž„์•„์›ƒ & Grace ๋ณต๊ตฌ

  1. pose_timeout_sec ๋™์•ˆ ์ƒˆ๋กœ์šด Pose ๋ฏธ์ˆ˜์‹  โ†’ ์ฆ‰์‹œ STOP, timeout_active=True.
  2. Pose๊ฐ€ ๋‹ค์‹œ ๋“ค์–ด์˜ค๋Š” ์ฒซ ํ‹ฑ โ†’ post_timeout_grace_sec ๋™์•ˆ ์ถ”๊ฐ€ ์ •์ง€ (์„ผ์„œ ํŠ€๋Š” ๊ฐ’/์žฌ์ •๋ ฌ ์•ˆ์ • ํ™•๋ณด).
  3. Grace ์ง„ํ–‰ ์ค‘ ์ˆ˜๋™ hold-to-run ์ž…๋ ฅ๋„ ๋ฌด์‹œ๋˜๊ณ  ์ฃผ๊ธฐ์ ์œผ๋กœ ๋‚จ์€ ์‹œ๊ฐ„์ด ๋กœ๊ทธ๋กœ ์ถœ๋ ฅ.
  4. 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

Y-only ์ •๋ ฌ ํžˆ์Šคํ…Œ๋ฆฌ์‹œ์Šค

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 ํฌํ™”๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Hold-to-run ์ „๋žต

/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 ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜คํ”„์…‹์„ ์ง€์ •ํ•˜๋ฉด โ€œ๋กœ๋ด‡ ์ค‘์‹ฌโ€์ด ๋ผ์ธ ์ค‘์•™์— ์˜ค๋„๋ก ์ œ์–ด ๊ธฐ์ค€์ด ๋ฐ”๋€๋‹ˆ๋‹ค.


๐ŸŽฏ ์ธํ„ฐํŽ˜์ด์Šค (Topics & Services)

๊ตฌ๋… (Subscribe)

ํ† ํ”ฝ ํƒ€์ž… ์„ค๋ช…
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)

ํผ๋ธ”๋ฆฌ์‹œ (Publish)

ํ† ํ”ฝ ํƒ€์ž… ์„ค๋ช…
cmd_topic (๊ธฐ๋ณธ: /cmd_vel) Twist ์†๋„ ๋ช…๋ น (vx, vy, wz)

์„œ๋น„์Šค (Services)

์„œ๋น„์Šค ํƒ€์ž… ์„ค๋ช…
/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)

ํ† ํ”ฝ ๋ช…๋ น (Goal ์˜ˆ์‹œ)

# (์ƒ๋Œ€) +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 {}

๐Ÿงช ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ๋ฆ„ ์˜ˆ์‹œ

  1. Dummy PGV ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์‹คํ–‰ โ†’ /cmd_vel ๋ช…๋ น์„ ๋ฐ›์•„ PoseStamped๋ฅผ ํผ๋ธ”๋ฆฌ์‹œ
  2. Line Drive Controller โ†’ PoseStamped๋ฅผ ๋ฐ›์•„ ์ œ์–ด(์ •๋ ฌ โ†’ ์ „์ง„)
  3. 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 ํ…Œ์ŠคํŠธ)

๐Ÿง  ์„ค๊ณ„ ๋ฉ”๋ชจ (Design Notes)

  • ์„ผ์„œ ๊ธฐ์ค€ ์ œ์–ด (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 ๋กœ ๋‹จ์ˆœ/์ง๊ด€ ์Œ์˜ ํ”ผ๋“œ๋ฐฑ์„ ์ ์šฉํ•˜์—ฌ ๋ถ€ํ˜ธ ํ˜ผ๋™์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“ž ๋ฌธ์˜ (Contact)

Maintainer: ์†์žฌ๋ฝ (Jaerak Son)
๐Ÿ“ง jr@pitin-ev.com

์ด์Šˆ / ๊ฐœ์„  ์ œ์•ˆ์€ GitHub Issues ๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”.


๋ผ์ด์„ ์Šค

ํŠน๋ณ„ํ•œ ๋ช…์‹œ๊ฐ€ ์—†๋‹ค๋ฉด ํŒจํ‚ค์ง€ ๋‚ด ์†Œ์Šค๋Š” Apache 2.0 ํ˜ธํ™˜ ๋ผ์ด์„ ์Šค(ROS 2 ๊ธฐ๋ณธ ์˜ˆ์‹œ ๊ธฐ๋ฐ˜)๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์— ๋”ฐ๋ผ LICENSE ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

๋ณ€๊ฒฝ ๋กœ๊ทธ ์ œ์•ˆ

ํ–ฅํ›„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ CHANGELOG.rst (ament ํ‘œ์ค€) ์ž‘์„ฑ ๊ถŒ์žฅ.


Happy tracing! ๐Ÿš€

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages