[ROS Kinetic Kame][C++] Class를 활용한 간단한 Subscriber 구현 Example

2020. 2. 20. 22:33Debugging/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을 출력하는 것을 확인할 수 있다.