当前位置: 首页 > news >正文

6. 话题通信 ---- 使用自定义msg,发布方和订阅方cpp,python文件编写

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()

相关文章:

  • Linux cmp 命令使用详解
  • Python语法系列博客 · 第8期[特殊字符] Lambda函数与高阶函数:函数式编程初体验
  • git合并分支并推送
  • FPGA系列之DDS信号发生器设计(DE2-115开发板)
  • firewalld 防火墙
  • 从零开始学A2A五:A2A 协议的安全性与多模态支持
  • 第三届世界科学智能大赛新能源赛道:新能源发电功率预测-数据处理心得体会1
  • 压滤机与锡泥产生效率
  • 解决echarts饼图label显示不全的问题
  • Keil MDK中禁用半主机(No Semihosting)
  • LINUX419 更换仓库(没换成)find命令
  • 深度补全网络:CSPN++ 有哪些开源项目
  • FFUF指南
  • 【langchain4j】Springboot如何接入大模型以及实战开发-AI问答助手(一)
  • C 语 言 --- 指 针 4(习 题)
  • [Java EE] Spring AOP 和 事务
  • 交换网络基础
  • 如何查看HTTP状态码?
  • javaSE.四大函数式接口
  • 【MySQL】SQL语句在MySQL中的执行过程?主要存储引擎区别?
  • 陈颖已任上海黄浦区委常委、统战部部长
  • 上海与世界|黄菊与上海建设中国式全球城市
  • 首部关于民营经济发展的基础性法律,有何亮点?专家解读
  • 此前显示售罄的火车票“五一”前大量放出来了?12306回应
  • 大学2025丨对话深大人工智能学院负责人李坚强:产学研生态比“造天才”更重要
  • 证监会副主席王建军被查