[ROS Kinetic Kame][C++] Class를 활용한 간단한 Subscriber 구현 Example
2020. 2. 20. 22:33ㆍDebugging/ROS
Publisher 구현에서 Pubsish중인 topic을 subscribe 해보자.
Quick Start
시작하기 앞서 package.xml, CMakeLists.txt패키지 설정이 귀찮으신 분들을 위한 예제 코드 GitHub
만들어진 catkin workspace 내 src 폴더로 이동한 후 아래 명령어를 입력해 Clone!
git clone https://github.com/MakingtheBuildKing/simple-pub-sub.git
catkin_make 후
rosrun tutorial_0 tutorial_0_subscriber
를 입력하면 subscriber node 실행 완료.
publisher node가 실행된다면 현재 ros time이 terminal 창에 출력된다.
Tutorial
time_sub = nh.subscribe<std_msgs::String>("/time_publisher/ros_time", 10, messageCallback);
Subscriber는 위와 같이 callback 함수를 등록할 때
예제 코드를 그대로 갖다 옮겨버리면 빌드단계에서 다음과 같은 에러가 발생한다
error: invalid use of non-static member function
Callback 함수로 쓸 함수명을 그대로 넣어주면 안 되고 bind를 사용해야한다.
#include <ros/ros.h>
#include <std_msgs/String.h>
class SUB{
public:
SUB();
~SUB();
private:
// Node Handler, Subscriber 선언
ros::NodeHandle nh;
ros::Subscriber time_sub;
// Subscribe 한 Data를 저장할 변수 선언
std::string time_sec, time_nsec;
/*
Publish 된 메시지가 확인될 때 호출되는 Cabllback 함수 선언
Publisher에서 정의한 message 타입과 같은 데이터를 받아야 함
*/
int messageCallback(const std_msgs::StringConstPtr &msg);
};
SUB::SUB(){
/*
Node Handler와 Subscriber 초기화
마찬가지로 message 타입과 topic name에 주의
callback 함수는 bind를 사용
*/
nh = ros::NodeHandle;
time_sub = nh.subscribe<std_msgs::String>("/time_publisher/ros_time", 10, boost::bind(&SUB::messageCallback, this, _1));
}
SUB::~SUB(){
};
int SUB::messageCallback(const std_msgs::StringConstPtr &msg){
std::cout << msg->data << std::endl;
}
int main(int argc, char **argv){
// ROS 초기화
ros::init(argc, argv, "time_subscriber");
// Class 객체 생성
SUB sub;
// Main 함수의 iteration 주기 설정
ros::Rate spinRate(30);
while(ros::ok()){
spinRate.sleep();
ros::spinOnce();
}
return 0;
}
여기서 callback 함수의 paramter가 한 개이기 때문에 아래와 같이 bind 해 주었지만
boost::bind(&SUB::messageCallback, this, _1)
time stamp를 이용해 여러 node에서 오는 topic들을 동기화하는 작업 등을 할 때에는
callback 함수의 parameter가 다수가 될 수 있다. 이 때는 parameter 수에 맞춰 아래처럼 바꿔주면 된다.
// messageCallback 함수가 3개의 parameter를 받을 때 예시
boost::bind(&SUB::messageCallback, this, _1, _2, _3)
위 예제 코드를 본인의 catkin workspace에 넣고 catkin_make 후
rosrun tutorial_0 tutorial_0_subscriber
Publisher에서 Pubsish중인 topic을 출력하는 것을 확인할 수 있다.
'Debugging > ROS' 카테고리의 다른 글
[ROS Kinetic Kame][C++] Class를 활용한 간단한 Publisher 구현 Example (0) | 2020.02.20 |
---|---|
[ROS Kinetic Kame] .rviz 파일 지정하여 Rviz 실행하기 (0) | 2020.02.20 |