ROS의 연구는 단순한 가입자와 출판사 (C ++ 버전)을 작성하는 10 노트

:이 문서에서 제공 http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29

  1. 발행자 노드를 적는다
    상술 한 바와 같이, 네트워크 노드는이 예에서 토커라는 노드가 작성 실행 프로그램에서 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
    단계 아래에 설명 :

    1.  로스 시스템 초기화 :
      ROS : 초기화 (는 argc, argv를, "말하는 사람");
      
    2.    핸들 및 발행인의 창조 :
      ROS : NodeHandle N; 
      ROS :: 제작사 chatter_pub = n.advertise <std_msgs :: 문자열> ( "잡담", 1000);
      

       

    3. 특정 주파수의 전송주기.

  2. 가입자 작성
    다음 코드 (중국어 주석의 코드를 설명하기 위해 코드를 참조) 패키지에 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) %
    
  3. 컴파일 노드는
    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 %] 내장 타겟 청취자
     
  4. 노드를 실행하여
    새로운 터미널을 엽니 다 :
    roscore
    

    그런 다음 화자 노드를 실행합니다 :

    rosrun beginner_tutorials 토커 
    

     광고가 나타납니다 :

     

     리스너 노드를 실행합니다 :

    rosrun beginner_tutorials 리스너 
    

    인터페이스를 받기가 나타납니다 :

     

     성공적으로 실행합니다. 긴 시간이 아니 참조, 안녕하세요.

추천

출처www.cnblogs.com/spyplus/p/11564266.html