0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ROS開發(fā)技術(shù)的twist_mux功能包的原理和使用方法,靈活使用鎖配置

ml8z_IV_Technol ? 來源:未知 ? 作者:易水寒 ? 2018-05-13 09:21 ? 次閱讀

twist_mux的原理類似于RTOS中的任務(wù)調(diào)度,需要為每個(gè)輸入的話題設(shè)置優(yōu)先級(jí),不同話題也可以設(shè)置為同樣的優(yōu)先級(jí),但是并不推薦這樣做。除了優(yōu)先級(jí)機(jī)制外,twist_mux還可以根據(jù)超時(shí)限制、外部鎖話題(lock topics)來限制輸入話題的選擇。

我們?cè)谧?a target="_blank">機(jī)器人ROS開發(fā)時(shí),常常會(huì)遇到相同速度控制消息的選擇問題。比如說控制機(jī)器人移動(dòng)的geometry_msgs::Twist消息,可以使用鍵盤節(jié)點(diǎn)發(fā)布,可以使用手柄節(jié)點(diǎn)發(fā)布,也可以在導(dǎo)航過程中由movebase發(fā)布,那么這些節(jié)點(diǎn)同時(shí)運(yùn)行時(shí),多個(gè)節(jié)點(diǎn)發(fā)布相同的速度控制話題,這個(gè)時(shí)候機(jī)器人就迷茫了,到底該聽誰的呢?只能收到哪個(gè)數(shù)據(jù)就聽誰的。

針對(duì)這樣的問題,ROS提供了一種mux多路切換器——twist_mux,可以幫助我們切換到希望接收的數(shù)據(jù)源上。

— 原理—

正如我們開篇描述的場(chǎng)景,當(dāng)機(jī)器人接收到不同節(jié)點(diǎn)發(fā)布的速度控制消息時(shí),該如何進(jìn)行選擇呢?

回想一下RTOS中的任務(wù)調(diào)度原則,每個(gè)任務(wù)都有自己的優(yōu)先級(jí),當(dāng)有多個(gè)任務(wù)進(jìn)入等待狀態(tài)時(shí),系統(tǒng)會(huì)選擇優(yōu)先級(jí)最高的任務(wù)執(zhí)行,很多系統(tǒng)還支持同等優(yōu)先級(jí)的任務(wù),此時(shí)系統(tǒng)會(huì)按照時(shí)間片輪詢的方式執(zhí)行任務(wù),也就是不偏不倚,平等對(duì)待相同優(yōu)先級(jí)的任務(wù)。

twist_mux的原理類似于RTOS中的任務(wù)調(diào)度,需要為每個(gè)輸入的話題設(shè)置優(yōu)先級(jí),不同話題也可以設(shè)置為同樣的優(yōu)先級(jí),但是并不推薦這樣做。

除了優(yōu)先級(jí)機(jī)制外,twist_mux還可以根據(jù)超時(shí)限制、外部鎖話題(lock topics)來限制輸入話題的選擇。

twist_mux功能包中的核心節(jié)點(diǎn)就是twist_mux,其輸入、輸出如下:

ROS開發(fā)技術(shù)的twist_mux功能包的原理和使用方法,靈活使用鎖配置

左側(cè)輸入的是多個(gè)geometry_msgs::Twist類型的話題,通過twist_mux的選擇后,輸出唯一的geometry_msgs::Twist話題。下方輸入的話題就是用戶動(dòng)態(tài)配置選擇機(jī)制的鎖話題,話題的消息類型是Bool,正如鎖一樣,只有打開和關(guān)閉兩種狀態(tài)。

這里鎖的概念可以理解為:通過限制不同優(yōu)先級(jí)的輸入源,達(dá)到控制輸出的效果。

— 配置—

twist_mux功能包的安裝一句話就可以搞定:

sudo apt-getinstallros-indigo-twist-mux

然后就可以運(yùn)行多路切換器了:

roslaunchtwist_muxtwist_mux.launch

打印當(dāng)前的話題列表可以看到:

ROS開發(fā)技術(shù)的twist_mux功能包的原理和使用方法,靈活使用鎖配置

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

可以看到,在launch文件中配置了一些話題名參數(shù),在啟動(dòng)twist_mux節(jié)點(diǎn)的過程中還加載了兩個(gè)配置文件,twist_mux_topics.yaml對(duì)應(yīng)的就是輸入話題的配置,twist_mux_locks.yaml對(duì)應(yīng)的是鎖話題的配置。

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

該配置文件中包含了一個(gè)輸入話題的配置列表,每個(gè)輸入話題的配置項(xiàng)包含以下幾個(gè):

name:一個(gè)用戶可讀的命名,不是話題名,只用于調(diào)試顯示;

topic:話題名,話題必須是geometry_msgs::Twist類型;

timeout:消息允許的超時(shí)限制,超過此時(shí)間仍然沒有數(shù)據(jù)后,會(huì)切換到其他輸入話題上,如果設(shè)置為0的話,相當(dāng)于沒有限制,會(huì)無限等待;

priority:輸入話題的優(yōu)先級(jí),0~255之間,值越大優(yōu)先級(jí)越高

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

關(guān)于鎖話題的配置也是一個(gè)列表,每一個(gè)子項(xiàng)都是一個(gè)鎖話題的配置,配置項(xiàng)包含以下幾個(gè):

name:一個(gè)用戶可讀的命名,不是話題名,只用于調(diào)試顯示;

topic:鎖話題名,消息類型必須是std_msgs::Bool類型;

timeout:鎖話題需要按周期發(fā)布,所以超過時(shí)間限制后,會(huì)認(rèn)為發(fā)布鎖的節(jié)點(diǎn)掉線了,鎖失效,類似于看門狗的功能;如果設(shè)置為0的話,則沒有超時(shí)限制,持續(xù)有效;

priority:限制輸入話題的優(yōu)先級(jí),0~255之間,在此值以下優(yōu)先級(jí)的話題,會(huì)被上鎖,開鎖之前無法輸出,以達(dá)到動(dòng)態(tài)控制輸出的效果。

— 實(shí)踐—

現(xiàn)在我們就來通過實(shí)踐驗(yàn)證一下twist_mux的效果。

首先啟動(dòng)twist_mux節(jié)點(diǎn):

roslaunchtwist_muxtwist_mux.launch

然后監(jiān)聽最終輸出的速度控制消息:

rostopicecho/twist_mux/cmd_vel

1. 多輸入源的選擇

目前還沒有任何輸入,所以還不會(huì)有輸出的消息。

接著我們就可以發(fā)布幾個(gè)輸入的消息了,先發(fā)布一個(gè)導(dǎo)航輸出的速度消息:

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

成功發(fā)布之后,輸出監(jiān)聽并沒有任何輸出,這是因?yàn)樵阪i消息中,我們?cè)O(shè)置的最小優(yōu)先級(jí)是100,而nav_vel的優(yōu)先級(jí)在配置文件中設(shè)置的是10,自然被擋到了門外,沒辦法輸出。

再來發(fā)布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"

很快就可以在輸出監(jiān)聽的終端中看到如下圖所示的joy_vel的消息了:

ROS開發(fā)技術(shù)的twist_mux功能包的原理和使用方法,靈活使用鎖配置

此時(shí)有nav_vel和joy_vel兩個(gè)輸入消息,經(jīng)過twist_mux的選擇后,只輸出了joy_vel消息。

那么如果我們想要輸出nav_vel怎么辦呢?

在nav_vel和joy_vel兩個(gè)消息保持發(fā)布的狀態(tài)下,重新打開一個(gè)窗口,關(guān)閉優(yōu)先級(jí)門檻的限制:

rostopicpub /joy_priority std_msgs/Bool"data: false"

此時(shí)如果joy_vel消息停止或者超時(shí)的話,twist_mux就會(huì)自動(dòng)切換到nav_vel輸出,我們可以直接kiil掉joy_vel的話題發(fā)布,輸出監(jiān)聽的終端就會(huì)顯示nav_vel消息的數(shù)據(jù)了:

ROS開發(fā)技術(shù)的twist_mux功能包的原理和使用方法,靈活使用鎖配置

2. 停止某優(yōu)先級(jí)以下的輸入源

如果我們想要暫停輸出,怎么辦呢?鎖消息中也設(shè)置了暫停nav_vel的話題:

rostopicpub /pause_navigation std_msgs/Bool"data: true"

現(xiàn)在nav_vel話題就暫停了,想要恢復(fù)的話,只需要再發(fā)布一次pause_navigation消息即可:

rostopicpub /pause_navigation std_msgs/Bool"data: false"

需要注意的是,/pause_navigation話題設(shè)置的優(yōu)先級(jí)和joy_priority是一樣的,所以這里的暫停無法暫停優(yōu)先級(jí)100及以上的話題,所以并不會(huì)影響joy_vel消息的轉(zhuǎn)發(fā)。

我們還在鎖配置中設(shè)置了一個(gè)優(yōu)先級(jí)為200的控制鎖,一旦我們生效這個(gè)鎖,優(yōu)先級(jí)200以下的話題都會(huì)停止轉(zhuǎn)發(fā):

rostopicpub /stop_closing_loop std_msgs/Bool"data: true"

現(xiàn)在所有話題都無法通過twist_mux輸出了。

OK,現(xiàn)在我們應(yīng)該已經(jīng)明白了twist_mux功能包的原理和使用方法,靈活使用鎖配置,可以讓我們輕松控制多個(gè)輸入源的切換。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • RTOS
    +關(guān)注

    關(guān)注

    20

    文章

    804

    瀏覽量

    119117
  • Mux
    Mux
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    23308
  • ROS
    ROS
    +關(guān)注

    關(guān)注

    1

    文章

    276

    瀏覽量

    16888

原文標(biāo)題:ROS技術(shù)之—— twist_mux多路切換器

文章出處:【微信號(hào):IV_Technology,微信公眾號(hào):智車科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    電腦鍵盤功能使用方法簡介

    `電腦鍵盤功能使用方法簡介一、功能簡介: 本程序?yàn)殡娔X鍵盤按鍵鎖定工具。用戶可以有選擇地鎖定或解鎖電腦鍵盤上的某些按鍵。二、注意事項(xiàng): 1、用戶自行設(shè)置的程序密碼請(qǐng)務(wù)必牢記,否則將
    發(fā)表于 12-30 15:04

    MQTT軟件配置參數(shù)和使用方法

    MQTT使用說明MQTT軟件配置參數(shù)和使用方法
    發(fā)表于 03-30 08:10

    ROS navigation功能添加自定義的全局路徑規(guī)劃器(Global Path Planner)

    ROS 的navigation官方功能提供了三種全局路徑規(guī)劃器:carrot_planner、global_planner、navfn。我們通常使用的是navfn,如果機(jī)器人執(zhí)行一些特殊任務(wù)而
    發(fā)表于 05-16 19:17

    zFTP軟件的位置打開與使用方法介紹

    zFTP軟件實(shí)現(xiàn)了一個(gè)FTP客戶端功能,使用此軟件可以實(shí)現(xiàn)從FTP服務(wù)器上面下載或上傳文件。軟件的開源倉庫:zFTP,同時(shí)軟件已經(jīng)加
    發(fā)表于 06-01 11:28

    基于RT-Thread操作系統(tǒng)env開發(fā)工具的使用方法

    git添加到系統(tǒng)環(huán)境變量。軟件包管理功能需要 git 的支持。注意在工作環(huán)境中,所有的路徑都不可以有中文字符或者空格。2、env 的使用方法2.1 打開 env 控制臺(tái)RT-Thread 軟件環(huán)境
    發(fā)表于 07-13 10:49

    通過將小車接入MicroROS完成了一個(gè)遙控小車的開發(fā)

    teleop_twist_keyboard teleop_twist_keyboard  接著按下入JKL,幾個(gè)按鍵,看一下小車是否動(dòng)了起來?! ∷?、總結(jié)  本節(jié)我們通過將小車接入MicroROS完成了一個(gè)遙控小車的開發(fā)。 原
    發(fā)表于 03-27 16:48

    NVIDIA Isaac ROS GEM的功能特性

    NVIDIA Isaac ROS GEM 是一款基于硬件加速的軟件,可以讓 ROS 開發(fā)者更輕松地基于 NVIDIA 硬件構(gòu)建高性能解決方案。
    的頭像 發(fā)表于 08-14 11:12 ?926次閱讀

    交換機(jī)最基本的配置使用方法

    交換機(jī)最基本的配置使用方法
    的頭像 發(fā)表于 01-04 11:34 ?6551次閱讀

    ROS Navigation Stack的整體設(shè)計(jì)思路和功能

    ROS Navigation Stack是ROS提供的一個(gè)二維的導(dǎo)航功能集合,通過輸入里程計(jì)、傳感器信息和目標(biāo)位姿,輸出控制機(jī)器人到達(dá)目標(biāo)狀態(tài)的安全速度指令。
    的頭像 發(fā)表于 02-01 11:20 ?1217次閱讀

    ROS部署PaddlePaddle的CV模型

    paddle_inference_ros_demo功能是基于paddle_inference_ros開發(fā)的,幫助
    的頭像 發(fā)表于 10-20 17:02 ?590次閱讀
    <b class='flag-5'>ROS</b>部署PaddlePaddle的CV模型

    ROS中如何設(shè)置消息信息

    設(shè)置消息信息 ROS 消息是結(jié)構(gòu)。可以直接復(fù)制它們以生成新的消息。副本和原始消息都有自己的數(shù)據(jù)。創(chuàng)建一條類型為geometry_msgs/Twist的消息。 twist = rosmessage
    的頭像 發(fā)表于 11-15 14:55 ?292次閱讀
    <b class='flag-5'>ROS</b>中如何設(shè)置消息信息

    ROS的擴(kuò)展有哪些方法

    也是毫不夸張的。 ROS的擴(kuò)展即ROS universe,是全球范圍的代碼,有不同國家的ROS社區(qū)組織開發(fā)和維護(hù)。 有的是庫代碼,如OpenCV、PCL等;庫的上一層是從
    的頭像 發(fā)表于 11-21 18:12 ?583次閱讀

    如何配置ROS驅(qū)動(dòng)功能

    配置ROS驅(qū)動(dòng)功能 將WHEELTEC 100N的 ROS_SDK 保存在工作空間的src文件夾下。 通過 catkin_make 進(jìn)行編
    的頭像 發(fā)表于 11-22 18:13 ?1017次閱讀
    如何<b class='flag-5'>配置</b><b class='flag-5'>ROS</b>驅(qū)動(dòng)<b class='flag-5'>功能</b><b class='flag-5'>包</b>

    ROS2中自帶例程測(cè)試

    的一個(gè)例程。 和剛才一樣打開兩個(gè)終端,這里我們需要source一下ROS里的環(huán)境變量。 該環(huán)境變量我們剛才已經(jīng)設(shè)置了過軟連接,所以配置過程中它也會(huì)配置ROS2的
    的頭像 發(fā)表于 11-28 16:29 ?732次閱讀
    <b class='flag-5'>ROS</b>2中自帶例程測(cè)試

    在TogetherROS中如何安裝ROS2功能

    安裝ROS2功能 接下來,還有一個(gè)很重要的配置,那就是安裝ROS2功能
    的頭像 發(fā)表于 12-01 16:02 ?772次閱讀
    在TogetherROS中如何安裝<b class='flag-5'>ROS</b>2<b class='flag-5'>功能</b><b class='flag-5'>包</b>