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

本文涉及的产品
资源编排,不限时长
简介: ROS Topic 相关API接口与命令行介绍

一、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 ,发布默认消息

c939c680b8fb41c6b67dcddb69286b0b.png

则subscribe端的带宽为

beb44f1274f946078fa960cf06b207eb.png

其中,

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的网络延迟为

671f6f5da545415dad863f64ec14d61a.png

其中,

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

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

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

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

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

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

将消息内容打印到屏幕

d4cf5b07e28b4c65a0ac4eceb142d5d0.png

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节点后,执行以下命令会有相应打印:

f2dc35ccd4674304bcbb7829ec45c297.png

其中,

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

rostopic echo --filter

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

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

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

6f92926dce5847feabddcd5cf881d06a.png

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

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

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

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

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

a1c3f8e134e940599b9de8275841e812.png

cbaa2c003e35474c9db4774adb2dc87a.png

rostopic echo -c

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

rostopic echo -c /topic_name
rostopic echo -b

显示bag文件中录制的topic

rostopic echo -b log_file.bag /topic_name

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

4e3fb4e96153401cb74192d23c17b8f8.png

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

2b521acb8d6b4697be7c0ef4ae9f0d6a.png

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

77c5926499ea4dcfbb768b9adcc45f28.png

02b3f68a96554e2aa32ed76d643a9bdb.png

95d51e8a4e9547dbb0e1d6e4f4dc28f3.png

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

rostopic echo -p

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

rostopic echo -p /topic_name

45d2b29c435b45bab75c3d7a496cf130.png

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

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

a5be5274cbb3492faaf501a4136c5bc7.png

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

rostopic echo -w

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

rostopic echo -w NUM_WIDTH /topic_name

5198d6b37ecf4c26bb3fa4b1349aba77.png

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

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

rostopic echo -n

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

rostopic echo -n COUNT /topic_name

cddc7c75f28a46da80ef1522397c264d.png

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

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

50f15b813aba40c0b2442294f5e542ec.png

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

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

933a9b01006342c19ab1d63bf38067ed.png

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

e89e72ecbc8b43298b8e9ca72c0d6a87.png

rostopic hz --filter

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

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

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

rostopic hz --filter FILTER_EXPR /topic_name

36acf129bf4941549c8e4252d1a9abc2.png

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

打印 topic 的信息

478c1af0509642f1929bd19e42533be8.png

其中,

Type:是 topic 的消息类型

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

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

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

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

02b7478864d14dd480491ccc4304947e.png

1.2.7 rostopic list

列出当前运行的topic

c1acb605aaa845dd9852fee590d3e1bf.png

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

dabc8bab3c8f4314a4ae842ae503ea25.png

rostopic list -b

列出bag文件中的topic

rostopic list -b all.bag

e048cdd2782b4148b5e4051bca2e213c.png

rostopic list -p

只列出有发布者的topic

rostopic list -p
rostopic list -s

只列出有订阅者的topic

rostopic list -s

7daff6fa334042f498eacbc41f9e5d6d.png

rostopic list -v

列出所有topic的详细信息

rostopic list -v

95c00d8a758f4e30951ba9538fc053ab.png

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

rostopic list --host

按主机名分组列表

rostopic list --host

f90d94a26dc34a119deb38b0db7925eb.png

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

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

b4799621885c4dfe8ebf942ba67f2d42.png

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

rostopic pub -r RATE

rate modeRATE的单位是Hz

ea57a9c5690a4c4b89e5d7d547808e94.png

发布者按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

eef9e3ee3fd340059819588f0c80b3e5.png

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 消息类型中的字段。

cf54bad7ce384da89b222af18bc33f21.png

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

c33b262e52894b5c947a3d37eab628d9.png

-r 选项

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

rosmsg show -r <message-type>

f8d40998e63b4213bfd5fb2fe8378780.png

1.2.11 rosmsg list

显示所有消息列表

rosmsg list

2a34bf988b2c4269885b60aa43dda626.png

1.2.12 rosmsg package

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

rosmsg package <package-name> 
rosmsg package mbot_communication

2141cf78b3714d5b9e2475f406a39cb7.png

-r选项

将消息列表显示在一行

rosmsg package mbot_communication -s

5c6e41d066be4035956434105c3fd523.png

1.2.13 rosmsg packages

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

rosmsg packages

a847945178114721819234217d77142a.png

-r选项

将包列表显示在一行

rosmsg packages -s

50f3fda05e54491cb89d6af6dd522ab1.png

1.2.14 rosmsg md5

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

rosmsg md5 <message-type>
rosmsg md5 String

ddc4512ec3b14ab5bdb8af90c4eaf1d1.png

二、Service

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
|
5天前
|
API PHP 开发者
速卖通商品详情接口(速卖通API系列)
速卖通(AliExpress)是阿里巴巴旗下的跨境电商平台,提供丰富的商品数据。通过速卖通开放平台(AliExpress Open API),开发者可获取商品详情、订单管理等数据。主要功能包括商品搜索、商品详情、订单管理和数据报告。商品详情接口aliexpress.affiliate.productdetail.get用于获取商品标题、价格、图片等详细信息。开发者需注册账号并创建应用以获取App Key和App Secret,使用PHP等语言调用API。该接口支持多种请求参数和返回字段,方便集成到各类电商应用中。
|
3天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
25 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
2天前
|
监控 供应链 搜索推荐
亚马逊商品详情接口(亚马逊 API 系列)
亚马逊作为全球最大的电商平台之一,提供了丰富的商品资源。开发者和电商从业者可通过亚马逊商品详情接口获取商品的描述、价格、评论、排名等数据,对市场分析、竞品研究、价格监控及业务优化具有重要价值。接口基于MWS服务,支持HTTP/HTTPS协议,需注册并获得API权限。Python示例展示了如何使用mws库调用接口获取商品详情。应用场景包括价格监控、市场调研、智能选品、用户推荐和库存管理等,助力电商运营和决策。
45 23
|
3天前
|
JSON 数据挖掘 API
lazada商品详情接口 (lazada API系列)
Lazada 是东南亚知名电商平台,提供海量商品资源。通过其商品详情接口,开发者和商家可获取商品标题、价格、库存、描述、图片、用户评价等详细信息,助力市场竞争分析、商品优化及库存管理。接口采用 HTTP GET 请求,返回 JSON 格式的响应数据,支持 Python 等语言调用。应用场景包括竞品分析、价格趋势研究、用户评价分析及电商应用开发,为企业决策和用户体验提升提供有力支持。
49 21
|
4天前
|
数据采集 JSON 监控
速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)
以下是使用 Python 调用速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)的代码示例。该示例包含准备基础参数、生成签名、发送请求和处理响应等关键步骤,并附有详细注释说明。代码展示了如何通过公共参数和业务参数构建请求,使用 HMAC-SHA256 加密生成签名,确保请求的安全性。最后,解析 JSON 响应并输出商品信息。此接口适用于商品监控、数据采集与分析及商品推荐等场景。注意需通过 OAuth2.0 获取 `access_token`,并根据官方文档调整参数和频率限制。
|
5天前
|
存储 搜索推荐 API
淘宝拍立淘按图搜索API接口系列概述
淘宝拍立淘按图搜索API接口允许用户通过上传图片或拍摄实物来搜索相似或相同的商品。这一功能主要依赖于图像识别技术,系统会对上传的图片进行分析和处理,提取出商品的特征信息,并在淘宝的商品数据库中进行匹配搜索,最终返回与上传图片相似或相同的商品列表。
|
4天前
|
JSON 监控 API
速卖通商品列表接口(速卖通API系列)
速卖通提供商品列表API,开发者可通过关键词、类目、价格范围等条件获取商品标题、价格、销量等基本信息。使用前需注册开发者账号、创建应用并授权获取access_token。Python示例代码展示了如何调用接口,返回JSON格式数据,包含商品列表、总数、页码等信息。应用场景包括商品监控、数据分析和个性化推荐。注意API会更新,请参考官方文档。
|
5天前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
27 5
|
8天前
|
JSON 监控 API
虾皮(shopee)商品列表接口(虾皮API 系列)
虾皮(Shopee)是东南亚及台湾地区的知名电商平台,提供丰富的商品数据。通过其API接口,开发者可合法获取商品列表信息,包括商品ID、名称、价格等,支持按分类、关键词、价格范围等条件筛选。Python示例代码展示了如何使用API进行请求,并解析返回的JSON数据。应用场景涵盖市场调研、竞品分析、选品决策、价格监控及数据可视化,帮助电商从业者和分析师更好地理解市场动态,优化运营策略。
|
6天前
|
JSON API 数据安全/隐私保护
虾皮(shopee)商品详情接口(虾皮 API 系列)
Shopee 商品详情接口(item_get)用于获取商品的标题、价格、描述、库存和图片等详细信息。开发者需使用 Shopee 提供的 API 密钥进行认证,通过 GET 请求访问指定 URL。请求参数包括 partner_id、shopid、itemid、timestamp 和 sign。签名生成需按字母顺序排序参数,拼接后与 API 密钥进行 HMAC-SHA256 加密。响应为 JSON 格式,包含商品详细信息及错误提示。注意妥善保管 API 密钥,并遵守请求频率限制。

热门文章

最新文章

推荐镜像

更多