C++ 로 Topic을 주고 받는 예제입니다. python과 마찬가지로 turtlesim을 이용합니다.

먼저 ros 패키지를 만들어 줍니다. 이때 build-type은 ament_cmake로 하여 C++를 사용하는 패키지를 만들어 줍니다.

ros2 pkg create --build-type ament_cmake ros2_cpp

Screenshot from 2023-01-17 16-06-09.png

패키지를 생성한 다음 생성한 패키지 경로에서 Visual Studio code를 실행합니다.

code ~/ros_ws/src/ros2_cpp 

실행 후 include/ros2_cpp 디렉토리 안에 pub_cpp.h라는 헤더 파일을 생성합니다.

Screenshot from 2023-01-17 16-10-20.png

pub_cpp.h

#include <chrono>
#include <memory>
#include <string>
#include <functional>
#include "rclcpp/rclcpp.hpp"
#include "geometry_msgs/msg/twist.hpp"

using namespace std::chrono_literals;

class CppPublisher : public rclcpp::Node
{
public:
    CppPublisher(std::string node_name, std::string topic_name): 
    Node(node_name)
    {
        publisher_= this->create_publisher<geometry_msgs::msg::Twist>(topic_name,10);
        timer_= this->create_wall_timer( 1s, std::bind(&CppPublisher::timer_callback, this));
    }

private:
    void timer_callback()
    {
        auto message = geometry_msgs::msg::Twist();
        message.linear.x = 2.0;
        message.angular.z = 2.0;
        RCLCPP_INFO(this->get_logger(), "publishing: %f , %f", message.linear.x, message.angular.z);
        publisher_->publish(message);
    }

        rclcpp::TimerBase::SharedPtr timer_;
        rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr publisher_;
    
};

~/ros_ws/src/ros2_cpp/src 경로 안에서 pub_cpp.cpp 파일을 생성합니다.

Screenshot from 2023-01-17 20-41-01.png

pub_cpp.cpp

#include "ros2_cpp/pub_cpp.h"

int main(int argc, char * argv[])
{
    std::string node_name = "pub_cpp_node";
    std::string topic_name = "/turtle1/cmd_vel";
    rclcpp::init(argc,argv);
    rclcpp::spin(std::make_shared<CppPublisher>(node_name, topic_name));
    rclcpp::shutdown();
    return 0;

}