ROS Topic 相关API接口与命令行介绍

2023-05-16

目录

    • 一、Topic
      • 1.1 常用函数接口
        • ros::Publisher类
        • ros::Subscriber类
      • 1.2 常用命令行工具
        • rostopic相关
          • 1.2.1 rostopic bw
          • 1.2.2 rostopic delay
          • 1.2.3 rostopic echo
            • rostopic echo --offset
            • rostopic echo --filter
            • rostopic echo -c
            • rostopic echo -b
            • rostopic echo -p
            • rostopic echo -w
            • rostopic echo -n
          • 1.2.4 rostopic find
          • 1.2.5 rostopic hz
            • rostopic hz -w
            • rostopic hz --filter
          • 1.2.6 rostopic info
          • 1.2.7 rostopic list
            • rostopic list <名空间>
            • rostopic list -b
            • rostopic list -p
            • rostopic list -s
            • rostopic list -v
            • rostopic list --host
          • 1.2.8 rostopic pub
            • rostopic pub -l/--latch
            • rostopic pub -r RATE
            • rostopic pub -1/--once
            • rostopic pub -f FILE
          • 1.2.9 rostopic type
        • rosmsg 相关
          • 1.2.10 rosmsg show
          • 1.2.11 rosmsg list
          • 1.2.12 rosmsg package
          • 1.2.13 rosmsg packages
          • 1.2.14 rosmsg md5

一、Topic

1.1 常用函数接口

ros::Publisher类

// 两个重载函数模板,用于发布topic消息
template <typename M>
void publish(const boost::shared_ptr<M>& message) const

template <typename M>
void publish(const M& message) const
// 关闭与此发布者关联的广播
void shutdown()

// 还不知道怎么用,mark一下,有知道的欢迎评论区留言
boost::function<void(const SubscriberLinkPtr &)> getLastMessageCallback()

// 获取与此发布者关联的订阅者的数量
uint32_t getNumSubscribers() const

// 获取此发布者发布的topic
std::string getTopic() const

// 此发布者是否为锁存模式
// 锁存模式:记录发布的最后一条消息,每有订阅者连接发布一次最后一条消息
// 通过advertise函数设置
bool isLatched() const

ros::Subscriber类

// 获取与此订阅者关联的发布者的数量
uint32_t getNumPublishers() const

// 获取此订阅者订阅的topic
std::string getTopic() const

// 关闭与此订阅者关联的广播
void shutdown ()

1.2 常用命令行工具

rostopic相关

rostopic bw    显示主题使用的带宽
rostopic delay 显示带header的topic的网络延迟
rostopic echo  将消息打印到屏幕
rostopic find  按类型查找主题
rostopic hz    显示主题的发布率
rostopic info  打印关于活动主题的信息
rostopic list  打印有关活动主题的信息
rostopic pub   将数据发布到主题
rostopic type  打印主题类型
1.2.1 rostopic bw
rostopic bw <topic-name>
rostopic bw /rosout

显示topic使用的带宽,显示的带宽是subscriber端的带宽,由于rostopic是用python实现的,所以实际速度可能会低于c++实现的ros节点。

比如topic为/rosout ,发布默认消息

在这里插入图片描述

则subscribe端的带宽为

在这里插入图片描述

其中,

average:带宽。

mean:从开始通信到现在,每次通信的平均数据量。

min:从开始通信到现在,最小的一次通信数据量。

max:从开始通信到现在,最大的一次通信数据量。

window:应该是从开始通信到现在接收数据的次数,但到100就不再增加了。作者代码里使用队列存储时间戳记录通信,通过获取队列大小得到通信次数,为限制内存开销,作者将队列大小限制为100,将队首元素pop,并将新时间戳加入队列,但pop后作者没有对记录通信次数的变量加1,所以window到100就不再增加了。

1.2.2 rostopic delay
rostopic delay <topic-name>
rostopic delay /rosout

显示带header的topic的网络延迟(因为header会记录msg发出时的时间戳),即msg从advertiser发出到subscriber接收经过的时间。

自己写一个测试topic /log 代码如下,

#!/usr/bin/python3
#-*- coding:utf-8 -*-

import rospy
from rosgraph_msgs.msg import Log

if __name__ == '__main__':

    rospy.init_node('log')

    log = rospy.Publisher('/log', Log, queue_size=10)

    rate = rospy.Rate(10)

    while not rospy.is_shutdown():
        log_msg = Log()
        log_msg.header.stamp = rospy.get_rostime()

        log.publish(log_msg)
        rospy.loginfo("Publish log message %s", log_msg)
 
        rate.sleep()

则该topic的网络延迟为

在这里插入图片描述

其中,

average delay :从开始通信到现在,所有通信的平均延迟时间,单位:s

min:从开始通信到现在,所有通信中延迟时间最小的一次

max:从开始通信到现在,所有通信中延迟时间最大的一次

std dev:从开始通信到现在,所有通信延迟数据的标准差,表征延迟数据的波动大小,标准差越小表示延迟数据波动越小。

window:和 rostopic bwwindow 一样,不过它的队列大小限制为50000。

1.2.3 rostopic echo
rostopic echo <topic-name>
rostopic echo /rosout

将消息内容打印到屏幕

在这里插入图片描述

rostopic echo 有自己的参数选项,如下,

rostopic echo --offset	
rostopic echo --filter
rostopic echo -c
rostopic echo -b
rostopic echo -p
rostopic echo -p --nostr
rostopic echo -p --noarr
rostopic echo -w
rostopic echo -n
rostopic echo --offset

在打印的消息中显示advertiser发布时间与subscriber接收时间的偏移量,和delay一样,topic要有header,否则打印中没有时间戳。

rostopic echo --offset /topic_name

测试程序如下:

自定义msg:

# HeaderString.msg
# 自定义msg
std_msgs/Header header
string data

offset节点源文件:

package名称为mbot_communication,自建包需相应修改

#include "ros/ros.h"
#include "mbot_communication/HeaderString.h"

int main(int argc, char **argv)
{
    ros::init(argc, argv, "offset");

    ros::NodeHandle n;
    ros::Publisher chatter_pub = n.advertise<mbot_communication::HeaderString>("/offset", 1000);

    ros::Rate loop_rate(5);

    int count = 0;

    while (ros::ok())
    {
        mbot_communication::HeaderString msg;
        msg.header.stamp = ros::Time::now();
        std::stringstream ss;
        ss << "hello world " << count;
        msg.data = ss.str();

        chatter_pub.publish(msg);

        ROS_INFO("sec: %d, nsec: %d, data: %s", msg.header.stamp.sec, msg.header.stamp.nsec, msg.data.c_str());

        ros::spinOnce();

        loop_rate.sleep();
        ++count;
    }

    return 0;
}

启动offset节点后,执行以下命令会有相应打印:

在这里插入图片描述

其中,

stamp是时间戳,这里是advertiser发布时间与subscriber接收时间的偏移量,stamp = advertiser发布时间戳 - subscriber接收时间戳,secs是秒,nsecs是纳秒,1秒= 1 ∗ 1 0 − 9 1*10^{-9} 1109 纳秒,上图第一个消息的偏移量就是 − 1 + 998923014 ∗ 1 0 − 9 = − 0.001076986 ( s ) -1+998923014*10^{-9} = -0.001076986(s) 1+998923014109=0.001076986(s)

rostopic echo --filter

显示与指定python语法的逻辑表达式匹配的消息

rostopic echo --filter "逻辑表达式"  /topic_name
rostopic echo --filter "m.data=='foo'"  /topic_name

可以对消息内容做逻辑匹配,比如上述自定义 /offset topic,只显示seq为偶数的消息,

在这里插入图片描述

默认消息变量为 m,使用.表示字段包含关系,只支持匹配数字和字符串,

支持python的所有内置运算符和内置函数,比如对于数字,支持 +-***///% 等数学运算,&|~^<<>> 等位运算,pow()abs()round()max() 等内置函数,对于字符串,支持 split()upper()find()len() 等内置函数,就是那种使用时不需要另外import包的函数在这里都支持。

对于逻辑运算支持 ==!=><>=<=andor 等。

另外,如果和字符或字符串进行比较,需要用 '' 括起来。

再给两个例子,其他自己探索吧:

在这里插入图片描述

在这里插入图片描述

rostopic echo -c

打印每条消息前清除屏幕,不能与 -p 一起使用。

rostopic echo -c /topic_name
rostopic echo -b

显示bag文件中录制的topic

rostopic echo -b log_file.bag /topic_name

录制了一段/offset的消息,使用该命令打印如下:

在这里插入图片描述

.bag有特定的编码格式,不能直接打开,如果想直接查看bag记录的内容而不想每次播放bag,可以使用这个命令将bag内容重定向,offset.txt文件就可以随时打开查看了。

在这里插入图片描述

rostopic echo -b 一起用的还有一个 -a 参数选项,用来显示 bag 文件中记录的所有消息,也就是 rostopic echo -b log_file.bag 后面如果接 topic 名字,就显示对应 topic 的消息内容,如果接 -a 就显示所有消息。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

显示所有消息时,是按照记录时的时间顺序打印每条消息的。

rostopic echo -p

以 matlab/octave 友好的格式显示消息。不能与 -c 一起使用。

rostopic echo -p /topic_name

在这里插入图片描述

其中,以%开头的第一行是标题,按顺序对应每行以 , 隔开的变量名。

rostopic echo -p 还有两个参数选项,--nostr --noarr ,分别代表 忽略字符串忽略数组

在这里插入图片描述

使用 --nostr 参数选项后,忽略掉了字符串类型的 frame_iddata

rostopic echo -w

以固定宽度 NUM_WIDTH 打印所有数值,如果 NUM_WIDTH 小于实际宽度,则以实际宽度打印。

rostopic echo -w NUM_WIDTH /topic_name

在这里插入图片描述

每个数字的宽度为13,实际宽度不足13的,在数字前面补空格。

符合python的 % 占位符规则,具体可查询 python % 占位符

rostopic echo -n

打印接收到的 COUNT 条消息并退出。

rostopic echo -n COUNT /topic_name

在这里插入图片描述

1.2.4 rostopic find
rostopic find <msg-type>
rostopic find rosgraph_msgs/Log

按照 topic 的消息类型查找运行的 topic

在这里插入图片描述

1.2.5 rostopic hz
rostopic hz <topic-name>
rostopic hz /rosout

显示主题的发布率。默认情况下,报告的速率是 rostopic 运行期间的平均速率。

在这里插入图片描述

rostopic delay 的打印类似,其中,

average rate :从开始通信到现在,所有通信的平均发布率,单位:Hz

min:从开始通信到现在,所有通信中发布周期最小的一次

max:从开始通信到现在,所有通信中发布周期最大的一次

std dev:从开始通信到现在,所有通信发布周期的标准差,表征发布周期的波动大小,标准差越小表示波动越小。

window:从开始通信到现在接收数据的次数,队列限制大小50000。

rostopic hz 的参数选项如下:

rostopic hz -w 
rostopic hz --filter
rostopic hz -w

使用窗口大小(样本数)报告速率,以对速率进行时间局部估计。

如不使用 -w 选项,报告的平均速率时从开始通信以来所有通信的平均速率,如使用 -w 则为最近 WINDOW_SIZE 次通信的平均速率。

 rostopic hz -w WINDOW_SIZE /topic_name

在这里插入图片描述

rostopic hz --filter

仅报告指定python语法的逻辑表达式匹配的消息的速率。

逻辑表达式的使用规则同 rostopic echo --filter

此选项对性能有很大影响,不应用于高速率主题。

rostopic hz --filter FILTER_EXPR /topic_name

在这里插入图片描述

1.2.6 rostopic info
rostopic info <topic-name>
rostopic info /rosout

打印 topic 的信息

在这里插入图片描述

其中,

Type:是 topic 的消息类型

Publishers:是该 topic 的发布者节点名,如果是通过 rostopic 指令发布,则节点名称就是 /rostopic_7739_1651069588197 的命名形式,其中 7739 是节点的 PID(线程ID),

1651069588197 是什么不知道(如果你知道欢迎评论区留言)

Subscribers:是该 topic 的订阅者节点名。

http://Yogo:40683/ 是该节点的网络地址,

在这里插入图片描述

1.2.7 rostopic list

列出当前运行的topic

在这里插入图片描述

rostopic的参数选项如下:

rostopic list <namespace>    # 列出指定命名空间中的topic
rostopic list -b <bag_file>  # 列出bag文件中的topic
rostopic list -p  # 只列出发布者
rostopic list -s  # 只列出订阅者
rostopic list -v  # 详细模式
rostopic list --host  # 按主机名分组列表
rostopic list <名空间>

列出指定命名空间中的topic,关于ROS的命名空间,见 ROS WiKi/Names/Graph Resource Names

rostopic list /up

在这里插入图片描述

rostopic list -b <bag_file>

列出bag文件中的topic

rostopic list -b all.bag

在这里插入图片描述

rostopic list -p

只列出有发布者的topic

rostopic list -p
rostopic list -s

只列出有订阅者的topic

rostopic list -s

在这里插入图片描述

rostopic list -v

列出所有topic的详细信息

rostopic list -v

在这里插入图片描述

其中包括topic的属性(发布者/订阅者)、topic名、topic消息类型(方括号里的)、该topic发布者/订阅者的数量。

rostopic list --host

按主机名分组列表

rostopic list --host

在这里插入图片描述

其中,方括号里是主机名。

1.2.8 rostopic pub

将数据发布到主题

rostopic pub <topic-name> <topic-type> [data...]
rostopic pub /topic_name std_msgs/String "hello"

关于topic发布的三种模式:

  • latching mode
    • 记录发布的最后一条消息,每有订阅者连接,发布一次最后一条消息
    • 默认为这个模式
  • once mode
    • 保持latching模式3秒,然后退出。
  • rate mode
    • 可以自定义消息的发布频率

关于topic发布消息的数据源:

  • 命令行参数(最常用的方法)

    rostopic pub /topic_name std_msgs/String "hello"
    
  • 管道输入

    rostopic echo /chatter | rostopic pub /bar std_msgs/String
    

    这个没发现有什么好用的场景,就是把/chatter的消息内容转发给/bar了。

  • 通过YAML文件输入

    首先要有一个存有msg的文件,可以重定向topic内容:

    rostopic echo /chatter > chatter.bagy
    

    然后使用-f参数选项将文件内容输入到topic

    rostopic pub -f chatter.bagy /bar std_msgs/String
    

​ 关于YAML格式在ROS中的使用,见 YAML on the ROS command line

参数选项:

rostopic pub -l <topic-name> <topic-type> [data...]
rostopic pub --latch <topic-name> <topic-type> [data...]
rostopic pub -r RATE <topic-name> <topic-type> [data...]
rostopic pub -1 <topic-name> <topic-type> [data...]
rostopic pub --once <topic-name> <topic-type> [data...]
rostopic pub -f FILE <topic-name> <topic-type> [data...]
rostopic pub -l/–latch

-l--latch是一样的,代表latching mode

在这里插入图片描述

发布者发布一次消息,并将最后一条消息保存等待,直到有新的订阅者连接,把保存的消息发给新的订阅者(每个新订阅者收到的都是这条保存的消息)

rostopic pub -r RATE

rate modeRATE的单位是Hz

在这里插入图片描述

发布者按10Hz的频率不停发布消息,订阅者一直接收消息。

rostopic pub -1/–once

-1(注意是数字1) 和 --once 是一样的,代表once mode

rostopic pub -f FILE

通过YAML文件输入

1.2.9 rostopic type

显示topic的消息类型

rostopic type <topic-name>
rostopic type /topic_name

在这里插入图片描述

rosmsg 相关

rosmsg show 显示消息格式内容
rosmsg list 显示消息列表
rosmsg package 显示指定包中的所有消息列表
rosmsg packages 显示所有带有消息的包的列表
rosmsg md5 显示指定消息类型的 md5 总和
1.2.10 rosmsg show
rosmsg show <message type>
rosmsg show std_msgs/String

显示 ROS 消息类型中的字段。

在这里插入图片描述

如果不知道包名称,也可以只写消息类型,该命令会在所有包中匹配:

在这里插入图片描述

-r 选项

显示消息原始文件中的所有内容,包括注释。

rosmsg show -r <message-type>

在这里插入图片描述

1.2.11 rosmsg list

显示所有消息列表

rosmsg list

在这里插入图片描述

1.2.12 rosmsg package

显示指定包中的所有消息列表

rosmsg package <package-name> 
rosmsg package mbot_communication

在这里插入图片描述

-r选项

将消息列表显示在一行

rosmsg package mbot_communication -s

在这里插入图片描述

1.2.13 rosmsg packages

显示所有带有消息的包的列表。

rosmsg packages

在这里插入图片描述

-r选项

将包列表显示在一行

rosmsg packages -s

在这里插入图片描述

1.2.14 rosmsg md5

显示指定消息类型的 md5 总和。如果编译的版本不匹配,会发出警告。

rosmsg md5 <message-type>
rosmsg md5 String

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS Topic 相关API接口与命令行介绍 的相关文章

随机推荐

  • keil工程中找不到头文件的可能原因

    今天用keil写一个串口调试程序 xff0c 编译工程时 xff0c 总是找不到type h头文件 xff0c 而该文件又是必须的 于是 xff0c 重新看设置 xff0c 头文件路径已经包含到工程里了 xff0c 头文件也已经添加到工程里
  • 在NAND FLASH上建立YAFFS2文件系统

    在NAND FLASH上建立YAFFS2文件系统 xff08 一 xff09 By on 2006 07 22 经过了半个多月的努力 xff0c 终于搞定nandflash的mtd驱动和上层的yaffs2文件系统 这半个多月来几乎每天都要和
  • 个人学习笔记-矩阵的四则运算

    目录 1 矩阵的四则运算1 1 矩阵的乘法运算1 2矩阵的加法运算1 3矩阵的减法运算 2 接口测试输出结果 1 矩阵的四则运算 1 1 矩阵的乘法运算 span class token comment 矩阵乘法 C语言实现分解步骤 xff
  • 单片机通信接口:UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB

    参考资料 xff1a 这些单片机接口 xff0c 一定要熟悉 xff1a UART I2C SPI TTL RS232 RS422 RS485 CAN USB SD卡 秒懂所有USB接口类型 xff0c USB接口大全 1 UART UAR
  • PCB中走线与电流的关系

    参考资料 xff1a 超强整理 xff01 PCB设计之电流与线宽有八种关系 1 前言 PCB的载流能力取决与以下因素 xff1a 线宽 线厚 xff08 铜箔厚度 xff09 容许温升 PCB走线越宽 xff0c 载流能力越大 但走线宽度
  • Visual Studio各版本集成的Visual C++版本对应关系

    Visual Studio版本集成的Visual C 43 43 版本对应关系如下 xff1a Visual Studio 6 xff1a vc6 Visual Studio 2003 xff1a vc7 Visual Studio 200
  • 字节序—字节内部的位序

    Big endian machine It thinks the first byte it reads is the biggest Little endian machine It thinks the first byte it re
  • 嵌入式常用模块之——环形队列(1)

    简单聊聊对我实现方式的介绍代码部分完整代码 简单聊聊 在嵌入式开发时候 xff0c 有很对模块是经常会使用到的 从这篇文字开始 xff0c 将我觉得一些常用的模块逐一做一个整理 梳理一下自己的思路 xff0c 也顺便方便大家 xff0c 如
  • Python实现isbn查询书籍详细信息

    如有错误 xff0c 请疯狂打脸没关系 xff0c 希望能够指出来 0 开始的开始 一直想做一个图书漂流软件 xff0c 最近入手 xff08 入坑 xff09 了微信小程序 xff0c 添加图书时需要用到isbn查询书籍信息的API xf
  • Ubuntu 安装 ROS 详细教程

    最近需要用ROS控制一个小车底盘 xff0c 然后发现不会了 所以写一篇博客记录一下 xff0c 以便以后查阅 OS xff1a Ubuntu 20 04 ROS xff1a noetic 1 设置Ubuntu的软件和更新 在搜索框输入so
  • roscore报错: ‘ascii’ codec can’t decode byte 0xe6 in position 13: ordinal not in range(128)

    零 问题描述 使用ROS是 xff0c 执行roscore报一下错误 xff1a ascii codec can t decode byte 0xe6 in position 13 ordinal not in range 128 The
  • Ubuntu16.04网络连接正常但浏览器无网络

    ubuntu xff0c google浏览器突然不能上网了 xff0c 经过一番折腾 xff0c 终于解决了问题 xff0c 在此记录一下 开始如下图 xff1a 然而 ping 一下百度 xff0c 是可以 ping 通的 xff0c 说
  • CMake学习(二) —— 生成链接库

    除使用 add executable 生成可执行文件外 xff0c 还可以使用 add library 生成链接库 一 Linux的链接库 首先讲一下 linux 的链接库 xff0c 就是一些函数代码的二进制形式 xff0c 有动态与静态
  • iperf3 使用指南

    iperf3的参数 xff1a s表示做服务器 c表示做客户端 t 表示表示发送时间 i 表示间隔多久报告一次 u 表示UDP xff0c 不加表示tcp R 表示服务器发客户端收 xff0c 不加默认客户端发 xff0c 服务器收 f 表
  • [Qt 教程之开始的开始] —— 创建项目及注意事项

    Qt系列教程总目录 OS xff1a Ubuntu 16 04 IDE xff1a Qt Creator 4 11 0 Qt xff1a Qt 5 14 0 xff08 GCC 5 3 1 20160406 Red Hat 5 3 1 6
  • Tips for Qt

    Based on Qt 5 14 0 Qt Creator 4 11 0 1 在UI设计界面添加控件后 xff0c 要编译一下 xff0c 再到编辑界面写代码 xff0c 否则系统不识别新添加的控件 2 多看帮助文档 xff0c 好多开发时
  • [Qt 实战小项目] —— C++ Qt 实现鼠标拖动旋转功能

    Qt系列教程总目录 文章目录 零 开始的开始一 实现思路1 旋转角度2 旋转方向3 实现旋转4 实现流程 二 完整代码 零 开始的开始 这是律盘 xff0c 看古琴课程时 xff0c 老师有一个纸质的 xff0c 可以查找各弦散按音位 xf
  • ERROR: cannot download default sources list from: 20-default.list. Website may be down.

    零 问题描述 安装 ROS 时 xff0c 执行 sudo rosdep init 报如下错误 xff1a ERROR cannot download default sources list from https raw githubus
  • ROS与操作系统版本对应关系

    Ubuntu和ROS1版本对应关系及官方支持结束时间 xff0c 加粗的为还在支持的版本 xff0c Recommended 为官方建议使用版本 UbuntuROS1Release dateEnd of Life14 04 LTSindig
  • ROS Topic 相关API接口与命令行介绍

    目录 一 Topic1 1 常用函数接口ros Publisher类ros Subscriber类 1 2 常用命令行工具rostopic相关1 2 1 rostopic bw1 2 2 rostopic delay1 2 3 rostop