ROS2 : Node
Node์ ๊ฐ๋
๊ณผ ์ญํ
ROS2(๋ก๋ด ์ด์ ์ฒด์ 2, Robot Operating System 2)์์ "Node"๋ ๋ก๋ด ์ํํธ์จ์ด์ ๊ธฐ๋ณธ์ ์ธ ์คํ ๋จ์์ด๋ค. Node๋ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ ํ๋ก๊ทธ๋จ์ผ๋ก, ๊ฐ Node๋ ํน์ ํ ์์ ์ ์ํํ๋ ๋ก์ง์ ๊ฐ์ง๊ณ ์๋ค. ROS2 ์์คํ ์์๋ ๋ค์ํ Node๊ฐ ์ํธ์์ฉํ๋ฉฐ ๋ณต์กํ ๋ก๋ด ์์คํ ์ ๊ตฌํํ๋ค.
Node๋ ์ฃผ๋ก ์ผ์ ๋ฐ์ดํฐ ์์ง, ์ ์ด ๋ช ๋ น ์คํ, ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฑ์ ๋ด๋นํ๋ค. ๊ฐ Node๋ ๋ค๋ฅธ Node๋ค๊ณผ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ, ROS2์ ํต์ ์ธํ๋ผ๋ฅผ ํตํด ์ด ์ํธ์์ฉ์ด ์ด๋ฃจ์ด์ง๋ค. ์ด๋ฅผ ํตํด ๋ถ์ฐ ์์คํ ์ ํํ๋ก ๋ก๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ตฌ์ฑ๋๋ค.
Node์ ๊ตฌ์กฐ์ ๊ตฌ์ฑ ์์
Node๋ ํฌ๊ฒ ๋ค์๊ณผ ๊ฐ์ ์์๋ค๋ก ๊ตฌ์ฑ๋๋ค:
ROS2 ํต์ ์ธํฐํ์ด์ค: Node๋ ROS2 ํต์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ค๋ฅธ Node์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค. ์ด ์ธํฐํ์ด์ค๋ ์ฃผ๋ก ํผ๋ธ๋ฆฌ์ (publisher), ์๋ธ์คํฌ๋ผ์ด๋ฒ(subscriber), ์๋น์ค ์๋ฒ(service server), ์๋น์ค ํด๋ผ์ด์ธํธ(service client)๋ก ๊ตฌ์ฑ๋๋ค. ํผ๋ธ๋ฆฌ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ก์ ํ๊ณ , ์๋ธ์คํฌ๋ผ์ด๋ฒ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ค. ์๋น์ค ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์๋ตํ๋ ์ญํ ์ ํ๋ฉฐ, ์๋น์ค ํด๋ผ์ด์ธํธ๋ ํน์ ์์ ์ ์์ฒญํ๋ ์ญํ ์ ํ๋ค.
์ฝ๋ฐฑ ํจ์: Node๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฑฐ๋ ์์ฒญ์ ๋ฐ์ ๋ ์คํ๋๋ ํจ์์ด๋ค. ์ฝ๋ฐฑ ํจ์๋ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์คํ๋๋ฉฐ, ์ด๋ฅผ ํตํด Node๊ฐ ๋ฐ์ํ๋ค. ์๋ฅผ ๋ค์ด, ์๋ก์ด ์ผ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์์ ๋ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง์ด ์ฝ๋ฐฑ ํจ์๋ก ์์ฑ๋ ์ ์๋ค.
์คํ ํจ์: ROS2 Node๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ก ๋์ํ๋ฉฐ, ์ด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์คํ ํจ์๊ฐ ์ฌ์ฉ๋๋ค. ์คํ ํจ์๋ Node๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ๊ณ์ํด์ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๋ฉฐ, ์ด๋ฅผ ํตํด Node๋ ์๋ก์ด ๋ฐ์ดํฐ๋ ์์ฒญ์ ์ง์์ ์ผ๋ก ์๋ตํ ์ ์๋ค.
Node์ ์๋ช
์ฃผ๊ธฐ
ROS2์์๋ Node์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด Node ์๋ช ์ฃผ๊ธฐ(lifecycle)๋ฅผ ์ง์ํ๋ค. Node ์๋ช ์ฃผ๊ธฐ๋ Node์ ์ํ๋ฅผ ์ ์ดํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. Node๋ ๋ค์๊ณผ ๊ฐ์ ์ํ๋ฅผ ๊ฐ์ง ์ ์๋ค:
Unconfigured: Node๊ฐ ์ด๊ธฐํ๋์์ง๋ง ์์ง ๊ตฌ์ฑ๋์ง ์์ ์ํ์ด๋ค. ์ด ์ํ์์๋ Node๊ฐ ํ์ฑํ๋์ง ์์ผ๋ฉฐ, ์ฃผ์ ๊ธฐ๋ฅ์ด ์คํ๋์ง ์๋๋ค.
Inactive: Node๊ฐ ๊ตฌ์ฑ๋์์ง๋ง ํ์ฑํ๋์ง ์์ ์ํ์ด๋ค. ์ด ์ํ์์๋ Node์ ํผ๋ธ๋ฆฌ์ ์ ์๋ธ์คํฌ๋ผ์ด๋ฒ๊ฐ ๋์ํ์ง ์์ผ๋ฉฐ, ์ธ๋ถ์์ ํต์ ์ด ์ ํ๋๋ค.
Active: Node๊ฐ ์์ ํ ํ์ฑํ๋ ์ํ๋ก, ํผ๋ธ๋ฆฌ์ ์ ์๋ธ์คํฌ๋ผ์ด๋ฒ๋ฅผ ํฌํจํ ๋ชจ๋ ๊ธฐ๋ฅ์ด ์ ์์ ์ผ๋ก ๋์ํ๋ค.
Finalized: Node๊ฐ ์ข ๋ฃ๋๋ ์ํ๋ก, ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ํด์ ๋๋ค.
Node ์๋ช ์ฃผ๊ธฐ๋ ํนํ ๋ณต์กํ ๋ก๋ด ์์คํ ์์ ์ ์ฉํ๋ฉฐ, Node์ ์ํ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
Node ๊ฐ์ ํต์
Node ๊ฐ์ ํต์ ์ ROS2์ ํต์ฌ ๊ธฐ๋ฅ ์ค ํ๋์ด๋ค. ROS2๋ ๋ถ์ฐ๋ ์์คํ ์์ ์ฌ๋ฌ Node๊ฐ ์๋ก ํจ์จ์ ์ผ๋ก ํต์ ํ ์ ์๋๋ก ๋ค์ํ ํต์ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ค:
ํ ํฝ(Topic): Node ๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ํต์ ๋ฉ์ปค๋์ฆ์ด๋ค. ํผ๋ธ๋ฆฌ์ Node๋ ํน์ ํ ํฝ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ก์ ํ๋ฉฐ, ์๋ธ์คํฌ๋ผ์ด๋ฒ Node๋ ํด๋น ํ ํฝ์ ๊ตฌ๋ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ค. ์ด๋ ์ฃผ๋ก ์ผ์ ๋ฐ์ดํฐ๋ ์ํ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ฌ์ฉ๋๋ค.
์๋น์ค(Service): Node ๊ฐ ๋๊ธฐ์ ์ผ๋ก ํต์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์๋น์ค ํด๋ผ์ด์ธํธ Node๋ ์๋น์ค ์๋ฒ Node์ ์์ฒญ(request)์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ์ด์ ๋ํ ์๋ต(response)์ ๋ฐํํ๋ค. ์ฃผ๋ก ๋ช ๋ น์ ์คํํ๊ฑฐ๋ ํน์ ์์ ์ ์์ฒญํ ๋ ์ฌ์ฉ๋๋ค.
์ก์ (Action): ์๋น์ค์ ์ ์ฌํ์ง๋ง, ๋น๋๊ธฐ์ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ๋๋ค. ์ก์ ์ ์์ฒญ๊ณผ ๋์์ ์์ ์งํ ์ํฉ์ ํผ๋๋ฐฑ๋ฐ์ ์ ์์ผ๋ฉฐ, ์์ ์ด ์๋ฃ๋๋ฉด ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ๋๋ค.
์ด๋ฌํ ํต์ ๋ฉ์ปค๋์ฆ์ ํตํด Node๋ค์ ํ๋ ฅํ์ฌ ๋ณต์กํ ์์ ์ ์ํํ ์ ์๋ค.
Node์ ๊ตฌํ๊ณผ ๊ฐ๋ฐ
ROS2์์ Node๋ฅผ ๊ตฌํํ๋ ๊ณผ์ ์ ์ฃผ๋ก ํ๋ก๊ทธ๋๋ฐ ์ธ์ด(C++ ๋๋ Python)๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฃจ์ด์ง๋ค. ๊ฐ๋ฐ์๋ ROS2 API๋ฅผ ์ฌ์ฉํ์ฌ ํผ๋ธ๋ฆฌ์ , ์๋ธ์คํฌ๋ผ์ด๋ฒ, ์๋น์ค, ์ก์ ๋ฑ์ ์ ์ํ๊ณ , ํ์ํ ๋ก์ง์ ์ฝ๋ฐฑ ํจ์๋ก ์์ฑํ๋ค.
Node ๊ตฌํ์ ์ผ๋ฐ์ ์ธ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค:
Node ํด๋์ค ์ ์: Node๋ ROS2์ rclcpp(๋๋ rclpy) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์๋ฐ์ ํด๋์ค๋ก ์ ์๋๋ค. ์ด ํด๋์ค ์์์ ํผ๋ธ๋ฆฌ์ , ์๋ธ์คํฌ๋ผ์ด๋ฒ, ์๋น์ค, ์ก์ ๋ฑ์ ์ค์ ํ๋ค.
Node ์ด๊ธฐํ: main ํจ์์์ Node๋ฅผ ์ด๊ธฐํํ๊ณ , ์คํ ํจ์๋ฅผ ํธ์ถํ์ฌ Node์ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์์ํ๋ค.
์ฝ๋ฐฑ ํจ์ ์์ฑ: ๊ฐ ํต์ ๋ฉ์ปค๋์ฆ์ ๋ํ ์ฝ๋ฐฑ ํจ์๋ฅผ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ์์ฒญ์ ์๋ตํ๋ ๋ก์ง์ ๊ตฌํํ๋ค.
๋น๋ ๋ฐ ์คํ: CMakeLists.txt ํ์ผ๊ณผ ํจํค์ง ์ค์ ํ์ผ์ ์์ฑํ ํ, colcon ๋น๋ ์์คํ ์ ์ฌ์ฉํ์ฌ Node๋ฅผ ๋น๋ํ๊ณ ์คํํ๋ค.
์ด์ ๊ฐ์ ๊ณผ์ ์ผ๋ก ๊ฐ๋ฐ์๋ ๋ค์ํ ๊ธฐ๋ฅ์ ๊ฐ์ง ROS2 Node๋ฅผ ๊ตฌํํ ์ ์๋ค.
๊ด๋ จ ์๋ฃ:
ROS2 Documentation: https://docs.ros.org/en/foxy/index.html
Programming Robots with ROS2 by Morgan Quigley, Brian Gerkey, and William D. Smart
Last updated