0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ROS开发技术的twist_mux功能包的原理和使用方法,灵活使用锁配置

ml8z_IV_Technol 来源:未知 作者:易水寒 2018-05-13 09:21 次阅读

twist_mux的原理类似于RTOS中的任务调度,需要为每个输入的话题设置优先级,不同话题也可以设置为同样的优先级,但是并不推荐这样做。除了优先级机制外,twist_mux还可以根据超时限制、外部锁话题(lock topics)来限制输入话题的选择。

我们在做机器人ROS开发时,常常会遇到相同速度控制消息的选择问题。比如说控制机器人移动的geometry_msgs::Twist消息,可以使用键盘节点发布,可以使用手柄节点发布,也可以在导航过程中由movebase发布,那么这些节点同时运行时,多个节点发布相同的速度控制话题,这个时候机器人就迷茫了,到底该听谁的呢?只能收到哪个数据就听谁的。

针对这样的问题,ROS提供了一种mux多路切换器——twist_mux,可以帮助我们切换到希望接收的数据源上。

— 原理—

正如我们开篇描述的场景,当机器人接收到不同节点发布的速度控制消息时,该如何进行选择呢?

回想一下RTOS中的任务调度原则,每个任务都有自己的优先级,当有多个任务进入等待状态时,系统会选择优先级最高的任务执行,很多系统还支持同等优先级的任务,此时系统会按照时间片轮询的方式执行任务,也就是不偏不倚,平等对待相同优先级的任务。

twist_mux的原理类似于RTOS中的任务调度,需要为每个输入的话题设置优先级,不同话题也可以设置为同样的优先级,但是并不推荐这样做。

除了优先级机制外,twist_mux还可以根据超时限制、外部锁话题(lock topics)来限制输入话题的选择。

twist_mux功能包中的核心节点就是twist_mux,其输入、输出如下:

ROS开发技术的twist_mux功能包的原理和使用方法,灵活使用锁配置

左侧输入的是多个geometry_msgs::Twist类型的话题,通过twist_mux的选择后,输出唯一的geometry_msgs::Twist话题。下方输入的话题就是用户动态配置选择机制的锁话题,话题的消息类型是Bool,正如锁一样,只有打开和关闭两种状态。

这里锁的概念可以理解为:通过限制不同优先级的输入源,达到控制输出的效果。

— 配置—

twist_mux功能包的安装一句话就可以搞定:

sudo apt-getinstallros-indigo-twist-mux

然后就可以运行多路切换器了:

roslaunchtwist_muxtwist_mux.launch

打印当前的话题列表可以看到:

ROS开发技术的twist_mux功能包的原理和使用方法,灵活使用锁配置

再来看一下twist_mux.launch文件里边到底干了啥:

可以看到,在launch文件中配置了一些话题名参数,在启动twist_mux节点的过程中还加载了两个配置文件,twist_mux_topics.yaml对应的就是输入话题的配置,twist_mux_locks.yaml对应的是锁话题的配置。

1. twist_mux_topics.yaml

#Input topics handled/muxed.#For each topic:#- name : name identifier to select the topic#- topic : input topic of geometry_msgs::Twisttype#- timeout : timeoutinseconds to start discarding old messages, and use 0.0 speed instead#- priority: priorityinthe range [0, 255]; the higher the more priority over other topicstopics:-name : navigationtopic : nav_veltimeout : 0.5priority: 10-name : joysticktopic : joy_veltimeout : 0.5priority: 100-name : keyboardtopic : key_veltimeout : 0.5priority: 90-name : tablettopic : tab_veltimeout : 0.5priority: 100

该配置文件中包含了一个输入话题的配置列表,每个输入话题的配置项包含以下几个:

name:一个用户可读的命名,不是话题名,只用于调试显示;

topic:话题名,话题必须是geometry_msgs::Twist类型;

timeout:消息允许的超时限制,超过此时间仍然没有数据后,会切换到其他输入话题上,如果设置为0的话,相当于没有限制,会无限等待;

priority:输入话题的优先级,0~255之间,值越大优先级越高

2. twist_mux_locks.yaml

#Locks to stop the twist inputs.#For each lock:#- topic : input topic that provides the lock; it must be oftypestd_msgs::Bool?!!!#- timeout : == 0.0 -> not used# > 0.0 -> the lock is supposed to published at a certain frequencyinorder# to detect that the publisher is alive; the timeoutinseconds allows# to detect that, andifthe publisher dies we willenablethe lock#- priority: priorityinthe range [0, 255], so all the topics with priority lower than it# will be stopped/disabledlocks:-name : pausetopic : pause_navigationtimeout : 0.0#Same priority as joystick control, so it'll not block it.priority: 100-name : loop_closuretopic : stop_closing_looptimeout : 0.0priority: 200-name : joysticktopic : joy_prioritytimeout : 0.0priority: 100

关于锁话题的配置也是一个列表,每一个子项都是一个锁话题的配置,配置项包含以下几个:

name:一个用户可读的命名,不是话题名,只用于调试显示;

topic:锁话题名,消息类型必须是std_msgs::Bool类型;

timeout:锁话题需要按周期发布,所以超过时间限制后,会认为发布锁的节点掉线了,锁失效,类似于看门狗的功能;如果设置为0的话,则没有超时限制,持续有效;

priority:限制输入话题的优先级,0~255之间,在此值以下优先级的话题,会被上锁,开锁之前无法输出,以达到动态控制输出的效果。

— 实践—

现在我们就来通过实践验证一下twist_mux的效果。

首先启动twist_mux节点:

roslaunchtwist_muxtwist_mux.launch

然后监听最终输出的速度控制消息:

rostopicecho/twist_mux/cmd_vel

1. 多输入源的选择

目前还没有任何输入,所以还不会有输出的消息。

接着我们就可以发布几个输入的消息了,先发布一个导航输出的速度消息:

rostopic pub -r10/nav_vel geometry_msgs/Twist"linear:x:1.0y:0.0z:0.0angular:x:0.0y:0.0z:0.0"

成功发布之后,输出监听并没有任何输出,这是因为在锁消息中,我们设置的最小优先级是100,而nav_vel的优先级在配置文件中设置的是10,自然被挡到了门外,没办法输出。

再来发布joy_vel消息:

rostopic pub -r10/joy_vel geometry_msgs/Twist"linear:x:2.0y:0.0z:0.0angular:x:0.0y:0.0z:0.0"

很快就可以在输出监听的终端中看到如下图所示的joy_vel的消息了:

ROS开发技术的twist_mux功能包的原理和使用方法,灵活使用锁配置

此时有nav_vel和joy_vel两个输入消息,经过twist_mux的选择后,只输出了joy_vel消息。

那么如果我们想要输出nav_vel怎么办呢?

在nav_vel和joy_vel两个消息保持发布的状态下,重新打开一个窗口,关闭优先级门槛的限制:

rostopicpub /joy_priority std_msgs/Bool"data: false"

此时如果joy_vel消息停止或者超时的话,twist_mux就会自动切换到nav_vel输出,我们可以直接kiil掉joy_vel的话题发布,输出监听的终端就会显示nav_vel消息的数据了:

ROS开发技术的twist_mux功能包的原理和使用方法,灵活使用锁配置

2. 停止某优先级以下的输入源

如果我们想要暂停输出,怎么办呢?锁消息中也设置了暂停nav_vel的话题:

rostopicpub /pause_navigation std_msgs/Bool"data: true"

现在nav_vel话题就暂停了,想要恢复的话,只需要再发布一次pause_navigation消息即可:

rostopicpub /pause_navigation std_msgs/Bool"data: false"

需要注意的是,/pause_navigation话题设置的优先级和joy_priority是一样的,所以这里的暂停无法暂停优先级100及以上的话题,所以并不会影响joy_vel消息的转发。

我们还在锁配置中设置了一个优先级为200的控制锁,一旦我们生效这个锁,优先级200以下的话题都会停止转发:

rostopicpub /stop_closing_loop std_msgs/Bool"data: true"

现在所有话题都无法通过twist_mux输出了。

OK,现在我们应该已经明白了twist_mux功能包的原理和使用方法,灵活使用锁配置,可以让我们轻松控制多个输入源的切换。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118800
  • Mux
    Mux
    +关注

    关注

    0

    文章

    37

    浏览量

    23223
  • ROS
    ROS
    +关注

    关注

    1

    文章

    271

    浏览量

    16684

原文标题:ROS技术之—— twist_mux多路切换器

文章出处:【微信号:IV_Technology,微信公众号:智车科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    电脑键盘功能使用方法简介

    `电脑键盘功能使用方法简介一、功能简介: 本程序为电脑键盘按键锁定工具。用户可以有选择地锁定或解锁电脑键盘上的某些按键。二、注意事项: 1、用户自行设置的程序密码请务必牢记,否则将
    发表于 12-30 15:04

    MQTT软件配置参数和使用方法

    MQTT使用说明MQTT软件配置参数和使用方法
    发表于 03-30 08:10

    ROS navigation功能添加自定义的全局路径规划器(Global Path Planner)

    ROS 的navigation官方功能提供了三种全局路径规划器:carrot_planner、global_planner、navfn。我们通常使用的是navfn,如果机器人执行一些特殊任务而
    发表于 05-16 19:17

    STM32与ArduinoMega2560驱动ROS小车有何不同

    STM32电机驱动ROS小车的通信原理及使用方法分别是什么?ArduinoMega2560电机驱动ROS小车的通信原理及使用方法分别是什么?
    发表于 02-10 07:28

    如何在ROS上使用serial进行串口通信

    如何在ROS上使用其提供的serial进行串口通信。我的环境介绍:PC:使用的是Ubuntu 16-04 ROS-Kinetic嵌入式端:STM32F071ROS机器人操作系统是用于
    发表于 02-21 07:27

    zFTP软件的位置打开与使用方法介绍

    zFTP软件实现了一个FTP客户端功能,使用此软件可以实现从FTP服务器上面下载或上传文件。软件的开源仓库:zFTP,同时软件已经加
    发表于 06-01 11:28

    基于RT-Thread操作系统env开发工具的使用方法

    git添加到系统环境变量。软件包管理功能需要 git 的支持。注意在工作环境中,所有的路径都不可以有中文字符或者空格。2、env 的使用方法2.1 打开 env 控制台RT-Thread 软件环境
    发表于 07-13 10:49

    通过将小车接入MicroROS完成了一个遥控小车的开发

    teleop_twist_keyboard teleop_twist_keyboard  接着按下入JKL,几个按键,看一下小车是否动了起来。  四、总结  本节我们通过将小车接入MicroROS完成了一个遥控小车的开发。 原
    发表于 03-27 16:48

    嵌入式VxWorks网络协议栈的Mutiplexer接口及其使用方法

    嵌入式系统网络协议栈的灵活性在应用上是一个重要指标。介绍嵌入式实时操作系统VxWorks网络协议栈的MUX(Mutiplexer)接口及其使用方法
    发表于 04-09 10:00 10次下载

    在FPGA中配置PLL的步骤及使用方法

    在FPGA中配置PLL的步骤及使用方法
    发表于 05-28 10:01 21次下载

    交换机最基本的配置使用方法

    交换机最基本的配置使用方法
    的头像 发表于 01-04 11:34 5432次阅读

    ROS中如何设置消息信息

    设置消息信息 ROS 消息是结构。可以直接复制它们以生成新的消息。副本和原始消息都有自己的数据。创建一条类型为geometry_msgs/Twist的消息。 twist = rosmessage
    的头像 发表于 11-15 14:55 140次阅读
    <b class='flag-5'>ROS</b>中如何设置消息信息

    ROS的扩展有哪些方法

    也是毫不夸张的。 ROS的扩展即ROS universe,是全球范围的代码,有不同国家的ROS社区组织开发和维护。 有的是库代码,如OpenCV、PCL等;库的上一层是从
    的头像 发表于 11-21 18:12 355次阅读

    如何配置ROS驱动功能

    配置ROS驱动功能包 将WHEELTEC 100N的 ROS_SDK 保存在工作空间的src文件夹下。 通过 catkin_make 进行编译。 刚装的
    的头像 发表于 11-22 18:13 584次阅读
    如何<b class='flag-5'>配置</b><b class='flag-5'>ROS</b>驱动<b class='flag-5'>功能</b>包

    在TogetherROS中如何安装ROS2功能

    安装ROS2功能包 接下来,还有一个很重要的配置,那就是安装ROS2功能包,我们说TogetherROS是基于
    的头像 发表于 12-01 16:02 461次阅读
    在TogetherROS中如何安装<b class='flag-5'>ROS</b>2<b class='flag-5'>功能</b>包