ROS基础学习-ROS通信机制进阶

ROS通信机制进阶

目录

  • 0.简介
  • 1.常用API
    • 1.1 节点初始化函数
      • 1.1.1 C++
      • 1.1.2 Python
    • 1.2 话题与服务相关函数
      • 1.2.1 对象获取相关
        • 1.2.1.1 C++
        • 1.2.1.2 Python
      • 1.2.2 订阅对象相关
        • 1.2.2.1 C++
        • 1.2.2.2 Python
      • 1.2.3 服务对象相关函数
        • 1.2.3.1 C++
        • 1.2.3.2 Python
      • 1.2.4 客户端对象相关
        • 1.2.4.1 C++
        • 1.2.4.2 Python
    • 2.回旋函数
      • 2.1 C++
      • 2.2 Python
    • 3.时间
      • 3.1 时刻
        • 3.1.1 C++
        • 3.1.2 Python
      • 3.2 持续时间
      • 3.3 持续时间与时刻运算
      • 3.4 设置运行频率
      • 3.5 定时器

0.简介

前面的都是粗粒度的通信框架基础,没有详细介绍涉及的API,也没有封装代码,后面研究更深入的东西。

  • ROS常用API
  • ROS中自定义头文件与源文件的使用

1.常用API

参考官方API文档或参考源码:

  • ROS节点的初始化相关API;
  • NodeHandle 的基本使用相关API;
  • 话题的发布方,订阅方对象相关API;
  • 服务的服务端,客户端对象相关API;
  • 时间相关API;
  • 日志输出相关API;
  • 参数服务器相关API.

另请参考:
http://wiki.ros.org/APIs
https://docs.ros.org/en/api/roscpp/html/

1.1 节点初始化函数

1.1.1 C++

/** @brief ROS初始化函数。* 该函数可以解析并使用节点,* 启动时传入的参数(通过参数设置节点名称、命名空间...) * 该函数有多个重载版本,如果使用NodeHandle建议调用该版本。 * \param argc 参数个数* \param argv 参数列表* \param name 节点名称,需要保证其唯一性,不允许重名节点,不允许包含命名空间* \param options 节点启动选项,被封装进了ros::init_options*/
void init(int &argc, char **argv, const std::string& name, uint32_t options = 0);

1.argc,argv的使用, 如果按照ROS中特定格式传入是实参,那么ROS可以加以使用,比如用来设置全局参数,给节点重命名…
2.options的使用,节点名称需要保证唯一,会导致一个问题,同一个节点不能重复启动
结果:ROS中当有重名的节点启动时,之前的节点会被关闭
需求:特定场景下,需要一个节点多次启动且能正常运行
在这里插入图片描述
解决:设置启动项,ros::init_options::AnonymouusName,当创建ROS节点时,会在用户自定义的节点名称后加随机数,从而避免重名问题。

1.1.2 Python

def init_node(name, argv=None, anonymous=False, log_level=None, disable_rostime=False, disable_rosout=False, disable_signals=False, xmlrpc_port=0, tcpros_port=0):"""在ROS msater中注册节点@param name: 节点名称,必须保证节点名称唯一,节点名称中不能使用命名空间(不能包含 '/')@type  name: str@param anonymous: 取值为 true 时,为节点名称后缀随机编号@type anonymous: bool"""

1.2 话题与服务相关函数

在 roscpp 中,话题和服务的相关对象一般由 NodeHandle 创建。
NodeHandle还有一个重要作用是可以用于设置命名空间,这是以后的重点。

1.2.1 对象获取相关

1.2.1.1 C++
1.对象获取:
/**
*根据话题生成发布对象
*在ROSmaster注册并返回一个发布者对象,该对象可以发布消息
*使用示例如下:
*ros::Publisher pub = handle.advertise<std_msgs::Empty>("my_topic", 1);
* \param topic 发布消息使用的话题
* \param queue_size 等待发送给订阅者的最大消息数量
* \param latch (optional) 如果为 true,该话题发布的最后一条消息将被保存,并且后期当有订阅者连接时会将该消息发送给订阅者
* \return 调用成功时,会返回一个发布对象
*/
template <class M>
Publisher advertise(const std::string& topic, uint32_t queue_size, bool latch = false)latch参数设置为true时,导航时地图发送,设置为true,当有新订阅方订阅时就将地图发布过去。
以静态地图发布为例,,方案1,可以使用固定频率发送地图数据,但是效率底;方案2,可以将地图发布对象对象的latch设置为true,并且发布方只发送一次数据,每当订阅连接时,将地图数据发送给订阅者(只发送一次),这样提高了数据的发送效率。2.消息发布函数:
/**
* 发布消息          
*/
template <typename M>
void publish(const M& message) const
1.2.1.2 Python

1.对象获取

class Publisher(Topic):"""在ROS master注册为相关话题的发布方"""def __init__(self, name, data_class, subscriber_listener=None, tcp_nodelay=False, latch=False, headers=None, queue_size=None):"""Constructor@param name: 话题名称 @type  name: str@param data_class: 消息类型@param latch: 如果为 true,该话题发布的最后一条消息将被保存,并且后期当有订阅者连接时会将该消息发送给订阅者@type  latch: bool@param queue_size: 等待发送给订阅者的最大消息数量@type  queue_size: int"""

2.消息发布函数:

def publish(self, *args, **kwds):"""发布消息"""

1.2.2 订阅对象相关

1.2.2.1 C++
1.对象获取
/*** \brief 生成某个话题的订阅对象** 该函数将根据给定的话题在ROS master 注册,并自动连接相同主题的发布方,每接收到一条消息,都会调用回调* 函数,并且传入该消息的共享指针,该消息不能被修改,因为可能其他订阅对象也会使用该消息。* * 使用示例如下:void callback(const std_msgs::Empty::ConstPtr

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/24721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见机器学习概念

信息熵 信息熵&#xff08;information entropy&#xff09;是信息论的基本概念。描述信息源各可能事件发生的不确定性。20世纪40年代&#xff0c;香农&#xff08;C.E.Shannon&#xff09;借鉴了热力学的概念&#xff0c;把信息中排除了冗余后的平均信息量称为“信息熵”&…

Python的Pillow(图像处理库)的一些学习笔记

Python的Pillow库是一个非常强大的图像处理库。 安装Pillow库&#xff1a; 在终端或命令行中输入以下命令来安装Pillow&#xff1a; pip install pillow 升级库&#xff1a; pip install pillow --upgrade 一些基础的应用 1、图像文件方面的&#xff1a; 打开文件 …

LVS负载均衡群集+NAT部署

目录 1.企业群集应用概述 1.1 群集的含义 1.2 企业群集分类 2.LVS负载均衡群集运用理论 2.1 负载均衡的架构 2.2 LVS负载均衡群集工作的三种模式 3.LVS虚拟服务器&#xff08;Linux Virtual Server&#xff09; 3.1 ip_vs通用模块 3.2 LVS调度器用的调度方法 4.ipvs…

【CS.DB】深度解析:ClickHouse与Elasticsearch在大数据分析中的应用与优化

文章目录 《深入对比&#xff1a;在大数据分析中的 ClickHouse和Elasticsearch》 1 介绍 2 深入非关系型数据库的世界2.1 非关系型数据库的种类2.2 列存储数据库&#xff08;如ClickHouse&#xff09;2.3 搜索引擎&#xff08;如Elasticsearch&#xff09;2.4 核心优势的归纳 3…

01_基于人脸的常见表情识别实战_深度学习基础知识

1. 感知机 感知机通常情况下指单层的人工神经网络,其结构与 MP 模型类似(按照生物神经元的结构和工作原理造出来的一个抽象和简化了模型,也称为神经网络的一个处理单元) 假设由一个 n 维的单层感知机,则: x 1 x_1 x1​ 至 x n x_n xn​ 为 n 维输入向量的各个分量w 1 j…

《C++避坑神器·二十七》VS中release打断点方法,#undef作用

1、release打断点方式 2、#undef作用 #undef指令用于”取消“已定义的#define指令 案例&#xff1a;

UiPath发送邮件给多人时需要注意哪些限制?

UiPath发送邮件给多人的步骤&#xff1f;如何使用UiPath发信&#xff1f; 尽管UiPath提供了强大的邮件发送功能&#xff0c;但在批量发送邮件时&#xff0c;有一些限制和注意事项是我们必须了解的。AokSend将详细介绍这些限制&#xff0c;并提供一些优化建议。 UiPath发送邮件…

【SQLAlChemy】如何定义ORM模型,如何映射到数据库?

定义ORM模型并映射到数据库 创建 ORM 基类 使用 declarative_base 根据 engine 来创建一个 ORM 基类。 from SqlAIchemy.LinkDB.main import engineBase declarative_base()创建自定义类 用上边定义的 Base 类来实现自己的 ORM 类。 __tablename__ 类属性&#xff0c;可以…

Electron qt开发教程

模块安装打包 npm install -g electron-forge electron-forge init my-project --templatevue npm start //进入目录启动 //打包成一个目录到out目录下&#xff0c;注意这种打包一般用于调试&#xff0c;并不是用于分发 npm run package //打出真正的分发包&#xff0c;放在o…

Swift 序列(Sequence)排序面面俱到 - 从过去到现在(二)

概览 在上篇 Swift 序列(Sequence)排序面面俱到 - 从过去到现在(一)博文中,我们讨论了 Swift 语言中序列和集合元素排序的一些基本知识,我们还给出了以自定义类型中任意属性排序的“康庄大道”。 不过在实际的撸码场景中,我们往往需要的是“多属性”同时参与到排序的考…

工业楼控暖通组态恒温检测控制大屏前端UI案例

工业楼控暖通组态恒温检测控制大屏前端UI案例

U盘文件系统结构损坏的应对与预防

在数字化时代&#xff0c;U盘作为便携式存储设备&#xff0c;其重要性不言而喻。然而&#xff0c;当U盘文件系统结构损坏时&#xff0c;我们可能会面临数据丢失的风险。本文将深入探讨U盘文件系统结构损坏的问题&#xff0c;分析其产生的原因&#xff0c;并给出相应的数据恢复方…

SpringBoot 的多配置文件

文章目录 SpringBoot 的多配置文件spring.profiles.active 配置Profile 和 ActiveProfiles 注解 SpringBoot 的多配置文件 spring.profiles.active 配置 默认情况下&#xff0c;当你启动 SpringBoot 项目时&#xff0c;会在日志中看到如下一条 INFO 信息&#xff1a; No act…

vue2 中如何使用 render 函数编写组件

vue2 中如何使用 render 函数编写组件 render 基础语法createElement返回值&#xff1a;VNode参数处理样式和类组件 propsHTML 特性和 DOM 属性处理事件插槽指令v-model 指令其他属性 使用 render 封装一个输入框其他问题参考 vue 提供了声明式编写 UI 的方式&#xff0c;即 vu…

VL830 USB4 最高支持40Gbps芯片功能阐述以及原理图分享

前文斥巨资拆了一个扩展坞供大家参考。其中核心即为本文要说的这个VL830,USB4的HUB芯片。 拆解报告传送门&#xff1a;USB4 Gen3x2 最高40Gbps传输速率的HUB扩展坞拆解分析 OK&#xff0c;闲话少叙。直接进入主题&#xff0c;我就直接翻译规格书了。 VL830是一款USB4端点设备…

C++笔试强训day41

目录 1.棋子翻转 2.宵暗的妖怪 3.过桥 1.棋子翻转 链接https://www.nowcoder.com/practice/a8c89dc768c84ec29cbf9ca065e3f6b4?tpId128&tqId33769&ru/exam/oj &#xff08;简单题&#xff09;对题意进行简单模拟即可&#xff1a; class Solution { public:int dx[…

设计模式-中介者(调停者)模式(行为型)

中介者模式 中介者模式是一种行为型模式&#xff0c;又叫调停者模式&#xff0c;它是为了解决多个对象之间&#xff0c;多个类之间通信的复杂性&#xff0c;定义一个中介者对象来封装一些列对象之间的交互&#xff0c;使各个对象之间不同持有对方的引用就可以实现交互&#xf…

连山露【诗词】

连山露 雾隐黄山路&#xff0c;十步一松树。 树上惊松鼠&#xff0c;松子衔木屋。 松子青嫩芽&#xff0c;尖尖头探出。 卷挂白露珠&#xff0c;装映黄山雾。

Java面试八股之什么是反射,实现原理是什么

Java中什么是反射&#xff0c;实现原理是什么 Java中的反射&#xff08;Reflection&#xff09;是一种强大的特性&#xff0c;它允许程序在运行时检查和操作类、接口、字段和方法的信息。简而言之&#xff0c;反射机制使得程序能够在运行时动态地了解和使用自身或其他程序集中…

LDR6020一拖二快充线:高效充电的新选择

LDR6020一拖二快充线&#xff1a;高效充电的新选择 随着移动设备的普及和功能的日益增强&#xff0c;电池续航成为了用户关注的重点之一。为了满足用户对于快速充电的需求&#xff0c;各大厂商纷纷推出了各种快充技术和产品。在这个背景下&#xff0c;LDR6020一拖二快充线凭借…