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有反應了。。

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