当前位置: 首页 > 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()

http://www.xdnf.cn/news/33139.html

相关文章:

  • 发动机悬置橡胶弹性体试验机
  • Dify快速入门之chatflow
  • 常见设计模式
  • 【对Linux文件权限的深入理解】
  • 针对MCP认证考试中的常见技术难题进行实战分析与解决方案分享
  • 清华《数据挖掘算法与应用》K-means聚类算法
  • 考研408操作系统文件管理——4.2目录系统详解
  • Java PrintStream 类深度解析
  • QT聊天项目DAY06
  • 什么是事件循环
  • 2025年渗透测试面试题总结-拷打题库05(题目+回答)
  • 大学第一次笔记本清灰
  • Zephyr、FreeRTOS、RT-Thread 邮箱(Mailbox)对比分析
  • 【信息系统项目管理师】高分论文:论信息系统项目的采购管理(“营业工单系统”项目)
  • MySql Innodb详细解读
  • 【预告】【k8s系列6】RKE搭建Kubernetes集群
  • Codeforces Educational Round 177 Div. 2 【B题,C待补
  • Elasticsearch:使用 ES|QL 进行搜索和过滤
  • 嵌入式linux系统中内存管理的方法与实现
  • EKF公式推导
  • 工业级向量检索核心技术:IVF-PQ原理与全流程解析
  • [Android] 豆包爱学v4.5.0小学到研究生 题目Ai解析
  • 【IaaS自动化运维】Ansible与Terraform集成
  • 【仓颉 + 鸿蒙 + AI Agent】CangjieMagic框架(16):ReactExecutor
  • 【重学Android】02.Java环境配置的一些分享
  • 高精度算法(加、减、乘、除、阶乘和)​
  • QML Rectangle 组件
  • 直线轴承常规分类知多少?
  • 洛谷P1177【模板】排序:十种排序算法全解(1)
  • Keil A51汇编伪指令