ROS2&MQTT

What is ROS2?

๋ฐ๋ถ€์žฅ 2025. 3. 22. 13:31
๋ถ€๊ฐ€์„ค๋ช…์€ ํŽ˜์ด์ง€ ์ตœํ•˜๋‹จ์— ์ •๋ฆฌํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค (*ํ‘œ์‹œ)

[๊ธฐ๋ณธ๊ฐœ๋…]

ROS2 (Robot Operating System 2)๋Š” ๋กœ๋ด‡ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ*์ด์ž ๋ฏธ๋“ค์›จ์–ด*์ด๋‹ค.
๋ง ๊ทธ๋Œ€๋กœ "์šด์˜์ฒด์ œ(OS)"์ฒ˜๋Ÿผ, ๋กœ๋ด‡์„ ๊ตฌ์„ฑํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(์„ผ์„œ, ๋ชจํ„ฐ, ์ธ์‹ ๋“ฑ)์„ ๋ชจ๋“ˆํ™”*ํ•˜๊ณ , ์ด๋“ค์ด ํ†ต์‹ ํ•˜๊ณ  ํ˜‘๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

[์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ]

ROS2๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

๐Ÿ“Œ  Node

  • ํ•˜๋‚˜์˜ ๋…๋ฆฝ์ ์ธ ์‹คํ–‰ ๋‹จ์œ„ (ํ”„๋กœ์„ธ์Šค)
  • ์˜ˆ: ์นด๋ฉ”๋ผ ๋…ธ๋“œ, ๋ชจํ„ฐ ์ œ์–ด ๋…ธ๋“œ

๐Ÿ“Œ  Topic

  • Pub/Sub ๊ตฌ์กฐ*์˜ ๋น„๋™๊ธฐ* ํ†ต์‹  ์ˆ˜๋‹จ
  • ์˜ˆ: ์นด๋ฉ”๋ผ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ publish → ์ธ์‹ ๋…ธ๋“œ๊ฐ€ subscribe

๐Ÿ“Œ  Service

  • ์š”์ฒญ(request)๊ณผ ์‘๋‹ต(response)์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋™๊ธฐ์‹* ํ†ต์‹ 
  • ์˜ˆ: ํ˜„์žฌ ์œ„์น˜๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‘๋‹ต ๋ฐ›๊ธฐ

๐Ÿ“Œ  Action

  • ์žฅ์‹œ๊ฐ„ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ์œ„ํ•œ ํ†ต์‹  ๋ฐฉ์‹ (์š”์ฒญ → ์ง„ํ–‰ ์ƒํ™ฉ → ์™„๋ฃŒ ์—ฌ๋ถ€ ํ”ผ๋“œ๋ฐฑ)

โœ”๏ธ ์™œ ํ•„์š”ํ•œ๊ฐ€?

  • ROS2์˜ Service๋Š” ์š”์ฒญ-์‘๋‹ต ๋ฐฉ์‹์ด์ง€๋งŒ, ์š”์ฒญํ•œ ๋™์•ˆ ์‘๋‹ต์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ค ์ž‘์—…์€ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฑฐ๋‚˜ ์ค‘๊ฐ„์— ์ทจ์†Œํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Œ
    • ์˜ˆ: ๋กœ๋ด‡ ํŒ”์ด ๋ชฉํ‘œ ์œ„์น˜๊นŒ์ง€ ์ฒœ์ฒœํžˆ ์›€์ง์ด๋Š” ์ž‘์—…
    • ์˜ˆ: ์ž์œจ์ฃผํ–‰์ฐจ๊ฐ€ ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ ์ถ”์ 

โœ”๏ธ Action์˜ ๊ตฌ์กฐ

  1. Goal ์š”์ฒญ: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž‘์—… ์š”์ฒญ์„ ๋ณด๋ƒ„
  2. Feedback ์ „์†ก: ์„œ๋ฒ„๊ฐ€ ์ž‘์—… ์ง„ํ–‰ ์ƒํ™ฉ์„ ๊ณ„์† ์ „๋‹ฌ
  3. Result ์‘๋‹ต: ์ž‘์—…์ด ๋๋‚˜๋ฉด ์ตœ์ข… ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
  4. Cancel ์š”์ฒญ ๊ฐ€๋Šฅ: ์ค‘๊ฐ„์— ์ž‘์—… ์ทจ์†Œ๋„ ๊ฐ€๋Šฅ

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด?

“๋ฐฐ๋‹ฌ ์š”์ฒญ”์„ ๋„ฃ์œผ๋ฉด,
์ค‘๊ฐ„์— “๋ฐฐ๋‹ฌ ์ค€๋น„ ์ค‘”, “์ด๋™ ์ค‘” ๊ฐ™์€ ์ƒํƒœ๋ฅผ ์•Œ๋ ค์ฃผ๊ณ ,
์ตœ์ข…์ ์œผ๋กœ “๋„์ฐฉ ์™„๋ฃŒ”๋ผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ฃผ๋Š” ๊ตฌ์กฐ์ด๋‹ค

๐Ÿ“Œ  Parameter

  • ๋…ธ๋“œ์˜ ๋™์ž‘ ์„ค์ •๊ฐ’ (๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)

โœ”๏ธ ์™œ ํ•„์š”ํ•œ๊ฐ€?

  • ์–ด๋–ค ๋…ธ๋“œ๋Š” ๋™์ž‘ ์กฐ๊ฑด์ด๋‚˜ ํ™˜๊ฒฝ๊ฐ’์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๊ฐ’(ํŒŒ๋ผ๋ฏธํ„ฐ)์„ ๋ฐ›์Œ
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’์„ ์™ธ๋ถ€์—์„œ ์„ค์ • ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ:
    • ๋กœ๋ด‡์˜ ์ตœ๋Œ€ ์†๋„
    • ์„ผ์„œ ์ƒ˜ํ”Œ๋ง ์ฃผ๊ธฐ
    • ํŠน์ • ๋™์ž‘์„ ์ผœ๊ณ  ๋„๋Š” ํ”Œ๋ž˜๊ทธ

โœ”๏ธ ์ฃผ์š” ํŠน์ง•

  • ๋…ธ๋“œ ์‹คํ–‰ ์ „์— ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์‹คํ–‰ ์ค‘์—๋„ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • ros2 param ๋ช…๋ น์–ด๋กœ ์™ธ๋ถ€์—์„œ ํ™•์ธ ๋ฐ ์ˆ˜์ • ๊ฐ€๋Šฅ
ros2 param list                # ํ˜„์žฌ ๋…ธ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชฉ๋ก
ros2 param get /my_node speed  # ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’ ์กฐํšŒ
ros2 param set /my_node speed 1.2  # ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’ ์„ค์ •

๐Ÿ“Œ  Launch

  • ๋…ธ๋“œ๋“ค์„ ํ•œ๋ฒˆ์— ์‹คํ–‰ํ•˜๋Š” ์ž๋™ํ™” ๋„๊ตฌ

โœ”๏ธ ์™œ ํ•„์š”ํ•œ๊ฐ€?

  • ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์Œ
    • ์นด๋ฉ”๋ผ ๋…ธ๋“œ, ์ธ์‹ ๋…ธ๋“œ, ์ œ์–ด ๋…ธ๋“œ, ์‹œ๊ฐํ™” ๋…ธ๋“œ ๋“ฑ...
  • ์ด๊ฑธ ๋งค๋ฒˆ ํ„ฐ๋ฏธ๋„์—์„œ ํ•˜๋‚˜์”ฉ ์‹คํ–‰ํ•˜๋Š” ๊ฑด ๋น„ํšจ์œจ์ ์ด๋‹ค.
  • ๊ทธ๋ž˜์„œ ํ•„์š”ํ•œ ๊ฒŒ → Launch ์‹œ์Šคํ…œ

โœ”๏ธ ๊ธฐ๋Šฅ

  • ์—ฌ๋Ÿฌ ๋…ธ๋“œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์‹คํ–‰
  • ๋…ธ๋“œ ๊ฐ„ ์˜์กด์„ฑ, ์‹คํ–‰ ์ˆœ์„œ, ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •๋„ ํ•จ๊ป˜ ์ง€์ • ๊ฐ€๋Šฅ
  • ROS2์—์„œ๋Š” Python ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜์˜ launch ํŒŒ์ผ์„ ์‚ฌ์šฉ
# ์˜ˆ์‹œ: launch/camera_and_control.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(package='my_camera_pkg', executable='camera_node', name='cam'),
        Node(package='my_control_pkg', executable='control_node', name='ctrl'),
    ])

[ROS2์˜ ํ†ต์‹  ๊ตฌ์กฐ]

ROS2๋Š” DDS(Data Distribution Service)* ๊ธฐ๋ฐ˜์˜ ํ†ต์‹  ๋ฏธ๋“ค์›จ์–ด*๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ“Œ ํŠน์ง•:

  • ๋…ธ๋“œ ๊ฐ„ Peer-to-Peer ํ†ต์‹ *
  • ์ค‘์•™ ๋ธŒ๋กœ์ปค ์—†์ด ์ž๋™ Discovery (๋ฐœ๊ฒฌ) ๊ธฐ๋Šฅ
  • ๋‹ค์–‘ํ•œ QoS ์ •์ฑ…* ์ง€์›
    • ์˜ˆ: ์‹ ๋ขฐ์„ฑ, ์ง€์—ฐ ์‹œ๊ฐ„, ์ง€์†์„ฑ ๋“ฑ ์กฐ์ • ๊ฐ€๋Šฅ
  • UDP, TCP* ๋ชจ๋‘ ์ง€์› → ์œ ์—ฐํ•œ ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ํ™˜๊ฒฝ ๊ตฌ์ถ• ๊ฐ€๋Šฅ

[์ค‘์•™ ๋ธŒ๋กœ์ปค ์—†์ด ์ž๋™ Discovery (๋ฐœ๊ฒฌ) ๊ธฐ๋Šฅ์ด๋ž€?]

โœ… 1. ๋จผ์ €, ์ค‘์•™ ๋ธŒ๋กœ์ปค๊ฐ€ ์žˆ๋‹ค๋ฉด? (MQTT ๊ตฌ์กฐ ์˜ˆ์‹œ)

  • MQTT์—์„œ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ๋ธŒ๋กœ์ปค(Broker)๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค.
    • ๋ชจ๋“  Publisher์™€ Subscriber๋Š” ๋ธŒ๋กœ์ปค๋ฅผ ๊ฑฐ์ณ์„œ๋งŒ ํ†ต์‹  ๊ฐ€๋Šฅ
  • ์˜ˆ: Mosquitto, EMQX, HiveMQ ๊ฐ™์€ MQTT ๋ธŒ๋กœ์ปค

๐Ÿ“Œ ์žฅ์ : ์ค‘์•™์—์„œ ํ†ต์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ•จ
๐Ÿ“Œ ๋‹จ์ : ๋ธŒ๋กœ์ปค๊ฐ€ ์ฃฝ์œผ๋ฉด ์ „์ฒด ํ†ต์‹  ๋ถˆ๊ฐ€ (Single Point of Failure)

 

โœ… 2. ROS2๋Š” ์ค‘์•™ ๋ธŒ๋กœ์ปค๊ฐ€ ์—†๋‹ค!

  • ROS2๋Š” DDS ๊ธฐ๋ฐ˜ Peer-to-Peer ๊ตฌ์กฐ๋ผ์„œ, ๋…ธ๋“œ๋“ค์ด ์„œ๋กœ ์ง์ ‘ ์—ฐ๊ฒฐ๋œ๋‹ค
  • ๊ทธ๋Ÿผ "์„œ๋กœ๋ฅผ ์–ด๋–ป๊ฒŒ ์•Œ์•„๋ด?" → ๋ฐ”๋กœ ์ž๋™ Discovery ๊ธฐ๋Šฅ์ด ๊ทธ๊ฑธ ํ•ด๊ฒฐํ•ด์คŒ.

 

โœ… 3. ์ž๋™ Discovery ๊ธฐ๋Šฅ์ด๋ž€?

ROS2 ๋…ธ๋“œ๋“ค์ด ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ์ƒ์— ๋‚˜ํƒ€๋‚˜๊ธฐ๋งŒ ํ•˜๋ฉด,
์„œ๋กœ๋ฅผ ์ž๋™์œผ๋กœ ๋ฐœ๊ฒฌํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ๋Šฅ

โœ” ์ž‘๋™ ๋ฐฉ์‹ (๊ฐ„๋‹จ ํ๋ฆ„)

  1. ๋…ธ๋“œ A๊ฐ€ ์‹คํ–‰๋จ → “๋‚˜๋Š” ์ด๋Ÿฐ ํ† ํ”ฝ์„ publishํ•  ๊ฑฐ์•ผ!” ๋ผ๊ณ  ๋„คํŠธ์›Œํฌ์— ์•Œ๋ฆผ
  2. ๋…ธ๋“œ B๊ฐ€ ์‹คํ–‰๋จ → “๋‚˜๋Š” ์ด ํ† ํ”ฝ์„ ๊ตฌ๋…ํ•  ๊ฑฐ์•ผ!” ๋ผ๊ณ  ๋งํ•จ
  3. DDS๊ฐ€ ์ž๋™์œผ๋กœ ๋‘ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•ด์คŒ

→ ๊ฐœ๋ฐœ์ž๋Š” IP ์ฃผ์†Œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋กœ์ปค๋ฅผ ๊ตฌ์„ฑํ•  ํ•„์š” ์—†์Œ

 

โœ… 4. Discovery๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ด์œ : DDS์˜ RTPS ํ”„๋กœํ† ์ฝœ

  • RTPS (Real-Time Publish Subscribe)๋ผ๋Š” ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด
    ๋„คํŠธ์›Œํฌ ๋‚ด์—์„œ ์„œ๋กœ์˜ ์กด์žฌ๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ* ๋ฐฉ์‹์œผ๋กœ ์•Œ๋ฆผ
  • ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ํŒจํ‚ท*์„ ์ด์šฉํ•ด "๋‚˜ ์—ฌ๊ธฐ ์žˆ์–ด!"๋ผ๊ณ  ์•Œ๋ฆผ

โœ… 5. ROS2์˜ Discovery ๊ธฐ๋Šฅ์˜ ์žฅ์ 

์žฅ์  ์„ค๋ช…
์„ค์ • ๊ฐ„ํŽธ ๋„คํŠธ์›Œํฌ์— ๋…ธ๋“œ๋งŒ ๋„์šฐ๋ฉด ์ž๋™ ์—ฐ๊ฒฐ๋จ
ํ™•์žฅ์„ฑ ๋›ฐ์–ด๋‚จ ๋…ธ๋“œ ์ˆ˜๊ฐ€ ๋งŽ์•„๋„ ๋ณ„๋„ ์„ค์ • ์—†์ด ์œ ์—ฐํ•˜๊ฒŒ ์—ฐ๊ฒฐ
๋ธŒ๋กœ์ปค ์—†์Œ ๋‹จ์ผ ์žฅ์• ์  ์—†์Œ, ์ง„์งœ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ
๋ฉ€ํ‹ฐ ๋กœ๋ด‡ ์‹œ์Šคํ…œ์— ์ ํ•ฉ ๋™์ ์œผ๋กœ ๋…ธ๋“œ๊ฐ€ ๋ถ™์—ˆ๋‹ค ๋–จ์–ด์กŒ๋‹ค ํ•ด๋„ ์ž๋™ ๊ฐ์ง€

[ROS2์˜ ํŠน์ง• ์ •๋ฆฌ]

๐Ÿ“Œ ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

  • DDS ๋ฏธ๋“ค์›จ์–ด ๋•๋ถ„์—, ์ œ์–ด/์„ผ์„œ ๋ฐ์ดํ„ฐ์˜ ๋น ๋ฅธ ๋ฐ˜์‘์„ฑ ํ™•๋ณด

๐Ÿ“Œ ๋‹ค์–‘ํ•œ OS ์ง€์›

  • Linux๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Windows, macOS, RTOS๊นŒ์ง€ ํ™•์žฅ

๐Ÿ“Œ ๋ชจ๋“ˆ์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ

  • Node ๋‹จ์œ„ ๊ตฌ์„ฑ์œผ๋กœ ๊ธฐ๋Šฅ ๋ถ„๋ฆฌ ๋ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ด

๐Ÿ“Œ ์ž๋™ Discovery ๊ธฐ๋Šฅ

  • ๋…ธ๋“œ๊ฐ€ ์ƒˆ๋กœ ์ƒ๊ธฐ๊ฑฐ๋‚˜ ์‚ฌ๋ผ์ ธ๋„ ์ž๋™์œผ๋กœ ์ธ์‹ํ•จ (์„ค์ • ํ•„์š” ์—†์Œ)

๐Ÿ“Œ QoS ์„ค์ • ์ง€์›

  • ํ†ต์‹  ์‹ ๋ขฐ์„ฑ, ์ „์†ก ๋นˆ๋„, ๋ณด์กด ์—ฌ๋ถ€ ๋“ฑ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์กฐ์ ˆ ๊ฐ€๋Šฅ

๐Ÿ“Œ ๋‹ค์–‘ํ•œ Tool ์ง€์›


[ROS2์˜ ์ฃผ์š” ํ™œ์šฉ ๋ถ„์•ผ]

  • ์ž์œจ์ฃผํ–‰ ๋กœ๋ด‡
  • ๋“œ๋ก  ๋ฐ UAV
  • ์Šค๋งˆํŠธ ํŒฉํ† ๋ฆฌ ๋ฐ ์‚ฐ์—… ์ž๋™ํ™”
  • ์˜๋ฃŒ์šฉ ๋กœ๋ด‡

ROS2๋Š” ๋‹ค์–‘ํ•œ ๋กœ๋ด‡ ์‹œ์Šคํ…œ์„ ํšจ์œจ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ํ†ต์‹ ํ•˜๊ฒŒ ๋•๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. Pub/Sub, Service, Action ๋“ฑ์˜ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, DDS ๊ธฐ๋ฐ˜์˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ๊ณผ ๋‹ค์–‘ํ•œ QoS ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ํ˜„์žฌ ์ž์œจ์ฃผํ–‰, ๋“œ๋ก , ์‚ฐ์—…๋กœ๋ด‡ ๋“ฑ์—์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ํ™œ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

 


[๋ถ€๊ฐ€์„ค๋ช…]

  1. ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ
  2. ๋ชจ๋“ˆํ™”
  3. ๋ฏธ๋“ค์›จ์–ด
  4. ROS2๊ตฌ์กฐ&๋ฏธ๋“ค์›จ์–ด
  5. Peer-to-Peer(P2P) ํ†ต์‹ 
  6. QoS ์„ค์ •(Quality of  Service)
  7. ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ(Multicast)
  8. Pub/Sub ๊ตฌ์กฐ(Publish/Subscribe)
  9. ๋™๊ธฐ(Synchronous) / ๋น„๋™๊ธฐ(Asynchronous) ํ†ต์‹ 
  10. UDP/TCP
  11. Client Library
  12. ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฐฉ์‹
  13. ํŒจํ‚ท

[1. ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ (Open-source Framework)]

โœ”๏ธ ๊ฐœ๋…

  • ์˜คํ”ˆ์†Œ์Šค(Open-source): ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๊ณต๊ฐœ๋˜์–ด ๋ˆ„๊ตฌ๋‚˜ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ, ์ˆ˜์ •, ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ์†Œํ”„ํŠธ์›จ์–ด
  • ํ”„๋ ˆ์ž„์›Œํฌ(Framework): ๊ฐœ๋ฐœ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ณธ ๊ตฌ์กฐ์™€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ผˆ๋Œ€

๐Ÿ”ง ์˜ˆ์‹œ (ROS2 ๊ธฐ์ค€)

  • ROS2๋Š” ๋กœ๋ด‡ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ž„
    • ์ด๋ฏธ ๊ตฌํ˜„๋œ ์ฝ”๋“œ ๊ตฌ์กฐ(๋…ธ๋“œ, ํ† ํ”ฝ, ์„œ๋น„์Šค ๋“ฑ)๋ฅผ ํ™œ์šฉํ•ด์„œ ์‰ฝ๊ฒŒ ๋กœ๋ด‡ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ
    • ์ง์ ‘ ํ†ต์‹  ์ฝ”๋“œ๋ฅผ ์งœ์ง€ ์•Š์•„๋„ ๋˜๋Š” "๊ธฐ๋ฐ˜ ๋„๊ตฌ"๋ฅผ ์ œ๊ณต

๐Ÿง  ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด?

“์ง‘ ์ง“๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ”๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋ผˆ๋Œ€(๊ณจ์กฐ), ์ „๊ธฐ ๋ฐฐ์„ , ์ˆ˜๋„๊ด€์€ ์ด๋ฏธ ๊น”๋ ค ์žˆ์Œ → ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ ์œ„์— ์ง‘์„ ๊พธ๋ฏธ๊ธฐ๋งŒ ํ•˜๋ฉด ๋จ


[2. ๋ชจ๋“ˆํ™” (Modularization)]

โœ”๏ธ ๊ฐœ๋…

  • ์‹œ์Šคํ…œ์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ ๋‹จ์œ„(๋ชจ๋“ˆ)๋กœ ๋‚˜๋ˆ„๋Š” ์„ค๊ณ„ ๋ฐฉ์‹
  • ๊ฐ ๋ชจ๋“ˆ์€ ์ž์‹ ์˜ ์—ญํ• ๋งŒ ํ•˜๊ณ , ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ๋Š” ์ตœ์†Œํ•œ์œผ๋กœ ์—ฐ๊ฒฐ๋จ

๐Ÿ”ง ์˜ˆ์‹œ (ROS2 ๊ธฐ์ค€)

  • ROS2์—์„œ ํ•˜๋‚˜์˜ Node๋Š” ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“ˆ์ž„
    • ์˜ˆ: ์„ผ์„œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋…ธ๋“œ, ์นด๋ฉ”๋ผ ๋…ธ๋“œ, ์ œ์–ด ๋…ธ๋“œ ๊ฐ๊ฐ ๋ถ„๋ฆฌ๋จ
    • ์„œ๋กœ Topic์œผ๋กœ๋งŒ ์—ฐ๊ฒฐ๋˜๊ณ , ์ฝ”๋“œ์ƒ์œผ๋กœ๋Š” ๋…๋ฆฝ์ ์ž„

๐Ÿง  ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด?

์ปดํ“จํ„ฐ๋ฅผ CPU, ๋ฉ”๋ชจ๋ฆฌ, SSD ๋“ฑ์œผ๋กœ ๋‚˜๋ˆ ์„œ ๋งŒ๋“  ๊ฒƒ์ฒ˜๋Ÿผ, ๋กœ๋ด‡ ์‹œ์Šคํ…œ๋„ "๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„๋ฆฌํ•ด์„œ" ๋งŒ๋“ค๋ฉด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง

 


[3. ๋ฏธ๋“ค์›จ์–ด(Middleware)]

๋ฏธ๋“ค์›จ์–ด (Middleware)

โœ”๏ธ ๊ฐœ๋…

  • ์‹œ์Šคํ…œ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ(๋…ธ๋“œ, ๋ชจ๋“ˆ) ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ์ค‘๊ฐ„ ๊ณ„์ธต ์†Œํ”„ํŠธ์›จ์–ด
  • ๋„คํŠธ์›Œํฌ ํ†ต์‹ , ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”, ์†ก์ˆ˜์‹  ๊ด€๋ฆฌ ๋“ฑ์„ ์ž๋™ ์ฒ˜๋ฆฌ

๐Ÿ”ง ์˜ˆ์‹œ (ROS2 ๊ธฐ์ค€)

  • ROS2๋Š” DDS(Data Distribution Service) ๋ผ๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉ
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ TCP/UDP ํ†ต์‹  ์ฝ”๋“œ๋ฅผ ์งœ์ง€ ์•Š์•„๋„ ๋จ
    • ๋…ธ๋“œ ๊ฐ„ ๋ฉ”์‹œ์ง€๋ฅผ ์ž๋™์œผ๋กœ ๋ณด๋‚ด์ฃผ๊ณ  ๋ฐ›์•„์คŒ
    • ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ, QoS ์„ค์ •, ์•”ํ˜ธํ™” ๋“ฑ๋„ ์ง€์›

๐Ÿง  ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด?

์„œ๋กœ ๋ง์ด ๋‹ค๋ฅธ ๋‘ ์‚ฌ๋žŒ์ด ๋Œ€ํ™”ํ•˜๋ ค๋ฉด ํ†ต์—ญ์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋“ฏ, ๋ฏธ๋“ค์›จ์–ด๋Š” ์‹œ์Šคํ…œ ์‚ฌ์ด์—์„œ ‘ํ†ต์‹  ํ†ต์—ญ์‚ฌ’ ์—ญํ• ์„ ํ•จ


[4. ROS2 ๊ตฌ์กฐ & ๋ฏธ๋“ค์›จ์–ด ์„ค๋ช…]

์ด ๊ทธ๋ฆผ์€ ROS2์˜ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ทธ๋ฆผ์ด๋‹ค. ์•„๋ž˜์—์„œ๋ถ€ํ„ฐ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ์„ค๋ช…ํ•˜๋ฉด

๐Ÿงฑ 1. ์šด์˜์ฒด์ œ ๊ณ„์ธต

  • ๋งจ ์•„๋ž˜์— ์žˆ๋Š” Linux/Windows/Mac/RTOS๋Š” ์šด์˜์ฒด์ œ๋“ค์ด๋‹ค.
  • ROS2๋Š” ๋‹ค์–‘ํ•œ OS์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋จ. → ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ง€์›

โš™๏ธ 2. DDS ๊ณ„์ธต (๋ฏธ๋“ค์›จ์–ด)

  • ๊ทธ ์œ„์— ์žˆ๋Š” DDS๊ฐ€ ํ•ต์‹ฌ์ด๋‹ค. ๋ฐ”๋กœ ROS2์˜ ๋ฏธ๋“ค์›จ์–ด(Middleware) ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.
  • DDS (Data Distribution Service)๋Š” ๋…ธ๋“œ ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋„คํŠธ์›Œํฌ ํ†ต์‹  ์—”์ง„์ด๋‹ค.
๋„คํŠธ์›Œํฌ ํ†ต์‹  ์—”์ง„ : ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ผ์ผ์ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ์ž๋™์œผ๋กœ ํ†ต์‹ ์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ

โœ” ๋ฏธ๋“ค์›จ์–ด๋กœ์„œ DDS์˜ ์—ญํ• :

  • ๋…ธ๋“œ๋“ค์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์ค‘๊ฐ„์—์„œ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹  ๊ด€๋ฆฌ
  • Peer-to-Peer ํ†ต์‹  ๊ตฌ์กฐ (๋ธŒ๋กœ์ปค ์—†์ด ๋™์ž‘)
  • QoS ์„ค์ •, ์‹ค์‹œ๊ฐ„ ํ†ต์‹ , ๋ณด์•ˆ, ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ๋“ฑ ๊ธฐ๋Šฅ ์ œ๊ณต
  • ๋‹ค์–‘ํ•œ DDS ๊ตฌํ˜„์ฒด ์‚ฌ์šฉ ๊ฐ€๋Šฅ (Fast DDS, Cyclone DDS, RTI Connext ๋“ฑ)

๐Ÿ‘‰ ์ฆ‰, ROS2๋Š” ์ง์ ‘ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ , DDS ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋Œ€์‹  ๊ทธ๊ฑธ ์ฒ˜๋ฆฌํ•จ

DDS๋Š” “ํ†ต์‹  ๊ทœ์น™(ํ‘œ์ค€)”์ด๊ณ , ๊ทธ๊ฑธ ์‹ค์ œ๋กœ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ๋“ค์ด '๊ตฌํ˜„์ฒด'์ด๋‹ค.

๐Ÿงฉ 3. Abstract DDS Layer & Client Library (ROS2 Core)

  • Abstract DDS Layer: DDS์™€ ์ง์ ‘์ ์œผ๋กœ ๋งž๋ฌผ๋ฆฌ๋Š” ์ค‘๊ฐ„ ๊ณ„์ธต. DDS ๊ตฌํ˜„์ฒด์™€ ROS2 ์‚ฌ์ด์˜ ์ถ”์ƒํ™”* ์—ญํ• ์„ ํ•ด.
  • Client Library: ROS2์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค(API)
    ์˜ˆ: rclcpp(C++), rclpy(Python) ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋Š” ROS2 ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•จ

โž• Intra-process API๋ž€?

  • ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹  ์‹œ, ๋„คํŠธ์›Œํฌ๊ฐ€ ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ ๋ฐฉ์‹์œผ๋กœ ๋” ๋น ๋ฅด๊ฒŒ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋‚ด๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

[์ถ”์ƒํ™” ์—ญํ• ์ด๋ž€]

๐Ÿ“Œ ์ •์˜ 

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„(=DDS ๊ตฌํ˜„์ฒด๋“ค)์„
ํ•˜๋‚˜์˜ ๊ณตํ†ต๋œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก
์ค‘๊ฐ„์—์„œ ๋ฌถ์–ด์ฃผ๋Š” ์—ญํ• 

 

๐Ÿ“Œ ์˜ˆ์‹œ

ROS2๋Š” ์—ฌ๋Ÿฌ DDS ๊ตฌํ˜„์ฒด๋ฅผ ์ง€์›ํ•œ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ, ๊ฐ DDS ๊ตฌํ˜„์ฒด๋Š” ๋‚ด๋ถ€ ํ•จ์ˆ˜ ์ด๋ฆ„, ๊ตฌ์กฐ, ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ์ „๋ถ€ ๋‹ค๋ฅด๋‹ค.

๋งŒ์•ฝ ROS2๊ฐ€ ์ง์ ‘ DDS ๊ตฌํ˜„์ฒด๋ฅผ ๋‹ค๋ฃจ๋ฉด?
→ ๊ตฌํ˜„์ฒด๋งˆ๋‹ค ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•จ → ๋ณต์žกํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ต๊ณ  ํ˜ธํ™˜์„ฑ ๋‚ฎ๋‹ค

 

๊ทธ๋ž˜์„œ ROS2๋Š” "์ถ”์ƒํ™” ๊ณ„์ธต(Abstract DDS Layer)"์„ ๋‘ฌ์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•œ๋‹ค:

 

๐Ÿ“Œ ๊ตฌ์กฐ ํ๋ฆ„:

[์‚ฌ์šฉ์ž ์ฝ”๋“œ] → [ROS2 Client Library (rclcpp/rclpy)] 
				↓ 
[Abstract DDS Layer] ← ์ถ”์ƒํ™” ๊ณ„์ธต 
		↓ 
[Fast DDS / Cyclone DDS / RTI Connext ๋“ฑ DDS ๊ตฌํ˜„์ฒด]
  • ROS2๋Š” ์ถ”์ƒํ™” ๊ณ„์ธต๋งŒ ๋ณด๊ณ  ๊ฐœ๋ฐœ
  • ์‹ค์ œ ์–ด๋–ค DDS๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”์ง€๋Š” ํ•˜๋‹จ์—์„œ ๊ต์ฒด ๊ฐ€๋Šฅ

๐Ÿ“Œ ์ถ”์ƒํ™”์˜ ํ•ต์‹ฌ ํšจ๊ณผ

ํšจ๊ณผ  ์„ค๋ช…
ํ˜ธํ™˜์„ฑ ํ–ฅ์ƒ ๋‹ค์–‘ํ•œ DDS๋ฅผ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ”์“ธ ์ˆ˜ ์žˆ์Œ
์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด DDS ๊ตฌํ˜„์ฒด๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์ƒ์œ„ ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ
์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต ๊ฐœ๋ฐœ์ž๋Š” DDS ๋‚ด๋ถ€๋ฅผ ๋ชฐ๋ผ๋„ ๋จ

๐Ÿง  4. Application ๊ณ„์ธต (๋…ธ๋“œ๋“ค)

  • ๋งจ ์œ„๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ๋…ธ๋“œ(Node)๋“ค์ด๋‹ค.
  • ์˜ˆ: ์„ผ์„œ ๋…ธ๋“œ, ๋ชจํ„ฐ ์ œ์–ด ๋…ธ๋“œ, ์ด๋ฏธ์ง€ ์ธ์‹ ๋…ธ๋“œ ๋“ฑ

์ด ๋…ธ๋“œ๋“ค์ด ์ง์ ‘ DDS๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ , Client Library๋ฅผ ํ†ตํ•ด ROS2 API๋ฅผ ํ˜ธ์ถœ → ๊ทธ ์•„๋ž˜ ๋ฏธ๋“ค์›จ์–ด(DDS)๊ฐ€ ์ž๋™์œผ๋กœ ํ†ต์‹ ์„ ์ฒ˜๋ฆฌํ•ด์คŒ

 

๊ทธ๋ฆผ๊ณผ ์—ฐ๊ฒฐํ•œ "๋ฏธ๋“ค์›จ์–ด" ์ •์˜ ์š”์•ฝ

ROS2 ๊ตฌ์กฐ์—์„œ DDS ๋ฏธ๋“ค์›จ์–ด๋Š” Client Library ์•„๋ž˜์— ์œ„์น˜ํ•˜์—ฌ, ์‹ค์ œ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ์—ญํ• ์„ ํ•œ๋‹ค.
๋…ธ๋“œ ๊ฐ„ ํ†ต์‹ ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋„คํŠธ์›Œํฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, DDS๊ฐ€ ๋Œ€์‹  ๋ฉ”์‹œ์ง€๋ฅผ ์ž๋™์œผ๋กœ ๋ผ์šฐํŒ…, ์ „์†ก, ์ˆ˜์‹ ํ•จ.
์ด๋ ‡๊ฒŒ ๋ณต์žกํ•œ ํ†ต์‹  ์ฒ˜๋ฆฌ๋ฅผ ์ˆจ๊ฒจ์ฃผ๊ณ , ๋ชจ๋“ˆ ๊ฐ„ ๋…๋ฆฝ์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด ๋ฏธ๋“ค์›จ์–ด์˜ ๋ณธ์งˆ์ ์ธ ์—ญํ• ์ด๋‹ค.


[5. Peer-to-Peer ํ†ต์‹  (P2P ํ†ต์‹ )]

โœ”๏ธ ๊ฐœ๋…

  • Peer-to-Peer(P2P) ํ†ต์‹ ์€ ์ค‘์•™ ์„œ๋ฒ„(๋ธŒ๋กœ์ปค) ์—†์ด,
    ๋…ธ๋“œ๋“ค๋ผ๋ฆฌ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ์‹์ด๋‹ค.

๐Ÿ“Œ ROS2์—์„œ์˜ ์˜๋ฏธ

  • ROS2์—์„œ๋Š” ํ† ํ”ฝ์„ publishํ•˜๋Š” ๋…ธ๋“œ์™€ subscribeํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์ง์ ‘ ์—ฐ๊ฒฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์Œ.
  • ์ค‘์•™ ์ค‘๊ฐœ ์„œ๋ฒ„๊ฐ€ ์—†์Œ → ์ง€์—ฐ์ด ์ค„๊ณ , ํ™•์žฅ์„ฑ์ด ์ข‹์•„์ง.

๐Ÿง  ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด?

์นดํ†ก ๋‹จ์ฒด๋ฐฉ์ฒ˜๋Ÿผ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ๋Œ€ํ™”ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ,
์นœ๊ตฌํ•œํ…Œ ์ง์ ‘ ์ „ํ™”๋ฅผ ๊ฑธ์–ด์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ตฌ์กฐ!

[6. QoS ์„ค์ • (Quality of Service)]

โœ”๏ธ ๊ฐœ๋…

  • QoS(Quality of Service)๋Š” ํ†ต์‹  ํ’ˆ์งˆ์„ ์กฐ์ ˆํ•˜๋Š” ์˜ต์…˜์ด์•ผ.
  • ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ, ์–ธ์ œ๊นŒ์ง€, ๋ช‡ ๋ฒˆ๊นŒ์ง€, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ „๋‹ฌํ• ์ง€ ์ •์˜ํ•จ.

๐Ÿ“Œ ROS2์—์„œ ์„ค์ • ๊ฐ€๋Šฅํ•œ ์ฃผ์š” QoS ์ •์ฑ…๋“ค:

์ •์ฑ… ์ด๋ฆ„ ์„ค๋ช… ์˜ˆ์‹œ
Reliability ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ณด๋‚ผ ๊ฒƒ์ธ๊ฐ€? Reliable(ํ™•์‹คํžˆ ์ „๋‹ฌ) vs Best Effort(์ตœ๋Œ€ํ•œ ์ „๋‹ฌ)
Durability ๊ตฌ๋…์ž๊ฐ€ ๋‚˜์ค‘์— ์—ฐ๊ฒฐํ•ด๋„ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ์ €์žฅํ•  ๊ฒƒ์ธ๊ฐ€? Volatile(์‹ค์‹œ๊ฐ„๋งŒ) vs Transient Local(์ด์ „ ๋ฉ”์‹œ์ง€ ์ €์žฅ)
History ๋ฉ”์‹œ์ง€๋ฅผ ๋ช‡ ๊ฐœ๊นŒ์ง€ ์ €์žฅํ•  ๊ฒƒ์ธ๊ฐ€? ๋งˆ์ง€๋ง‰ N๊ฐœ ๋ฉ”์‹œ์ง€๋งŒ ์œ ์ง€
Deadline ํŠน์ • ์‹œ๊ฐ„ ์•ˆ์— ๋ฉ”์‹œ์ง€๋ฅผ ๊ผญ ๋ฐ›์•„์•ผ ํ•˜๋Š”๊ฐ€? ์‹ค์‹œ๊ฐ„ ์ œ์–ด ํ•„์š” ์‹œ ์‚ฌ์šฉ
Liveliness ์ด ๋…ธ๋“œ๊ฐ€ ์‚ด์•„์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹ ํ†ต์‹  ์žฅ์•  ํƒ์ง€ ๊ฐ€๋Šฅ

๐Ÿง  ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด?

์šฐํŽธ์„ ๋ณด๋‚ผ ๋•Œ “๋น ๋ฅธ ๋“ฑ๊ธฐ + ๋ฐ˜๋“œ์‹œ ์ˆ˜์ทจํ™•์ธ” ์˜ต์…˜์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„.
์–ด๋–ค ํ†ต์‹ ์€ ๋А๋ ค๋„ ๊ดœ์ฐฎ๊ณ , ์–ด๋–ค ๊ฑด ๋ฐ˜๋“œ์‹œ ๋„์ฐฉํ•ด์•ผ ํ•˜์ž–์•„?

[7. ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ (Multicast)]

โœ”๏ธ ๊ฐœ๋…

  • ํ•œ ๋…ธ๋“œ๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•ด๋„, ์—ฌ๋Ÿฌ ๊ตฌ๋…์ž(Subscriber)์—๊ฒŒ ๋™์‹œ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹

๐Ÿ“Œ ROS2์—์„œ์˜ ์˜๋ฏธ

  • ์˜ˆ: ์นด๋ฉ”๋ผ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ publishํ•˜๋ฉด, ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋…ธ๋“œ, ์ €์žฅ ๋…ธ๋“œ, ์ŠคํŠธ๋ฆฌ๋ฐ ๋…ธ๋“œ ๋ชจ๋‘ ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด.
  • ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๊ฐ€ ์ ๊ณ , ํšจ์œจ์ ์œผ๋กœ ๋‹ค์ˆ˜ ๊ตฌ๋…์ž์—๊ฒŒ ์ „๋‹ฌ ๊ฐ€๋Šฅ

๐Ÿง  ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด?

์ˆ˜์—… ์‹œ๊ฐ„์— ์„ ์ƒ๋‹˜์ด ํ•œ ๋ฒˆ๋งŒ ๋งํ•˜๋ฉด, ๋ชจ๋“  ํ•™์ƒ์ด ๋™์‹œ์— ๋“ฃ๋Š” ๊ตฌ์กฐ (vs ์ผ์ผ์ด ์ „ํ™”ํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ์œ ๋‹ˆ์บ์ŠคํŠธ)


[8. Pub/Sub ๊ตฌ์กฐ (Publish / Subscribe)]

โœ”๏ธ ๊ฐœ๋… ์„ค๋ช…

  • ๋ฐœํ–‰(Publish): ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ์ชฝ
  • ๊ตฌ๋…(Subscribe): ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ์ชฝ
  • ๋ฐœํ–‰์ž๋Š” ๋ˆ„๊ฐ€ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋ชฐ๋ผ๋„ ๋˜๊ณ , ๊ตฌ๋…์ž๋Š” ๋ˆ„๊ฐ€ ๋ฐœํ–‰ํ–ˆ๋Š”์ง€ ๋ชฐ๋ผ๋„ ๋จ → ๋А์Šจํ•œ ์—ฐ๊ฒฐ(Decoupling)

๐Ÿ“Œ ๊ตฌ์กฐ ์š”์•ฝ

[Publisher Node] -- Topic --> [Subscriber Node]
  • ๋ฉ”์‹œ์ง€๋Š” "Topic"์ด๋ผ๋Š” ํ†ต๋กœ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋จ
  • Topic ์ด๋ฆ„์ด ๊ฐ™์œผ๋ฉด ํ†ต์‹ ์ด ์—ฐ๊ฒฐ๋จ

๐Ÿง  ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด?

“ํ•™๊ต ๊ฒŒ์‹œํŒ์— ๊ณต์ง€ ์˜ฌ๋ฆฌ๊ธฐ(Pub)”
→ “ํ•™์ƒ๋“ค์ด ์•Œ์•„์„œ ํ™•์ธ(Subscribe)”ํ•˜๋Š” ๊ตฌ์กฐ

[9. ๋™๊ธฐ(Synchronous) / ๋น„๋™๊ธฐ(Asynchronous) ํ†ต์‹ ]

โœ”๏ธ ๋™๊ธฐ ํ†ต์‹  (Synchronous)

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ธ ์ชฝ์ด ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ์‹
  • ์‘๋‹ต์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๊ณ , ๊ทธ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰

์˜ˆ์‹œ:

  • A๊ฐ€ B์—๊ฒŒ "๋ช‡ ์‹œ์•ผ?" ๋ผ๊ณ  ๋ฌผ์–ด๋ณด๊ณ  → B์˜ ๋Œ€๋‹ต์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ

ROS2์—์„œ ํ•ด๋‹น๋˜๋Š” ๊ตฌ์กฐ:

  • Service ํ†ต์‹ 
    ์˜ˆ:
Node A (Client): "์œ„์น˜ ์ข€ ์•Œ๋ ค์ค˜" 
Node B (Server): "์—ฌ๊ธฐ์•ผ" → ์‘๋‹ต

โœ”๏ธ ๋น„๋™๊ธฐ ํ†ต์‹  (Asynchronous)

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ  ๋‚˜์„œ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ์ง„ํ–‰
  • ์‘๋‹ต์ด ์˜ค๋ฉด ๊ทธ๋•Œ ์ฒ˜๋ฆฌ (ํ˜น์€ ์•„์˜ˆ ์‘๋‹ต์ด ์—†์–ด๋„ ๋จ)

์˜ˆ์‹œ:

  • A๊ฐ€ ํ•™๊ต ๊ฒŒ์‹œํŒ(Pub)์— ๊ณต์ง€๋ฅผ ๋ถ™์ด๋ฉด →
    ํ•™์ƒ B, C, D๋Š” ์–ธ์ œ๋“ ์ง€ ์ž์œ ๋กญ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ์Œ

ROS2์—์„œ ํ•ด๋‹น๋˜๋Š” ๊ตฌ์กฐ:

  • Publish/Subscribe ํ†ต์‹ 
  • Action๋„ ๋น„๋™๊ธฐ ๋ฐฉ์‹์— ๊ฐ€๊น์ง€๋งŒ ์ค‘๊ฐ„ ํ”ผ๋“œ๋ฐฑ๋„ ํฌํ•จ๋จ
ROS2์˜ Pub/Sub ๊ตฌ์กฐ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ์ชฝ๊ณผ ๋ฐ›๋Š” ์ชฝ์ด ๋А์Šจํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์ด ๋†’๋‹ค.
์ด ๊ตฌ์กฐ๋Š” ๋น„๋™๊ธฐ ํ†ต์‹ ์œผ๋กœ, ๋…ธ๋“œ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•œ ํ›„ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฐ˜๋ฉด, Service ํ†ต์‹ ์€ ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ์ž๊ฐ€ ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋ฉฐ, Action์€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์ค‘๊ฐ„ ํ”ผ๋“œ๋ฐฑ์ด ํฌํ•จ๋œ ๊ตฌ์กฐ์ด๋‹ค.

 


[10. TCP/UDP]

TCP (Transmission Control Protocol)

โœ”๏ธ ๊ฐœ๋…

  • ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋ณด์žฅํ•˜๋Š” ํ”„๋กœํ† ์ฝœ
  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ฉด ์ˆ˜์‹  ํ™•์ธ(ACK)์„ ๋ฐ›๊ณ , ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด ์žฌ์ „์†กํ•จ
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋„์ฐฉํ•˜๋„๋ก ๋ณด์žฅํ•จ
  • ์—ฐ๊ฒฐ์„ ๋จผ์ € ์„ค์ •ํ•ด์•ผ ํ•จ (3-way handshake)

๐Ÿ“ฆ ํŠน์ง•

ํ•ญ๋ชฉ ์„ค๋ช…
์—ฐ๊ฒฐ ๋ฐฉ์‹ ์—ฐ๊ฒฐ ์ง€ํ–ฅ (Connection-oriented)
์‹ ๋ขฐ์„ฑ ๋†’์Œ (์†์‹ค ์‹œ ์žฌ์ „์†ก)
์ˆœ์„œ ๋ณด์žฅ O
์†๋„ ๋А๋ฆด ์ˆ˜ ์žˆ์Œ (ํ™•์ธ ์ ˆ์ฐจ ํ•„์š”)
์‚ฌ์šฉ ์˜ˆ ์›น์‚ฌ์ดํŠธ ์ ‘์†(HTTP), ์ด๋ฉ”์ผ, ํŒŒ์ผ ์ „์†ก(FTP)

๐Ÿง  ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด?

ํƒ๋ฐฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ, “๋ฐ›๋Š” ์‚ฌ๋žŒ์ด ์ œ๋Œ€๋กœ ๋ฐ›์•˜๋Š”์ง€ ํ™•์ธ์„œ๊นŒ์ง€ ๊ผญ ๋ฐ›๋Š”” ์•ˆ์ „ํ•œ ํƒ๋ฐฐ ์„œ๋น„์Šค


UDP (User Datagram Protocol)

โœ”๏ธ ๊ฐœ๋…

  • ๋น ๋ฅด๊ฒŒ ์ „์†กํ•˜๋Š” ๋ฐ ์ดˆ์ ์ด ๋งž์ถฐ์ง„ ํ”„๋กœํ† ์ฝœ
  • ์ˆ˜์‹  ํ™•์ธ ์—†์ด ๊ทธ๋ƒฅ ๋ฐ์ดํ„ฐ๋งŒ ๋˜์ง
  • ์ˆœ์„œ ๋ณด์žฅ๋„ ์—†๊ณ , ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋  ์ˆ˜๋„ ์žˆ์Œ
  • ์—ฐ๊ฒฐ ์—†์ด ๋ฐ”๋กœ ์ „์†ก ๊ฐ€๋Šฅ

๐Ÿ“ฆ ํŠน์ง•

ํ•ญ๋ชฉ ์„ค๋ช…
์—ฐ๊ฒฐ ๋ฐฉ์‹ ๋น„์—ฐ๊ฒฐํ˜• (Connectionless)
์‹ ๋ขฐ์„ฑ ๋‚ฎ์Œ (์žฌ์ „์†ก ์—†์Œ)
์ˆœ์„œ ๋ณด์žฅ X
์†๋„ ๋งค์šฐ ๋น ๋ฆ„
์‚ฌ์šฉ ์˜ˆ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ, VoIP, ์˜จ๋ผ์ธ ๊ฒŒ์ž„, ์„ผ์„œ ๋ฐ์ดํ„ฐ ์ „์†ก

๐Ÿง  ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด?

๋ฌธ์ž๋‚˜ ์ชฝ์ง€๋ฅผ ๋˜์ ธ์ฃผ๋Š” ๋А๋‚Œ. ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๊ณ , ๋ชป ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Œ. ํ•˜์ง€๋งŒ ๋น ๋ฆ„!


โœ… TCP vs UDP ๋น„๊ต ์š”์•ฝ

ํ•ญ๋ชฉ TCP UDP
์—ฐ๊ฒฐ ๋ฐฉ์‹ ์—ฐ๊ฒฐ ์ง€ํ–ฅ ๋น„์—ฐ๊ฒฐ
์‹ ๋ขฐ์„ฑ ๋†’์Œ ๋‚ฎ์Œ
์ˆœ์„œ ๋ณด์žฅ O X
์†๋„ ๋А๋ฆผ ๋น ๋ฆ„
๋ฐ์ดํ„ฐ ์œ ์‹ค ์‹œ ์žฌ์ „์†ก ๋ฌด์‹œ
์‚ฌ์šฉ ์˜ˆ ์›น, ๋ฉ”์ผ ์˜์ƒ, ๊ฒŒ์ž„, ์„ผ์„œ ๋ฐ์ดํ„ฐ
ROS2์—์„œ์˜ ํ™œ์šฉ Service (์ฃผ๋กœ TCP) Topic (๊ณ ์†์ด๋ฉด UDP)

๐Ÿ“Œ ROS2์™€์˜ ์—ฐ๊ฒฐ

  • ROS2๋Š” DDS๋ฅผ ํ†ตํ•ด TCP์™€ UDP ๋‘˜ ๋‹ค ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์‹ ๋ขฐ์„ฑ(Reliable) ์„ค์ • ์‹œ → TCP ๊ธฐ๋ฐ˜
  • ์†๋„ ์šฐ์„ (Best Effort) ์„ค์ • ์‹œ → UDP ๊ธฐ๋ฐ˜

์˜ˆ๋ฅผ ๋“ค์–ด,

  • ์ž์œจ์ฃผํ–‰์ฐจ์˜ ์นด๋ฉ”๋ผ ์ด๋ฏธ์ง€ → UDP ์‚ฌ์šฉ (๋น ๋ฅด๊ฒŒ!)
  • ๋ช…๋ น ์ œ์–ด/์‘๋‹ต → TCP ์‚ฌ์šฉ (์ •ํ™•ํ•˜๊ฒŒ!)

โœ๏ธ  ์š”์•ฝ ๋ฌธ์žฅ

TCP๋Š” ์‹ ๋ขฐ์„ฑ๊ณผ ์ˆœ์„œ ๋ณด์žฅ์„ ์œ„ํ•ด ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ณ , ์ˆ˜์‹  ํ™•์ธ ๋ฐ ์žฌ์ „์†ก์„ ์ง€์›ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ๋ฐ˜๋ฉด UDP๋Š” ๋น ๋ฅธ ์†๋„๋ฅผ ์œ„ํ•ด ์—ฐ๊ฒฐ ์„ค์ • ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ์œ ์‹ค์ด๋‚˜ ์ˆœ์„œ ์˜ค๋ฅ˜๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค. ROS2์—์„œ๋Š” DDS ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ†ตํ•ด ํ†ต์‹  ์ƒํ™ฉ์— ๋”ฐ๋ผ TCP ๋˜๋Š” UDP ๊ธฐ๋ฐ˜ QoS ์ •์ฑ…์„ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

[11. Client Library]

๐Ÿ“Œ ์ •์˜

ROS2 ๊ธฐ๋Šฅ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(API)

์ฆ‰, C++, Python ๊ฐ™์€ ์–ธ์–ด๋กœ ROS2 ๋…ธ๋“œ, ํ† ํ”ฝ, ์„œ๋น„์Šค ๋“ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์ฝ”๋“œ ๋ชจ์Œ์ด๋‹ค.

์™œ ํ•„์š”ํ•œ๊ฐ€?

ROS2 ๋‚ด๋ถ€๋Š” ๋ณต์žกํ•˜๊ฒŒ DDS, ๋ฉ”์‹œ์ง€ ํ, ํ†ต์‹  ์„ค์ • ๋“ฑ์ด ์–ฝํ˜€ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋„ ๊ทธ๋ƒฅ ์•„๋ž˜์ฒ˜๋Ÿผ ์“ฐ๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์—:

# Python์œผ๋กœ ์ž‘์„ฑํ•œ ROS2 ๋…ธ๋“œ ์˜ˆ์‹œ
import rclpy
from rclpy.node import Node

class MyNode(Node):
    def __init__(self):
        super().__init__('hello_node')
        self.get_logger().info('Hello ROS2!')

rclpy.init()
node = MyNode()
rclpy.spin(node)
rclpy.shutdown()

์ด๋Ÿฐ ๊ฑธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒŒ ๋ฐ”๋กœ Client Library์ด๋‹ค!

ROS2์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฃผ์š” Client Libraries

์ด๋ฆ„ ์–ธ์–ด ์„ค๋ช…
rclcpp C++์šฉ Client Library ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๋กœ๋ด‡์— ์ž์ฃผ ์‚ฌ์šฉ
rclpy Python์šฉ Client Library ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์‹ค์Šต ๊ฐ€๋Šฅ
rcljava, rclcs, rclgo Java, C#, Go ๋“ฑ ์ผ๋ถ€ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๊ตฌ์กฐ ์† ์œ„์น˜ ์ •๋ฆฌ (์ „์ฒด ๊ณ„์ธต ํ๋ฆ„)

[์‚ฌ์šฉ์ž ์ฝ”๋“œ: Python/C++]
		 ↓ 
[Client Library: rclpy / rclcpp] 
		 ↓ 
[ROS2 Core (rcl, rmw, DDS ์ถ”์ƒํ™”)] 
		 ↓ 
[DDS ๊ตฌํ˜„์ฒด (Fast DDS, Cyclone DDS ๋“ฑ)]
		 ↓ 
[๋„คํŠธ์›Œํฌ ํ†ต์‹ ]
  • ์‚ฌ์šฉ์ž๋Š” rclpy๋‚˜ rclcpp๋ฅผ ํ†ตํ•ด์„œ ROS2 ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœ
  • ๊ทธ ์•„๋ž˜๋Š” ์ „ํ˜€ ๋ชฐ๋ผ๋„ ๋œ๋‹ค (์ˆจ๊ฒจ์ ธ ์žˆ์Œ)

[12. ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฐฉ์‹]

โœ” ์ •์˜

๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ํŠน์ • ๋Œ€์ƒ์ด ์•„๋‹Œ,
์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์žฅ์น˜(๋…ธ๋“œ)์—๊ฒŒ ๋™์‹œ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹

์ฆ‰, “๋‚˜ ์—ฌ๊ธฐ ์žˆ์–ด!”๋ผ๊ณ  ํ•œ ๋ฒˆ ๋งํ•˜๋ฉด, ๊ทผ์ฒ˜์— ์žˆ๋Š” ๋ชจ๋“  ์• ๋“ค์ด ๋‹ค ๋“ฃ๋Š” ๊ตฌ์กฐ

๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ์™ธ ๊ฐœ๋…

๋ฐฉ์‹ ์„ค๋ช…
Unicast ํŠน์ • ๋Œ€์ƒ ํ•˜๋‚˜์—๊ฒŒ๋งŒ ๋ฉ”์‹œ์ง€ ์ „์†ก (1:1)
Multicast ํŠน์ • ๊ทธ๋ฃน์—๊ฒŒ๋งŒ ์ „์†ก (1:๋‹ค)
Broadcast ๊ฐ™์€ ๋„คํŠธ์›Œํฌ์— ์žˆ๋Š” ๋ชจ๋“  ์žฅ์น˜์—๊ฒŒ ์ „์†ก (1:์ „์ฒด)

[13. ํŒจํ‚ท]

๐Ÿ“Œ ์ •์˜

๋„คํŠธ์›Œํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ,
์ „์†กํ•˜๊ธฐ ์ข‹๊ฒŒ ์ชผ๊ฐœ์„œ ๋งŒ๋“  ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์ด๋‹ค.

  • ์ปดํ“จํ„ฐ๋Š” ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋ณด๋‚ด์ง€ ์•Š์•„
  • ๋Œ€์‹ , ์ผ์ • ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ ์„œ ์ž‘์€ ๋ฉ์–ด๋ฆฌ(=ํŒจํ‚ท)๋กœ ๋งŒ๋“ค์–ด ์ „์†กํ•จ
  • ์ด ๋ฉ์–ด๋ฆฌ๊ฐ€ ํ•˜๋‚˜์˜ ๋‹จ์œ„ ์ „์†ก

๐Ÿ“Œ ๊ตฌ์„ฑ์š”์†Œ

ํŒจํ‚ท์€ ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ๊ฐ€ ์•„๋‹ˆ๊ณ , ์•ˆ์— ๋‘ ๊ฐ€์ง€ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค:

  1. ํ—ค๋”(Header)
    • ์ถœ๋ฐœ์ง€/๋„์ฐฉ์ง€ ์ฃผ์†Œ (์˜ˆ: IP ์ฃผ์†Œ)
    • ์ˆœ์„œ ๋ฒˆํ˜ธ
    • ์—๋Ÿฌ ๊ฒ€์ถœ์šฉ ์ฒดํฌ์„ฌ ๋“ฑ
      → "์–ด๋””์„œ ์™”๊ณ , ์–ด๋””๋กœ ๊ฐ€์•ผ ํ•˜๋ฉฐ, ๋ฌด์Šจ ๋‚ด์šฉ์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ๋ด‰ํˆฌ"
  2. ๋ฐ์ดํ„ฐ(Payload)
    • ์‹ค์ œ ์ „๋‹ฌํ•˜๋ ค๋Š” ๋‚ด์šฉ
      → ์˜ˆ: ์„ผ์„œ๊ฐ’, ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€, ์ด๋ฏธ์ง€ ์ผ๋ถ€ ๋“ฑ