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

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()
相关推荐
Wendy144115 分钟前
【灰度实验】——图像预处理(OpenCV)
人工智能·opencv·计算机视觉
中杯可乐多加冰27 分钟前
五大低代码平台横向深度测评:smardaten 2.0领衔AI原型设计
人工智能
无线图像传输研究探索38 分钟前
单兵图传终端:移动场景中的 “实时感知神经”
网络·人工智能·5g·无线图传·5g单兵图传
zzywxc7872 小时前
AI在编程、测试、数据分析等领域的前沿应用(技术报告)
人工智能·深度学习·机器学习·数据挖掘·数据分析·自动化·ai编程
铭keny2 小时前
YOLOv8 基于RTSP流目标检测
人工智能·yolo·目标检测
墨尘游子2 小时前
11-大语言模型—Transformer 盖楼,BERT 装修,RoBERTa 直接 “拎包入住”|预训练白话指南
人工智能·语言模型·自然语言处理
金井PRATHAMA3 小时前
主要分布于内侧内嗅皮层的层Ⅲ的网格-速度联合细胞(Grid × Speed Conjunctive Cells)对NLP中的深层语义分析的积极影响和启示
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·知识图谱
天道哥哥3 小时前
InsightFace(RetinaFace + ArcFace)人脸识别项目(预训练模型,鲁棒性很好)
人工智能·目标检测
幻风_huanfeng3 小时前
学习人工智能所需知识体系及路径详解
人工智能·学习
云道轩3 小时前
使用Docker在Rocky Linux 9.5上在线部署LangFlow
linux·人工智能·docker·容器·langflow