ROS編程(一)——基於topic通信代碼編寫

對於ros中基本的基於topic的通信(listener.cpp&talker.cpp)不再敘述,很多地方都有資料。這篇博客主要是講怎麼修改消息類型。

1.添加msg文件

按照需求編輯msg文件
示例:
string first_name
string last_name
uint8 age
uint32 score

2.編譯msg文件

(1)在Package.xml中添加功能包依賴
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
(2)在CMakeLists.txt中添加功能包依賴
find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  message_generation
) 
add_message_files(
  FILES
  Person.msg
) 
generate_messages(
  DEPENDENCIES
  std_msgs
) 
catkin_package(
  LIBRARIES custom_msg_topic
  CATKIN_DEPENDS roscpp message_runtime
)

3.查看消息類型

rosmsg show Person

4.修改Publisher文件

#include<sstream>
#include"ros/ros.h"
#include"learning_communication/Person.h"  //此處的learning_communication是rospkg的名稱,Person是msg的名稱

int main(int argc,char **argv)
{
	ros::init(argc,argv,"talker1");//talker1是該cpp文件名稱
	ros::NodeHandle n;
	ros::Publisher chatter1_pub = n.advertise<learning_communication::Person>("chatter1",1000);//chatter1_pub是topic名字再加上_pub,learning_communication::Person是pkg+msg名稱,後面引號內爲主題名
	ros::Rate loop_rate(10);
	int count=0;
	while(ros::ok())
	{
		learning_communication::Person msg;
		std::stringstream ss;
		ss<<"Zhang San"<<count;
		msg.name=ss.str();
		msg.sex=1;
		msg.age=18;//採用的是類的輸出的方式
		ROS_INFO("%s,%d,%d",msg.name.c_str(),msg.sex,msg.age);
		chatter1_pub.publish(msg);
		ros::spinOnce();
		loop_rate.sleep();
		++count;
	}
	return 0;
}

5.修改subscriber文件

#include"ros/ros.h"
#include"learning_communication/Person.h"

void chatterCallback(const learning_communication::Person::ConstPtr& msg)//這裏learning_communication::Person::ConstPtr是pkg::msg::ConstPtr
{
	ROS_INFO("I heard: [%s]",msg->name.c_str());
	ROS_INFO("His age is: [%d]",msg->age);
	if(msg->sex==1) ROS_INFO("His sex is male");
	if(msg->sex==2) ROS_INFO("His sex is female");
	if(msg->sex==0) ROS_INFO("It is unknown");
}

int main(int argc,char **argv)
{
	ros::init(argc,argv,"listener1");
	ros::NodeHandle n;
	ros::Subscriber sub = n.subscribe("chatter1",1000,chatterCallback);
	ros::spin();
	return 0;
}

6.運行

(1)roscore
(2)rosrun rospkg talker
(3)rosrun rospkg listener

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