当前位置: 首页 > 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中的执行过程?主要存储引擎区别?
  • 解读丨连续两日施压,特朗普为何着急让美联储降息
  • 【社论】家政服务提质扩容,为何被一提再提
  • 潮州官方回应女婴事件:尚未发现虐待,各种原因导致营养不良
  • 多米尼加俱乐部屋顶坍塌事故死亡人数升至232人
  • 贵州省纪委原副书记、省监委原副主任张平一审被控受贿4772万余元
  • 江西省委书记人民日报撰文:推动新征程国家安全工作走深走实,切实以江西之稳维护全国大局之安