//wsl
//sub.cpp
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/int32.hpp"
#include <memory>
#include <functional>
using std::placeholders::_1; //unbind (fn함수의 첫 번째 인자)
void mysub_callback(rclcpp::Node::SharedPtr node, //std::shared_ptr<rclcpp::Node> node
const std_msgs::msg::Int32::SharedPtr msg) //std::shared_ptr<std_msgs::msg::Int32> msg
{
RCLCPP_INFO(node->get_logger(), "Subscription: %d", msg->data);
}
int main(int argc, char* argv[])
{
rclcpp::init(argc, argv);
auto node = std::make_shared<rclcpp::Node>("node_sub1");
auto qos_profile = rclcpp::QoS(rclcpp::KeepLast(10));
//토픽 메시지를 수신했을 때 호출되는 사용자 정의 콜백함수
std::function<void(const std_msgs::msg::Int32::SharedPtr msg)> fn;
fn = std::bind(mysub_callback, node, _1); //create_subscription함수의 세 번째 매개변수 조건
//반환형: void, 매개변수: MessageT
auto mysub = node->create_subscription<std_msgs::msg::Int32>("topic_pub1", qos_profile, fn);
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
//jetson
//pub.cpp
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/int32.hpp"
#include <memory>
#include <chrono>
#include <functional>
using namespace std::chrono_literals;
void callback(rclcpp::Node::SharedPtr node,
rclcpp::Publisher<std_msgs::msg::Int32>::SharedPtr pub)
{
static int count = 0;
std_msgs::msg::Int32 message;
message.data = count++;
RCLCPP_INFO(node->get_logger(), "Publish: %d", message.data);
pub->publish(message);
}
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
auto node = std::make_shared<rclcpp::Node>("node_pub1");
auto qos_profile = rclcpp::QoS(rclcpp::KeepLast(10));
auto mypub = node->create_publisher<std_msgs::msg::Int32>("topic_pub1", qos_profile);
std::function<void()> fn = std::bind(callback, node, mypub);
auto timer = node->create_wall_timer(50ms, fn);
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
//MakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(pub_sub1-2)
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 dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
# build #변경
add_executable(pub src/pub.cpp)
ament_target_dependencies(pub rclcpp std_msgs)
# Install
install(TARGETS
pub
DESTINATION lib/${PROJECT_NAME})
ament_package()