:이 문서에서 제공 http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29
- 발행자 노드를 적는다
상술 한 바와 같이, 네트워크 노드는이 예에서 토커라는 노드가 작성 실행 프로그램에서 ROS에 접속되고, 노드는 외부 해제 메시지를 계속한다.
첫 번째 패키지 경로로 이동roscd begginner_tutorials
소스 코드를 저장하기위한 src 디렉토리를 생성합니다 :
에서 mkdir -p SRC
그런 다음 talker.cpp 소스 파일을 생성하고있는 다음과 같습니다 내용을 붙여 (중국은 코멘트를 해석하는 코드 참조).
/ * * 저작권 (C) 2008, 모건 퀴 글리와 윌로우, Inc는 * 와 함께 또는없이, 소스 및 바이너리 형태로 * 재배포 및 사용 * 수정, 다음과 같은 조건이 충족되는 경우에 한해 허용됩니다 * * 소스 코드의 재배포 위의 저작권 공지, 유지해야한다 * 조건 목록 및 다음 면책 조항을. * 바이너리 형식의 재배포는 상기 저작권 재생해야 * 통지, 조건 및 다음 부인 * 문서 및 / 또는 배포시 제공된 다른 재료. * * 어느 쪽도하지 스탠포드 대학 또는 윌로우, Inc.의 이름이나 이름의 * 참여자 보증하거나에서 파생 된 제품을 홍보하는 데 사용할 수 있습니다 대체 제품 또는 서비스 *, 사용에 따른 손해, 또는 영업 * 사전 서면 허가없이이 소프트웨어. * * "있는 그대로"이 소프트웨어는 저작권자 및 제공자로부터 제공됩니다 * 모든 명시 적 또는 묵시적 보증, 제한되는 것은 아니지만, 가장 상품성, 특정 목적에의 * 묵시적 보증의 적합성에 *이 부인된다. 어떠한 경우에도 저작권자 또는 제공자는한다 직접적 책임을지지 *, 간접적, 부수적, 특별, 징벌 적, 또는 * 결과적 손해 (포함 하나는 (단, 이에 한하지 않음)의 조달 * 중단) 이에 국한되지 않음, 여부에 관계 책임 또는 불법 행위 (과실 또는 기타 포함) * 계약, 엄격한 책임, 또는 불법 행위 *에 해당하는 경우에서 발생하는. 방식.이 소프트웨어의 사용, 짝수.을 사전에 알고는 IF의 *. 그러한 가능성의 손상. * / // % 태그 (FULLTEXT) % // 태그 % (ROS_HEADER) % 스파이에 의해 // 주석 : ROS / ROS 시스템 헤더 파일의 기본 기능에 필요한 ros.h는 "ROS / ros.h"#include를 // %의 종료 태그 (ROS_HEADER) % // % 태그 (MSG_HEADER를 ) % // 그 스파이로 주석 : std_msgs / String.h std_msgs 패킷 파일 String.msg에 의해 생성 된 헤더 파일 사용법 #include "std_msgs / String.h" // %의 종료 태그 (MSG_HEADER) % #INCLUDE <sstream > / ** *이 튜토리얼은 ROS 시스템을 통해 메시지를 보내는 간단한 보여줍니다. * / int 주 (int argc, 문자 ** argv와) { / ** * ROS : 초기화 () 함수는 argc를 볼 필요와 IT가 있다는에게 수행 할 수 있습니다 argv를에서 * 임의 ROS 인수와를 명령 줄에서 제공 한 이름 리매핑. * 프로그래밍 재 매핑 당신은 초기화의 다른 버전 (사용) 걸린다 는 argc와 argv를 통과, 명령 줄 프로그램을 직접 * 재 매핑을, 그러나 대부분은 IS 상기 * 방법은 IT 가장 쉬운을합니다. 인수의 셋째 초기화에 ()이 노드의 이름입니다. * * 전화 당신은 ROS 중 하나 :: 초기화의 버전 () 전에 MUST로 사용하여 다른 * ROS의 시스템의 일부입니다. * / / / % 태그 (INIT) % 우리가 명령 행의 이름을 바꿀 수 있습니다 //이 ROS를 초기화, 우리는 또한 노드 이름은, 이름에서 ROS 시스템 (안 같은 이름) 고유 필요로 지정된 // 이름 슬래시 (/)를 포함하지. :: 초기화 ROS (는 argc, argv를, "전병"); // %의 종료 태그 (INIT) % / ** NodeHandle는. ROS 시스템에서와 커뮤니케이션의 주요 액세스 *의 지점에 * 완전하여이 노드를 초기화 NodeHandle 최초에 의지하여 건설하고, 마지막에 * NodeHandle 사용에 의지에 의해 파괴 노드 아래로 닫습니다. * / // % 태그 (NODEHANDLE) % // 생성 노드를 처리, 노드가 마지막 소멸자 노드 프로세스와 핸들이 처음 만들었을 때 때 리소스를 해제합니다, 사실 초기화됩니다. :: NodeHandle N-ROS; // %의 종료 태그 (NODEHANDLE) % / ** * 당신이 원하는 것을 어떻게 말해 ROS의 () 함수입니다 광고 . * ROS의 주어진이 항목의 이름을 게시 전화를 호출에 * 마스터 노드 , 계속 어떤 WHO의 게시 및 WHO 레지스트리입니다 *이 가입되어있다. 다음은이 ()가 호출되는, 마스터 한 후 광고 * 노드가이 주제에 이름에 가입하려고하는 사람, 통지합니다 * / * 그들은 차례로이있는 피어 - 투 - 피어 연결을 협상합니다 * 노드를. () 당신이 할 수있는 게시자 객체 반환 광고 * 게시 호출을 통해 그 주제에 메시지를 게시를 (). 일단 반환 제작사 객체의 복사본을 파괴 * 주제는 * 자동으로 알려지지 않은 것입니다. * * 두번째 파라미터 (광고하는) 메시지 큐의 크기 메시지를 발행 사용될 *. 메시지가 더 빨리 게시하는 경우 * 우리가 그들을 보낼 수있는 것보다 여기 수는 얼마나 많은 메시지를 지정 * 멀리 일부를 던지기 전에 버퍼. // % 태그 (발행인) % //该句告诉마스터主控节点,我们将在수다主题中发布std_msgs的문자열消息,在我们发布消息时, // 마스터 노드 후 모두, 메시지 큐의 크기는 1000, 즉 큐에 1000 개 이상의 메시지입니다 주제 노드에 가입 통지합니다, 메시지는 이전하기 전에 삭제됩니다 ROS :: chatter_pub = n.advertise 출판사 <std_msgs :: 문자열> ( "채팅", 1000); // %의 종료 태그 (발행인) % // % 태그 (LOOP_RATE) % 를 10Hz의 // 지정된 동작 주파수, 속도 :: 잠을 호출 그것은 전에 실행됩니다 (). 속도 loop_rate : ROS (10); // %의 종료 태그 (LOOP_RATE) % / ** . * COUNT 메시지의 많은 만드는 데 사용되는이 우리를 보냈습니다 어떻게 . 각각의 메시지 문자열에 대한 * 고유 한 * / // 태그 % (ROS_OK) %의 INT의 COUNT = 0; // 지속적으로 실행할 때 :: 확인 ROS에 true를 돌려 인터럽트 false를 반환 할 때 다음과 같은 경우에 false를 돌려 : // 1. 인터럽트 신호, SIGINT, 키보드를 수신 인터럽트 신호를 트리거 Ctrl + C를 입력한다. @ 2는 동일한 이름의 네트워크 노드로부터 추방된다. // 3. 프로그램의 나머지는 ROS : 종료 ()를 호출합니다. // 4. 모든 ROS : NodeHandles이 파괴 될 수있다. * 메시지 개체의 유형의 IS. 이 객체 유형과 일치해야 그동안 (ROS : OK ()) { % 종료 태그 // (ROS_OK) %이 / ** *이 메시지 개체입니다. 귀하가 물건 데이터 IT와, IT와 다음 게시 할 수 있습니다. * / // % 태그 (FILL_MESSAGE) % 표준 메시지 문자열을 사용하여 작성 //. :: 문자열 MSG의 std_msgs; 표준 : : 이제 stringstream의 SS, SS << "여보세요 세계"<< COUNT, msg.data = ss.str (); // %의 종료 태그 (FILL_MESSAGE) % // % 태그 (ROSCONSOLE) % / 출력 문 / ROS, 표준에 :: 대신에 표준 출력의를 법원. 로스 정보는 섹션 레벨을 참조하십시오. ROS_INFO ( "%의 S", msg.data.c_str ()); // %의 종료 태그 (ROSCONSOLE) % / ** *이 매개 변수의 메시지 보내기 IS 어떻게 게시 () 함수의. * 매개 변수 템플릿을 주어진 광고에로 행해졌 및 <> () 호출 상기 생성자에서의 *. * / // % 태그 (게시) % // 발표 chatter_pub.publish (MSG); // %의 종료 태그가 (게시) %가 구독을 추가 할 때, ROS : spinOnce는 ()는 콜백을 트리거 할 수 있는지 확인합니다 // 문이 트리거되지 않습니다하지 않으면 기능 (콜백). % 태그 // (SPINONCE) % ROS : spinOnce (); // %의 종료 태그 (SPINONCE) % // % 태그 (RATE_SLEEP) % // 수면은 10Hz의 실행을 보장합니다. loop_rate.sleep (); // %의 종료 태그 (RATE_SLEEP) % ++ COUNT; } 반환 0; } // % 종료 태그 (FULLTEXT) %
: 문서는 또한 다음과 같은 경로 GitHub의에서 찾을 수 있습니다 https://raw.github.com/ros/ros_tutorials/kinetic-devel/roscpp_tutorials/talker/talker.cpp
단계 아래에 설명 :- 로스 시스템 초기화 :
ROS : 초기화 (는 argc, argv를, "말하는 사람");
- 핸들 및 발행인의 창조 :
ROS : NodeHandle N; ROS :: 제작사 chatter_pub = n.advertise <std_msgs :: 문자열> ( "잡담", 1000);
-
특정 주파수의 전송주기.
- 로스 시스템 초기화 :
- 가입자 작성
다음 코드 (중국어 주석의 코드를 설명하기 위해 코드를 참조) 패키지에 listener.cpp을 만들어 마찬가지로, 붙여 넣기 :
/ * * 저작권 (C) 2008, 모건 퀴 글리와 윌로우, Inc는 * 와 함께 또는없이, 소스 및 바이너리 형태로 * 재배포 및 사용 * 수정, 다음과 같은 조건이 충족되는 경우에 한해 허용됩니다 * * 소스 코드의 재배포 위의 저작권 공지, 유지해야한다 * 조건 목록 및 다음 면책 조항을. * 바이너리 형식의 재배포는 상기 저작권 재생해야 * 통지, 조건 및 다음 부인 * 문서 및 / 또는 배포시 제공된 다른 재료. * * 어느 쪽도하지 스탠포드 대학 또는 윌로우, Inc.의 이름이나 이름의 * 참여자 보증하거나에서 파생 된 제품을 홍보하는 데 사용할 수 있습니다 사전 서면 허가없이이 소프트웨어 *를. * * "있는 그대로"이 소프트웨어는 저작권자 및 제공자로부터 제공됩니다 * 모든 명시 적 또는 묵시적 보증, 제한되는 것은 아니지만, 가장 상품성, 특정 목적에의 * 묵시적 보증의 적합성에 *이 부인된다. 어떠한 경우에도 저작권자 또는 제공자는한다 직접적 책임을지지 *, 간접적, 부수적, 특별, 징벌 적, 또는 * 결과적 손해 (포함 하나는 (단, 이에 한하지 않음)의 조달 대체 제품 또는 서비스 *, 사용에 따른 손해, 또는 영업 * 중단)을 포함하며 이에 국한되지 않음도 명시 IN 책임 또는 불법 행위 (과실 또는 기타 포함) * 계약, 엄격한 책임, 또는 불법 행위 * 통지의 경우에도 마찬가지의 THIS SOFTWARE USE OF 발생하는 손상의 가능성 *. * / // % 태그 (FULLTEXT) %의 사용법 #include "ROS는 / ros.h" 사용법 #include "std_msgs / String.h은" / ** *이 튜토리얼은 ROS 시스템을 통해 메시지의 간단한 영수증을 보여줍니다. * / // % 태그 (콜백) % //接收到主题消息时的回调函数 무효 chatterCallback (const를 std_msgs :: 문자열 :: ConstPtr 및 MSG) { ROS_INFO는 ( "내가들은 : [% s]을 (를)", msg-> 데이터 .c_str ()); } // % 종료 태그 (콜백) %의 int 주 (int argc, 문자 ** ARGV) { / ** * RO들 : 초기화 () 함수가 수행 할 수 있도록하고는 argc argv를 참조해야 * 명령 줄에서 제공 한 모든 ROS 인수 및 이름 매핑. * 프로그램 재 매핑을 위해 당신이 소요 초기화 ()의 다른 버전을 사용할 수 있습니다 직접 * 재 매핑을하지만,는 argc와 argv를 전달 대부분의 명령 줄 프로그램입니다 그것을 할 수있는 가장 쉬운 방법은 *. INIT의 세 번째 인수는 (), 노드의 이름이다. * * 당신은 다른 사용하기 전에 ROS : 초기화 ()의 버전 중 하나를 호출해야합니다 ROS 시스템의 * 부분. * / //初始化:.指定节点名称 ROS : 초기화 (는 argc, argv를, "청취자"); / ** * NodeHandle는 ROS 시스템과 통신의 주요 액세스 포인트입니다. * 완전이 노드, 마지막 초기화됩니다 구성된 첫 번째 NodeHandle 노드를 폐쇄합니다 * NodeHandle 이것을 파괴합니다. * / //创建节点句柄 ROS : NodeHandle N; / ** * 구독 () 호출을 사용하면 메시지를 수신 할 것을 ROS에게 어떻게 주어진 주제에 *. 이는 ROS를 호출 호출 하는 사람들 출판이 누구의 레지스트리 유지 * 마스터 노드 * 가입됩니다. 메시지는 여기에, 콜백 함수에 전달되는 chatterCallback라고 *. ()는 가입자 객체 반환 구독 * 당신이 탈퇴 할 때까지로 유지해야합니다. 구독자의 모든 사본 때 * 객체가 범위를 벗어난 이동이 콜백은 자동으로 구독 취소 될 것입니다 이 주제 *. * * 구독 () 함수의 두번째 파라미터는 메시지의 크기 큐 *. 메시지가 빠른 마지막으로 내 그들은 가공되고 도착하는 경우,이 * 넘버에 의해 버퍼링 그 메시지는 시작하기 전에에 던져까지 될 것이다 * 멀리 가장 오래된 것들에서. * / // % 태그 (가입자) % // 지정된 구독 테마 및 콜백 함수를 지정, 큐의 요소가 1000보다 큰 경우 우리는 큐에 저장된 메시지를 처리하기에 너무 늦은 때 큐 크기는 1000, 그것은 오래된 뉴스 포기합니다 ROS : 가입자 하위 = n.subscribe ( " 잡담 "1000, chatterCallback이); // %의 종료 태그 (가입자) % / ** . * :: 스핀 ROS ()는이 버전으로 콜백을 펌핑, 루프를 입력 것, 모든 // 스핀주기가 입력되며, 메시지가 도착했을 때 처리 메시지에서 Ctrl + C가 사이클 마스터 노드를 종료하거나 또한 노드를 닫습니다 이 사이클을 종료합니다. ROS : 스핀 (); * 콜백에서 (주 하나) 스레드 호출되는이로. ROS : 스핀 내에서 () Ctrl-C를 눌렀을 때 *이 종료됩니다, 또는 노드는 마스터에 의해 종료됩니다. * / // % 태그 (SPIN) % // % 종료 태그 (SPIN) %의 복귀 0; } // % 종료 태그 (FULLTEXT) %
- 컴파일 노드는
CMakeLists.txt에 다음 코드를 추가합니다 :
add_executable (토커 SRC / talker.cpp) target_link_libraries (토커 $ {catkin_LIBRARIES}) add_dependencies (토커 beginner_tutorials_generate_messages_cpp) add_executable (리스너 SRC / listener.cpp) target_link_libraries (리스너 $ {catkin_LIBRARIES}) add_dependencies (리스너 beginner_tutorials_generate_messages_cpp)
이러한 코드는 실행 프로그램으로 컴파일 - 상기 한 두 개의 노드에 추가하고, 필요한 라이브러리 및 종속성을 지정합니다.
그런 다음 catkin_make을 실행 다음과 같이 코드는 다음과 같습니다당신의 버들개지의 작업 공간에서 # $ CD를 ~ / catkin_ws $ catkin_make
아래 성공적으로 컴파일
기본 경로 : / 홈 / 샤오 / catkin_ws의 소스 공간 : / 홈 / 샤오 / catkin_ws / SRC의 빌드 공간 : / 홈 / 샤오 / catkin_ws / 구축 (STABLE) 공간 : / 홈 / 샤오 / catkin_ws / (STABLE) 설치 공간 : / 홈 / 샤오 / catkin_ws 설치 / #### #### 실행 명령을 "/ / 가정 / 샤오 / catkin_ws 구축"의 "cmake_check_build_system을" #### #### "-j8 -l8합니다 명령 실행 #### / 가정 / 샤오 / catkin_ws이 / 빌드 ""에서 " #### [0 %] 내장 대상 std_msgs_generate_messages_eus [0 %] 내장 대상 std_msgs_generate_messages_lisp [0 %] 내장 대상 std_msgs_generate_messages_nodejs [0 %] 내장 대상 std_msgs_generate_messages_py [0 %] 내장 대상 std_msgs_generate_messages_cpp [0 %] 건축 대상 _begginner_tutorials_generate_messages_check_deps_AddTwoInts [0 %] 건축 대상 _begginner_tutorials_generate_messages_check_deps_Num [5 %] begginner_tutorials에서 생성 EusLisp 코드 / Num.msg [11 %] begginner_tutorials 용 코드 생성 EusLisp 매니페스트 [17 %]로부터 생성 EusLisp 코드 begginner_tutorials / AddTwoInts.srv [23 %] begginner_tutorials에서 생성 된 자바 스크립트 코드 / Num.msg [29 %] 생성 C ++ 코드에서 begginner_tutorials / AddTwoInts.srv [35 %]를 생성 C ++ 코드에서 begginner_tutorials / Num.msg [41 %]을 생성 파이썬 MSG의 begginner_tutorials / 민 [47 %] begginner_tutorials / Num.msg에서 리스프 코드 생성 [52 %] begginner_tutorials / AddTwoInts.srv에서 생성 된 자바 스크립트 코드 [58 %] / AddTwoInts.srv가 begginner_tutorials에서 리스프 코드 생성 [64 %] SRV의 begginner_tutorials / AddTwoInts에서 생성 파이썬 코드 [64 %] 건축 대상 begginner_tutorials_generate_messages_nodejs [64 %]를 내장 타겟 begginner_tutorials_generate_messages_lisp [70 %] begginner_tutorials위한 생성 파이썬 MSG의 __init__.py [76 %] begginner_tutorials위한 생성 파이썬 SRV __init__.py [76 %] 건축 대상 begginner_tutorials_generate_messages_cpp [88 %] 건물 오브젝트 CXX begginner_tutorials / CMakeFiles / talker.dir / SRC / talker.cpp.o [88 %] 건물 오브젝트 CXX begginner_tutorials / CMakeFiles / listener.dir / SRC / listener.cpp.o [88 %] 건축 대상 begginner_tutorials_generate_messages_py [ 88 %] 건축 대상 begginner_tutorials_generate_messages_eus [88 %] 건축 대상 begginner_tutorials_generate_messages [94 %] 링크 CXX 실행 / 홈 / 샤오 / catkin_ws /은 devel / LIB / begginner_tutorials / 토커 [94 %] 건축 대상 화자 [100 %] 링크 CXX 실행 / 홈 / 샤오 / catkin_ws /은 devel / lib 디렉토리 / begginner_tutorials / 수신기 [100 %] 내장 타겟 청취자
- 노드를 실행하여
새로운 터미널을 엽니 다 :
roscore
그런 다음 화자 노드를 실행합니다 :
rosrun beginner_tutorials 토커
광고가 나타납니다 :
리스너 노드를 실행합니다 :
rosrun beginner_tutorials 리스너
인터페이스를 받기가 나타납니다 :
성공적으로 실행합니다. 긴 시간이 아니 참조, 안녕하세요.