ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ROS] 토픽(Topic) 메시지를 통해 현재 시간 출력하기 (1)
    메모 및 기타 2020. 5. 30. 23:52

     토픽은 메시지의 한 형태이다. 토픽(Topic)은 한 노드에서 다른 노드로 단일방향 메시지를 전달할 때 사용하며

    메시지를 전송하는 노드를 퍼블리셔 노드(Publisher node), 메시지를 수신하는노드를 서브스크라이버노드(Subscriber node)라고 한다.

     

    이번 포스팅에서는 간단한 튜토리얼 패키지를 만들어 볼 것이다. 현재의 시간을 출력하고 메시지로 보낸다. 아울러  메시지 작성, 퍼블리셔노드, 서브스크라이버 노드 그리고 빌드업 후 패키지 실행을 해볼 것이다.

    참고로 표윤석형님의 예제를 참고로 했다. 짱짱맨 형님임

     


    1)패키지 생성

     

    터미널 창에서

    cd catkin_ws/src                 //catkin_ws로 이동한 후                            

    catkin_create_pkg ros_tutorials_topic message_generation std_msgs roscpp

    // message_generation, std_msgs, roscpp를 의존성으로 하는 ros_tutorials_topic 패키지를 만들어준다.

     

    cd ~/catkin_ws/src/ros_tutorials_topic

    ls

    //CMakeLists.txt와 package.xml 파일이 만들어진것을  알 수 있다.

     

    2)패키지 설정 파일(package.xml) 수정

    ros의 필수 설정 파일이며, 패지키 정보를 담은 xml파일로써, 패키지 이름, 저작자, 라이센스, 의존성 패키지등이 기술되어 있다.

     

     

    cd ~/catkin_ws/src/ros_tutorials_topic

    gedit package.xml

    <?xml version="1.0"?>
    <package format="2">
    <name>ros_tutorials_topic</name>      
    <version>0.0.0</version>                     
    <description>ROS turtorial package to learn the topic</description>   
    <license>Apache 2.0</license>
    <author email="sss@naver.com">sss sss</author>          
    <maintainer email="sss@naver.com">sss</maintainer>      
    <url type="website">http://www.abced.com</url>
    <buildtool_depend>catkin</buildtool_depend>             
    <depend>roscpp</depend>                                 
    <depend>std_msgs</depend>
    <depend>message_generation</depend>
      <export></export>
    </package>

     

     

    3)빌드설정 파일(CMakeList) 수정

    cmake_minimum_required(VERSION 2.8.3)
    project(ros_tutorials_topic)
    ## 패키지명과 내가 만든 패키지 명이 같아야한다. 
    ## 패키지를 생성할 때 만든 의존성 패키지로 message_generation, std_msgs, roscpp이며 이 패키지들이 존재하지 않으면 빌드 도중에 에러가 난다.
    find_package(catkin REQUIRED COMPONENTS message_generation std_msgs roscpp)
    ## 메시지 선언: MsgTutorial.msg
    add_message_files(FILES MsgTutorial.msg)
    ## 의존하는 메시지를 설정하는 옵션이다.
    generate_messages(DEPENDENCIES std_msgs)
    ## 캐킨 패키지 옵션으로 라이브러리, 캐킨 빌드 의존성, 시스템 의존 패키지를 기술한다.
    catkin_package(
    LIBRARIES ros_tutorials_topic
    CATKIN_DEPENDS std_msgs roscpp
    )
    ## 인클루드 디렉터리를 설정한다.
    include_directories(${catkin_INCLUDE_DIRS})
    ## 퍼블리셔 노드에 대한 빌드 옵션이며, 실행 파일, 타깃 링크 라이브러리, 추가 의존성 등을 설정한다.
    add_executable(topic_publisher src/topic_publisher.cpp)
    add_dependencies(topic_publisher ${${PROJECT_NAME}_EXPORTED_TARGETS}
    ${catkin_EXPORTED_TARGETS})
    target_link_libraries(topic_publisher ${catkin_LIBRARIES})
    ## 섭스크라이버 노드에 대한 빌드 옵션이다.
    add_executable(topic_subscriber src/topic_subscriber.cpp)
    add_dependencies(topic_subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS}
    ${catkin_EXPORTED_TARGETS})
    target_link_libraries(topic_subscriber ${catkin_LIBRARIES})

    코드내용을 간략하게 요약하면

     

    1. 패키지 명 설정

    2. 메시지 선언

    3. 퍼블리셔 노드 빌드

    4. 섭스크라이버 노드 빌드

    이다.

     

     

    4)메시지 파일 작성

     

    mkdir msg               //msg폴더를 먼저 만들고

    cd msg               

    gedit MsgTutorial.msg            //CMakeLists에서 설정한 MsgTutorial.msg 파일을 만들어 준다.

     

    다음과 같이 코드를 작성해준다.

    time stamp
    int32 data

    time과 int32는 메세지 형식

    stamp, data는 메세지 이름

     

     

    5)퍼블리셔 노드 작성

     

    cd catkin_ws/src/ros_tutorials_topic_topic/

    mkdir src

    cd src/

    gedit topic_publisher.cpp

     

    튜토리얼 토픽 패키지 파일안에 src파일을 만들어준 후 gedit를 통해 퍼블리셔 파일을 만들어준다.

    퍼블리셔 파일안에는 다음과 같은 코드를 입력한다.

    #include "ros/ros.h"
    // ROS 기본 헤더파일
    #include "ros_tutorials_topic/MsgTutorial.h"// MsgTutorial 메시지 파일 헤더(빌드 후 자동 생성됨)
    int main(int argc, char **argv)
    {
    ros::init(argc, argv, "topic_publisher");
    ros::NodeHandle nh;
    // 노드 메인 함수
    // 노드명 초기화
    // ROS 시스템과 통신을 위한 노드 핸들 선언
    // 퍼블리셔 선언, ros_tutorials_topic 패키지의 MsgTutorial 메시지 파일을 이용한
    // 퍼블리셔 ros_tutorial_pub 를 작성한다. 토픽명은 "ros_tutorial_msg" 이며,
    // 퍼블리셔 큐(queue) 사이즈를 100개로 설정한다는 것이다
    ros::Publisher ros_tutorial_pub = nh.advertise<ros_tutorials_topic::MsgTutorial>("ros_tutorial_msg", 100);
    // 루프 주기를 설정한다. "10" 이라는 것은 10Hz를 말하는 것으로 0.1초 간격으로 반복된다
    ros::Rate loop_rate(10);
    // MsgTutorial 메시지 파일 형식으로 msg 라는 메시지를 선언
    ros_tutorials_topic::MsgTutorial msg;
    // 메시지에 사용될 변수 선언
    int count = 0;
    while (ros::ok())
    {
    msg.stamp = ros::Time::now();
    msg.data = count;
    // 현재 시간을 msg의 하위 stamp 메시지에 담는다
    // count라는 변수 값을 msg의 하위 data 메시지에 담는다
    ROS_INFO("send msg = %d", msg.stamp.sec);
    ROS_INFO("send msg = %d", msg.stamp.nsec);
    ROS_INFO("send msg = %d", msg.data); // stamp.sec 메시지를 표시한다
    // stamp.nsec 메시지를 표시한다
    // data 메시지를 표시한다
    ros_tutorial_pub.publish(msg); // 메시지를 발행한다
    loop_rate.sleep(); // 위에서 정한 루프 주기에 따라 슬립에 들어간다
    ++count; // count 변수 1씩 증가
    }
    return 0;
    }

     

     

     

     

    6)서브스크라이버 노드 작성

     

    cd catkin_ws/src/ros_tutorials_topic/src/

    gedit topic_subscriber.cpp

     

    서브스크라이버 노드도 마찬가지로 src폴더안에 topic_subscriber.cpp를 만들어준다.

     

    #include "ros/ros.h"
    // ROS 기본 헤더파일
    #include "ros_tutorials_topic/MsgTutorial.h"
    // MsgTutorial 메시지 파일 헤더 (빌드 후 자동 생성됨)
    // 메시지 콜백 함수로써, 밑에서 설정한 ros_tutorial_msg라는 이름의 토픽
    // 메시지를 수신하였을 때 동작하는 함수이다
    // 입력 메시지로는 ros_tutorials_topic 패키지의 MsgTutorial 메시지를 받도록 되어있다
    void msgCallback(const ros_tutorials_topic::MsgTutorial::ConstPtr& msg)
    {
    ROS_INFO("recieve msg = %d", msg->stamp.sec);
    // stamp.sec 메시지를 표시한다
    ROS_INFO("recieve msg = %d", msg->stamp.nsec);
    // stamp.nsec 메시지를 표시한다
    ROS_INFO("recieve msg = %d", msg->data);
    // data 메시지를 표시한다
    }
    int main(int argc, char **argv)
    {
    ros::init(argc, argv, "topic_subscriber");
    ros::NodeHandle nh;
    // 노드 메인 함수
    // 노드명 초기화
    // ROS 시스템과 통신을 위한 노드 핸들 선언
    // 서브스크라이버 선언, ros_tutorials_topic 패키지의 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;
    }

     

    토픽메세지 2탄 계속 ㄱㄱ

    반응형

    댓글

Designed by Tistory.