๐Ÿ’ป Language/ROS : ๋กœ๋ด‡์‹œ์Šคํ…œ

[ROS] ROS๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (Robotics)

mxnxeonx 2022. 7. 4. 16:49
728x90
728x90

ROS๋ž€?

๋ฐฐํฌ ๊ฐ€๋Šฅํ•˜๊ณ , ๋ชจ๋“ˆํ˜• ๋””์ž์ธ ๋กœ๋ด‡ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์œ„ํ•œ ๋ฏธ๋“ค์›จ์–ด. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋“œ์›จ์–ด๋ฅผ ๊ตฌ๋™ํ•˜๋Š” OS(์˜ˆ: ubuntu)๋ฅผ ์„ค์น˜ํ•œ ํ›„ apt๋“ฑ์˜ ํŒจํ‚ค์ง• ํˆด์„ ์ด์šฉํ•˜์—ฌ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

ROS = Plumbing + Tools + Capabilities + Ecosystem

  • Plumbing: publish-subscribe messaging infrastructure design์„ ์ œ๊ณตํ•˜์—ฌ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆํ˜• ์‹œ์Šคํ…œ์„ ๋น ๋ฅด๊ณ  ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ
  • Tools: ์‹คํ–‰, ์ค‘๋‹จ, ๊ด€์ธก, ๋””๋ฒ„๊น…, ๋กœ๊น…, ํ…Œ์ŠคํŒ…, ๋น„์ฃผ์–ผ๋ผ์ด์ง• ๊ฐ€๋Šฅํ•œ ๊ธฐ๋ณธ ๋„๊ตฌ๋ฅผ ์ œ๊ณต
  • Capabilities: ๋กœ๋ด‡ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ libraries๋ฅผ ์ œ๊ณต
  • Ecosystem: ๊ฐœ๋ฐœ ๋ถ€ํ„ฐ integration๊ณผ documentation์— ๊ฐ•ํ•œ ์ค‘์ ์„ ๋‘๊ณ ์žˆ์–ด ์ „ ์„ธ๊ณ„, ๊ฑฐ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์˜ํ•ด ์ƒํƒœ๊ณ„๊ฐ€ ํ˜•์„ฑ๋  ์ˆ˜ ์žˆ๊ณ  ๊ทธ๋กœ ์ธํ•ด ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง€๊ณ  ๋กœ๋ด‡ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๋น ๋ฅธ ๋ฐœ์ „์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Œ → ๋ฐฐํฌ ๊ฐ€๋Šฅํ•˜๊ณ  ๋ชจ๋“ˆํ˜• ๋””์ž์ธ์„ ์ถ”๊ตฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ!

 

ROS์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ

  • ํ”„๋กœ๊ทธ๋žจ ๊ฐ„ ํ†ต์‹ ์„ ๋งค์šฐ ๊ฐ„ํŽธํ•˜๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅ (TCP/IP ๋“ฑ์˜ ํ†ต์‹  ์†Œ์ผ“ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†์ด ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ)
  • ํ•˜๋“œ์›จ์–ด ๋“œ๋ผ์ด๋ฒ„ ํŒจํ‚ค์ง€ (Camera, LIDAR, Dynamixel ๋“ฑ ๋‹ค์–‘ํ•œ ํ•˜๋“œ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค ์กด์žฌ)
  • ๋‹ค์–‘ํ•œ ํ•„์ˆ˜ + ์œ ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํฌํ•จ (OpenCV ์˜์ƒ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Eigen ์„ ํ˜•๋Œ€์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ)
  • ๋ชจ๋‹ˆํ„ฐ๋ง / ๋””๋ฒ„๊น… ๋„๊ตฌ

 

ROS์˜ ํ•œ๊ณ„

  • ์ƒ์—…์šฉ ์ œํ’ˆ์ด ์•„๋‹Œ Open-source๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์œ ์ง€๋ณด์ˆ˜ ํ•˜๊ฑฐ๋‚˜ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋„์›€์„ ๋ฐ›์•„์•ผ ํ•จ
  • Real-time programming ๋ฌธ์ œ ์กด์žฌ (ROS 1.0: ros_control + PREEMPT_RT / ROS 2.0: ํ†ต์‹  ์‹œ์Šคํ…œ (DDS) real-time safeํ™”, nodelet ํ™œ์„ฑํ™”)
  • ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์ดˆ๊ธฐ ๊ตฌ์„ฑ์˜ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ

 

ROS1๊ณผ ROS2์˜ ์ฐจ์ด

  1. ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ์—์„œ ํ˜ธํ™˜ ๊ฐ€๋Šฅ (Ubuntu, Mac OS, Windows) → ROS1์—์„œ๋„ WinROS์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ํ™œ์šฉํ•ด์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธด ํ•˜์ง€๋งŒ ROS2์—์„œ๋Š” ์ •์‹์œผ๋กœ ๋ฐฐํฌ๋˜์–ด ๋‹ค์–‘ํ•œ Window์šฉ ํŒจํ‚ค์ง€๋“ค์ด ๋ฐฐํฌ๋˜๊ณ  ์žˆ์Œ
  2. Real-time ์ •์‹ ์ œ๊ณต → ROS1์˜ ํ†ต์‹  ๋ฐฉ์‹์ด TCP๋ฐฉ์‹์—์„œ Data Distribution Service(DDS) ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋˜๋ฉด์„œ Real Time Publish Subscribe (RTPS) ์™€ ๊ฐ™์ด Real-time์ด ์ œ๊ณต๋˜๋Š” publisher๋ฅผ ์ •์‹์œผ๋กœ ์ง€์›ํ•œ๋‹ค.
  3. ๋ณด์•ˆ ์ด์Šˆ ํ•ด๊ฒฐ → ROS1.0์˜ ๊ฒฝ์šฐ์—๋Š” ros master์˜ IP๊ฐ€ ๋…ธ์ถœ๋˜๋ฉด ๋™์ผ ๋„คํŠธ์›Œํฌ ์ƒ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์‰ฝ๊ฒŒ ํ•ดํ‚น๋‹นํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ROS2.0์—์„œ DDS๊ธฐ๋ฐ˜ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ๋ณด์•ˆ ์ด์Šˆ๋ฅผ ํ†ต์‹ ๋‹จ์—์„œ๋ถ€ํ„ฐ ํ•ด๊ฒฐ๋จ
  4. Node๋“ค์ด ๋…๋ฆฝ์ ์œผ๋กœ ํ†ต์‹  ์ˆ˜ํ–‰ → Node๋“ค์„ ์ค‘์žฌํ•ด์ฃผ๋Š” Roscore๊ฐ€ ์—†์–ด์ง. ROS Master์˜ ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๋ฉด ์‹œ์Šคํ…œ์ด ๋งˆ๋น„๋˜๋Š” ๋‹จ์ ์„ ๋ฐฉ์ง€
  5. ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์„œ๋„ ์—ฌ๋Ÿฌ ๋…ธ๋“œ ์‹คํ–‰ ๊ฐ€๋Šฅ → ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  6. Cmake๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒจํ‚ค์ง€ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  7. ํŒจํ‚ค์ง€๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋นŒ๋“œ ๊ฐ€๋Šฅ → ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ๋™์‹œ์— ๋นŒ๋“œํ•˜๊ฒŒ ๋˜๋Š” ROS1์— ๋น„ํ•ด ํŒจํ‚ค์ง€์˜ ์ข…์†์„ฑ์˜ ์ค‘์š”์„ฑ์ด ๋‚ฎ์•„์ง€๊ฒŒ ๋จ

 

ROS์˜ ๊ตฌ์กฐ

  • Nodes : ROS ํ†ต์‹ ์„ ์ด์šฉํ•˜๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ
  • Messages: Publish, subscribe ๋˜๋Š” ROS ๋ฐ์ดํ„ฐ ํ˜•์‹
  • Service: Server์™€ Client๋กœ ์‚ฌ์ด์— ์ „๋‹ฌ๋˜๋Š” ROS ๋ฐ์ดํ„ฐ ํ˜•์‹
  • Topics: ๊ฐ™์€ topic์„ ํ†ตํ•ด publisher์™€ subscriber๊ฐ€ ์ด์–ด์ง
  • Actions: Topic๊ณผ Service๊ฐ€ ํ˜ผํ•ฉ๋œ ํ˜•ํƒœ
  • Master: ๋…ธ๋“œ๋ผ๋ฆฌ ์„œ๋กœ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์›€ (Topic ๊ด€๋ฆฌ ๋“ฑ)
  • rosout: ROS์ƒ์˜ stdout/stderr
  • roscore: Master + rosout + parameter server

 


 

ROS๋Š” ๋‹ค์ˆ˜์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์—ฐ๊ฒฐ/์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ†ต์‹  ๊ตฌ์กฐ๋ฅผ ์ถ”์ƒํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋•๋Š”๋‹ค.

Publisher → Subscriber ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ†ต์‹  ๋ฐฉ์‹

 

A, B ๋‘ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ Topic์œผ๋กœ ํ†ต์‹ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

โ–ช ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰/๊ตฌ๋…

  1. A ๋…ธ๋“œ(Publisher)๋Š” Master์—๊ฒŒ ๋ฐœํ–‰ํ•  Topic ์ด๋ฆ„์„ ์•Œ๋ฆฐ๋‹ค.
  2. B ๋…ธ๋“œ(Subscriber)๋Š” Master์—๊ฒŒ ๊ตฌ๋…ํ•  Topic ์ด๋ฆ„์„ ์•Œ๋ฆฐ๋‹ค.
  3. Master๋Š” ๊ตฌ๋…ํ•  Topic ์ด๋ฆ„์ด ๋ฐœํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  4. ๋ฐœํ–‰ ์ค‘์ด๋ฉด ๋ฐœํ–‰์ž(Publisher, A)์™€ ๊ตฌ๋…์ž(Subscriber, B)๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.
  5. ๋ฐœํ–‰์ž(Publisher, A)๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๋ฉด Master์˜ ํ†ต๊ณผ ์—†์ด ๊ตฌ๋…์ž(Subscriber, B)์—๊ฒŒ ๋ฐ”๋กœ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋œ๋‹ค.
  6. ๋ฉ”์‹œ์ง€๊ฐ€ ๊ตฌ๋…์ž(Subscriber, B)์—๊ฒŒ ๋„์ฐฉํ•˜๋ฉด callback ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

โ–ช ์„œ๋น„์Šค ์š”์ฒญ/์‘๋‹ต

  1. ํด๋ผ์ด์–ธํŠธ ๋…ธ๋“œ(Subscriber, B)๊ฐ€ ์„œ๋ฒ„ ๋…ธ๋“œ(Publisher, A)์—๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์š”์ฒญํ•œ๋‹ค.
  2. ์„œ๋ฒ„ ๋…ธ๋“œ(Publisher, A)๋Š” ํด๋ผ์ด์–ธํŠธ ๋…ธ๋“œ(Subscriber, B)์˜ ์š”์ฒญ์„ ๋ฐ›๊ณ  ์ฒ˜๋ฆฌํ•˜์—ฌ ์‘๋‹ตํ•œ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ ๋…ธ๋“œ(Subscriber, B)๋Š” ์„œ๋ฒ„ ๋…ธ๋“œ(Publisher, A)์˜ ์‘๋‹ต์„ ์ˆ˜์‹ ํ•œ๋‹ค.

โ–ช ์„œ๋น„์Šค/๋ฉ”์‹œ์ง€ ํ˜ผํ•ฉ ํ˜•ํƒœ์ธ Action

  1. ํด๋ผ์ด์–ธํŠธ ๋…ธ๋“œ(Subscriber, B)๊ฐ€ ์„œ๋ฒ„ ๋…ธ๋“œ(Publisher, A)์—๊ฒŒ "๋กœ๋ด‡ ํŒ”์ด ๋ชฉํ‘œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋„๋ก ํ•˜๋ผ"๊ณ  ์š”์ฒญํ•œ๋‹ค.
  2. ์„œ๋ฒ„ ๋…ธ๋“œ(Publisher, A)๋Š” ํด๋ผ์ด์–ธํŠธ ๋…ธ๋“œ(Subscriber, B)์˜ ์š”์ฒญ์„ ๋ฐ›๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค.
  3. ์„œ๋ฒ„ ๋…ธ๋“œ(Publisher, A)๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ ๋…ธ๋“œ(Subscriber, B)์—๊ฒŒ ์‘๋‹ตํ•œ๋‹ค.
  4. ํด๋ผ์ด์–ธํŠธ ๋…ธ๋“œ(Subscriber, B)๋Š” ์„œ๋ฒ„ ๋…ธ๋“œ(Publisher, A)์˜ ์‘๋‹ต์„ ์ˆ˜์‹ ํ•œ๋‹ค. → ๋™์ž‘์˜ ์‹คํŒจ/์„ฑ๊ณต ์—ฌ๋ถ€ ํ™•์ธ

 


 

ROS Actionlib

ํด๋ผ์ด์–ธํŠธ๊ฐ€ Goal์„ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๊ฐ€ Goal์„ ์ˆ˜์‹  ๋ฐ›๊ณ  ์ž‘๋™์„ ์‹œ์ž‘ํ•œ๋‹ค. ์ž‘๋™ ์ค‘์—๋Š” ํ˜„์žฌ ์ง„ํ–‰ ์ •๋„๋ฅผ Feedbackํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ , ์ž‘์—… ์™„๋ฃŒ์‹œ Result๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†กํ•œ๋‹ค. (Success/Fail) ํด๋ผ์ด์–ธํŠธ๋Š” Result๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ๋‹ค์Œ ์ผ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Goal: ํด๋ผ์ด์–ธํŠธ ๋…ธ๋“œ๊ฐ€ ์„œ๋ฒ„ ๋…ธ๋“œ์—๊ฒŒ ์ „์†กํ•˜๋Š” ๋ชฉํ‘œ ์ •๋ณด
  • Feedback: ์„œ๋ฒ„ ๋…ธ๋“œ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ๋…ธ๋“œ์—๊ฒŒ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ •๋ณด๋ฅผ feedback
  • Result: ์„œ๋ฒ„ ๋…ธ๋“œ๊ฐ€ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ฑฐ๋‚˜ ์ค‘๋‹จํ–ˆ์„ ๋•Œ, result๋ฅผ respondํ•จ

  1. (Client) Goal ์ „์†ก ํ•จ์ˆ˜ ํ˜ธ์ถœ
  2. (Server) Goal ์„ ์‹คํ–‰ํ•˜๋Š” Callback ํ•จ์ˆ˜ ํ˜ธ์ถœ
  3. (Server) Feedback ์ „์†ก ํ•จ์ˆ˜ ํ˜ธ์ถœ
  4. (Client) Feedback Callback ํ•จ์ˆ˜ ํ˜ธ์ถœ
  5. (Server) action ์™„๋ฃŒ ํ›„ result ์ „์†ก ํ•จ์ˆ˜ ํ˜ธ์ถœ
  6. (Client) Result Callback ํ•จ์ˆ˜ ํ˜ธ์ถœ

 

ROS File System

  • /opt/ros/{version}: ROS์˜ ๊ธฐ๋ณธ ์„ค์น˜ ์œ„์น˜ (์ดํ•˜์˜ version์€ melodic์œผ๋กœ ๊ฐ€์ •)
  • /opt/ros/melodic/share/: ROS ํŒจํ‚ค์ง€๋“ค์ด ์„ค์น˜๋˜๋Š” ์œ„์น˜ (roscd {package-name} ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ)
  • ~/.ros/log/ : ROS ์‹คํ–‰ log๋“ค์ด ๋ชจ์—ฌ ์žˆ๋Š” ๊ณณ (roscd log๋กœ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅ)
rospack # ros + pack(age): ํŒจํ‚ค์ง€์˜ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ
roscd # ros + cd: ํŒจํ‚ค์ง€์˜ ์ด๋ฆ„๋งŒ์œผ๋กœ cd ์ฒ˜๋Ÿผ ํด๋”๋ฅผ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Œ
rosls # ros + ls: ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ํŒจํ‚ค์ง€๋‚˜ ์Šคํƒ, ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๋ฐ”๋กœ ls๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์คŒ

 

 

ROS Workspace

Package๋“ค์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„์œผ๋กœ, {workspace_name}/src/ ๊ฒฝ๋กœ ์•„๋ž˜์— ํŒจํ‚ค์ง€๋“ค์„ ๋†“์•„ ์‚ฌ์šฉํ•œ๋‹ค. Workspace ์„ค์ • ์‹œ, {workspace_name}/devel/setup.bash ๋ฅผ ์‹คํ–‰์‹œ์ผœ ์ฃผ์–ด์•ผ ํ•œ๋‹ค. (catkin_make ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ)

$ mkdir –p ~/catkin_ws/src # workspace ํด๋” ์ƒ์„ฑ
$ cd ~/catkin_ws # workspace ๋กœ ์ด๋™
$ catkin_make # ์ดˆ๊ธฐ catkin_make ์‹คํ–‰ (devel ๊ณผ build ํด๋”๊ฐ€ ์ƒ์„ฑ๋จ)

์ดํ›„ ~/.bashrc์— source ~/catkin_ws/devel/setup.bash ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , source ~/.bashrc ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค. (ํ•ด๋‹น command๋ฅผ ์ž…๋ ฅํ•ด์•ผ ๋ณ€๊ฒฝ๋œ ์„ค์ •์ด ๋ฐ˜์˜๋จ)

# ROS environment setup
source /opt/ros/melodic/setup.bash
# User ROS workspace environment setup
# source {workspace_directory}/devel/setup.bash
source ~/catkin_ws/devel/setup.bash

# Alias
alias sb='source ~/.bashrc'
alias sb='source ~/.bashrc'
alias cw='cd ~/catkin_ws'
alias cs='cd ~/catkin_ws/src'
alias cm='cd ~/catkin_ws && catkin_make'

 

 

ROS Package

ROS์—์„œ ์‚ฌ์šฉ๋˜๋Š” Software๋Š” package๋ผ๋Š” ๊ณณ์— ์ •๋ฆฌ๋˜์–ด ์žˆ๋‹ค. Package์—๋Š” node(์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ), ROS-independent library, Dataset, Configuration files, Third-party software๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค.

  • CMakeLists.txt: ROS๋Š” CMake ๋นŒ๋“œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, CMake๋ฅผ ์œ„ํ•ด ์ž‘์„ฑํ•œ๋‹ค.
  • package.xml: ์ถ”๊ฐ€์ ์œผ๋กœ package ์ •๋ณด๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํŒŒ์ผ (ROS Package ์ •๋ณด ํŒŒ์ผ)
  • include/: C++ ํ—ค๋” ํŒŒ์ผ
  • src/: C++ ์†Œ์Šค ํŒŒ์ผ
  • scripts/ : Python ์Šคํฌ๋ฆฝํŠธ
  • msg/: Message (msg) ํƒ€์ž… ์ •์˜

 

ROS ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด CMake build ํ˜•ํƒœ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ src ํด๋” ์•ˆ์—๋Š” toplevel์˜ CMakeLists.txt๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ชจ๋‘ add_subdirectoryํ•˜์—ฌ ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ๋นŒ๋“œ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

# ~/catkin_ws/src๋กœ ์ด๋™
$ cd ~/catkin_ws/src
# <package_name>์ด๋ผ๋Š” ํŒจํ‚ค์ง€ ์ƒ์„ฑ
$ catkin_create_pkg <package_name> [depend 1] … [depend n]
# beginner_tutorials ํŒจํ‚ค์ง€๋ฅผ
# roscpp, rospy, std_msgs์˜ depend๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒ์„ฑ
$ catkin_create_pkg beginner_tutorials roscpp rospy std_msgs

catkin_create_pkg ๋ช…๋ น์„ ํ†ตํ•ด package๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 


 

ROS Commands

โ–ช roscore: ROS Master์™€ Parameter ์„œ๋ฒ„, rosout ๋…ธ๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ๋„๊ตฌ๋กœ ROS ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „ ๋ฐ˜๋“œ์‹œ ๋จผ์ € ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ex; rosrun ์‹คํ–‰ ์ „ roscore ๋จผ์ € ์ผœ๋‘˜ ๊ฒƒ

 

โ–ช rosrun: ROS ํŒจํ‚ค์ง€ ๋‚ด๋ถ€์˜ ๋…ธ๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ๋„๊ตฌ $ rosrun {ํŒจํ‚ค์ง€๋ช…} {๋…ธ๋“œ๋ช…}

  • ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅ
  • ๊ฐ„๋‹จํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ ์ฃผ๋กœ ์‚ฌ์šฉ
  • ์ž๋™์™„์„ฑ์œผ๋กœ ๋ช…๋ น์–ด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ž…๋ ฅ ๊ฐ€๋Šฅ
  • roscore๊ฐ€ ๋™์ž‘ํ•˜๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š์Œ

 

โ–ช roslaunch: ๋‹ค์ˆ˜์˜ ROS ๋…ธ๋“œ๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ๋„๊ตฌ $ roslaunch {ํŒจํ‚ค์ง€๋ช…} {launchํŒŒ์ผ๋ช…}

  • ROS์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด ์ค‘ ํ•˜๋‚˜
  • ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ
  • launch ํŒŒ์ผ์€ XML ๋ฌธ๋ฒ• ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ ๋‹ค์–‘ํ•œ ๋…ธ๋“œ์˜ ์‹คํ–‰ ์˜ต์…˜์„ ์„ค์ • ๊ฐ€๋Šฅ
  • roscore๊ฐ€ ์‹คํ–‰๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์ž์ฒด์ ์œผ๋กœ roscore๋ฅผ ์‹คํ–‰์‹œํ‚ด

 

โ–ช roscd: ํ•ด๋‹น ROS ํŒจํ‚ค์ง€์˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•˜๋Š” ๋„๊ตฌ $ roscd {ํŒจํ‚ค์ง€๋ช…}

  • ROS Master์— ๋“ฑ๋ก๋œ ํŒจํ‚ค์ง€๋“ค ์ค‘ ํ•ด๋‹น ํŒจํ‚ค์ง€์˜ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•˜๋Š” ๋„๊ตฌ
  • ๋””๋ ‰ํ† ๋ฆฌ์˜ ์œ„์น˜๋ฅผ ์™ธ์šธ ํ•„์š” ์—†์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ด๋™ ๊ฐ€๋Šฅ

 

โ–ช rostopic: ROS ๋ฉ”์‹œ์ง€์— ๊ด€ํ•œ ์กฐ์ž‘ ๋ฐ ๊ด€์ธก์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋„๊ตฌ

  • topic์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ
  • ์ฃผ๋กœ ๋””๋ฒ„๊น…์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๋•Œ ์‚ฌ์šฉ
  • $ rostopic list: topic๋“ค์˜ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด
  • $ rostopic echo {ํ† ํ”ฝ๋ช…}: {ํ† ํ”ฝ๋ช…}์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด
  • $ rostopic pub {ํ† ํ”ฝ๋ช…} {์ž๋ฃŒํ˜•} {๊ฐ’}: {ํ† ํ”ฝ๋ช…}์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๋ช…๋ น์–ด
  • $ rostopic info {ํ† ํ”ฝ๋ช…}: {ํ† ํ”ฝ๋ช…}์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด
  • $ rostopic hz {ํ† ํ”ฝ๋ช…}: {ํ† ํ”ฝ๋ช…}์˜ Publish ์ฃผ๊ธฐ(hz)๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด

 

โ–ช rosnode: ROS node๋“ค์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ

  • ํŠน์ • ๋…ธ๋“œ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ์š”์ฒญ ๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด
  • ๊ฐ•์ œ๋กœ ๋…ธ๋“œ๋ฅผ kill ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
  • rostopic, rosservice์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค์–‘ํ•œ ์˜ต์…˜๋“ค์ด ์กด์žฌ
  • $ rosnode list: node๋“ค์˜ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด
  • $ rosnode info {๋…ธ๋“œ๋ช…}: {๋…ธ๋“œ๋ช…}์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด
  • $ rosnode kill {๋…ธ๋“œ๋ช…}: {๋…ธ๋“œ๋ช…}์„ ์ข…๋ฃŒํ•˜๋Š” ๋ช…๋ น์–ด

 

โ–ช rosservice: ROS ์„œ๋น„์Šค์— ๊ด€ํ•œ ์กฐ์ž‘ ๋ฐ ๊ด€์ธก์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋„๊ตฌ

  • $ rosservice list: service๋“ค์˜ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด
  • $ rosservice info {์„œ๋น„์Šค๋ช…}: {์„œ๋น„์Šค๋ช…}์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด
  • $ rosservice find {์„œ๋น„์Šคํƒ€์ž…}: {์„œ๋น„์Šคํƒ€์ž…}์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š” ์„œ๋น„์Šค๋ฅผ ์ฐพ๋Š” ๋ช…๋ น์–ด
  • $ rosservice call {์„œ๋น„์Šค๋ช…}: {์„œ๋น„์Šค๋ช…}์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์š”์ฒญํ•˜๋Š” ๋ช…๋ น์–ด

 

โ–ช rosparam: ROS Master์˜ parameter ์„œ๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ

  • ROS ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ „์—ญ ๋ณ€์ˆ˜ ๋ชฉ๋ก์ธ ํŒŒ๋ผ๋ฏธํ„ฐ ์„œ๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ช…๋ น์–ด
  • ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํ๋ฆ„์„ ์™ธ๋ถ€์—์„œ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์Œ
  • roscore๋ฅผ ์‹คํ–‰ํ•˜๋ฉด background์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ์„œ๋ฒ„๊ฐ€ ๊ฐ™์ด ์‹คํ–‰๋จ
  • roscore๊ฐ€ ์žฌ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ํŒŒ๋ผ๋ฏธํ„ฐ ์„œ๋ฒ„๋Š” ์ดˆ๊ธฐํ™”๋จ
  • $ rosparam list: ํŒŒ๋ผ๋ฏธํ„ฐ ์„œ๋ฒ„์— ๋“ฑ๋ก๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด
  • $ rosparam set {ํŒŒ๋ผ๋ฏธํ„ฐ๋ช…} {๊ฐ’}: ์ƒˆ๋กœ์šด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ช…๋ น์–ด
  • $ rosparam get {ํŒŒ๋ผ๋ฏธํ„ฐ๋ช…}: ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด

 

โ–ช rosbag: ROS์˜ ๊ฐ์ข… ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๊น…ํ•ด์ฃผ๋Š” ๋„๊ตฌ

  • ROS์˜ ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žฌ์ƒํ•ด์ฃผ๋Š” ๋„๊ตฌ
  • ROS ์ƒ์—์„œ ํผ๋ธ”๋ฆฌ์‹œ๋˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋‹นํžˆ ์ž์ฃผ ์‚ฌ์šฉ
  • ๋กœ๋ด‡์˜ ์„ผ์„œ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ ๋ฐ ์žฌ์ƒํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
  • $ rosbag info {bag๋ฐ์ดํ„ฐ๋ช…}: bag ๋ฐ์ดํ„ฐ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด
  • $ rosbag record {์˜ต์…˜} {ํŒŒ์ผ๋ช…} {ํ† ํ”ฝ๋ช…}: ROS ํ† ํ”ฝ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด
  • $ rosbag play {bag๋ฐ์ดํ„ฐ๋ช…}: bag ๋ฐ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด
728x90
320x100