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

作者 : admin 本文共2717个字,预计阅读时间需要7分钟 发布时间: 2024-06-8 共1人阅读

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基础学习-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("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
本站无任何商业行为
个人在线分享 » ROS基础学习-ROS通信机制进阶
E-->