ROS2 : Node

Node์˜ ๊ฐœ๋…๊ณผ ์—ญํ• 

ROS2(๋กœ๋ด‡ ์šด์˜ ์ฒด์ œ 2, Robot Operating System 2)์—์„œ "Node"๋Š” ๋กœ๋ด‡ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ธฐ๋ณธ์ ์ธ ์‹คํ–‰ ๋‹จ์œ„์ด๋‹ค. Node๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ, ๊ฐ Node๋Š” ํŠน์ •ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ROS2 ์‹œ์Šคํ…œ์—์„œ๋Š” ๋‹ค์–‘ํ•œ Node๊ฐ€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ ๋ณต์žกํ•œ ๋กœ๋ด‡ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

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

Node์˜ ๊ตฌ์กฐ์™€ ๊ตฌ์„ฑ ์š”์†Œ

Node๋Š” ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์†Œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค:

  1. ROS2 ํ†ต์‹  ์ธํ„ฐํŽ˜์ด์Šค: Node๋Š” ROS2 ํ†ต์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ Node์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฃผ๋กœ ํผ๋ธ”๋ฆฌ์…”(publisher), ์„œ๋ธŒ์Šคํฌ๋ผ์ด๋ฒ„(subscriber), ์„œ๋น„์Šค ์„œ๋ฒ„(service server), ์„œ๋น„์Šค ํด๋ผ์ด์–ธํŠธ(service client)๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ํผ๋ธ”๋ฆฌ์…”๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์‹ ํ•˜๊ณ , ์„œ๋ธŒ์Šคํฌ๋ผ์ด๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค. ์„œ๋น„์Šค ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ์‘๋‹ตํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ์„œ๋น„์Šค ํด๋ผ์ด์–ธํŠธ๋Š” ํŠน์ • ์ž‘์—…์„ ์š”์ฒญํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

  2. ์ฝœ๋ฐฑ ํ•จ์ˆ˜: Node๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๊ฑฐ๋‚˜ ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์‹คํ–‰๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด Node๊ฐ€ ๋ฐ˜์‘ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด ์„ผ์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

  3. ์Šคํ•€ ํ•จ์ˆ˜: ROS2 Node๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ•€ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. ์Šคํ•€ ํ•จ์ˆ˜๋Š” Node๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด Node๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋‚˜ ์š”์ฒญ์— ์ง€์†์ ์œผ๋กœ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค.

Node์˜ ์ƒ๋ช…์ฃผ๊ธฐ

ROS2์—์„œ๋Š” Node์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Node ์ƒ๋ช…์ฃผ๊ธฐ(lifecycle)๋ฅผ ์ง€์›ํ•œ๋‹ค. Node ์ƒ๋ช…์ฃผ๊ธฐ๋Š” Node์˜ ์ƒํƒœ๋ฅผ ์ œ์–ดํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. Node๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค:

  1. Unconfigured: Node๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์—ˆ์ง€๋งŒ ์•„์ง ๊ตฌ์„ฑ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋‹ค. ์ด ์ƒํƒœ์—์„œ๋Š” Node๊ฐ€ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ฃผ์š” ๊ธฐ๋Šฅ์ด ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

  2. Inactive: Node๊ฐ€ ๊ตฌ์„ฑ๋˜์—ˆ์ง€๋งŒ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋‹ค. ์ด ์ƒํƒœ์—์„œ๋Š” Node์˜ ํผ๋ธ”๋ฆฌ์…”์™€ ์„œ๋ธŒ์Šคํฌ๋ผ์ด๋ฒ„๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์™ธ๋ถ€์™€์˜ ํ†ต์‹ ์ด ์ œํ•œ๋œ๋‹ค.

  3. Active: Node๊ฐ€ ์™„์ „ํžˆ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ๋กœ, ํผ๋ธ”๋ฆฌ์…”์™€ ์„œ๋ธŒ์Šคํฌ๋ผ์ด๋ฒ„๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

  4. Finalized: Node๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ์ƒํƒœ๋กœ, ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•ด์ œ๋œ๋‹ค.

Node ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ํŠนํžˆ ๋ณต์žกํ•œ ๋กœ๋ด‡ ์‹œ์Šคํ…œ์—์„œ ์œ ์šฉํ•˜๋ฉฐ, Node์˜ ์ƒํƒœ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

Node ๊ฐ„์˜ ํ†ต์‹ 

Node ๊ฐ„์˜ ํ†ต์‹ ์€ ROS2์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ROS2๋Š” ๋ถ„์‚ฐ๋œ ์‹œ์Šคํ…œ์—์„œ ์—ฌ๋Ÿฌ Node๊ฐ€ ์„œ๋กœ ํšจ์œจ์ ์œผ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ํ†ต์‹  ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•œ๋‹ค:

  1. ํ† ํ”ฝ(Topic): Node ๊ฐ„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ํ†ต์‹  ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ํผ๋ธ”๋ฆฌ์…” Node๋Š” ํŠน์ • ํ† ํ”ฝ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์‹ ํ•˜๋ฉฐ, ์„œ๋ธŒ์Šคํฌ๋ผ์ด๋ฒ„ Node๋Š” ํ•ด๋‹น ํ† ํ”ฝ์„ ๊ตฌ๋…ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค. ์ด๋Š” ์ฃผ๋กœ ์„ผ์„œ ๋ฐ์ดํ„ฐ๋‚˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

  2. ์„œ๋น„์Šค(Service): Node ๊ฐ„ ๋™๊ธฐ์ ์œผ๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์„œ๋น„์Šค ํด๋ผ์ด์–ธํŠธ Node๋Š” ์„œ๋น„์Šค ์„œ๋ฒ„ Node์— ์š”์ฒญ(request)์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ์ด์— ๋Œ€ํ•œ ์‘๋‹ต(response)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฃผ๋กœ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์ž‘์—…์„ ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

  3. ์•ก์…˜(Action): ์„œ๋น„์Šค์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋น„๋™๊ธฐ์  ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์•ก์…˜์€ ์š”์ฒญ๊ณผ ๋™์‹œ์— ์ž‘์—… ์ง„ํ–‰ ์ƒํ™ฉ์„ ํ”ผ๋“œ๋ฐฑ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š”๋‹ค.

์ด๋Ÿฌํ•œ ํ†ต์‹  ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด Node๋“ค์€ ํ˜‘๋ ฅํ•˜์—ฌ ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Node์˜ ๊ตฌํ˜„๊ณผ ๊ฐœ๋ฐœ

ROS2์—์„œ Node๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์€ ์ฃผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(C++ ๋˜๋Š” Python)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฃจ์–ด์ง„๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ROS2 API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํผ๋ธ”๋ฆฌ์…”, ์„œ๋ธŒ์Šคํฌ๋ผ์ด๋ฒ„, ์„œ๋น„์Šค, ์•ก์…˜ ๋“ฑ์„ ์ •์˜ํ•˜๊ณ , ํ•„์š”ํ•œ ๋กœ์ง์„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•œ๋‹ค.

Node ๊ตฌํ˜„์˜ ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. Node ํด๋ž˜์Šค ์ •์˜: Node๋Š” ROS2์˜ rclcpp(๋˜๋Š” rclpy) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์†๋ฐ›์•„ ํด๋ž˜์Šค๋กœ ์ •์˜๋œ๋‹ค. ์ด ํด๋ž˜์Šค ์•ˆ์—์„œ ํผ๋ธ”๋ฆฌ์…”, ์„œ๋ธŒ์Šคํฌ๋ผ์ด๋ฒ„, ์„œ๋น„์Šค, ์•ก์…˜ ๋“ฑ์„ ์„ค์ •ํ•œ๋‹ค.

  2. Node ์ดˆ๊ธฐํ™”: main ํ•จ์ˆ˜์—์„œ Node๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ์Šคํ•€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Node์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.

  3. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ž‘์„ฑ: ๊ฐ ํ†ต์‹  ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์š”์ฒญ์— ์‘๋‹ตํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•œ๋‹ค.

  4. ๋นŒ๋“œ ๋ฐ ์‹คํ–‰: 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