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

2020. 2. 20. 22:04Debugging/ROS

Subscriber 구현은 여기


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_publisher

를 입력하면 publisher node 실행 완료.

실행 확인하고 입맛에 맞게 바꿔 쓰면 됩니다.


Tutorial

Publisher는 ROS 공식 사이트의 예제를 그대로 형식에 맞춰 옮겨주면 쉽게 구현할 수 있다.

다음 예제는 현재 ROS time 을 받아 String 형태로 Publish 하는 Node 코드이다.

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <string>

class PUB {

    public:
    PUB();   
    ~PUB();

    private:
    // Node Handler, Publisher 선언
    ros::NodeHandle nh;
    ros::Publisher time_pub;

    // Publish 할 Data 선언
    std::string time_sec, time_nsec;

    // 작업을 진행할 함수
    int task();
};

PUB::PUB() {
    // Node Handler와 Publisher 초기화
    nh = ros::NodeHandle();

    /* 
    std_msgs::String Message 타입을 가지는 topic 정의
    /time_publisher/ros_time 형태의 topic 생성
    */    
    time_pub = nh.advertise<std_msgs::String>("/time_publisher/ros_time", 10);
    task();
}

PUB::~PUB(){};

int PUB::task(){

    // iteration 주기 설정
    ros::Rate taskRate(60);

    while(ros::ok()) {

        // Publisher에 맞는 Message타입 선언
        std_msgs::String msg;

        // data를 적절히 가공 후 msg에 할당
        std::stringstream ss;        
        time_sec =  std::to_string(ros::Time::now().sec);        
        time_nsec =  std::to_string(ros::Time::now().nsec);
        ss << time_sec << "."<< time_nsec;
        msg.data = ss.str();

        // msg에 할당된 data를 publish
        time_pub.publish(msg);

        ros::spinOnce();
        taskRate.sleep();
    }

    return 0;
}

int main(int argc, char **argv){

    // ROS 초기화
    ros::init(argc, argv, "time_publisher");

    // Class 객체 생성
    PUB pub;

    // Main iteration 주기 설정
    ros::Rate spinRate(30);

    while(ros::ok()){

        /*
        Main Loop는 30Hz 주기로 Iteration
        */
        ros::spinOnce();
        spinRate.sleep();
    }

    return 0;
}

위 예제 코드를 본인의 catkin workspace에 넣고 catkin_make 후

rostopic echo /time_publisher/ros_time

명령어를 통해 topic을 확인하면 현재 ros time이 publish 되고 있는 것을 확인할 수 있다.