이번 글에서는 C++을 통해 발행자(publisher)와 구독자(subscriber)를 만들어보겠습니다.
터미널을 열고 오버레이 작업공간 src 폴더로 이동하세요.
C++ 패키지를 만들겠습니다. 빌드타입은 ament_cmake, 의존성 패키지는 rclcpp와 std_msgs를 포함합니다. 패키지 이름은 pubsub_cpp로 하겠습니다. $ ros2 pkg create pubsub_cpp --build-type ament_cmake --dependencies rclcpp std_msgs |
package.xml 파일을 열어서 version, description, maintainer, license를 수정하고 저장합니다.
C 언어 빌드 설정은 필요없으므로 제거해주고 pub와 sub 노드의 빌드와 설치 설정을 추가합니다.
노드를 작성을 위해 ~/dev_ws/src/pubsub_cpp/src 폴더에 pub.cpp와 sub.cpp를 생성합니다. $ touch ~/dev_ws/src/pubsub_cpp/src/{pub.cpp,sub.cpp} |
pub 노드를 작성하겠습니다.
파이썬 패키지와 같습니다. Node 클래스를 상속하는 Pub 클래스를 만들어서 main 함수에서 실행시켜주면 됩니다.
우선 rclcpp.hpp와 string.hpp 헤더파일을 include하고 네임스페이스로 chrono_literals를 사용합니다. #include <chrono> #include <functional> #include <memory> #include <string> #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" using namespace std::chrono_literals;
발행자 노드 클래스를 작성합니다. 클래스 이름은 Pub 이고 Node 클래스를 상속합니다. class Pub : public rclcpp::Node { }
Pub 클래스 생성자를 작성합니다. 부모 클래스인 Node 클래스는 노드 이름을 매개변수로 초기화하고, count를 0으로 초기화합니다. create_publisher 함수를 통해 발행자를 생성하고 create_wall_timer를 통해 타이머를 생성합니다. public: Pub() : Node("pub"), count(0) { auto qos_profile = rclcpp::QoS(rclcpp::KeepLast(10)); publisher_ = this->create_publisher<std_msgs::msg::String>( "topic", qos_profile); timer = this->create_wall_timer( 500ms, std::bind(&Pub::timer_callback, this)); }
timer_callback 함수는 private로 만들어줍시다. private: void timer_callback() { auto msg = std_msgs::msg::String(); msg.data = "Hello World: " + std::to_string(count++); RCLCPP_INFO( this->get_logger(), "Publishing: '%s'", msg.data.c_str()); publisher_->publish(msg); } rclcpp::TimerBase::SharedPtr timer; rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_; size_t count;
메인함수를 작성합니다. int main(int argc, char * argv[]) { rclcpp::init(argc, argv); auto node = std::make_shared<Pub>(); rclcpp::spin(node); rclcpp::shutdown(); return 0; }
동일하게 아래 스크린샷과 같이 sub 노드를 작성하세요.
이제 colcon으로 패키지를 빌드해주세요.
$ cd ~/dev_ws && colcon build --symlink-install --packages-select pubsub_cpp |
오버레이 작업공간을 환경설정합니다. $ . ~/dev_ws/install/setup.bash |
다음 명령어를 통해 sub 노드를 실행해봅시다. $ ros2 run pubsub_cpp sub |
새로운 터미널을 열고 다시 오버레이 작업공간을 환경설정하고 pub 노드를 싱행해봅시다. $ . ~/dev_ws/install/setup.bash $ ros2 run pubsub_cpp pub |
구독자는 지난번에 만든 pubsub_py 패키지의 sub 노드를 실행시키고 발행자는 pubsub_cpp 패키지의 pub 노드를 실행해보세요! $ . ~/dev_ws/install/setup.bash $ ros2 run pubsub_py sub |
$ . ~/dev_ws/install/setup.bash $ ros2 run pubsub_cpp pub |
|