Study: Robotics(Robot)/Robot: Planning & Control

[Planning] ROS2 Nav2: ROS2 Navigation Stack ์ •๋ฆฌ

DrawingProcess 2023. 8. 29. 13:01
๋ฐ˜์‘ํ˜•
๐Ÿ’ก ๋ณธ ๋ฌธ์„œ๋Š” ROS2 Navigation Stack์ธ 'Nav2'์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋†“์€ ๊ธ€์ž…๋‹ˆ๋‹ค.
๋ณธ๊ฒฉ์ ์œผ๋กœ Nav2์˜ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๊ธฐ ์•ž์„œ Nav2์˜ ์ฃผ์š” ๊ฐœ๋…๋“ค์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜์˜€์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ROS1 Navigation (Move Base)

ROS2 Navigation (Nav2)

ROS2

Action Server(์•ก์…˜ ์„œ๋ฒ„)

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

์ž‘์—…์ด ์™„๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ์•ก์…˜ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ feedback์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด๋Š” ๋ชฉํ‘œ ์ง€์ ๊นŒ์ง€์˜ ๊ฐ๋„, ์„ฑ๊ณต ์—ฌ๋ถ€ ๋“ฑ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”ผ๋“œ๋ฐฑ๊ณผ ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ํด๋ผ์ด์–ธํŠธ์— callback์„ ๋“ฑ๋กํ•จ์œผ๋กœ์จ ๋™์‹œ์— ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

Nav2์—์„œ ์•ก์…˜ ์„œ๋ฒ„๋Š” NavigateToPose ์•ก์…˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด ์ตœ์ƒ์œ„ BT(ํ–‰๋™ ํŠธ๋ฆฌ) ๋‚ด๋น„๊ฒŒ์ดํ„ฐ์™€ ํ†ต์‹ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ BT Navigator๊ฐ€ ์ฐจํ›„ ์ž‘์€ ์•ก์…˜ ์„œ๋ฒ„๋“ค๊ณผ ํ†ต์‹ ํ•˜์—ฌ, plan์„ ๊ณ„์‚ฐํ•˜๊ณ , ๋™์ž‘์ œ์–ด ๋ฐ ๋ณต๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.  

๋„ค๋น„๊ฒŒ์ด์…˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์•ก์…˜ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋กœ ์•ก์…˜ ๋ฉ”์‹œ์ง€ ํƒ€์ž…์„ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ์ž‘์—…์„ ์š”์ฒญํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š”๋ฐ ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์•ก์…˜ ํƒ€์ž…์€ nav2_msgs/action ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•„๋ž˜์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋„ค๋น„๊ฒŒ์ด์…˜ ์ž‘์—…์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์•ก์…˜ ํƒ€์ž…์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด "NavigateToPose" ์•ก์…˜์€ ๋กœ๋ด‡์„ ํŠน์ • ์œ„์น˜๋กœ ์ด๋™์‹œํ‚ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์•ก์…˜์ธ๋ฐ, ํ•ด๋‹น ์•ก์…˜์€ nav2_msgs/action/NavigateToPose ๋ฉ”์‹œ์ง€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด ์•ก์…˜ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ๋ฉ”์‹œ์ง€ ํƒ€์ž…์„ ํ†ตํ•ด ์ž‘์—…์„ ์š”์ฒญํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ฃผ๊ณ ๋ฐ›์Šต๋‹ˆ๋‹ค.

Lifecycle nodes and bond(์ƒ๋ช… ์ฃผ๊ธฐ ๋…ธ๋“œ์™€ ๋ณธ๋“œ)

Lifecycle node๋Š” ROS 2์—์„œ ๋…ธ๋“œ(Node)์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋…ธ๋“œ์˜ ์ดˆ๊ธฐํ™”, ํ™œ์„ฑํ™”, ์ผ์‹œ ์ค‘์ง€, ์ข…๋ฃŒ ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ƒํƒœ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๋…ธ๋“œ๊ฐ€ ์ฒ˜์Œ ์‹œ์ž‘๋˜๋ฉด unconfigured ์ƒํƒœ์ด๋ฉฐ, ROS ๋„คํŠธ์›Œํฌ ์„ค์ •์ด๋‚˜ parameter๋ฅผ ์ฝ๋Š” ๊ฒƒ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋‹จ์ˆœ node ์ƒ์„ฑ์ž๋งŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ launch ์‹œ์Šคํ…œ์ด๋‚˜ ์ œ๊ณต๋œ lifecycle manager์— ์˜ํ•ด ๋…ธ๋“œ๋“ค์€ configuration์„ ํ†ตํ•ด inactive ์ƒํƒœ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„ activing ๋‹จ๊ณ„๋กœ ์ „ํ™˜ํ•˜๋ฉด์„œ node๊ฐ€ ๋น„๋กœ์†Œ activate ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋•Œ configure(๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•„์š”ํ•œ ์ƒํƒœ), activate(๋…ธ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ํ•„์š”ํ•œ ์ƒํƒœ), deactive(๋…ธ๋“œ๊ฐ€ ์ค‘์ง€ ๋  ๋•Œ ํ•„์š”ํ•œ ์ƒํƒœ) ๋“ฑ๊ณผ ๊ฐ™์€ ๋…ธ๋“œ์˜ ์ƒํƒœ๋ฅผ Lifecycle์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด์ฃ .

configuration ๋‹จ๊ณ„์—์„œ๋Š” on_configure() ํ•จ์ˆ˜๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์—ฌ ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ, ROS ๋„คํŠธ์›Œํ‚น ์ธํ„ฐํŽ˜์ด์Šค, ์•ˆ์ „ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑํ™” ๋‹จ๊ณ„์—์„œ๋Š” on_activate() ํ•จ์ˆ˜๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜์—ฌ ROS ๋„คํŠธ์›Œํ‚น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ •๋ณด ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜๋„๋ก ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๋Š” ์ตœ์ข… ์ƒํƒœ์—์„œ deactivating, cleaning up, shutting down ๊ทธ๋ฆฌ๊ณ  end ์ƒํƒœ๋กœ ๊ฐ๊ฐ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„์—์„œ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜๊ณ , ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ•ด์ œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ Lifecycle node๋Š” ์ •์˜๋œ lifecycle ์ƒํƒœ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜๋ฉฐ, ๋กœ๋ด‡ ๋ฐ ์‹œ์Šคํ…œ์˜ ์ œ์–ด ๋ฐ ์šด์˜์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๋ชจ๋“  ROS ์‹œ์Šคํ…œ์€ ๊ฐ€๋Šฅํ•˜๋ฉด ์ด lifecycle ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฉฐ Nav2๋Š” ๋ชจ๋“  ์„œ๋ฒ„์—์„œ lifecycle node framework์„ ํ™œ์šฉํ•  ๋งŒํผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Nav2์—์„œ๋Š” LifecycleNodes์˜ wrapper์ธ nav2_util LifecycleNode๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด wrapper๋Š” ์ผ๋ฐ˜์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด LifecycleNodes์˜ ๋ณต์žกํ•œ ๋ถ€๋ถ„์„ ๋Œ€๋ถ€๋ถ„ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์„œ๋ฒ„๊ฐ€ ์ „ํ™˜๋œ ํ›„์—๋„ active ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก lifecycle manager๋ฅผ ์œ„ํ•œ bond ์—ฐ๊ฒฐ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์„œ๋ฒ„๊ฐ€ ์ถฉ๋Œํ•˜๋Š” ๊ฒฝ์šฐ lifecycle manager์—๊ฒŒ ์ด๋ฅผ ์•Œ๋ฆฌ๊ณ  ์‹œ์Šคํ…œ์„ ๋‹ค์šด์‹œ์ผœ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. 

Nav2์˜ lifecycle manager๋Š” navigation stack์˜ startupshutdownresetpause, resume์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด lifecycle node์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŠน์ • navigation stack์—์„œ ์š”์ฒญ๋œ ์ œ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ lifecycle manager๊ฐ€ lifecycle์ด ํ™œ์„ฑํ™”๋œ ๋…ธ๋“œ(lifecycle์„ ์ด์šฉํ•ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ)๋“ค์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด์ฃ . Lifecycle manager๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ startupshutdownresetpause, resume ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” lifecycle_manager/manage_nodes ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด RVIZ์— ์˜ํ•ด lifecycle manager์˜ manage_nodes service๋กœ๋ถ€ํ„ฐ startup์ด ์š”์ฒญ๋˜๋ฉด lifecycle managers๋Š” ๋…ธ๋“œ ๋ชฉ๋ก์—์„œ lifecycle์ด ํ™œ์„ฑํ™”๋œ ๋…ธ๋“œ๋“ค(Node A, Node B, Node C)์— ๋Œ€ํ•ด configure()๊ณผ activate() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


Behavior Tree(ํ–‰๋™ ํŠธ๋ฆฌ)

์ด์ „ ROS1์—์„œ์˜ move base์™€ ๋น„๊ตํ•ด ๊ฐ€์žฅ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„ ์ ์ด ๋ฐ”๋กœ Behavior Tree ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด Behavior Tree๋Š” Tree ๊ตฌ์กฐ๋กœ ์—ฌ๋Ÿฌ Node๋“ค์ด ๋‚˜๋ฌด ๊ฐ€์ง€์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ๋œ ๊ณ„์ธต์  ์ž๋ฃŒ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ์˜ ์™ผ์ชฝ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉฐ ์„œ๋กœ ์˜์กด์„ฑ์ด ์—†๋Š” ๋…ธ๋“œ๋“ค์ด ์‹คํ–‰๋˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ˆ˜์‹ญ ๊ฐœ์˜ state์™€ ์ˆ˜๋ฐฑ ๊ฐœ์˜ transition์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” FSM๊ณผ๋Š” ๋ฐ˜๋Œ€๋˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์ถ•๊ตฌ๋ฅผ ํ•˜๋Š” ๋กœ๋ด‡์„ ๋งŒ๋“ ๋‹ค๊ณ  ํ•  ๋•Œ Behavior Tree๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์ดˆ ์š”์†Œ์™€ ๊ฐ™์€ 'ํ‚ฅ', '๊ฑท๊ธฐ', '๊ณต์œผ๋กœ ์ด๋™'๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋™์ž‘์— ์žฌ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ๋ณด๋‹ค ๊ฐ„๋‹จํ•œ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Nav2์—์„œ๋Š” Behavior Tree library๋กœ BehaviorTree CPP V3๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Nav2๋Š” ์ด library์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” node๋“ค๋„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ์ž์ฒด์ ์œผ๋กœ ๋งŒ๋“  ์ „์šฉ custom node๋ฅผ ์‚ฌ์šฉํ•ด Behavior Tree๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ง์ ‘ custom node plugin์„ ๋งŒ๋“ค์–ด ์ƒˆ๋กœ์šด Behavior Tree ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ๋“ค์–ด์ค€ node plugin์„ bt_factory์™€ nav2_tree_node.xml์— ๋“ฑ๋ก๋งŒ ํ•ด์ฃผ๋ฉด Behavior Tree ๊ตฌ์„ฑ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Nav2์—์„œ default ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ ์ค‘์ธ behavior tree ๊ตฌ์กฐ


Navigation Servers

Planner, Controller, Smoother and Recovery Servers

Nav2์˜ ๋„ค ๊ฐ€์ง€ ์•ก์…˜ ์„œ๋ฒ„๋Š” Planner, Controller, Smoother ๊ทธ๋ฆฌ๊ณ  Recovery Server์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•ก์…˜ ์„œ๋ฒ„๋Š” ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋งต ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ œ๊ณตํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ถœ๋ ฅ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ ์ •๋ณด(๋งต ๋ฐ์ดํ„ฐ, ์žฅ์• ๋ฌผ ์œ„์น˜, ๋ชฉํ‘œ ์ง€์ , ๋กœ๋ด‡์˜ ์ƒํƒœ ๋“ฑ)๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Planner, Controller ๊ทธ๋ฆฌ๊ณ  Smoother ์„œ๋ฒ„๋Š” ๋Ÿฐํƒ€์ž„์— ์‚ฌ์šฉํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ names๊ณผ types๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. types๋Š” ๋“ฑ๋ก๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์„ ๋งํ•˜๋ฉฐ names๋Š” ์ž‘์—…์˜ ๋ณ„์นญ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •๋œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— FollowPath๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” DWB ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ DWB์— ๋Œ€ํ•œ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜(parameter)๋Š” ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค(์˜ˆ: FollowPath.<param>).

Behavior Tree๊ฐ€ ํ•ด๋‹น BT ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋ฉด action server๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๋‚ด๋ถ€์˜ action server callback์€ ํŠน์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋งคํ•‘๋˜๋Š” ์ด๋ฆ„(์˜ˆ: FollowPath)์œผ๋กœ ์„ ํƒํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(DWB๋‚˜ RPP ๋“ฑ)์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” Behavior Tree์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํด๋ž˜์Šค๋กœ ์ถ”์ƒํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์ฃ .

Planner

Planner์˜ ์—ญํ• ์€ objective ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Planner๋Š” ์ด๋ฅผ ์œ„ํ•ด global environmental representation(์ „์—ญ ํ™˜๊ฒฝ ํ‘œํ˜„ - ๋กœ๋ด‡์ด ์ „์ฒด ํ™˜๊ฒฝ์„ ํฌ๊ด„์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ) ๋ฐ ๋ฒ„ํผ์— ์ €์žฅ๋œ ์„ผ์„œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Planner๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋ชฉ์ ์ง€๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ณ„์‚ฐ
  • ์™„์ „ํ•œ coverage path(์ปค๋ฒ„๋ฆฌ์ง€ ๊ฒฝ๋กœ - ์ง€์ •๋œ ์˜์—ญ์„ ๋กœ๋ด‡์ด ํšจ์œจ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ณ  ๋ชจ๋“  ์ง€์ ์„ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒฝ๋กœ) ๊ณ„์‚ฐ
  • sparse path(ํฌ์†Œ ๊ฒฝ๋กœ - ๋กœ๋ด‡์˜ ์ด๋™ ๊ฒฝ๋กœ ์ค‘ ๋ฏธ๋ฆฌ ์ •์˜๋œ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ง€์ ๋งŒ์„ ํฌํ•จํ•˜๋Š” ๊ฒฝ๋กœ) ๋˜๋Š” predefined routes(๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ฒฝ๋กœ)๋ฅผ ๋”ฐ๋ผ ๊ฒฝ๋กœ ๊ณ„์‚ฐ

Nav2์—์„œ Planner์˜ ์ผ๋ฐ˜์ ์ธ ์—ญํ• ์€ ํ˜„์žฌ ์œ„์น˜์—์„œ ๋ชฉํ‘œ ์œ„์น˜๊นŒ์ง€ ์œ ํšจํ•˜๊ณ  ์ž ์žฌ์ ์œผ๋กœ ์ตœ์ ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Planner๋Š” ์ตœ์  ๊ฒฝ๋กœ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋กœ๋ด‡์˜ ์ž‘์—…์ด๋‚˜ ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๋Š” ๋‹ค์–‘ํ•œ ๊ณ„ํš๊ณผ ๊ฒฝ๋กœ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Controller

ROS 1์—์„œ local planner๋ผ๊ณ  ๋ถˆ๋ ธ๋˜ Controller๋Š” ์ „์—ญ์ ์œผ๋กœ ๊ณ„์‚ฐ๋œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ฅด๊ฑฐ๋‚˜ ๋กœ์ปฌ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. Controller๋Š” local environmental representation(๋กœ์ปฌ ํ™˜๊ฒฝ ํ‘œํ˜„ - ๋กœ๋ด‡์ด ํ˜„์žฌ ์œ„์น˜ ์ฃผ๋ณ€์˜ ์ž‘์€ ์˜์—ญ์„ ํฌํ˜„ํ•œ ๊ฒƒ)์— ์ ‘๊ทผํ•˜์—ฌ ๊ธฐ์ง€(base)๊ฐ€ ๋”ฐ๋ผ์•ผ ํ•  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ œ์–ด ํ™œ๋™์„ ๊ณ„์‚ฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ Controller๋Š” ๋กœ๋ด‡์„ ๊ณต๊ฐ„ ์•ž์œผ๋กœ ํˆฌ์˜ํ•˜๊ณ  ๊ฐ ์—…๋ฐ์ดํŠธ๋งˆ๋‹ค ๋กœ์ปฌ์—์„œ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

Controller๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๊ฒฝ๋กœ ๋”ฐ๋ผ๊ฐ€๊ธฐ
  • Odometric frame(์ขŒํ‘œ๊ณ„)์—์„œ์˜ ๊ฐ์ง€๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถฉ์ „ ์Šคํ…Œ์ด์…˜์— ๋„ํ‚นํ•˜๋Š” ์ž‘์—…
  • ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ ํƒ‘์Šน
  • ๋„๊ตฌ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ

Nav2์—์„œ Controller์˜ ์ผ๋ฐ˜์ ์ธ ์—ญํ• ์€ global plan์„ ๋”ฐ๋ฅด๊ธฐ ์œ„ํ•œ ์œ ํšจํ•œ control ํ™œ๋™์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ Nav2์—๋Š” ๋งŽ์€ ์ข…๋ฅ˜์˜ Controller์™€ Local Planner๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ €๋งˆ๋‹ค์˜ ๋ชฉ์ ์— ๋”ฐ๋ผ plugin์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

Behaviors

Recovery Behaviors(๋ณต๊ตฌ ๋™์ž‘)์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๊ณ ์žฅ๋‚˜๋„ ์‹œ์Šคํ…œ์ด ์ค‘๋‹จ ์—†์ด ๊ณ„์† ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š”(๋‚ด๊ฒฐํ•จ์„ฑ ์‹œ์Šคํ…œ) ์ฃผ์š” ์š”์†Œ์ž…๋‹ˆ๋‹ค. Recovery์˜ ๋ชฉํ‘œ๋Š” ์‹œ์Šคํ…œ์˜ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃจ๊ณ  ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ์ž์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ธ์‹ ์‹œ์Šคํ…œ์— ๊ฒฐํ•จ์ด ๋ฐœ์ƒํ•˜์—ฌ ํ™˜๊ฒฝ ํ‘œํ˜„์ด ๊ฐ€์งœ ์žฅ์• ๋ฌผ๋กœ ๊ฐ€๋“ ์ฐจ๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ ๋กœ๋ด‡์€ Clear Costmap Recovery(์ฝ”์ŠคํŠธ๋งต ๋ณต๊ตฌ)๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋กœ๋ด‡์ด ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ๋Š” ๋™์  ์žฅ์• ๋ฌผ์ด๋‚˜ ์ œ์–ด ๋ถˆ๋Ÿ‰์œผ๋กœ ์ธํ•ด ๋กœ๋ด‡์ด ๋ฉˆ์ถ˜ ๊ฒฝ์šฐ๋ฅผ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ ๋กœ๋ด‡์ด ํ›„์ง„ํ•˜๊ฑฐ๋‚˜ ์ œ์ž๋ฆฌ์—์„œ ํšŒ์ „ํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋˜๋Š” ๊ฒฝ์šฐ, ๋กœ๋ด‡์ด ์—ด์•…ํ•œ ์œ„์น˜์—์„œ ์ž์œ  ๊ณต๊ฐ„์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์„ฑ๊ณต์ ์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์™„์ „ํžˆ ์‹คํŒจํ•œ ๊ฒฝ์šฐ ์šด์˜์ž์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด Recovery Behaviors(๋ณต๊ตฌ ๋™์ž‘)์ด ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ์ด๋ฉ”์ผ, SMS, Slack, Matrix ๋“ฑ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Behavior server๋Š” ๋‹จ์ˆœํžˆ Recovery Behaviors(๋ณต๊ตฌ ๋™์ž‘)์„ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ Behavior๋“ค์ด ๊ณต์œ ํ•˜๋Š” ๋น„์šฉ์ด ํฐ ์ž์›(costmap์ด๋‚˜ tf buffer)์— ์ ‘๊ทผํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ์จ Behavior๋“ค์€ Recovery ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Smoothers

Planner๊ฐ€ ํƒ์ƒ‰ํ•œ ๊ฒฝ๋กœ์˜ ์ตœ์ ์„ฑ ๊ธฐ์ค€์ด ์ผ๋ฐ˜์ ์œผ๋กœ ํ˜„์‹ค์— ๋น„ํ•ด ๋‚ฎ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฝ๋กœ์˜ ์ถ”๊ฐ€์ ์ธ ๊ฐœ์„ ์ด ๋„์›€์ด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชฉ์ ์œผ๋กœ ๋„์ž…๋œ Smoother(์Šค๋ฌด๋”)๋Š” ์ฃผ๋กœ ๊ฒฝ๋กœ์˜ ์šธํ‰๋ถˆํ‰ํ•จ์„ ๊ฐ์†Œ์‹œํ‚ค๊ณ  ๊ธ‰๊ฒฉํ•œ ํšŒ์ „์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ•˜๋ฉฐ, ๋˜ํ•œ ์ „์—ญ ํ™˜๊ฒฝ ํ‘œํ˜„์— ์•ก์„ธ์Šคํ•˜์—ฌ ์žฅ์• ๋ฌผ ๋ฐ high-cost area(๊ณ ๋น„์šฉ ์˜์—ญ)์—์„œ ๋” ๋ฉ€๋ฆฌ ์ด๋™ํ•˜๋„๋ก ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

Nav2์—์„œ Smoother์˜ ์ผ๋ฐ˜์ ์ธ ์—ญํ• ์€ ๊ฒฝ๋กœ๋ฅผ ๋ฐ›์•„์„œ ๊ฐœ์„ ๋œ ๋ฒ„์ „์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž…๋ ฅ ๊ฒฝ๋กœ๋งˆ๋‹ค ๊ฐœ์„  ๊ธฐ์ค€๊ณผ ํ•ด๋‹น ๊ฐœ์„  ๋ฐฉ๋ฒ•์ด ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ์„œ๋ฒ„์— ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋งŽ์€ ์Šค๋ฌด๋”๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.


State Estimation(์ƒํƒœ ์ถ”์ •)

Navigation project์—๋Š” community standards์— ๋”ฐ๋ผ ์ œ๊ณต๋˜์–ด์•ผ ํ•˜๋Š” 2๊ฐ€์ง€ ์ฃผ์š” ๋ณ€ํ™˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ map -> odom ๋ณ€ํ™˜์€ positioning system(localization, mapping, SLAM)์— ์˜ํ•ด ์ œ๊ณต๋˜๋ฉฐ, ๋‘ ๋ฒˆ์งธ odom -> base link ๋ณ€ํ™˜์€ odometry system์— ์˜ํ•ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.  

โ€ป ์ฐธ๊ณ 
Navigation system์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋กœ๋ด‡์— ๋ผ์ด๋‹ค๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ Nav2๋Š” ๋ผ์ด๋‹ค๋ฅผ ์ด์šฉํ•œ ์ถฉ๋Œ ํšŒํ”ผ, localization, SLAM์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์‹ค์ œ๋กœ ๊ฒ€์ฆ๋œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•  Standard๋งŒ์„ ์ค€์ˆ˜ํ•œ๋‹ค๋ฉด vision์ด๋‚˜ depth ๊ธฐ๋ฐ˜ ์œ„์น˜ ๊ฒฐ์ • ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ถฉ๋Œ ํšŒํ”ผ๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ์„ผ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์„ฑ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Standards

REP 105๋Š” Navigation๊ณผ ๋” ํฐ ROS ์—์ฝ”์‹œ์Šคํ…œ์— ํ•„์š”ํ•œ frame๊ณผ ๊ทœ์•ฝ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ทœ์•ฝ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ œ๊ณต๋˜๋Š” ํ’๋ถ€ํ•œ positioning, odometry ๋ฐ SLAM ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•ญ์ƒ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

REP-105๋ฅผ ๊ฐ„๋žตํžˆ ์„ค๋ช…ํ•˜๋ฉด ์ตœ์†Œํ•œ ๋กœ๋ด‡์— ๋Œ€ํ•œ ์ „์ฒด map -> odom -> base link -> [sensor frames]์„ ํฌํ•จํ•˜๋Š” TF ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. TF2๋Š” ์‹œ๊ฐ„ ๋ณ€ํ™˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ROS 2์—์„œ time synchronized transformations(์‹œ๊ฐ„๊ณผ ๋™๊ธฐํ™”๋œ ๋ณ€ํ™˜)์„ ํ‘œํ˜„ํ•˜๊ณ  ์–ป๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Global positioning system(์ „์—ญ ์œ„์น˜ ๊ฒฐ์ • ์‹œ์Šคํ…œ - ์˜ˆ) GPS, SLAM, Motion Capture)์€ ์ตœ์†Œํ•œ map -> odom ๋ณ€ํ™˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์—ญํ• ์ด๋ฉฐ, ๊ทธ๋Ÿฐ ๋‹ค์Œ odometry system์€ odom -> base_link ๋ณ€ํ™˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์—ญํ• ์ž…๋‹ˆ๋‹ค. base_link์™€ ๊ด€๋ จ๋œ ๋‚˜๋จธ์ง€ ๋ณ€ํ™˜์€ ์ •์ ์ด์–ด์•ผ ํ•˜๋ฉฐ URDF์— ์ •์˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Global Positioning: Localization and SLAM

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ตœ์†Œํ•œ map -> odom ๋ณ€ํ™˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด Global positioning system(GPS, SLAM, Motion Capture)์˜ ์—ญํ• ์ž…๋‹ˆ๋‹ค. Nav2๋Š” static map(์ •์  ์ง€๋„)์—์„œ์˜ localization๋ฅผ ์œ„ํ•ด ํŒŒํ‹ฐํด ํ•„ํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” Adaptive Monte-Carlo Localization(์ ์‘ํ˜• ๋ชฌํ…Œ์นด๋ฅผ๋กœ) ๊ธฐ๋ฒ•์ธ amcl์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์œ„์น˜ ๊ฒฐ์ • ๋ฐ static map(์ •์  ์ง€๋„)์˜ ์ƒ์„ฑ์„ ์œ„ํ•ด SLAM Toolbox๋ฅผ ๊ธฐ๋ณธ SLAM ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Odometry

Odometry system์˜ ์—ญํ• ์€ odom -> base_link ๋ณ€ํ™˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Odometry๋Š” ๋ผ์ด๋”(LIDAR), ๋ ˆ์ด๋”(RADAR), ๋ฐ”ํ€ด ์—”์ฝ”๋”, ์‹œ๊ฐ ๊ธฐ๋ฐ˜ ์œ„์น˜ ์ถ”์ •(VIO), ๊ด€์„ฑ ์ธก์ • ์žฅ์น˜(IMU) ๋“ฑ ๋‹ค์–‘ํ•œ ๊ณณ์œผ๋กœ๋ถ€ํ„ฐ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Odometry์˜ ๋ชฉํ‘œ๋Š” ๋กœ๋ด‡์˜ ์›€์ง์ž„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ถ€๋“œ๋Ÿฝ๊ณ  ์—ฐ์†์ ์ธ ๋กœ์ปฌ ํ”„๋ ˆ์ž„์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Global positioning system์€ odometry drift(์ ์ฐจ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์˜ค์ฐจ)๋ฅผ ๊ณ ๋ คํ•˜์—ฌ global frame(๊ณ ์ •๋œ ์ขŒํ‘œ๊ณ„)์„ ๊ธฐ์ค€์œผ๋กœ ๋ณ€ํ™˜์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

Robot Localization์€ ์ด๋Ÿฌํ•œ ํ“จ์ „์„ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ N๊ฐœ์˜ ์„ผ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ์†์ ์ด๊ณ  ์›ํ™œํ•œ odometry๋ฅผ TF์™€ topic์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋ชจ๋ฐ”์ผ ๋กœ๋ด‡ ์„ค์ •์—์„œ๋Š” ๋ฐ”ํ€ด ์ธ์ฝ”๋”, IMU ๋ฐ ๋น„์ „์˜ odometry๋ฅผ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋“œ๋Ÿฌ์šด odometry ์ถœ๋ ฅ์€ global position updates(์ „์—ญ ์œ„์น˜ ์—…๋ฐ์ดํŠธ) ๊ฐ„ ๋กœ๋ด‡์˜ ์œ„์น˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Environmental Representation(ํ™˜๊ฒฝ ํ‘œํ˜„)

Environmetal representation์€ ๋กœ๋ด‡์ด ์ž์‹ ์˜ ์ฃผ๋ณ€ ํ™˜๊ฒฝ์„ ์ธ์‹ํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ฐ์ดํ„ฐ๋“ค์˜ ์ •๋ณด๋ฅผ ๋‹จ์ผ ๊ณต๊ฐ„์œผ๋กœ ๊ฒฐํ•ฉํ•˜๊ธฐ ์œ„ํ•œ central localization(์ค‘์•™ ๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜) ์—ญํ• ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณต๊ฐ„์€ Controller, Planner, Recovery ๋“ฑ์ด ์ž‘์—…์„ ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Costmaps and Layers(์ฝ”์ŠคํŠธ๋งต๊ณผ ๋ ˆ์ด์–ด)

ํ˜„์žฌ ์‚ฌ์šฉ๋˜๋Š” ํ™˜๊ฒฝ ํ‘œํ˜„์€ Costmap(์ฝ”์ŠคํŠธ๋งต)์ž…๋‹ˆ๋‹ค. Costmap์€ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์˜์—ญ, ์ž์œ ๋กญ๊ฒŒ ์ด๋™ ๊ฐ€๋Šฅํ•œ ์˜์—ญ, ์ ์œ ๋œ ์˜์—ญ, ํŒฝ์ฐฝ๋œ ์ฝ”์ŠคํŠธ๋กœ ๊ตฌ์„ฑ๋œ ์ผ์ •ํ•œ 2D ๊ฒฉ์ž ๊ทธ๋ฆฌ๋“œ์ž…๋‹ˆ๋‹ค. ์ด ์ฝ”์ŠคํŠธ๋งต์€ global plan(์ „์—ญ ๊ฒฝ๋กœ ๊ณ„ํš)์„ ์œ„ํ•ด ํƒ์ƒ‰๋˜๊ฑฐ๋‚˜, local control efforts(๋กœ์ปฌ ์ œ์–ด ๋…ธ๋ ฅ)์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒ˜ํ”Œ๋ง๋˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ Costmap Layers(์ฝ”์ŠคํŠธ๋งต ๋ ˆ์ด์–ด)๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„๋˜์–ด ์ฝ”์ŠคํŠธ๋งต์— ์ •๋ณด๋ฅผ ๋ฒ„ํผ๋ง(์ €์žฅ)ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ผ์ด๋‹ค, ๋ ˆ์ด๋”, ์ŒํŒŒ, ๊นŠ์ด, ์ด๋ฏธ์ง€ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. Costmap Layers๋Š” ์นด๋ฉ”๋ผ๋‚˜ ๊นŠ์ด ์„ผ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ํ›„ ์žฅ์• ๋ฌผ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ถ”์ ํ•˜์—ฌ ์ถฉ๋Œ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์–ด๋–ค ๊ทœ์น™์ด๋‚˜ ํœด๋ฆฌ์Šคํ‹ฑ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๊ธฐ๋ณธ ์ฝ”์ŠคํŠธ๋งต์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

map์— ํ‘œํ˜„๋œ global costmap๊ณผ local costmap

Costmap FIlters(์ฝ”์ŠคํŠธ๋งต ํ•„ํ„ฐ)

์ง€๋„ ํŒŒ์ผ์— ์ฃผ์„์„ ๋‹ฌ์•„ ์–ด๋–ค ์œ„์น˜์—์„œ ํŠน์ • ๋™์ž‘์ด ๋ฐœ์ƒํ•˜๋„๋ก ํ•˜๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ์ฃผ์„/ํ‘œ์‹œ ์˜ˆ์‹œ๋กœ๋Š” ๋‚ด๋ถ€์—์„œ ํ”ผํ•ด์•ผ ํ•  ์˜์—ญ์„ ๋‚˜ํƒ€๋‚ด๊ฑฐ๋‚˜ ํ‘œ์‹œ๋œ ํ”ฝ์…€ ์˜์—ญ์—์„œ ์ตœ๋Œ€ ์†๋„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์„ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ์˜์—ญ์„ "Filter Mask(ํ•„ํ„ฐ ๋งˆ์Šคํฌ)"๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•„ํ„ฐ ๋งˆ์Šคํฌ์˜ ์ฃผ์š” ๋ชฉํ‘œ๋Š” ์ง€๋„์˜ ํŠน์ • ์˜์—ญ์— ์ผ๋ถ€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด๋‚˜ ํ–‰๋™ ๋ณ€ํ™”๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Costmap Filters(์ฝ”์ŠคํŠธ๋งต ํ•„ํ„ฐ)๋Š” ํ•„ํ„ฐ ๋งˆ์Šคํฌ์— ์ฃผ์„์ด ๋‹ฌ๋ฆฐ spatial-dependent behavioral changes(๊ณต๊ฐ„์— ์˜์กดํ•˜๋Š” ๋™์ž‘ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์˜ˆ) ํŠน์ • ๊ณต๊ฐ„์—์„œ ์ตœ๋Œ€ ์†๋„ ์ œํ•œ)์„ Nav2 ์Šคํƒ์— ์ ์šฉํ•˜๋Š” costmap layer-based approach(์ฝ”์ŠคํŠธ๋งต ๋ ˆ์ด์–ด ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹)์ž…๋‹ˆ๋‹ค. ์ฝ”์ŠคํŠธ๋งต ํ•„ํ„ฐ๋Š” ์ฝ”์ŠคํŠธ๋งต ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•„ํ„ฐ ๋งˆ์Šคํฌ์— ํ‘œ์‹œ๋œ ๊ณต๊ฐ„ ์ฃผ์„์— ๋”ฐ๋ผ ์ฝ”์ŠคํŠธ๋งต์„ ํ•„ํ„ฐ๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— 'ํ•„ํ„ฐ'๋ผ๊ณ  ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. ํ•„ํ„ฐ๋ง๋œ ์ฝ”์ŠคํŠธ๋งต์„ ๋งŒ๋“ค๊ณ  ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ์˜์—ญ์—์„œ ๋กœ๋ด‡์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ํ•„ํ„ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•„ํ„ฐ ๋งˆ์Šคํฌ์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋Š” ํ•„ํ„ฐ ๊ณต๊ฐ„์—์„œ ํ”ผ์ฒ˜ ๋งต์œผ๋กœ ์„ ํ˜•์ ์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณ€ํ™˜๋œ ํ”ผ์ฒ˜ ๋งต์„ map/costmap(์ง€๋„/์ฝ”์ŠคํŠธ๋งต)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ์„ผ์„œ ๋ฐ์ดํ„ฐ์™€ robot coordinate filters(ํ˜„์žฌ ๋กœ๋ด‡ ์ขŒํ‘œ ํ•„ํ„ฐ)๊ฐ€ ๊ธฐ๋ณธ ์ฝ”์ŠคํŠธ๋งต์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋กœ๋ด‡์˜ ์œ„์น˜์— ๋”ฐ๋ผ ๋กœ๋ด‡์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”์ŠคํŠธ๋งต ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋กœ๋ด‡์ด ์ ˆ๋Œ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋Š” ์ ‘๊ทผ ๊ธˆ์ง€/์•ˆ์ „ ๊ตฌ์—ญ
  • ์†๋„ ์ œํ•œ ๊ตฌ์—ญ, ํ•ด๋‹น ์˜์—ญ์— ์ง„์ž…ํ•˜๋Š” ๋กœ๋ด‡์˜ ์ตœ๋Œ€ ์†๋„๊ฐ€ ์ œํ•œ๋จ
  • ์‚ฐ์—… ํ™˜๊ฒฝ ๋ฐ ์ฐฝ๊ณ ์—์„œ ์ด๋™ํ•˜๋Š” ๋กœ๋ด‡๋“ค์„ ์œ„ํ•œ ์„ ํ˜ธ ๋ ˆ์ธ

 

์ตœ๋Œ€ ์†๋„๋ฅผ ์ œํ•œํ•˜๋Š” ์ฝ”์ŠคํŠธ๋งต ํ•„ํ„ฐ๊ฐ€ ์ ์šฉ๋œ map, ๋ถ„ํ™์ƒ‰ ์‚ฌ๊ฐํ˜•์ด ์†๋„๋ฅผ ์ œํ•œํ•˜๋Š” filter mask์— ํ•ด๋‹น๋œ๋‹ค.

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•