ROS编程第三步: 使用自己的消息

上一讲说了怎样 定制自己的消息,这里说说怎么把自己的消息用起来。
把自己定制的消息记为 Person
一 .
最好的办法就是 ,写一个 发布者不停发自己的消息Person,另一个接收者不停接受自己的消息Person

那么就写出了如下 一个 发布者,一个订阅者

// 发布者 
#include<ros/ros.h>
#include "learning_topic/Person.h"
int main(int argc ,char ** argv){

	//ROS节点初始化
	ros::init(argc,argv,"person_publisher");
	//创建句柄
	ros::NodeHandle n;
	//实例化personpublisher, Person 发布到 person_info
	ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info",10);
	//设置循环的频率
	ros::Rate loop_rate(1);

	while(ros::ok()){
		//初始化person的类型
		learning_topic::Person person_msg;
		person_msg.name="Jack";
		person_msg.age=123;
		person_msg.sex=learning_topic::Person::male;
		//发布消息
		person_info_pub.publish(person_msg);
		ROS_INFO("Publish person whos name is %s ,age is %d, sex is: %d",person_msg.name.c_str(), person_msg.age,person_msg.sex);
		//循环延时
		loop_rate.sleep();
	}
	return 0;
}
//订阅者
#include<ros/ros.h>
#include "learning_topic/Person.h"

void personInfoCallback(const learning_topic::Person::ConstPtr& msg){
	ROS_INFO("Subscriber Person Info As Follows: 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
	ros::Subscriber person_info_sub =   n.subscribe("/person_info",10,personInfoCallback);
	//等待回调
	ros::spin();
	
	return 0;	
}

代码结构清晰明了,解释一下 nage person_info 是从哪来的, 这个只要你的 发布者发布这样一个话题, 无论是什么名字, 只要你 接收者接受一个同名的话题就行了,不用纠结叫啥名,它可以是 任意一个名字。

然后,为了代码生效,做如下工作
进入CMakeLists

找到# 包围的 Install ,上面添加

add_executable(person_subscriber  src/person_subscriber.cpp)
target_link_libraries(person_subscriber 
   ${catkin_LIBRARIES}
 )
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp  )


add_executable(person_publisher  src/person_publisher.cpp)
target_link_libraries(person_publisher 
   ${catkin_LIBRARIES}
 )
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp  )

解释 :
上面是subscriber的东西,下面是puslisher的东西,讲讲上面的吧
第一行: 把自己的cpp文件可执行化
第二行: 为自己的文件添加链接库
第三行: 也是所有使用了 【自定义消息】的程序都要添加的,程序必须添加这个依赖才可以使得内部消息可用。反之 如果你没用自定义消息,你只用添加上面两行。

回到工作空间 ,catkin_make , 然后 source devel/setup.bash

开三个终端
第一个: roscore
第二个: rosrun 你的功能包名 person_subsriber //发现没反应
接着开第三个 : rosrun 你的功能包名 person_publisher

可以看到 subscriber有反应了。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章