上一讲说了怎样 定制自己的消息,这里说说怎么把自己的消息用起来。
把自己定制的消息记为 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有反应了。。