對於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