七、话题消息的定义和使用

目的:实现Publisher 与 Subscriber 之间的传输

1、自定义话题消息

如何自定义话题消息?

①完成数据接口的定义---定义msg文件

Person.msg

string name
uint8 sex
uint8 age uint8 unknown = 0
uint8 male = 1
uint8 female = 2

②在package.xml中添加功能包依赖

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

③在CMakeLists.txt添加编译选项

  ·find_package(......message_generation)

  ·add_message_files(FILES Person.msg)

    generate_messages(DEPENDENCIES std_msgs)

  ·catkin_package(......message_runtime)

注意:配置完catkin_make一下,会在devel下产生一个Person.h的头文件

④编译生成语言相关文件

2、创建发布者代码

C++代码:

/**
* 该例程将发布/person_info话题,自定义消息类型learning_topic::Person
*/ #include <ros/ros.h>
#include "learning_topic/Person.h" int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "person_publisher"); // 创建节点句柄
ros::NodeHandle n; // 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10
ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10); // 设置循环的频率
ros::Rate loop_rate(1); int count = 0;
while (ros::ok())
{
// 初始化learning_topic::Person类型的消息
learning_topic::Person person_msg;
person_msg.name = "Tom";
person_msg.age = 18;
person_msg.sex = learning_topic::Person::male; // 发布消息
person_info_pub.publish(person_msg); ROS_INFO("Publish Person Info: name:%s age:%d sex:%d",
person_msg.name.c_str(), person_msg.age, person_msg.sex); // 按照循环频率延时
loop_rate.sleep();
} return 0;
}

流程见上一讲(2)

python代码:

# 该例程将发布/person_info话题,自定义消息类型learning_topic::Person

import rospy
from learning_topic.msg import Person def velocity_publisher():
# ROS节点初始化
rospy.init_node('person_publisher', anonymous=True) # 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10
person_info_pub = rospy.Publisher('/person_info', Person, queue_size=10) #设置循环的频率
rate = rospy.Rate(10) while not rospy.is_shutdown():
# 初始化learning_topic::Person类型的消息
person_msg = Person()
person_msg.name = "Tom";
person_msg.age = 18;
person_msg.sex = Person.male; # 发布消息
person_info_pub.publish(person_msg)
rospy.loginfo("Publsh person message[%s, %d, %d]",
person_msg.name, person_msg.age, person_msg.sex) # 按照循环频率延时
rate.sleep() if __name__ == '__main__':
try:
velocity_publisher()
except rospy.ROSInterruptException:
pass

3、创建订阅者代码

C++代码:

/**
* 该例程将订阅/person_info话题,自定义消息类型learning_topic::Person
*/ #include <ros/ros.h>
#include "learning_topic/Person.h" // 接收到订阅的消息后,会进入消息回调函数
void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
{
// 将接收到的消息打印出来
ROS_INFO("Subcribe Person Info: name:%s age:%d sex:%d",
msg->name.c_str(), msg->age, msg->sex);
} int main(int argc, char **argv)
{
// 初始化ROS节点
ros::init(argc, argv, "person_subscriber"); // 创建节点句柄
ros::NodeHandle n; // 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallback
ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback); // 循环等待回调函数
ros::spin(); return 0;
}

python代码:

# 该例程将订阅/person_info话题,自定义消息类型learning_topic::Person

import rospy
from learning_topic.msg import Person def personInfoCallback(msg):
rospy.loginfo("Subcribe Person Info: name:%s age:%d sex:%d",
msg.name, msg.age, msg.sex) def person_subscriber():
# ROS节点初始化
rospy.init_node('person_subscriber', anonymous=True) # 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallback
rospy.Subscriber("/person_info", Person, personInfoCallback) # 循环等待回调函数
rospy.spin() if __name__ == '__main__':
person_subscriber()

4、配置代码编译规则

如何配置CMakeLists.txt中的编译规则?

①设置需要配置的代码和生成的可执行文件

②设置链接库

③配置依赖项

CMakeLists.txt中需要添加:

add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp) add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)

5、编译并且运行发布者和订阅者

命令:

  $ cd ~/catkin_ws

  $ catkin_make

  $ source devel/setup.bash

  $ roscore

  $ rosrun learning_topic person_subscriber

  $ rosrun learning_topic person_publisher

图示:

ROS入门21讲(3)的更多相关文章

  1. Ros入门21讲

    一.ROS是什么? ROS=通信机制+开发工具+应用功能+生态系统 目的:提高机器人研发中的软件复用率. 1.ROS中的通信机制 松耦合分布式通信: 注意:什么是耦合.紧耦合.松耦合? 1.1 耦合 ...

  2. ros系统21讲—前六讲

    课程介绍(第一讲) linux介绍安装(第二讲) linux的基础操作(第三讲) ROS中语言c++与python介绍(第四讲) 安装ROS系统(第五讲) 第一个: sudo sh -c echo d ...

  3. SLAM+语音机器人DIY系列:(二)ROS入门——5.编写简单的消息发布器和订阅器

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  4. SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  5. SLAM+语音机器人DIY系列:(二)ROS入门——10.在实际机器人上运行ROS高级功能预览

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  6. ROS入门学习

    ROS学习笔记 ROS入门网站; ROS入门书籍 ROS主要包含包括功能包.节点.话题.消息类型和服务; ROS功能包/软件包(Packages) ROS软件包是一组用于实现特定功能的相关文件的集合, ...

  7. 《VC++ 6简明教程》即VC++ 6.0入门精讲 学习进度及笔记

    VC++6.0入门→精讲 2013.06.09,目前,每一章的“自测题”和“小结”三个板块还没有看(备注:第一章的“实验”已经看完). 2013.06.16 第三章的“实验”.“自测题”.“小结”和“ ...

  8. c#委托事件入门--第二讲:事件入门

    上文 c#委托事件入门--第一讲:委托入门 中和大家介绍了委托,学习委托必不可少的就要说下事件.以下思明仍然从事件是什么.为什么用事件.怎么实现事件和总结介绍一下事件 1.事件是什么:. 1.1 NE ...

  9. ROS_Kinetic_03 ROS入门向导

    ROS_Kinetic_03 ROS入门向导 每个人都有不同的学习习惯和爱好并针对不同的应用进行ROS相关设计与开发, 没有固定不变的学习模式,但以下的内容是通常都会用到的. 1. ROS基础教程 1 ...

  10. SLAM+语音机器人DIY系列:(二)ROS入门——1.ROS是什么

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

随机推荐

  1. Committer 迎新!这次是来自阿里云的同学

    截至今天,Apache DolphinScheduler 项目在 GitHub 上的 Star 数已突破 10.6K,贡献者人数也突破了 470 人.社区的不断壮大,离不开每位 Contributor ...

  2. 【Azure Developer】使用Python SDK去Azure Container Instance服务的Execute命令的疑问解释

    Azure Container Instance服务介绍 Azure 容器实例(Azure Container Instances,简称 ACI)是一个无服务器容器解决方案,允许用户在 Azure 云 ...

  3. PCIe简介

    PCIe简介 Peripheral Component Interconnect Express (PCI),高速串行计算机扩展总线标准,PCIe对外围设备的组织方式是树形结构. 拓扑结构 根: 树的 ...

  4. CF1693D--单调区间

    \(T_4\) 单调区间结题报告 题目描述 一句话题意:给定一个排列 \(a\) 算出有多少个区间 \([l , r]\) , 满足其可以划分为一个单调递增子序列和单调递减子序列,其中单调递增子序列长 ...

  5. .NET Core3.1 跨域 Cors 找不到 “Access-Control-Allow-Origin”

    今天在做项目的时候遇到了调用WebAPI跨域的问题 No 'Access-Control-Allow-Origin' header is present on the requested resour ...

  6. locale 设置

    locale 介绍 在终端中,locale(本地化)设置是指与本地语言.国家和文化偏好有关的环境变量的配置.这些设定决定了程序如何处理和显示字符.时间.日期格式.货币等. 在类 Unix 系统(比如 ...

  7. Clobotics 计算机视觉场景存储实践:多云架构、 POSIX 全兼容、低运维的统一存储

    Clobotics 是一家将计算机视觉和机器学习技术应用于风电以及零售行业的企业.在风电行业,Clobotics 利用无人机对风力发电机叶片进行检查,显著降低了对人工作业的依赖.在零售领域,公司通过分 ...

  8. uniapp中,getApp()返回的实例到底是什么?为什么getApp()返回的实例无法访问vuex的$store

    按uniapp官方手册中说,getApp()函数用于获取当前应用实例.当前应用,也就是说当前应用程序.因为getApp()返回的实例可以用于访问app.vue中的globaldata,因此这个当前应用 ...

  9. FFmpeg开发笔记(五十)聊聊几种流媒体传输技术的前世今生

    ​自从互联网普及之后,用于视频直播的流媒体技术就发展起来.这几十年中,比较有影响的主要有MMS.RTSP.RTMP.HLS.SRT.RIST几种,分别介绍如下. 1.MMS协议 MMS全称Micros ...

  10. Java基础 韩顺平老师的 泛型 的部分笔记

    553,泛型引入 package com.hspedu.list_; import java.util.*; import java.util.concurrent.CompletionService ...