1)在功能包下新建msg目录,在msg目录下新建Person.msg,在Person.msg文件写入:
cpp
string name
uint16 age
float64 height
2)修改配置文件
2.1) 功能包下package.xml文件修改
cpp
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
<!--
exce_depend 以前对应的是 run_depend 现在非法
-->
2.2)功能包下CMakeLists.txt 文件修改(4处)
cpp
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
# 需要加入 message_generation,必须有 std_msgs
cpp
## 配置 msg 源文件
add_message_files(
FILES
Person.msg
)
cpp
# 生成消息时依赖于 std_msgs
generate_messages(
DEPENDENCIES
std_msgs
)
cpp
#执行时依赖
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES demo02_talker_listener
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
3)编译Ctrl+shift+B
查看Person.h的C++路径和python路径,后续调用相关msg时,是从这些中间文件中调用的

c_cpp_properties.json修改如下:

settings.json修改如下:

发布方的cpp和python源文件编写如下:
cpp
#include "ros/ros.h"
#include "topic_com/Person.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"talker");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<topic_com::Person>("chatter",1000);
topic_com::Person p;
p.name ="wu";
p.age =20;
p.height =1.75;
ros::Rate r(10);
while(ros::ok())
{
pub.publish(p);
ROS_INFO("发送数据%s %d %.2f",p.name.c_str(),p.age,p.height);
p.age += 1;
r.sleep();
ros::spinOnce();
}
return 0;
}
python
#! /usr/bin/env python
from topic_com.msg import Person
import rospy
if __name__ == "__main__":
rospy.init_node("talker_p")
pub = rospy.Publisher("chatt",Person,queue_size=1000)
p=Person()
p.name="wu"
p.age =20
p.height =1.75
rate = rospy.Rate(10)
while not rospy.is_shutdown():
pub.publish(p) #发布消息
rate.sleep() #休眠
rospy.loginfo("姓名:%s, 年龄:%d, 身高:%.2f",p.name, p.age, p.height)
订阅方的cpp和python源文件编写如下:
cpp
#include "ros/ros.h"
#include "topic_com/Person.h"
void doMsg(const topic_com::Person::ConstPtr& msg_p)
{
ROS_INFO("I heard : %s %d %.2f",msg_p->name.c_str(),msg_p->age,msg_p->height);
}
int main(int argc, char *argv[])
{
ros::init(argc,argv,"listener");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe<topic_com::Person>("chatter",1000,doMsg);
ros::spin();
return 0;
}
python
#! /usr/bin/env python
from topic_com.msg import Person
import rospy
def doMsg(p):
rospy.loginfo("I heard %s %d %.2f",p.name,p.age,p.height)
if __name__ == "__main__":
rospy.init_node("listener_p")
sub =rospy.Subscriber("chatt",Person,doMsg,queue_size=1000)
rospy.spin()