上一講說了怎樣 定製自己的消息,這裏說說怎麼把自己的消息用起來。
把自己定製的消息記爲 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有反應了。。