-
[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탄 계속 ㄱㄱ
반응형'메모 및 기타' 카테고리의 다른 글
디지털 시스템: 디지털 시스템(Digital System)이란? (0) 2020.09.10 메모: 파이썬 알고리즘 1차 강의 메모 (0) 2020.08.20 Git: 깃허브(Github)로 협업하기 (0) 2020.08.08 Git: 자주 사용하는 Git 명령어 요약정리하기 (0) 2020.08.07 우분투 16.04 에서 한글 입력 설정으로 바꾸기 (0) 2020.05.29