차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
activity:public:2021:ros:5._topic_programming [2021/10/03 15:21:00] – [ROS STUDY #4 : ROS 기초프로그래밍(topic 퍼블리시)] yhy01625 | activity:public:2021:ros:5._topic_programming [2021/10/03 15:44:14] (현재) – [3. topic 퍼블리시] yhy01625 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | ======ROS STUDY #4 : ROS 기초프로그래밍(topic 퍼블리시)====== | ||
+ | |||
+ | {{youtube> | ||
+ | =====1. topic, service, action의 개념 ===== | ||
+ | ====1.1 메시지 통신의 종류==== | ||
+ | {{: | ||
+ | |||
+ | 메시지의 종류에는 토픽, 서비스, 액션 세 가지가 있다. | ||
+ | 각각에 대해 알아보도록 하자. | ||
+ | |||
+ | |||
+ | ====1.2 Topic이란? | ||
+ | {{: | ||
+ | |||
+ | 토픽은 실시간으로 전송되는 메시지이다. 단방향성을 갖고 있다. 퍼블리셔나 서브스크라이버가 중지하지 않는 이상, 메시지를 계속 보낸다. | ||
+ | 이러한 특성 때문에 로봇의 상태나 센서 메시지 등을 보낼 때 토픽을 많이 사용한다. | ||
+ | |||
+ | |||
+ | |||
+ | ====1.3 Service란? | ||
+ | {{: | ||
+ | |||
+ | 서비스는 1회성의 메시지이다. 토픽에서는 동등한 지위의 두 개의 노드간에 통신이 이루어졌지만, | ||
+ | 서비스 클라이언트는 서비스를 요청하는 입장이고, | ||
+ | 요청과 응답을 수행하면, | ||
+ | 1회성이라는 특징때문에, | ||
+ | |||
+ | |||
+ | ====1.4 Action이란? | ||
+ | {{: | ||
+ | |||
+ | 액션은 서비스에서 중간 결과값을 보고하는 부분이 추가된 통신이다. 서비스를 기반으로 만들어진 통신이라 생각하기 쉽지만, 실제로는 토픽을 바탕으로 구동된다. | ||
+ | 그렇기 때문에 rostopic list라는 명령어 사용시, 액션에서 사용하는 goal, status, cancel, result, feedback의 5개 토픽을 확인할 수 있다. | ||
+ | 서비스와는 다르게 클라이언트에서 취소명령을 보내거나, | ||
+ | |||
+ | 위의 사진들은 < | ||
+ | |||
+ | =====2. 패키지 내부 살펴보기 ===== | ||
+ | {{: | ||
+ | |||
+ | ^ 파일 ^ 설명 ^ | ||
+ | | /include | 패키지 실행에 필요한 헤더 파일 존재 | | ||
+ | | /launch | ROS 노드를 실행하기 위한 실행 파일 존재 | | ||
+ | | /rviz | RViz 데이터 값의 결과 구성을 저장 | | ||
+ | | /src | 코드 소스 파일 존재 | | ||
+ | | CMakeLists.txt | 빌드 설정 파일 | | ||
+ | | package.xml | 패키지 설정 파일 | | ||
+ | =====3. topic 퍼블리시 ===== | ||
+ | ====3.1. 패키지 기본 설정==== | ||
+ | ===3.1.1. 패키지 생성=== | ||
+ | <sxh bash> | ||
+ | catkin_create_pkg ros_tutorials_topic message_generation roscpp std_msgs | ||
+ | catkin_create_pkg [만들 패키지 이름] [의존성 패키지1] [의존성 패키지2]... | ||
+ | </ | ||
+ | catkin_ws로 이동 후, 터미널에서 위의 명령어 입력 | ||
+ | |||
+ | ===3.1.2. package.xml=== | ||
+ | <sxh xml title: | ||
+ | <package format=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | |||
+ | ##빌드시 사용되는 의존성 패키지 | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | |||
+ | ## | ||
+ | < | ||
+ | < | ||
+ | |||
+ | ##빌드 후 실행시 사용되는 의존성 패키지 | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ===3.1.3. CMakeLists.txt=== | ||
+ | 작성한 노드를 빌트 할때 즉 소스코드 작성 후 실행파일을 만들때 사용되는 옵션들 | ||
+ | <sxh cpp title: | ||
+ | cmake_minimum_required(VERSION 2.8.3) | ||
+ | project(ros_tutorials_topic) | ||
+ | |||
+ | find_package(catkin REQUIRED COMPONENTS message_generation std_msgs roscpp) | ||
+ | |||
+ | 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/ | ||
+ | add_dependencies(topic_publisher ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) | ||
+ | target_link_libraries(topic_publisher ${catkin_LIBRARIES}) | ||
+ | |||
+ | add_executable(topic_subscriber src/ | ||
+ | add_dependencies(topic_subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) | ||
+ | target_link_libraries(topic_subscriber ${catkin_LIBRARIES}) | ||
+ | </ | ||
+ | |||
+ | ====3.2. 메세지(msg) 등록==== | ||
+ | <sxh cpp title: | ||
+ | time stamp | ||
+ | int32 data | ||
+ | </ | ||
+ | time, int32 : 메세지 형식 | ||
+ | |||
+ | ====3.3. 노드 코드 작성==== | ||
+ | |||
+ | ===3.3.1. 퍼블리셔(publisher)=== | ||
+ | <sxh cpp title: | ||
+ | #include " | ||
+ | #include " | ||
+ | |||
+ | int main(int argc, char **argv) | ||
+ | { | ||
+ | ros:: | ||
+ | ros:: | ||
+ | |||
+ | // Declare publisher, create publisher ' | ||
+ | // message file from the ' | ||
+ | // ' | ||
+ | ros:: | ||
+ | // Set the loop period. ' | ||
+ | ros::Rate loop_rate(10); | ||
+ | |||
+ | ros_tutorials_topic:: | ||
+ | int count = 0; // Variable to be used in message | ||
+ | |||
+ | while (ros::ok()) | ||
+ | { | ||
+ | msg.stamp = ros:: | ||
+ | msg.data | ||
+ | ROS_INFO(" | ||
+ | ROS_INFO(" | ||
+ | ROS_INFO(" | ||
+ | //ROS INFO는 printf 와 비슷하다. ros의 경우 목적에 따라 다른 print 명령어 모양을 가지고 있다. | ||
+ | ros_tutorial_pub.publish(msg); | ||
+ | |||
+ | loop_rate.sleep(); | ||
+ | |||
+ | ++count; | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===3.3.2. 서브스크라이버(subscriber)=== | ||
+ | <sxh cpp title: | ||
+ | #include " | ||
+ | #include " | ||
+ | |||
+ | // Message callback function. This is a function is called when a topic | ||
+ | // message named ' | ||
+ | // the ' | ||
+ | void msgCallback(const ros_tutorials_topic:: | ||
+ | { | ||
+ | ROS_INFO(" | ||
+ | ROS_INFO(" | ||
+ | ROS_INFO(" | ||
+ | } | ||
+ | |||
+ | int main(int argc, char **argv) | ||
+ | { | ||
+ | ros:: | ||
+ | |||
+ | ros:: | ||
+ | |||
+ | // Declares subscriber. Create subscriber ' | ||
+ | // message file from the ' | ||
+ | // ' | ||
+ | ros:: | ||
+ | |||
+ | // A function for calling a callback function, waiting for a message to be | ||
+ | // received, and executing a callback function when it is received. | ||
+ | ros:: | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||