[ROS] 나만의 패키지 만들어보기(1)

HY K·2024년 8월 19일

ROS1

목록 보기
32/34

이번 포스팅에서는 간단한 토픽을 송수신 하는 패키지를 만들고, 빌드하고, 실행시켜보자. C++ 패키지로 작성하였다.


1. package.xml

<?xml version="1.0"?>
<package format="2">
  <name>ros_practice</name>
  <version>0.1.0</version>
  <description>The ros_practice 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_export_depend>roscpp</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>

  <exec_depend>roscpp</exec_depend>
  <exec_depend>std_msgs</exec_depend>

  <export>
  </export>
</package>

자체 msg를 사용하지 않고, std_msgs를 사용하였기 때문에 message_generation이나 message_runtime과 같은 패키지들을 의존하지 않는다.


2. CMakeLists.txt

cmake_minimum_required(VERSION 3.0.2)
project(ros_practice)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES ros_practice
  CATKIN_DEPENDS roscpp std_msgs
#  DEPENDS system_lib
)

include_directories(
 include
  ${catkin_INCLUDE_DIRS}
)

add_executable(ros_topic_publisher src/ros_topic_publisher.cpp)
# ros_topic_publisher라는 실행 파일을 생성한다. src 내부의 파일을 컴파일 해서 만든다.
# add_executable은 CMake에서 실행 파일을 정의할 때 사용하는 명령어이다.
add_dependencies(ros_topic_publisher ${${PROJECT_NAME}_EXPORTED_TARGETS}
${catkin_EXPORTED_TARGETS})
# ros_topic_publisher 실행 파일이 특정한 다른 타겟들이 먼저 빌드된 후에 빌드되도록 종속성을 추가한다.
# ${${PROJECT_NAME}_EXPORTED_TARGETS}는 현재 프로젝트의 메시지 또는 서비스 생성과 같은 타겟들을 포함한다.
# ${catkin_EXPORTED_TARGETS}는 catkin 빌드 시스템에서 관리하는 종속 타겟들이 포함된다.
# 이 모든 파일들이 빌드 된 이후에, src 내부 파일을 빌드해서 실행 파일을 생성한다.
target_link_libraries(ros_topic_publisher ${catkin_LIBRARIES})
# target_link_libraries는 실행 파일이 컴파일 될 때 어떤 라이브러리들과 링크해야 하는지 지정한다.
# 첫번째 인자는 링크할 타겟이고
# ${catkin_LIBRARIES}는 catkin 빌드 시스템에서 제공하는 모든 필요한 라이브러리의 집합이다.
# 이 라이브러리들은 find_package(catkin REQUIRED COMPONENTS ..)에서 지정한 내용에 따라 다르다.

add_executable(ros_topic_subscriber src/ros_topic_subscriber.cpp)
add_dependencies(ros_topic_subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS}
${catkin_EXPORTED_TARGETS})
target_link_libraries(ros_topic_subscriber ${catkin_LIBRARIES})

특별히 CMakeLists.txt 파일의 마지막 부분에 대해 상세한 설명을 적어놨다(내가 제대로 몰랐기 때문에 ㅎㅎ;). 참고하면 좋을 것 같다.


3. 실행 파일들

src 폴더 내부에 작성하였다.

ros_topic_publisher.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"

int main(int argc, char **argv){
    ros::init(argc, argv, "ros_topic_publisher");
    ros::NodeHandle nh;

    ros::Publisher ros_topic_pub = nh.advertise<std_msgs::String>("ros_topic_string",100);

    ros::Rate loop_rate(10);

    std_msgs::String msg;

    while(ros::ok()){
        msg.data = "Hello!!";
        ROS_INFO("Sending_MSG is %s", msg.data.c_str());

        ros_topic_pub.publish(msg);
        loop_rate.sleep();
    }
}

ros_topic_subscriber.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"

void msgCallback(const std_msgs::String::ConstPtr& msg){
    ROS_INFO("Recieved Msg = %s", msg->data.c_str());
}

int main(int argc, char **argv){
    ros::init(argc, argv, "ros_topic_subscriber");
    ros::NodeHandle nh;

    ros::Subscriber ros_topic_sub = nh.subscribe("ros_topic_string", 100, msgCallback);

    ros::spin();
}

이 모든 것을 작성한 다음에

  • catkin_make로 빌드하기
  • roscore 켜기
  • source devel/setup.bash 해주고
  • rosrun 명령어로 실행하기

단계를 거쳐서 실행해보자.

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

0개의 댓글