-
What is ROS2?ROS2&MQTT 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์ ๊ตฌ์กฐ
- Goal ์์ฒญ: ํด๋ผ์ด์ธํธ๊ฐ ์์ ์์ฒญ์ ๋ณด๋
- Feedback ์ ์ก: ์๋ฒ๊ฐ ์์ ์งํ ์ํฉ์ ๊ณ์ ์ ๋ฌ
- Result ์๋ต: ์์ ์ด ๋๋๋ฉด ์ต์ข ๊ฒฐ๊ณผ ๋ฐํ
- 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 ๋ ธ๋๋ค์ด ๊ฐ์ ๋คํธ์ํฌ ์์ ๋ํ๋๊ธฐ๋ง ํ๋ฉด,
์๋ก๋ฅผ ์๋์ผ๋ก ๋ฐ๊ฒฌํ๊ณ ์ฐ๊ฒฐํ๋ ๊ธฐ๋ฅโ ์๋ ๋ฐฉ์ (๊ฐ๋จ ํ๋ฆ)
- ๋ ธ๋ A๊ฐ ์คํ๋จ → “๋๋ ์ด๋ฐ ํ ํฝ์ publishํ ๊ฑฐ์ผ!” ๋ผ๊ณ ๋คํธ์ํฌ์ ์๋ฆผ
- ๋ ธ๋ B๊ฐ ์คํ๋จ → “๋๋ ์ด ํ ํฝ์ ๊ตฌ๋ ํ ๊ฑฐ์ผ!” ๋ผ๊ณ ๋งํจ
- 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 ์ง์
- Simulation - Gazebo, Ignition, ISSAC, webots
- Embedded - rosserial, micro-ROS
- Visualization , Debug Tools - RViz, RQt
[ROS2์ ์ฃผ์ ํ์ฉ ๋ถ์ผ]
- ์์จ์ฃผํ ๋ก๋ด
- ๋๋ก ๋ฐ UAV
- ์ค๋งํธ ํฉํ ๋ฆฌ ๋ฐ ์ฐ์ ์๋ํ
- ์๋ฃ์ฉ ๋ก๋ด
ROS2๋ ๋ค์ํ ๋ก๋ด ์์คํ ์ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐํ๊ณ ํต์ ํ๊ฒ ๋๋ ์คํ์์ค ํ๋ ์์ํฌ์ด๋ค. Pub/Sub, Service, Action ๋ฑ์ ๋ฉ์์ง ์ ๋ฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์์ผ๋ฉฐ, DDS ๊ธฐ๋ฐ์ ๋ฏธ๋ค์จ์ด๋ฅผ ํตํด ์ค์๊ฐ ํต์ ๊ณผ ๋ค์ํ QoS ์ค์ ์ด ๊ฐ๋ฅํ๋ฉฐ ํ์ฌ ์์จ์ฃผํ, ๋๋ก , ์ฐ์ ๋ก๋ด ๋ฑ์์ ๊ด๋ฒ์ํ๊ฒ ํ์ฉ๋๊ณ ์๋ค.
[๋ถ๊ฐ์ค๋ช ]
- ์คํ์์ค ํ๋ ์์ํฌ
- ๋ชจ๋ํ
- ๋ฏธ๋ค์จ์ด
- ROS2๊ตฌ์กฐ&๋ฏธ๋ค์จ์ด
- Peer-to-Peer(P2P) ํต์
- QoS ์ค์ (Quality of Service)
- ๋ฉํฐ์บ์คํธ(Multicast)
- Pub/Sub ๊ตฌ์กฐ(Publish/Subscribe)
- ๋๊ธฐ(Synchronous) / ๋น๋๊ธฐ(Asynchronous) ํต์
- UDP/TCP
- Client Library
- ๋ธ๋ก๋์บ์คํธ ๋ฐฉ์
- ํจํท
[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. ํจํท]
๐ ์ ์
๋คํธ์ํฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋,
์ ์กํ๊ธฐ ์ข๊ฒ ์ชผ๊ฐ์ ๋ง๋ ๋ฐ์ดํฐ ์กฐ๊ฐ์ด๋ค.- ์ปดํจํฐ๋ ํฐ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๋ณด๋ด์ง ์์
- ๋์ , ์ผ์ ํฌ๊ธฐ๋ก ๋๋ ์ ์์ ๋ฉ์ด๋ฆฌ(=ํจํท)๋ก ๋ง๋ค์ด ์ ์กํจ
- ์ด ๋ฉ์ด๋ฆฌ๊ฐ ํ๋์ ๋จ์ ์ ์ก
๐ ๊ตฌ์ฑ์์
ํจํท์ ๋จ์ํ ๋ฐ์ดํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์๋๊ณ , ์์ ๋ ๊ฐ์ง ์ ๋ณด๊ฐ ๋ค์ด ์๋ค:
- ํค๋(Header)
- ์ถ๋ฐ์ง/๋์ฐฉ์ง ์ฃผ์ (์: IP ์ฃผ์)
- ์์ ๋ฒํธ
- ์๋ฌ ๊ฒ์ถ์ฉ ์ฒดํฌ์ฌ ๋ฑ
→ "์ด๋์ ์๊ณ , ์ด๋๋ก ๊ฐ์ผ ํ๋ฉฐ, ๋ฌด์จ ๋ด์ฉ์ธ์ง ์๋ ค์ฃผ๋ ๋ดํฌ"
- ๋ฐ์ดํฐ(Payload)
- ์ค์ ์ ๋ฌํ๋ ค๋ ๋ด์ฉ
→ ์: ์ผ์๊ฐ, ์ฑํ ๋ฉ์์ง, ์ด๋ฏธ์ง ์ผ๋ถ ๋ฑ
- ์ค์ ์ ๋ฌํ๋ ค๋ ๋ด์ฉ
'ROS2&MQTT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MQTT - 1, ๊ธฐ๋ณธํต์ (0) 2025.04.06 ROS2(Cyclone DDS)๋ฅผ ๋คํธ์ํฌ๋ก ์ฐ๊ฒฐํ์ฌ ์คํํ๊ธฐ (0) 2025.04.04