1)在功能包下新建msg目录,在msg目录下新建Person.msg,在Person.msg文件写入:
string name
uint16 age
float64 height
2)修改配置文件
2.1) 功能包下package.xml文件修改
<build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend><!-- exce_depend 以前对应的是 run_depend 现在非法-->
2.2)功能包下CMakeLists.txt 文件修改(4处)
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)
# 需要加入 message_generation,必须有 std_msgs
## 配置 msg 源文件
add_message_files(FILESPerson.msg
)
# 生成消息时依赖于 std_msgs
generate_messages(DEPENDENCIESstd_msgs
)
#执行时依赖
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES demo02_talker_listenerCATKIN_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源文件编写如下:
#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;
}
#! /usr/bin/env pythonfrom topic_com.msg import Personimport rospyif __name__ == "__main__":rospy.init_node("talker_p")pub = rospy.Publisher("chatt",Person,queue_size=1000)p=Person()p.name="wu"p.age =20p.height =1.75rate = 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源文件编写如下:
#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;
}
#! /usr/bin/env pythonfrom 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()