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

ROS通信机制进阶

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

相关推荐

  1. ROS-ROS通信机制-常用API

    2024-06-12 01:02:05       38 阅读
  2. 无人机群ros通信

    2024-06-12 01:02:05       36 阅读
  3. ROS笔记四:ROS通信

    2024-06-12 01:02:05       41 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-12 01:02:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-12 01:02:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-12 01:02:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-12 01:02:05       20 阅读

热门阅读

  1. Git如何拉取远程仓库的其他分支

    2024-06-12 01:02:05       7 阅读
  2. Spring Cloud应用框架

    2024-06-12 01:02:05       7 阅读
  3. 【python】基于pandas的EXCEL合并方法

    2024-06-12 01:02:05       11 阅读
  4. AI赋能未来:大模型与AIGC的崛起

    2024-06-12 01:02:05       7 阅读
  5. 【C++——引用&】

    2024-06-12 01:02:05       8 阅读
  6. python多线程翻译获取进度结果

    2024-06-12 01:02:05       7 阅读
  7. 力扣1818.绝对差值和

    2024-06-12 01:02:05       8 阅读