古月居 ROS 21 讲

5、话题消息的订阅与使用

1)完成数据接口的定义:在learning topic中创建msg,打开终端设置

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

2)根据数据接口定义设置编译规则
➢ 在package.xml中添加功能包依赖
<build_depend>message_generation</build_depend>编译依赖
<exec_depend>message_runtime</exec_depend>运行依赖

➢ 在CMakeLists.txt添加编译选项
• message_generation
• add_message_files(FILES Person.msg)接口
generate_messages(DEPENDENCIES std_msgs) ROS已经有的库
• message_runtime
由.msg编译生成的代码文件.h

// Generated by gencpp from file learning_topic/Person.msg
// DO NOT EDIT!#ifndef LEARNING_TOPIC_MESSAGE_PERSON_H
#define LEARNING_TOPIC_MESSAGE_PERSON_H#include <string>
#include <vector>
#include <map>#include <ros/types.h>
#include <ros/serialization.h>
#include <ros/builtin_message_traits.h>
#include <ros/message_operations.h>namespace learning_topic
{template <class ContainerAllocator>
struct Person_
{typedef Person_<ContainerAllocator> Type;Person_(): name(), sex(0), age(0)  {}Person_(const ContainerAllocator& _alloc): name(_alloc), sex(0), age(0)  {(void)_alloc;}typedef std::basic_string<char, std::char_traits<char>, typename ContainerAllocator::template rebind<char>::other >  _name_type;_name_type name;typedef uint8_t _sex_type;_sex_type sex;typedef uint8_t _age_type;_age_type age;enum {unknown = 0u,male = 1u,female = 2u,};typedef boost::shared_ptr< ::learning_topic::Person_<ContainerAllocator> > Ptr;typedef boost::shared_ptr< ::learning_topic::Person_<ContainerAllocator> const> ConstPtr;}; // struct Person_typedef ::learning_topic::Person_<std::allocator<void> > Person;typedef boost::shared_ptr< ::learning_topic::Person > PersonPtr;
typedef boost::shared_ptr< ::learning_topic::Person const> PersonConstPtr;// constants requiring out of line definitiontemplate<typename ContainerAllocator>
std::ostream& operator<<(std::ostream& s, const ::learning_topic::Person_<ContainerAllocator> & v)
{ros::message_operations::Printer< ::learning_topic::Person_<ContainerAllocator> >::stream(s, "", v);
return s;
}} // namespace learning_topicnamespace ros
{namespace message_traits
{// BOOLTRAITS {'IsFixedSize': False, 'IsMessage': True, 'HasHeader': False}
// {'learning_topic': ['/home/ubuntu/catkin_ws/src/learning_topic/msg'], 'std_msgs': ['/opt/ros/kinetic/share/std_msgs/cmake/../msg']}// !!!!!!!!!!! ['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_parsed_fields', 'constants', 'fields', 'full_name', 'has_header', 'header_present', 'names', 'package', 'parsed_fields', 'short_name', 'text', 'types']template <class ContainerAllocator>
struct IsFixedSize< ::learning_topic::Person_<ContainerAllocator> >: FalseType{ };template <class ContainerAllocator>
struct IsFixedSize< ::learning_topic::Person_<ContainerAllocator> const>: FalseType{ };template <class ContainerAllocator>
struct IsMessage< ::learning_topic::Person_<ContainerAllocator> >: TrueType{ };template <class ContainerAllocator>
struct IsMessage< ::learning_topic::Person_<ContainerAllocator> const>: TrueType{ };template <class ContainerAllocator>
struct HasHeader< ::learning_topic::Person_<ContainerAllocator> >: FalseType{ };template <class ContainerAllocator>
struct HasHeader< ::learning_topic::Person_<ContainerAllocator> const>: FalseType{ };template<class ContainerAllocator>
struct MD5Sum< ::learning_topic::Person_<ContainerAllocator> >
{static const char* value(){return "8361f88618d6779bd872f0ba928ced56";}static const char* value(const ::learning_topic::Person_<ContainerAllocator>&) { return value(); }static const uint64_t static_value1 = 0x8361f88618d6779bULL;static const uint64_t static_value2 = 0xd872f0ba928ced56ULL;
};template<class ContainerAllocator>
struct DataType< ::learning_topic::Person_<ContainerAllocator> >
{static const char* value(){return "learning_topic/Person";}static const char* value(const ::learning_topic::Person_<ContainerAllocator>&) { return value(); }
};template<class ContainerAllocator>
struct Definition< ::learning_topic::Person_<ContainerAllocator> >
{static const char* value(){return "string name\n\
uint8 sex\n\
uint8 age\n\
uint8 unknown = 0\n\
uint8 male = 1\n\
uint8 female = 2\n\
";}static const char* value(const ::learning_topic::Person_<ContainerAllocator>&) { return value(); }
};} // namespace message_traits
} // namespace rosnamespace ros
{namespace serialization
{template<class ContainerAllocator> struct Serializer< ::learning_topic::Person_<ContainerAllocator> >{template<typename Stream, typename T> inline static void allInOne(Stream& stream, T m){stream.next(m.name);stream.next(m.sex);stream.next(m.age);}ROS_DECLARE_ALLINONE_SERIALIZER}; // struct Person_} // namespace serialization
} // namespace rosnamespace ros
{namespace message_operations
{template<class ContainerAllocator>
struct Printer< ::learning_topic::Person_<ContainerAllocator> >
{template<typename Stream> static void stream(Stream& s, const std::string& indent, const ::learning_topic::Person_<ContainerAllocator>& v){s << indent << "name: ";Printer<std::basic_string<char, std::char_traits<char>, typename ContainerAllocator::template rebind<char>::other > >::stream(s, indent + "  ", v.name);s << indent << "sex: ";Printer<uint8_t>::stream(s, indent + "  ", v.sex);s << indent << "age: ";Printer<uint8_t>::stream(s, indent + "  ", v.age);}
};} // namespace message_operations
} // namespace ros#endif // LEARNING_TOPIC_MESSAGE_PERSON_H

创建person_publisher与person_subscriber

Publisher

/*** 该例程将发布/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,队列长度10ros::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;
}

Subscriber

/*** 该例程将订阅/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,注册回调函数personInfoCallbackros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);// 循环等待回调函数ros::spin();return 0;
}

3)编译代码

如何配置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)
拷贝到CMakeLists.txt

$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun learning_topic person_subscriber
$ rosrun learning_topic person_publisher


关掉ROSMaster也不会影响发送与接受

古月居 ROS 21 讲5相关推荐

  1. 古月居 ROS 21 讲1

    古月居 ROS 21 讲 1.ROS命令行工具的使用 以小海龟为例 打开三个终端,分别输入 roscore rosrun turtlesim turtlesim_node (二次输入tab) rosr ...

  2. 【古月居ROS 21讲】精简理清 - 速刷古月居ROS21讲 ROS概念全过程

    速刷古月居ROS21讲概念全过程 ROS的概念:对应第七讲 通讯机制 节点 (Node)-- 执行单元 节点管理器(ROS Master) 话题和消息 话题(Topic) -- 异步通信机制 消息(M ...

  3. 古月居 ROS 入门21讲--PA16 参数的使用与编程方法

    古月居 ROS 入门21讲--PA16 参数的使用与编程方法 1.参数模型 2.创建功能包 cd ~/catkin_ws/src catkin_create_pkg learning_paramete ...

  4. 古月居 ROS 入门21讲--PA18 tf坐标系广播与监听的编程实现笔记

    古月居 ROS 入门21讲--PA18 tf坐标系广播与监听的编程实现 1.创建功能包 cd ~/catkin_ws/src catkin_create_pkg learning_tf roscpp ...

  5. 古月居 ROS 入门21讲--PA17 ROS中坐标系管理系统笔记

    古月居 ROS 入门21讲--PA17 ROS中坐标系管理系统笔记 1.TF 功能包功能 ∙ \bullet ∙ 五秒钟之前,机器人头部坐标系相当于全局坐标系的关系是怎样的? ∙ \bullet ∙机 ...

  6. 古月居ROS入门21讲学习笔记P9

    古月居ROS入门21讲学习笔记P9 工作空间(workspace) 创建工作空间 创建功能包 实操 创建工作空间 创建功能包 老师在B站的原视频 链接: [古月居]古月·ROS入门21讲 | 一学就会 ...

  7. 古月居ROS入门21讲——9.创建工作空间与功能包

    1.工作空间 工作空间(workspace)直观的形容就是一个仓库,里面装载着ROS的各种项目工程,便于系统组织管理调用. src/: 源代码包 build/: 编译生成的中间文件 devel/: 开 ...

  8. 古月居 ROS入门21讲 第十二讲 话题消息的定义与使用

    古月居 ROS入门21讲 第十二讲 话题消息的定义与使用 Person.msg string name uint8 sex uint8 ageuint8 unknown=0 uint8 male=1 ...

  9. 古月居ROS入门21讲笔记

    ROS入门21讲笔记--古月居 1 C++&Python极简基础 1.1 安装编译/解析器 1.2 for循环 1.3 while循环 1.4 面向对象 2. ROS基础 2.1 ROS概念 ...

最新文章

  1. 增强学习(五)----- 时间差分学习(Q learning, Sarsa learning)
  2. html转word保留样式_译员必备 | 初识Word格式标记
  3. 关闭 Sublime Text 3 自动更新
  4. MySQL给新建用户并赋予权限
  5. 如何显示win11隐藏文件
  6. 21SpringMvc_异步发送表单数据到Bean,并响应JSON文本返回(这篇可能是最重要的一篇了)...
  7. C++算法学习(栈)
  8. CentOS-6.4 安装 Memcached
  9. (四) Docker 常用帮助命令
  10. mysql 查看 脏页_MySQL:刷脏页
  11. 汉语语句的计算机分析,(计算机专业毕业论文)汉语语法自动分析.doc
  12. 禁止用鼠标拖动窗口的大小 - 回复 合肥的石头 的问题
  13. android应用统计获取api,APICloud
  14. 前端踩坑(八)前端使用Moment 时间格式化错误
  15. SerDes结构之发送端前馈均衡技术(FFE)
  16. access()函数、_access()函数
  17. 静态网页制作HTML学习笔记
  18. signal函数原型解读
  19. 二分图的最大匹配-解决匹配问题
  20. Linux脚本:Bash脚本看这一篇就够了

热门文章

  1. 二维图画法入门_CAD二维零件图画法教程
  2. 怎么把100多个EXCEL文件合并成一个
  3. ps自动混合图层后蒙版全黑_使用图层蒙版在Photoshop中淡化和混合图像
  4. 【js】且运算、或运算
  5. python实现新高考志愿填报系统 ,web版本高考志愿智能分析推荐平台
  6. 第7代IGBT模块 FF900R12ME7PB11BPSA1 900A
  7. Primefaces
  8. oracle恢复数据库的正确方式,oracle恢复数据库方法详解
  9. 使用风讯做新闻类网站
  10. dmp文件的压缩比例