Simple Message Publisher 및 Subscriber 예제
21 Dec 2017 | ROS간단하게 메시지를 발행/수신하는 예제 코드는 다음과 같습니다.
snowdeer_publisher
package.xml
<?xml version="1.0"?> <?xml-model href="http://download.ros.org/schema/package_format2.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?> <package format="2"> <name>snow_publisher</name> <version>0.4.0</version> <description>Snow ROS Message Publisher</description> <maintainer email="snowdeer0314@gmail.com">snowdeer</maintainer> <license>Apache License 2.0</license> <buildtool_depend>ament_cmake</buildtool_depend> <build_depend>rclcpp</build_depend> <build_depend>std_msgs</build_depend> <exec_depend>rclcpp</exec_depend> <exec_depend>std_msgs</exec_depend> <export> <build_type>ament_cmake</build_type> </export> </package>
CMakeLists.txt
cmake_minimum_required(VERSION 3.5) project(snow_publisher) # Default to C++14 if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 14) endif() if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED) add_executable(${PROJECT_NAME} main.cpp) ament_target_dependencies(${PROJECT_NAME} rclcpp std_msgs) install(TARGETS ${PROJECT_NAME} DESTINATION lib/${PROJECT_NAME}) ament_package()
main.cpp
#include <cstdio> #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" using namespace std; using namespace std::chrono_literals; int main(int argc, char * argv[]) { printf("This is SnowDeer's ROS Message Publisher.\n"); rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("snowdeer_msg_publisher"); auto publisher = node->create_publisher<std_msgs::msg::String>("snowdeer_topic"); auto message = std::make_shared<std_msgs::msg::String>(); auto publish_count = 0; rclcpp::WallRate loop_rate(1000ms); while (rclcpp::ok()) { message->data = "Hello, SnowDeer! " + std::to_string(publish_count++); RCLCPP_INFO(node->get_logger(), "Publishing: '%s'", message->data.c_str()) publisher->publish(message); rclcpp::spin_some(node); loop_rate.sleep(); } rclcpp::shutdown(); return 0; }
snowdeer_subscriber
package.xml
<?xml version="1.0"?> <?xml-model href="http://download.ros.org/schema/package_format2.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?> <package format="2"> <name>snow_subscriber</name> <version>0.4.0</version> <description>Snow ROS Message Subscriber</description> <maintainer email="snowdeer0314@gmail.com">snowdeer</maintainer> <license>Apache License 2.0</license> <buildtool_depend>ament_cmake</buildtool_depend> <build_depend>rclcpp</build_depend> <build_depend>std_msgs</build_depend> <exec_depend>rclcpp</exec_depend> <exec_depend>std_msgs</exec_depend> <export> <build_type>ament_cmake</build_type> </export> </package>
CMakeLists.txt
cmake_minimum_required(VERSION 3.5) project(snow_subscriber) # Default to C++14 if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 14) endif() if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED) add_executable(${PROJECT_NAME} main.cpp) ament_target_dependencies(${PROJECT_NAME} rclcpp std_msgs) install(TARGETS ${PROJECT_NAME} DESTINATION lib/${PROJECT_NAME}) ament_package()
main.cpp
#include <cstdio> #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" using namespace std; rclcpp::Node::SharedPtr node = nullptr; void callback_from_topic(const std_msgs::msg::String::SharedPtr msg) { RCLCPP_INFO(node->get_logger(), "Received Message: '%s'", msg->data.c_str()) } int main(int argc, char * argv[]) { printf("This is SnowDeer's ROS Message Subscriber.\n"); rclcpp::init(argc, argv); node = rclcpp::Node::make_shared("snowdeer_msg_subscriber"); auto subscription = node->create_subscription<std_msgs::msg::String> ("snowdeer_topic", callback_from_topic); rclcpp::spin(node); rclcpp::shutdown(); node = nullptr; return 0; }