ROS 기초 게시 자 와 구독 자

22863 단어 ROS
프로 세 스 게시 자 는 정 보 를 발표 하고 화제 (topic) 를 통 해 전송 하 며 구독 자 는 구독 을 통 해 데 이 터 를 얻 고 조작 게시 자의 데이터 구 조 는 twist 이 며 구독 자 는 pose 입 니 다.
발표 자 실현
화제 기능 팩 만 들 기
$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim

기능 패키지 의 src 폴 더 에 velocity 만 들 기publisher. cpp 파일
일반 생 성 절차
  • ROS 노드 초기 화
  • ROS Master 에 노드 정 보 를 등록 하고 발표 한 화제 명 과 화제 중의 정보 유형
  • 을 포함한다.
  • 메시지 데이터 만 들 기
  • 일정한 주파수 순환 에 따라 소식 발표
  • //      turtle1/cmd_vel  ,    geometry_msgs::Twist
    #include 
    #include 
    int main(int argc, char **argv){
    	// ROS     
    	ros::init(argc, argv, "velocity_publisher");
    	//       
    	ros::NodeHandle n;
    	//     Publisher,    /turtle1/cmd_vel topic,     geometry_msgs::Twist,    10
    	ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
    	//        
    	ros::Rate loop_rate(10);
    	int count = 0;
    	while (ros::ok()){
    	    //    geometry_msgs::Twist     
    		geometry_msgs::Twist vel_msg;
    		vel_msg.linear.x = 0.5;
    		vel_msg.angular.z = 0.2;
    	    //     
    		turtle_vel_pub.publish(vel_msg);
    		ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
    		vel_msg.linear.x, vel_msg.angular.z);
    	    //         
    	    loop_rate.sleep();
    	}
    	return 0;
    }
    

    CMakeLists. txt 에 build 영역 을 설정 합 니 다.
    add_executable(velocity_publisher src/velocity_publisher.cpp)
    target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
    

    마지막 으로 게시 자 를 컴 파일 하고 실행 합 니 다.
    $ cd ~/catkin_ws
    $ catkin_make
    $ source devel/setup.bash		#        ,            
    $ roscore
    $ rosrun turtlesim turtlesim_node
    $ rosrun learning_topic velocity_publisher
    

    홈 디 렉 터 리 에 환경 변 수 를 파일 로 설정 합 니 다. ctrl + h 는 숨겨 진 파일 을 표시 할 수 있 습 니 다. bashsrc 를 찾 아 마지막 줄 에 추가 합 니 다.
    source /home/xxx/catkin_ws/devel/setup.bash		#xxx    
    

    프로 세 스 가 ctrl + c 로 정지 할 수 있 습 니 다.
    구독 자 실현
    화제 기능 팩 은 기능 팩 의 src 폴 더 에 존재 합 니 다 posesubscriber. cpp 파일
    일반 생 성 절차
  • ROS 노드 초기 화
  • 구독 에 필요 한 화제
  • 화제 메 시 지 를 순환 적 으로 기다 리 고 메 시 지 를 받 은 후 리 셋 함수
  • 에 들 어 갑 니 다.
  • 리 셋 함수 에서 메시지 처 리 를 완성 합 니 다.
  • //      /turtle1/pose  ,    turtlesim::Pose
    #include 
    #include "turtlesim/Pose.h"
    //          ,         
    void poseCallback(const turtlesim::Pose::ConstPtr& msg){
        //            
        ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
    }
    
    int main(int argc, char **argv){
        //    ROS  
        ros::init(argc, argv, "pose_subscriber");
        //       ,      
        ros::NodeHandle n;
        //     Subscriber,    /turtle1/pose topic,      poseCallback
        ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
        //         
        ros::spin();
        return 0;
    }
    

    CMakeLists. txt 에 'build 영역' 설정
    add_executable(pose_subscriber src/pose_subscriber.cpp)
    target_link_libraries(pose_subscriber ${catkin_LIBRARIES})
    

    마지막 으로 구독 자 를 컴 파일 하고 실행 합 니 다.
    $ cd ~/catkin_ws
    $ catkin_make
    $ source devel/setup.bash
    $ roscore
    $ rosrun turtlesim turtlesim_node
    $ rosrun learning_topic pose_subscriber
    

    사용자 정의 화제
    화제 기능 패키지 에 msg 폴 더 를 만 들 고 사용자 정의 화 제 를 저장 하 는 파일 을 msg 폴 더 에 Person. msg 를 만 들 고 데이터 인터페이스 로 사용 합 니 다.
    string name
    uint8 sex
    uint8 age
    
    uint8 unknown = 0	#   
    uint8 male = 1
    uint8 female = 2
    

    화제 기능 패키지 의 package. xml 에 기능 패키지 의 컴 파일 의존 과 실행 의존 도 를 추가 합 니 다.
    <build_depend>message_generation</build_depend> #    message
    <exec_depend>message_runtime</exec_depend>		#    
    

    CMakeLists. txt 에 컴 파일 옵션 추가
    message_generation						# find_package()   
    
    add_message_files(FILES Person.msg)		# msg      
    generate_messages(DEPENDENCIES std_msgs)#  , messages,services   
    
    message_runtime							# catkin_package()  
    										#         
    

    이 때 devel / include / 기능 패키지 디 렉 터 리 에서 msg 파일 이 정의 하 는 헤더 파일 을 생 성 합 니 다. 그 정 보 는 msg 에서 정의 하 는 내용 입 니 다.
    이 사용자 정의 화 제 를 사용 하여 화제 기능 패키지 의 src 디 렉 터 리 에 person 을 만 듭 니 다.publisher.cpp
    //      /person_info  ,       learning_topic::Person
    #include 
    #include "learning_topic/Person.h"
    int main(int argc, char **argv){
        // ROS     
        ros::init(argc, argv, "person_publisher");
        //       
        ros::NodeHandle n;
        //     Publisher,    /person_info topic,     learning_topic::Person,    10
        ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);
        //        
        ros::Rate loop_rate(1);
        int count = 0;
        while (ros::ok()){
            //    learning_topic::Person     
        	learning_topic::Person person_msg;		//  Person  
    		person_msg.name = "Tom";
    		person_msg.age  = 18;
    		person_msg.sex  = learning_topic::Person::male;
            //     
    		person_info_pub.publish(person_msg);
           	ROS_INFO("Publish Person Info: name:%s  age:%d  sex:%d", 
    		person_msg.name.c_str(), person_msg.age, person_msg.sex);
            //         
            loop_rate.sleep();
        }
        return 0;
    }
    

    창설 personsubscriber.cpp
    //      /person_info  ,       learning_topic::Person
    #include 
    #include "learning_topic/Person.h"
    //          ,         
    void personInfoCallback(const learning_topic::Person::ConstPtr& msg){
        //            
        ROS_INFO("Subcribe Person Info: name:%s  age:%d  sex:%d", msg->name.c_str(), msg->age, msg->sex);
    }
    
    int main(int argc, char **argv){
        //    ROS  
        ros::init(argc, argv, "person_subscriber");
        //       
        ros::NodeHandle n;
        //     Subscriber,    /person_info topic,      personInfoCallback
        ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);
        //         
        ros::spin();
        return 0;
    }
    

    기능 패키지 의 CMakeLists. txt 의 컴 파일 규칙, build 표시 줄 을 설정 합 니 다.
    add_executable(person_publisher src/person_publisher.cpp)					#  
    target_link_libraries(person_publisher ${catkin_LIBRARIES})					#   
    add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)	#    ,        
    
    add_executable(person_subscriber src/person_subscriber.cpp)
    target_link_libraries(person_subscriber ${catkin_LIBRARIES})
    add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)
    

    컴 파일
    $ cd ~/catkin_ws
    $ catkin_make
    $ source devel/setup.bash
    $ roscore
    $ rosrun learning_topic person_subscriber
    $ rosrun learning_topic person_publisher
    

    주: 게시 자 와 구독 자가 연결 되 었 을 때 ros master 는 더 이상 필요 하지 않 습 니 다. ros master 는 두 가지 연결 만 책임 지고 다른 연결 이 있어 야 필요 합 니 다.

    좋은 웹페이지 즐겨찾기