이번 포스팅에도 ROS의 C++ 패키지를 통해서 토픽을 퍼블리시 해보자.
참고한 링크는 다음과 같다.
https://cafe.naver.com/openrt/3043
$ cd catkin_ws/src
$ catkin_create_pkg oroca_ros_tutorial std_msgs roscpp
<?xml version="1.0"?>
<package format="2">
<name>oroca_ros_tutorials</name>
<version>0.1.0</version>
<description>The oroca_ros_tutorials package</description>
<maintainer email="alpha12334@naver.com">kimhoyun</maintainer>
<license>Apache 2.0</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>message_generation</build_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<build_export_depend>message_generation</build_export_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>message_runtime</exec_depend>
<export>
</export>
</package>
cmake_minimum_required(VERSION 3.0.2)
project(oroca_ros_tutorials)
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation
)
add_message_files(
FILES
msgTutorial.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
INCLUDE_DIRS include
LIBRARIES oroca_ros_tutorials
CATKIN_DEPENDS roscpp std_msgs
)
include_directories(
include ${catkin_INCLUDE_DIRS}
)
add_executable(ros_tutorial_msg_publisher src/ros_tutorial_msg_publisher.cpp)
target_link_libraries(ros_tutorial_msg_publisher ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_msg_publisher oroca_ros_tutorials_generate_messages_cpp)
add_executable(ros_tutorial_msg_subscriber src/ros_tutorial_msg_subscriber.cpp)
target_link_libraries(ros_tutorial_msg_subscriber ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_msg_subscriber oroca_ros_tutorials_generate_messages_cpp)
#include "ros/ros.h"
#include "oroca_ros_tutorials/msgTutorial.h"
int main(int argc, char **argv){
ros::init(argc, argv, "ros_tutorial_msg_publisher");
ros::NodeHandle nh;
ros::Publisher ros_tutorial_pub = nh.advertise<oroca_ros_tutorials::msgTutorial>("ros_tutorial_msg", 100);
ros::Rate loop_rate(10);
int count = 0;
while(ros::ok()){
oroca_ros_tutorials::msgTutorial msg;
msg.data = count;
ROS_INFO("send msg = %d", count);
ros_tutorial_pub.publish(msg);
loop_rate.sleep();
++count;
}
}
#include "ros/ros.h" // ROS 기본 헤더파일
#include "oroca_ros_tutorials/msgTutorial.h" // msgTutorial 메시지 파일 헤더 (빌드후 자동 생성됨)
// 메시지 콜백함수로써, 밑에서 설정한 ros_tutorial_sub 구독자에 해당되는 메시지를
// 수신하였을때 동작하는 함수이다
// 입력 메시지로는 oroca_ros_tutorial 패키지의 msgTutorial 메시지를 받도록 되어있다
void msgCallback(const oroca_ros_tutorials::msgTutorial::ConstPtr& msg)
{
ROS_INFO("recieve msg: %d", msg->data); // 수신된 메시지를 표시하는 함수
}
int main(int argc, char **argv) // 노드 메인 함수
{
ros::init(argc, argv, "ros_tutorial_msg_subscriber"); // 노드명 초기화
ros::NodeHandle nh; // ROS 시스템과 통신을 위한 노드 핸들 선언
// 구독자 선언, oroca_ros_tutorials 패키지의 msgTutorial 메시지 파일을 이용한
// 구독자 ros_tutorial_sub 를 작성한다. 토픽명은 "ros_tutorial_msg" 이며,
// 구독자 큐(queue) 사이즈를 100개로 설정한다는 것이다
ros::Subscriber ros_tutorial_sub = nh.subscribe("ros_tutorial_msg", 100, msgCallback);
// 콜백함수 호출을 위한 함수로써, 메시지가 수신되기를 대기, 수신되었을 경우 콜백함수를 실행한다
ros::spin();
return 0;
}
빌드 및 실행은 이전 포스팅들을 참조해서 하면 된다.