[ROS][C++ 패키지] 토픽을 발행해보자(3)

HY K·2024년 8월 17일

ROS1

목록 보기
24/34

이번 포스팅에도 ROS의 C++ 패키지를 통해서 토픽을 퍼블리시 해보자.
참고한 링크는 다음과 같다.
https://cafe.naver.com/openrt/3043


1. 패키지 생성

$ cd catkin_ws/src
$ catkin_create_pkg oroca_ros_tutorial std_msgs roscpp

2. 빌드 설정 파일 수정

2.1 package.xml

<?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>

CMakeLists.txt

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)

3. 노드 작성하기

3.1 퍼블리셔

#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;
    }
}

3.2 서브스크라이버

#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;
}

빌드 및 실행은 이전 포스팅들을 참조해서 하면 된다.

profile
로봇, 드론, SLAM, 제어 공학 초보

0개의 댓글