Topics subscription - modulabs/gazebo-tutorial GitHub Wiki

Overview

Gazebo๋Š” ๋ณ„๋„์˜ ํ”„๋กœ๊ทธ๋žจ์ด Gazebo์™€์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ—ˆ์šฉํ•˜๋Š” TCP / IP ์†Œ์ผ“์—์„œ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค. Boost ASIO๋Š” Gazebo์—์„œ ํ†ต์‹  ๋ ˆ์ด์–ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ Google Protobufs๋Š” ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐ ์ง๋ ฌํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋Š” ๊ฒŒ์‹œ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ œ๋ผ๋Š” ์ด๋ฆ„์˜ ์ฑ„๋„์„ ํ†ตํ•ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ฃผ์ œ์˜ ๋ฐ˜๋Œ€ํŽธ์—๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•  ๋•Œ ์ฝœ๋ฐฑ์„ ์ˆ˜์‹ ํ•˜๋Š” ๊ฐ€์ž…์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์•ฝํ•˜๋ฉด ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ ค๋ฉด ์ง€์ •๋œ ์ฃผ์ œ์— ๊ฒŒ์‹œ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  ๊ตฌ๋…์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ช… ๋œ ์ฃผ์ œ์— ๊ฐ€์ž…ํ•ด์•ผํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

TCP / IP ์†Œ์ผ“์„ ํ†ตํ•ด Gazebo์™€ ํ†ต์‹ ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ Gazebo ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์ œ๊ณต๋œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Gazebo ์ „์†ก ์‹œ์Šคํ…œ์€ ์—ฌ๊ธฐ์— ์„ค๋ช…๋˜์–ด ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ๋ฉ”์‹œ์ง€๊ฐ€ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‹คํ–‰์ค‘์ธ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ์ค‘์ธ ๋ชจ๋“  ํ•ญ๋ชฉ ๋ชฉ๋ก์€ ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (Gazebo๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค).

gz topic -l

Example

์ด ์˜ˆ๋Š” WorldStatistics ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  Gazebo์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ์งธ, debian์—์„œ Gazebo๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค๋ฉด, Gazebo ๊ฐœ๋ฐœ ํŒŒ์ผ์„ ์„ค์น˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์†Œ์Šค์—์„œ Gazebo๋ฅผ ์„ค์น˜ ํ•œ ๊ฒฝ์šฐ์ด ๋‹จ๊ณ„๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. X๋ฅผ ๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ ์žˆ๋Š” Gazebo์˜ ์–ด๋–ค ๋ฒ„์ „ ๋ฒˆํ˜ธ๋กœ ๋ฐ”๊พธ์‹ญ์‹œ์˜ค.

sudo apt-get install libgazeboX-dev

listener.cc์™€ CMakeLists.txt๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์˜ listener ํด๋”์— ๋„ฃ์€ ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ์ปดํŒŒ์ผํ•˜์‹ญ์‹œ์˜ค.

mkdir ~/listener
cd ~/listener
wget https://bitbucket.org/osrf/gazebo/raw/default/examples/stand_alone/listener/listener.cc
wget https://bitbucket.org/osrf/gazebo/raw/default/examples/stand_alone/listener/CMakeLists.txt
mkdir build
cd build
cmake ..
make

Gazebo์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ผ ๋•Œ ๋ฆฌ์Šค๋„ˆ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค. cd ~/listener/build ./listener

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

sim_time {
  sec: 1104
  nsec: 855000000
}
pause_time {
  sec: 0
  nsec: 0
}
real_time {
  sec: 1108
  nsec: 263362269
}
paused: false
iterations: 1104855
sim_time {
  sec: 1105
  nsec: 55000000
}
pause_time {
  sec: 0
  nsec: 0
}
real_time {
  sec: 1108
  nsec: 464165998
}
paused: false
iterations: 1105055

Explanation of the code

Gazebo๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์ „์†ก ์‹œ์Šคํ…œ์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

gazebo::setupClient(_argc, _argv);

๋‹ค์Œ์œผ๋กœ ๊ฒŒ์‹œ์ž์™€ ๊ฐ€์ž…์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gazebo::transport::NodePtr node(new gazebo::transport::Node());
node->Init();

''world_stats ''์ฃผ์ œ์— ๊ตฌ๋…์ž๋ฅผ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค. Gazebo๋Š”์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์ผ๋ จ์˜ ํ†ต๊ณ„๋ฅผ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

gazebo::transport::SubscriberPtr sub = node->Subscribe("~/world_stats", cb);

์ด์ „ ์ค„์—์„œ cb๋ฅผ ํ˜ธ์ถœ ํ•œ ์ฝ˜์†”์— ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

void cb(ConstWorldStatisticsPtr &_msg)
{
  std::cout << _msg->DebugString();
}

์ด ์‹œ์ ์—์„œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๋™์•ˆ ๋Œ€๊ธฐ ๋ฃจํ”„๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋ฅผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ฐ„๋‹จํ•œ ๋Œ€๊ธฐ ๋ฃจํ”„์ž…๋‹ˆ๋‹ค.

while (true)
  gazebo::common::Time::MSleep(10);

์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ „์†ก ์‹œ์Šคํ…œ์„ ๋งˆ๋ฌด๋ฆฌํ•˜์‹ญ์‹œ์˜ค.

gazebo::shutdown();
โš ๏ธ **GitHub.com Fallback** โš ๏ธ