Curieux.JY
  • Post
  • Note
  • Jung Yeon Lee

On this page

  • ํ•ต์‹ฌ ๋น„๊ต (ํ•œ๋ˆˆ์—)
  • Guide
  • ์žฅ๋‹จ์ 
    • Topic ์žฅ๋‹จ์ 
    • Service ์žฅ๋‹จ์ 
    • Action ์žฅ๋‹จ์ 
  • ๊ธฐ์ˆ ์  ๊ณ ๋ ค์‚ฌํ•ญ (์„ฑ๋Šฅยท์‹ ๋ขฐ์„ฑยทQoS ๋“ฑ)
  • ์‹ค๋ฌด ๋””์ž์ธ ํŒจํ„ด & ๊ถŒ์žฅ
  • Example
  • ์‹œ์Šคํ…œ ๊ตฌ์„ฑ์‹œ ์ƒ๊ฐํ•ด๋ณผ ์งˆ๋ฌธ๋“ค

๐Ÿ“ROS2 topic/service/action

ros2
topic
service
action 2025
topic vs. service vs. action
Published

October 15, 2025

  • Basic - Interfaces

  • Topics vs Services vs Actions

  • Topic์€ ๋ฐœํ–‰/๊ตฌ๋…(๋น„๋™๊ธฐ์  ์ŠคํŠธ๋ฆฌ๋ฐ)์— ์ ํ•ฉํ•˜๊ณ , ์ƒํƒœยท์„ผ์„œยท์ง€์†์  ๋ช…๋ น์— ์ฃผ๋กœ ์‚ฌ์šฉ

  • Service๋Š” ์š”์ฒญ-์‘๋‹ต(๋‹จ๋ฐœ์„ฑ RPC)์— ์ ํ•ฉ

  • Action์€ ์žฅ์‹œ๊ฐ„ ์‹คํ–‰๋˜๋Š” ์ž‘์—…(๋ชฉํ‘œ/ํ”ผ๋“œ๋ฐฑ/๊ฒฐ๊ณผ/์ทจ์†Œ)์ด ํ•„์š”ํ•  ๋•Œ ์“ฐ๋Š” ์ƒ์œ„ ์ถ”์ƒ์œผ๋กœ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ํ† ํ”ฝ+์„œ๋น„์Šค ํŒจํ„ด์„ ์‚ฌ์šฉ

ํ•ต์‹ฌ ๋น„๊ต (ํ•œ๋ˆˆ์—)

ํ•ญ๋ชฉ Topic Service Action
ํ†ต์‹ ๋ฐฉ์‹ publish/subscribe (๋น„๋™๊ธฐ, ์ŠคํŠธ๋ฆฌ๋ฐ) request/response (RPC) goal/feedback/result (์ƒํƒœful, ์ทจ์†Œ ๊ฐ€๋Šฅ)
์‚ฌ์šฉ์‚ฌ๋ก€ ์„ผ์„œ ๋ฐ์ดํ„ฐ, ์ƒํƒœ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ, ์ง€์† ๋ช…๋ น (์˜ˆ: cmd_vel) ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ, ๋‹จ๋ฐœ ๋ช…๋ น(์˜ˆ: ์ดˆ๊ธฐํ™”), ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ชฉํ‘œ, ๊ทธ๋ฆฝ ๋™์ž‘(์žฅ์‹œ๊ฐ„), ์šด๋™ ๊ณ„ํš ์‹คํ–‰
ํ”ผ๋“œ๋ฐฑ ์—†์Œ(๋ณ„๋„ ํ† ํ”ฝ์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ) ์‘๋‹ต๋งŒ ์ฃผ๊ธฐ์  ํ”ผ๋“œ๋ฐฑ ์ œ๊ณต ๊ฐ€๋Šฅ
์ทจ์†Œ/์ค‘๋‹จ ๋ณ„๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํ•„์š” ์—†์Œ(์š”์ฒญ ๋‹จ์œ„๋ผ ์ค‘๋‹จ ๊ฐœ๋… ์—†์Œ) ํ‘œ์ค€ ์ทจ์†Œ/์ค‘๋‹จ ์ œ๊ณต
๋‹ค์ค‘๊ตฌ๋…/๋‹ค์ค‘๋ฐœํ–‰ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ง€์›(1:N, N:1) ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„(1:1) ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„(์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ ๊ฐ€๋Šฅ)
QoS ์ œ์–ด ์ƒ์„ธ QoS ์„ค์ • ๊ฐ€๋Šฅ (reliable, transient_local ๋“ฑ) QoS ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‚˜ ์ผ๋ฐ˜์ ์€ ๋‚ฎ์Œ ๋‚ด๋ถ€์ ์œผ๋กœ ํ† ํ”ฝ/์„œ๋น„์Šค ์‚ฌ์šฉ โ†’ QoS ์˜ํ–ฅ ๋ฐ›์Œ
๊ตฌํ˜„ ๋ณต์žก๋„ ๋‚ฎ์Œ ๋‚ฎ์Œ ์•ฝ๊ฐ„ ๋†’์Œ (action ์ธํ„ฐํŽ˜์ด์Šค ํ•„์š”)

Guide

  1. ์ง€์†์ ์ธ ์ŠคํŠธ๋ฆฌ๋ฐ(์‹ค์‹œ๊ฐ„ ์„ผ์„œ, ์ฃผ๊ธฐ์  ์ƒํƒœ, ๋กœ์šฐ๋ ˆ๋ฒจ ์ œ์–ด) โ†’ Topic. ์˜ˆ: LiDAR, ์นด๋ฉ”๋ผ, IMU, ๋กœ๋ด‡์˜ ํ˜„์žฌ ์กฐ์ธํŠธ ์ƒํƒœ, cmd_vel ๊ฐ™์€ ์ฃผ๊ธฐ์  velocity ๋ช…๋ น. ์ด์œ : ์ €์ง€์—ฐ, ๋‹ค์ˆ˜ ๊ตฌ๋…์ž/๋ฐœํ–‰์ž OK, QoS๋กœ ๋‚ด๊ตฌ์„ฑ/์‹ ๋ขฐ์„ฑ ์กฐ์ • ๊ฐ€๋Šฅ.

  2. ๋‹จ๋ฐœ์„ฑ ์š”์ฒญ๊ณผ ์‘๋‹ต(์ฆ‰๊ฐ์ ์ธ ์ฒ˜๋ฆฌ) โ†’ Service. ์˜ˆ: ๋งต ์ดˆ๊ธฐํ™”, ๋กœ๊ทธ ๋‹ค์šด๋กœ๋“œ, ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ/์„ค์ •, ๊ฐ„๋‹จํ•œ ๊ณ„์‚ฐ ์š”์ฒญ. ์ด์œ : ์š”์ฒญ-์‘๋‹ต ํ˜•ํƒœ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ๊ตฌํ˜„์ด ๊ฐ„๋‹จ. ๋™๊ธฐ ํ˜ธ์ถœ์ด ๊ธฐ๋ณธ์ด๋ผ ๋กœ์ง ๋‹จ์ˆœํ™” ๊ฐ€๋Šฅ.

  3. ๋ชฉํ‘œ ๊ธฐ๋ฐ˜์˜ ์žฅ์‹œ๊ฐ„ ์ž‘์—…(์ค‘๊ฐ„ ํ”ผ๋“œ๋ฐฑ ํ•„์š”, ์ทจ์†Œ ๊ฐ€๋Šฅ) โ†’ Action. ์˜ˆ: ์ด๋™ ๋กœ๋ด‡์˜ ๋ชฉํ‘œ ์ง€์ , ํŒ”์˜ ๋ณต์žกํ•œ ํฌ์ฆˆ ํŠธ๋ž˜์ ํ† ๋ฆฌ, ๊ทธ๋ฆฝ/์กฐ์ž‘ ์‹œํ€€์Šค. ์ด์œ : ๋ชฉํ‘œ ์ „์†ก โ†’ ์ฃผ๊ธฐ์  ํ”ผ๋“œ๋ฐฑ(์ง„ํ–‰๋ฅ ) โ†’ ๊ฒฐ๊ณผ/์ƒํƒœ/์ทจ์†Œ ํ๋ฆ„์„ ํ‘œ์ค€ํ™”ํ•จ.

์žฅ๋‹จ์ 

Topic ์žฅ๋‹จ์ 

  • ์žฅ์ 
    • ๋‹จ์ˆœํ•˜๊ณ  ๊ฒฝ๋Ÿ‰. ๋‚ฎ์€ ์˜ค๋ฒ„ํ—ค๋“œ.
    • ๋‹ค์ค‘ ์ˆ˜์‹ ์ž/๋ฐœํ–‰์ž์— ์ ํ•ฉ.
    • QoS๋กœ ์ „์†ก ๋ณด์žฅ/์ผ์‹œ์  ๊ตฌ๋…์ž ๋ณต๊ตฌ(transient_local) ๋“ฑ ์ œ์–ด ๊ฐ€๋Šฅ.
  • ๋‹จ์ 
    • ์š”์ฒญ-์‘๋‹ต, ํ”ผ๋“œ๋ฐฑ, ์ทจ์†Œ ๊ฐ™์€ ํŒจํ„ด์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ(๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Œ).
    • ์ƒํƒœ ์ถ”์ (logic ์ƒํƒœ ๊ธฐ๊ณ„)์ด ํ•„์š”ํ•˜๋ฉด ํ† ํ”ฝ๋งŒ์œผ๋กœ๋Š” ๊ด€๋ฆฌ๊ฐ€ ๋ฒˆ๊ฑฐ๋กœ์›€.
  • Understanding topics

Service ์žฅ๋‹จ์ 

  • ์žฅ์ 
    • ๋™๊ธฐ์ (๋˜๋Š” ๋น„๋™๊ธฐ Future)์œผ๋กœ ๊ฐ„๋‹จํ•œ RPC ํŒจํ„ด ๊ตฌํ˜„ ์‰ฌ์›€.
    • ํ˜ธ์ถœ๊ณผ ์‘๋‹ต์ด ๋ช…ํ™•ํ•ด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ/ํƒ€์ž„์•„์›ƒ ๊ด€๋ฆฌ๊ฐ€ ํŽธํ•จ.
  • ๋‹จ์ 
    • ๊ธด ์‹œ๊ฐ„ ์ž‘์—…์—๋Š” ๋ถ€์ ํ•ฉ(๋ธ”๋กœํ‚น ์œ„ํ—˜, ํด๋ผ์ด์–ธํŠธ ๊ตฌํ˜„ ๋ณต์žก).
    • ํ”ผ๋“œ๋ฐฑ ๋˜๋Š” ์ค‘๊ฐ„ ์ƒํƒœ ์ „์†ก ํ‘œ์ค€ํ™” ์—†์Œ.
  • Understanding servies

Action ์žฅ๋‹จ์ 

  • ์žฅ์ 
    • ์žฅ์‹œ๊ฐ„ ์ž‘์—…์— ์ ํ•ฉ: ๋ชฉํ‘œ, ์ฃผ๊ธฐ์  ํ”ผ๋“œ๋ฐฑ, ์ตœ์ข… ๊ฒฐ๊ณผ, ์ทจ์†Œ๋ฅผ ํ‘œ์ค€ํ™”.
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒํƒœ(accepted, executing, canceled, succeeded ๋“ฑ)๋ฅผ ๊ด€์ฐฐ ๊ฐ€๋Šฅ.
    • ๋‚ด์žฅ๋œ ์ทจ์†Œ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๊ฒฐ๊ณผ ์ฝ”๋“œ๋กœ ์•ˆ์ •์ ์ธ ์ œ์–ด ํ๋ฆ„ ์ œ๊ณต.
  • ๋‹จ์ 
    • ํ† ํ”ฝ/์„œ๋น„์Šค๋ณด๋‹ค ๊ตฌํ˜„ ๋ณต์žก๋„ โ†‘ (์•ก์…˜ ์ •์˜ ํŒŒ์ผ, ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ).
    • ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์–ด์„œ ๋‹จ์ˆœ/์ดˆ์ €์ง€์—ฐ ๋ฉ”์‹œ์ง€์—๋Š” ๋ถˆํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ.
    • QoS์— ์ฃผ์˜: ์•ก์…˜ ๋‚ด๋ถ€ ํ†ต์‹ ์˜ QoS ์„ค์ • ํ•„์š”ํ•˜๋ฉด ๋ณต์žกํ•ด์ง.
  • Understanding actions

๊ธฐ์ˆ ์  ๊ณ ๋ ค์‚ฌํ•ญ (์„ฑ๋Šฅยท์‹ ๋ขฐ์„ฑยทQoS ๋“ฑ)

  • ์ง€์—ฐ(latency): ํ† ํ”ฝ์€ ์„ค๊ณ„์— ๋”ฐ๋ผ ๋งค์šฐ ๋‚ฎ์€ ์ง€์—ฐ์„ ์ค„ ์ˆ˜ ์žˆ์Œ. ์„œ๋น„์Šค/์•ก์…˜์€ RPC ํ๋ฆ„/์ƒํƒœ ๊ด€๋ฆฌ ๋•Œ๋ฌธ์— ํ† ํ”ฝ๋ณด๋‹ค ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ ์กด์žฌ.
  • QoS: ROS2์—์„œ๋Š” ํ† ํ”ฝยท์„œ๋น„์Šคยท์•ก์…˜ ๋ชจ๋‘ QoS๋ฅผ ์„ค์ • ๊ฐ€๋Šฅ(ํŠนํžˆ ํ† ํ”ฝ). ์„ผ์„œ ๊ฐ™์€ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” reliable ๋˜๋Š” transient_local ๊ณ ๋ ค.
  • ์Šค์ผ€์ผ๋ง: ๋‹ค์ˆ˜์˜ ๊ตฌ๋…์ž๊ฐ€ ํ•„์š”ํ•˜๋ฉด ํ† ํ”ฝ์ด ์ž์—ฐ์Šค๋Ÿฝ๋‹ค. ์„œ๋น„์Šค๋Š” 1:1 ํŒจํ„ด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•จ(์„œ๋ฒ„์—์„œ ์Šค๋ ˆ๋“œ/ํ ์ฒ˜๋ฆฌ).
  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ: ์•ก์…˜์€ ๊ฒฐ๊ณผ ์ƒํƒœ๋กœ ์‹คํŒจ/์ทจ์†Œ/ํƒ€์ž„์•„์›ƒ์„ ํ‘œ์ค€ํ™”ํ•ด์„œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์–ด ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๊ตฌ์กฐํ™”์— ์œ ๋ฆฌ.

์‹ค๋ฌด ๋””์ž์ธ ํŒจํ„ด & ๊ถŒ์žฅ

  • ์„ผ์„œ โ†’ ํ† ํ”ฝ
  • ๋กœ์šฐ๋ ˆ๋ฒจ ์ œ์–ด ๋ช…๋ น(์ฃผ๊ธฐ์ ) โ†’ ํ† ํ”ฝ (cmd_vel, joint_commands ๋“ฑ)
  • ๋‹จ๋ฐœ์„ฑ ๋ช…๋ น(์„ค์ •, ์งˆ์˜) โ†’ ์„œ๋น„์Šค
  • ๋ชฉํ‘œ๊ธฐ๋ฐ˜ ์žฅ์‹œ๊ฐ„ ์ž‘์—… โ†’ ์•ก์…˜
  • ํ˜ผํ•ฉ ์‚ฌ์šฉ ๊ถŒ์žฅ: ์˜ˆ) ๋กœ์ปฌ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํ† ํ”ฝ์œผ๋กœ ์ฃผ๊ธฐ์  ์ œ์–ด, ์ƒ์œ„ ์ œ์–ด๊ธฐ๋Š” ์•ก์…˜์œผ๋กœ ๋ชฉํ‘œ ์ „์†ก(์ง„ํ–‰ ํ”ผ๋“œ๋ฐฑ ์ˆ˜์‹ ), ํ•„์š”์‹œ ์„œ๋น„์Šค๋กœ ์„ค์ •/์ฟผ๋ฆฌ.
  • ์ƒํƒœ ์ „ํŒŒ: ์‹œ์Šคํ…œ ์ƒํƒœ๋Š” ํ† ํ”ฝ์œผ๋กœ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ (์˜ˆ: /robot/state) โ†’ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์ด ๊ตฌ๋….

Example

  • Topic: ํผ๋ธ”๋ฆฌ์…” geometry_msgs/Twist ๋กœ 10Hz๋กœ ์†๋„ ๋ฐœํ–‰ โ†’ ๋กœ์ปฌ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ตฌ๋…ํ•ด ๋ชจํ„ฐ ์ œ์–ด.
  • Service: /reset_odometry ํ˜ธ์ถœ โ†’ ์„œ๋ฒ„๊ฐ€ ์ฆ‰์‹œ odom reset ํ›„ ์„ฑ๊ณต ์‘๋‹ต ๋ฐ˜ํ™˜.
  • Action: /navigate_to goal(๋ชฉํ‘œ ์ขŒํ‘œ) ์ „์†ก โ†’ ์ฃผ๊ธฐ์  ํ”ผ๋“œ๋ฐฑ(๊ฑฐ๋ฆฌ/์ง„ํ–‰๋ฅ ) ์ˆ˜์‹  โ†’ ๋„์ค‘์— ์ทจ์†Œ ๊ฐ€๋Šฅ โ†’ ์™„๋ฃŒ ์‹œ result(์„ฑ๊ณต/์‹คํŒจ ์ฝ”๋“œ).

์‹œ์Šคํ…œ ๊ตฌ์„ฑ์‹œ ์ƒ๊ฐํ•ด๋ณผ ์งˆ๋ฌธ๋“ค

  1. ์ž‘์—…์ด ์ง€์†์ /์ŠคํŠธ๋ฆฌ๋ฐ์ธ๊ฐ€? โ†’ Topic
  2. ์ž‘์—…์ด ๋‹จ๋ฐœ์„ฑ ์š”์ฒญ-์‘๋‹ต์ธ๊ฐ€? โ†’ Service
  3. ์ž‘์—…์ด ๋ชฉํ‘œ ๊ธฐ๋ฐ˜/์žฅ์‹œ๊ฐ„/ํ”ผ๋“œ๋ฐฑยท์ทจ์†Œ ํ•„์š”์ธ๊ฐ€? โ†’ Action

๋Œ€๋ถ€๋ถ„ ์‹œ์Šคํ…œ์€ ํ† ํ”ฝ + ์•ก์…˜ + ์„œ๋น„์Šค๋ฅผ ํ˜ผํ•ฉํ•ด์„œ ์”๋‹ˆ๋‹ค. ํ† ํ”ฝ์€ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ(์„ผ์„œ/์ƒํƒœ), ์„œ๋น„์Šค๋Š” ๊ตฌ์„ฑยท์„ค์ •ยท์ฟผ๋ฆฌ, ์•ก์…˜์€ ๋ณต์žกํ•œ ๋ชฉํ‘œ ์‹คํ–‰ ํ๋ฆ„์„ ๋งก๊ธฐ๋ฉด ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๊น”๋”ํ•ด์ง‘๋‹ˆ๋‹ค.


  1. Topic (ํ† ํ”ฝ) โ€” ๊ฒŒ์‹œํŒ / ๋ฐฉ์†ก ๐ŸŽ™๏ธ
    • ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚ด์šฉ์„ ๊ณ„์† ์จ ๋ถ™์ด๋Š” ๊ฒŒ์‹œํŒ(๋˜๋Š” ๋ผ๋””์˜ค ๋ฐฉ์†ก)์ด์—์š”.
    • ์–ด๋–ป๊ฒŒ ์“ฐ๋‚˜์š”?: ํ•œ ์‚ฌ๋žŒ์ด ๊ฒŒ์‹œํŒ์— ๊ธ€(๋ฉ”์‹œ์ง€)์„ ๋ถ™์ด๋ฉด, ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ์™€์„œ ๊ทธ ๊ธ€์„ ์ฝ์„ ์ˆ˜ ์žˆ์–ด์š”. ๊ธ€์„ ๋ถ™์ด๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ฐ€ ์ฝ๋Š”์ง€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„์š”.
    • ์–ธ์ œ ์“ฐ๋ฉด ์ข‹์„๊นŒ?: ์นด๋ฉ”๋ผ๊ฐ€ ๋งค๋ฒˆ ์‚ฌ์ง„์„ ๋ณด๋‚ด๊ฑฐ๋‚˜(์˜ˆ: ๋งค์ดˆ ํ•œ ์žฅ), ์„ผ์„œ๊ฐ€ ๊ณ„์† ๊ฐ’(์†๋„, ์˜จ๋„)์„ ๋ณด๋‚ด์•ผ ํ•  ๋•Œ.
    • ์˜ˆ์‹œ
      • ๋กœ๋ด‡ ์นด๋ฉ”๋ผ๊ฐ€ ๊ณ„์† ์‚ฌ์ง„์„ ์˜ฌ๋ฆฌ๋Š” ๊ณณ: /camera/image
      • ๋ฐ”ํ€ด ์†๋„๋ฅผ ๊ณ„์† ์•Œ๋ ค์ฃผ๋Š” ๊ณณ: /cmd_vel
  2. Service (์„œ๋น„์Šค) โ€” ์ „ํ™”๋กœ ๋ฌผ์–ด๋ณด๊ธฐ โ˜Ž๏ธ
    • ์ „ํ™”๋กœ ์งˆ๋ฌธํ•˜๊ณ  ๋ฐ”๋กœ ๋‹ต์„ ๋ฐ›๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”.
    • ์–ด๋–ป๊ฒŒ ์“ฐ๋‚˜์š”?: ๋‚ด๊ฐ€ โ€œ์—ฐํ•„ ์žˆ์–ด?โ€๋ผ๊ณ  ๋ฌผ์–ด๋ณด๋ฉด, ์ƒ๋Œ€๊ฐ€ โ€œ์‘, ์—ฌ๊ธฐ ์žˆ์–ดโ€๋ผ๊ณ  ๋ฐ”๋กœ ๋Œ€๋‹ตํ•ด์š”. ์š”์ฒญ(request) โ†’ ์‘๋‹ต(response) ํ•œ ๋ฒˆ์— ๋๋‚˜์š”.
    • ์–ธ์ œ ์“ฐ๋ฉด ์ข‹์„๊นŒ?: ์ฆ‰์‹œ ๋‹ต์„ ๋ฐ›์•„์•ผ ํ•  ๋•Œ. ์˜ˆ: โ€œ์ง€๊ธˆ ์œ„์น˜ ์•Œ๋ ค์ค˜โ€, โ€œ๋งต ๋ฆฌ์…‹ํ•ด์ค„๋ž˜?โ€
    • ์˜ˆ์‹œ
      • /reset_odometry ๋ผ๋Š” ์„œ๋น„์Šค์— ์š”์ฒญํ•˜๋ฉด โ€œ๋ฆฌ์…‹ ์™„๋ฃŒโ€๋ผ๊ณ  ๋ฐ”๋กœ ์‘๋‹ต.
  3. Action (์•ก์…˜) โ€” ์‹ฌ๋ถ€๋ฆ„ ์‹œํ‚ค๊ธฐ + ์ค‘๊ฐ„ ์†Œ์‹ ๋ฐ›๊ธฐ ๐Ÿง‘โ€โœˆ๏ธ๐Ÿ“ฃ
    • ์นœ๊ตฌ์—๊ฒŒ ๊ธด ์‹ฌ๋ถ€๋ฆ„์„ ์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”. โ€œ๋ถ€์—Œ์—์„œ ์ฃผ์Šค ๊ฐ€์ ธ์™€โ€๋ผ๊ณ  ์‹œํ‚ค๋ฉด, ์นœ๊ตฌ๋Š” ๊ฐ€๋‹ค๊ฐ€ ์ค‘๊ฐ„์— ์ „ํ™”๋กœ โ€œ์ง€๊ธˆ ๋ถ€์—Œ์— ์žˆ์–ด์š”โ€, โ€œ๊ฑฐ์˜ ๋‹ค ์™”์–ด์š”โ€ ๊ฐ™์€ ์†Œ์‹์„ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋ฆฌ๊ณ  ๋๋‚˜๋ฉด โ€œ๋๋‚ฌ์–ด์š”โ€๋ผ๊ณ  ๋งํ•ด์š”. ํ•„์š”ํ•˜๋ฉด ์‹ฌ๋ถ€๋ฆ„์„ ๊ทธ๋งŒ๋‘๋ผ๊ณ (์ทจ์†Œ) ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.
    • ์–ด๋–ป๊ฒŒ ์“ฐ๋‚˜์š”?: ๋ชฉํ‘œ(goal)๋ฅผ ์ฃผ๋ฉด ์„œ๋ฒ„๊ฐ€ ๊ทธ๊ฑธ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ์ค‘๊ฐ„ ํ”ผ๋“œ๋ฐฑ(feedback) ์„ ์•Œ๋ ค์ฃผ๊ณ , ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ(result) ๋ฅผ ๋ณด๋‚ด์š”.
    • ์–ธ์ œ ์“ฐ๋ฉด ์ข‹์„๊นŒ?: ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ผ์ด๋‚˜ ์ค‘๊ฐ„ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์•Œ๊ณ  ์‹ถ์„ ๋•Œ. ์˜ˆ: โ€œ์ง€๊ธˆ ์ด ์œ„์น˜๊นŒ์ง€ ์ด๋™ํ•ดโ€, โ€œ๊ทธ ๋ฌผ๊ฑด์„ ์ง‘์–ด ๋“ค์–ดโ€
    • ์˜ˆ์‹œ
      • /arm/move_to_pose ์•ก์…˜: ๋ชฉํ‘œ ์œ„์น˜๋กœ ๊ฐ€๋Š” ๋™์•ˆ โ€œ์ง€๊ธˆ ์—ฌ๊ธฐ๊นŒ์ง€ ์™”์–ด์š”(ํ”ผ๋“œ๋ฐฑ)โ€, ๋๋‚˜๋ฉด โ€œ์„ฑ๊ณต/์‹คํŒจ(๊ฒฐ๊ณผ)โ€.
๋ฐฉ์‹ ๋น„์œ  ์–ธ์ œ ์“ฐ๋‚˜
Topic ๊ฒŒ์‹œํŒ/๋ฐฉ์†ก ๊ณ„์† ํ˜๋Ÿฌ์˜ค๋Š” ๋ฐ์ดํ„ฐ(์นด๋ฉ”๋ผ, ์„ผ์„œ)
Service ์ „ํ™” ํ•œ ๋ฒˆ ๋ฌผ์–ด๋ณด๊ณ  ๋ฐ”๋กœ ๋‹ต๋ฐ›์„ ๋•Œ
Action ๊ธด ์‹ฌ๋ถ€๋ฆ„ + ์ค‘๊ฐ„๋ณด๊ณ  ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…, ์ง„ํ–‰์ƒํ™ฉ/์ทจ์†Œ ํ•„์š”ํ•  ๋•Œ
  1. ์นด๋ฉ”๋ผ๊ฐ€ ๋งค์ดˆ ์‚ฌ์ง„์„ ์˜ฌ๋ ค์š” โ†’ Topic (/camera/image)
  2. ๋กœ๋ด‡์—๊ฒŒ โ€œ๋งต ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•ดโ€๋ผ๊ณ  ๋ฐ”๋กœ ์š”์ฒญ โ†’ Service (/reset_map)
  3. ๋กœ๋ด‡์—๊ฒŒ โ€œ์ € ์ƒ์ž ๊ฐ€์ ธ์™€โ€๋ผ๊ณ  ์‹œํ‚ค๋ฉด โ†’ Action (/pick_box)
    • ๋กœ๋ด‡: โ€œ์ถœ๋ฐœํ–ˆ์–ด์š”(ํ”ผ๋“œ๋ฐฑ)โ€, โ€œ์ง‘์–ด ๋“ค์—ˆ์–ด์š”(ํ”ผ๋“œ๋ฐฑ)โ€, โ€œ์™„๋ฃŒ(๊ฒฐ๊ณผ)โ€
QoS ์ฐธ๊ณ 

ํ•œ ์ค„ ์š”์•ฝ

QoS๋Š” ๋ฐœํ–‰์ž(publisher)์™€ ๊ตฌ๋…์ž(subscriber)๊ฐ€ โ€œ์–ด๋–ป๊ฒŒโ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„์ง€ ์•ฝ์†ํ•˜๋Š” ์„ค์ •์ด์—์š”. (์‹ ๋ขฐ์„ฑ, ๋ณด๊ด€, ํ ํฌ๊ธฐ, ๋งŒ๋ฃŒ์‹œ๊ฐ„ ๋“ฑ) ์ด ์„ค์ •์œผ๋กœ ๋„คํŠธ์›Œํฌ ์ƒํƒœ ยท ์ง€์—ฐ ยท ๋Œ€์—ญํญ ยท late-joiner(๋‚˜์ค‘์— ๊ตฌ๋…์„ ์‹œ์ž‘ํ•œ ๋…ธ๋“œ) ์ฒ˜๋ฆฌ๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์–ด์š”.

  • ํ† ํ”ฝ์„ ํŽธ์ง€๋กœ ๋ณด๋ฉด, QoS๋Š” โ€œํŽธ์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด๋‚ผ๊นŒ/๋ณด์กดํ• ๊นŒโ€์— ๋Œ€ํ•œ ์•ฝ์†์ด์—์š”.
    • reliable = ๋“ฑ๊ธฐ์šฐํŽธ: ๋ฐ˜๋“œ์‹œ ๋ฐฐ๋‹ฌํ•˜๋ ค ์‹œ๋„(์žฌ์ „์†ก).
    • best_effort = ์—ฝ์„œ/ํ†ต์ƒ์šฐํŽธ: ํ•œ ๋ฒˆ๋งŒ ๋˜์ง€๊ณ  ๋(๋น ๋ฅด์ง€๋งŒ ๋ถ„์‹ค๋  ์ˆ˜ ์žˆ์Œ).
    • transient_local = ์šฐ์ฒดํ†ต์— ๋ณด๊ด€: ๋‚˜์ค‘์— ์™€๋„ ์šฐ์ฒดํ†ต์—์„œ ํŽธ์ง€๋ฅผ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Œ(๋ผ์นญ๊ณผ ์œ ์‚ฌ).

์ฃผ์š” QoS ์˜ต์…˜

  1. Reliability(์‹ ๋ขฐ์„ฑ)
    • RELIABLE : ๋ฉ”์‹œ์ง€ ์†์‹ค์„ ์ค„์ด๋ ค ์žฌ์ „์†กํ•จ(์ค‘์š”ํ•œ ๋ช…๋ น/๊ฒฐ๊ณผ์— ์‚ฌ์šฉ).
    • BEST_EFFORT : ์žฌ์ „์†ก ์•ˆ ํ•จ(์„ผ์„œ ์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ™์ด ๋น ๋ฅธ ๊ฐฑ์‹ ์ด ์ค‘์š”ํ•˜๊ณ  ์ผ๋ถ€ ์†์‹ค ํ—ˆ์šฉ๋  ๋•Œ).
  2. Durability(๋‚ด๊ตฌ์„ฑ)
    • VOLATILE : ๊ตฌ๋…์ž๊ฐ€ ์—†์œผ๋ฉด ๋ฉ”์‹œ์ง€ ๋ฒ„๋ ค์ง(๊ธฐ๋ณธ).
    • TRANSIENT_LOCAL : ์ตœ๊ทผ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๊ด€ํ•ด์„œ ์ƒˆ๋กœ ๊ตฌ๋…ํ•ด๋„ ๋งˆ์ง€๋ง‰ ๋ฉ”์‹œ์ง€ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ (ROS1์˜ latching๊ณผ ์œ ์‚ฌ).
  3. History & Depth(ํžˆ์Šคํ† ๋ฆฌ/ํ ํฌ๊ธฐ)
    • KEEP_LAST + depth = N: ์ตœ์‹  N๊ฐœ๋งŒ ๋ณด๊ด€.
    • KEEP_ALL: ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๊ด€(๋ฉ”๋ชจ๋ฆฌ/๋ฆฌ์†Œ์Šค ์ฃผ์˜).
  4. Deadline
    • ๋ฐœํ–‰์ž๊ฐ€ ์ •ํ•œ ์ฃผ๊ธฐ(์˜ˆ: 0.1s) ์•ˆ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์•ผ ํ•˜๋Š”์ง€ ์•ฝ์†. ๊ธฐ๊ฐ„ ๋„˜๊ธฐ๋ฉด ์•Œ๋ฆผ/๊ฒฝ๊ณ  ๊ฐ€๋Šฅ.
  5. Liveliness(์ƒ์กด์„ฑ ํ™•์ธ)
    • ๋ฐœํ–‰์ž๊ฐ€ ์‚ด์•„์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์„ค์ •. (์ž๋™/์ˆ˜๋™ ๋ฐฉ์‹ ๋“ฑ)
  6. Lifespan(์ˆ˜๋ช…)
    • ๋ฉ”์‹œ์ง€๊ฐ€ โ€œ์œ ํšจํ•œ ์‹œ๊ฐ„โ€์„ ๊ฐ€์ง โ€” ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ํ๊ธฐ. (์˜ˆ: ์ด๋ฒคํŠธ์„ฑ ์•Œ๋ฆผ)

์‹ค๋ฌด ์˜ˆ์‹œ โ€” ์–ด๋–ค ํ† ํ”ฝ์— ์–ด๋–ค ์„ค์ •์„ ์“ธ๊นŒ

(vision, arm, hand ๊ธฐ์ค€)

  • Camera ์ด๋ฏธ์ง€ (/camera/image_raw)
    • ๊ถŒ์žฅ: BEST_EFFORT, KEEP_LAST depth 5
    • ์ด์œ : ์ด๋ฏธ์ง€๋Š” ๋งค์šฐ ์ž์ฃผ ์˜ค๊ณ , ์˜ค๋ž˜๋œ ์ด๋ฏธ์ง€๋Š” ์“ธ๋ชจ๊ฐ€ ์—†์œผ๋ฉฐ ์•ฝ๊ฐ„์˜ ํ”„๋ ˆ์ž„ ์†์‹ค์€ ๊ดœ์ฐฎ์Œ. ๋Œ€์—ญํญ ์ ˆ์•ฝ.
  • Detection ๊ฒฐ๊ณผ (/vision/detections)
    • ๊ถŒ์žฅ: RELIABLE, KEEP_LAST depth 5, ๋˜๋Š” TRANSIENT_LOCAL(late-joiner์—๊ฒŒ ์ตœ์‹  ๊ฒฐ๊ณผ ์ œ๊ณต)
    • ์ด์œ : ๊ฒ€์ถœ ๊ฒฐ๊ณผ๋Š” ๋†“์น˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด ์‹ ๋ขฐ์„ฑ ํ•„์š”. ๋‹ค๋งŒ ๋นˆ๋„๋Š” ๋‚ฎ์Œ.
  • Arm/Hand ๋ช…๋ น (/arm/move_to_pose ์•ก์…˜ ๋‚ด๋ถ€ ํ† ํ”ฝ ๋˜๋Š” /allegro_hand_position_controller_r/commands)
    • ๊ถŒ์žฅ: RELIABLE, KEEP_LAST depth 1~10
    • ์ด์œ : ๋ช…๋ น ์†์‹ค์€ ์œ„ํ—˜ํ•˜๋ฏ€๋กœ ์žฌ์ „์†ก ๋ณด์žฅ ํ•„์š”.
  • Joint state (/joint_states)
    • ๊ถŒ์žฅ: RELIABLE, KEEP_LAST depth 10
    • ์ด์œ : ์ƒํƒœ ์ •๋ณด๋ฅผ ์ •ํ™•ํžˆ ๋ฐ›์•„์•ผ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ.
  • ์ง„๋‹จ/๋กœ๊ทธ ํ† ํ”ฝ
    • ๊ถŒ์žฅ: BEST_EFFORT ๋˜๋Š” RELIABLE (use-case์— ๋”ฐ๋ผ)

QoS๊ฐ€ ์‹ค์ œ๋กœ ๋ฐ”๊ฟ”๋†“๋Š” ๊ฒƒ (๊ฒฐ๊ณผ)

  • BEST_EFFORT โ†’ ๋” ๋‚ฎ์€ ์ง€์—ฐ, ํŒจํ‚ท ์†์‹ค ํ—ˆ์šฉ. ๋„คํŠธ์›Œํฌ๊ฐ€ ํ˜ผ์žกํ•  ๋•Œ ๋ฉ”์‹œ์ง€ ๋น ์ง.
  • RELIABLE โ†’ ์žฌ์ „์†ก์œผ๋กœ ์‹ ๋ขฐ์„ฑ โ†‘, ํ•˜์ง€๋งŒ ๋„คํŠธ์›Œํฌ/์ง€์—ฐยท์˜ค๋ฒ„ํ—ค๋“œ โ†‘.
  • TRANSIENT_LOCAL โ†’ ์ƒˆ๋กœ ๊ตฌ๋…ํ•ด๋„ ์ตœ๊ทผ ๋ฉ”์‹œ์ง€ ํ™•๋ณด ๊ฐ€๋Šฅ(์˜ˆ: ์ƒํƒœ/์„ค์ •).
  • KEEP_ALL โ†’ ๋ฉ”๋ชจ๋ฆฌยท๋””์Šคํฌ ๋ถ€๋‹ด ์ปค์งˆ ์ˆ˜ ์žˆ์Œ(์ฃผ์˜).

๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ์˜ˆ (rclpy)

from rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSHistoryPolicy

# ์˜ˆ: ์นด๋ฉ”๋ผ ํ† ํ”ฝ์šฉ QoS
camera_qos = QoSProfile(
    reliability=QoSReliabilityPolicy.BEST_EFFORT,
    history=QoSHistoryPolicy.KEEP_LAST,
    depth=5
)

# ์˜ˆ: ์ค‘์š”ํ•œ ๋ช…๋ น ํ† ํ”ฝ์šฉ QoS
cmd_qos = QoSProfile(
    reliability=QoSReliabilityPolicy.RELIABLE,
    history=QoSHistoryPolicy.KEEP_LAST,
    depth=10
)

๊ทธ๋ฆฌ๊ณ  ํผ๋ธ”๋ฆฌ์…”/์„œ๋ธŒ์Šคํฌ๋ผ์ด๋ฒ„ ์ƒ์„ฑ ์‹œ ์ด QoSProfile์„ ๋„˜๊ฒจ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์–ธ์ œ QoS๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ• ๊นŒ? ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ถˆ์•ˆ์ •ํ•˜๊ณ  ์ค‘์š”ํ•œ ๋ฉ”์‹œ์ง€๋ฉด โ†’ RELIABLE.
  • ๋ฉ”์‹œ์ง€๊ฐ€ ์‹ค์‹œ๊ฐ„ยท์ž์ฃผ ๊ฐฑ์‹ ๋˜๊ณ  ์˜ค๋ž˜๋œ ๋ฉ”์‹œ์ง€๋Š” ํ•„์š”์—†๋‹ค๋ฉด โ†’ BEST_EFFORT.
  • ์–ด๋–ค ํ† ํ”ฝ์€ ๋‚˜์ค‘์— ์‹œ์ž‘ํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์ตœ๊ทผ ์ƒํƒœ๋ฅผ ๊ผญ ๋ฐ›์•„์•ผ ํ•œ๋‹ค๋ฉด โ†’ TRANSIENT_LOCAL.
  • ๋ฉ”๋ชจ๋ฆฌ/๋Œ€์—ญํญ ํ•œ๊ณ„๊ฐ€ ๊ฑฑ์ •๋˜๋ฉด โ†’ history/depth๋ฅผ ๋‚ฎ์ถฐ๋ผ.

๊ฐ„๋‹จ ์š”์•ฝ (ํ‘œ)

๋ชฉ์  ๊ถŒ์žฅ QoS ์„ค์ •
์นด๋ฉ”๋ผ/์ด๋ฏธ์ง€ ์ŠคํŠธ๋ฆฌ๋ฐ BEST_EFFORT, KEEP_LAST, depth=3~10
์„ผ์„œ/์ƒํƒœ (์ค‘์š”) RELIABLE, KEEP_LAST, depth=5~20
์ œ์–ด ๋ช…๋ น(์ค‘์š”) RELIABLE, KEEP_LAST, depth=1~10
์ดˆ๊ธฐ ์ƒํƒœ ์ „๋‹ฌ(๋‚˜์ค‘ ๊ฐ€์ž…์ž ํ•„์š”) TRANSIENT_LOCAL

Copyright 2024, Jung Yeon Lee