Skip to content

Topics subscription

wngjs3 edited this page Mar 16, 2018 · 2 revisions

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();

Table of Contents




Clone this wiki locally