cmd_vel_mux包从名字就可以推测出它的用途,即进行速度的选择(In electronics, a multiplexer or mux is a device that selects one of several analog or digital input signals and forwards the selected input into a single line)。这一功能有时候很有用,比如机器人在自主导航时遇到紧急情况要切换到手动控制模式,这时就要将机器人控制权从自主导航的节点切换到方向盘、手柄、键盘、急停开关等控制节点。

  如果有多个节点要想控制机器人的运动,多路复用器(cmd_vel_mux)允许平行使用所有这些命令,并且可以设置优先级,优先级高的会抢占优先级低的任务。例如机器人自主导航时可能会有下面4种优先级的任务(通常将自主行为的优先级设为最低):

  • 3 (highest priority): safety controller (安全控制)
  • 2: keyboard teleop (键盘遥控)
  • 1: android teleop (Android 遥控)
  • 0 (lowest priority): navi stack teleop (导航包自主控制)

  在一般情况下,大部分时间都是navi包控制机器人。但是通过Android遥控app或键盘遥控触发命令,可以覆盖navi包的命令。如果两个都发出命令,那么会优先使用键盘的遥控命令。当碰撞、跌落传感器发出报警信号,触发safety controller的命令时,则又会重写上面所有的速度命令,这样就能保证机器人的自主移动时的安全。

  下载yocs_cmd_vel_mux包的源文件到ROS工作目录的源文件夹中(比如catkin_ws/src),然后使用catkin进行编译。

  先看一下包中的standalone.launch文件。先运行一个名为nodelet_manager的nodelet manager节点,然后加载cmd_vel_mux.launch文件:

<!--
Example standalone launcher for the velocity multiplexer. For best results you would usually load this into the core control system
to avoid latency for reactive controllers. However for other apps, running
it standalone with a similar configuration will also work.
-->
<launch>
<arg name="nodelet_manager_name" value="nodelet_manager"/>
<arg name="config_file" value="$(find yocs_cmd_vel_mux)/param/example.yaml"/> <!-- nodelet manager -->
<node pkg="nodelet" type="nodelet" name="$(arg nodelet_manager_name)" args="manager"/> <!-- velocity mulitplexer -->
<include file="$(find yocs_cmd_vel_mux)/launch/cmd_vel_mux.launch">
<arg name="nodelet_manager_name" value="$(arg nodelet_manager_name)"/>
<arg name="config_file" value="$(arg config_file)"/>
</include>
</launch>

  在cmd_vel_mux.launch中使用nodelet_manager加载yocs_cmd_vel_mux/CmdVelMuxNodelet

<!--
YOCS Velocity Multiplexer launcher
--> <launch>
<arg name="nodelet_manager_name" default="nodelet_manager"/>
<arg name="config_file" default="$(find yocs_cmd_vel_mux)/param/example.yaml"/> <node pkg="nodelet" type="nodelet" name="yocs_cmd_vel_mux"
args="load yocs_cmd_vel_mux/CmdVelMuxNodelet $(arg nodelet_manager_name)">
<param name="yaml_cfg_file" value="$(arg config_file)"/>
</node>
</launch>

  下面是修改的配置文件,有默认、手柄和键盘3种优先级不同的控制方式。优先级从0到MAX_INT,数字越大优先级越高:

# Individual subscriber configuration:
# name: Source name
# topic: The topic that provides cmd_vel messages
# timeout: Time in seconds without incoming messages to consider this topic inactive
# priority: Priority: an UNIQUE unsigned integer from 0 (lowest) to MAX_INT
# short_desc: Short description (optional) subscribers:
- name: "Default input"
topic: "input/default"
timeout: 0.1
priority: 0
short_desc: "The default cmd_vel, controllers unaware that we are multiplexing cmd_vel should come here" - name: "Joystick control"
topic: "input/joystick"
timeout: 0.1
priority: 1 - name: "Keyboard operation"
topic: "input/keyop"
timeout: 0.1
priority: 2 publisher: "output/cmd_vel"

  下面以ROS中的小海龟为例子来展示一下cmd_vel_mux的使用方法。编写一个test.launch文件如下,文件中先开启了cmd_vel_mux,然后运行turtlesim_node节点,最后开启了turtle_teleop_key键盘控制节点:

<launch>
<include file="$(find yocs_cmd_vel_mux)/launch/standalone.launch"/> <node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node" >
<remap from="/turtle1/cmd_vel" to="/yocs_cmd_vel_mux/output/cmd_vel" />
</node> <node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" output="screen">
<remap from="/turtle1/cmd_vel" to="/yocs_cmd_vel_mux/input/keyop" />
</node>
</launch>

  launch文件中将turtlesim_node节点订阅的/turtle1/cmd_vel消息重映射到mux的输出/yocs_cmd_vel_mux/output/cmd_vel上。将turtle_teleop_key发布的消息/turtle1/cmd_vel重映射到mux的输入/yocs_cmd_vel_mux/input/keyop上。要注意launch文件中remap的用法。如果该属性在顶层, 即作为 launch 元素的子元素出现, 重映射将会应用到所有的后续节点。这些重映射元素也可以作为一个节点元素的子元素,如:

<node node-attributes>
<remap from="original-name" to="new-name"/>
</node>

  在这种情况下,给出的重映射只应用于其所在的节点。

  cmd_vel_mux的作用就像一个选择开关,接收多个输入信号,只输出一个结果:

  cmd_vel_mux会发布下面两个消息,分别是输出速度(名称可以在配置文件中更改)和mux的当前选择:

  • output/cmd_vel (geometry_msgs/Twist):Multiplexed output. Incoming velocity commands from the active source are republished on this topic. The topic name is specified on the configuration file.

  • active (std_msgs/String):The active input at each moment, or idle if nobody is commanding the robot. Latched topic

  输入命令roslaunch yocs_cmd_vel_mux  test.launch运行测试文件,然后打开一个新终端输入下面的指令作为默认控制信号:

rostopic pub -r  /yocs_cmd_vel_mux/input/default geometry_msgs/Twist  '{linear:  {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0,y: 0.0,z: 0.5}}'

  使用rostopic echo查看一下mux的输出,可以看到正在执行默认控制指令,小海龟以0.5rad/s的角速度旋转:

  active为:Default input

  接着在turtle_teleop_key的窗口中按下方向键,可以看到小海龟改由键盘控制,active变为Keyboard operation:

  输出速度output/cmd_vel也变为键盘控制的速度:

参考:

yocs_cmd_vel_mux

Kobuki's Control System

ROS nodelet的使用

Kobuki入门教程-Kobuki控制系统

使用yocs_cmd_vel_mux进行机器人速度控制切换的更多相关文章

  1. 使用yocs_velocity_smoother对机器人速度进行限制

    yocs_velocity_smoother是一个速度.加速度限制器,用来防止robot navigation的速度/转速过快,加速度/快减速过大.Bound incoming velocity me ...

  2. Android Studio安装配置、环境搭建详细步骤及基本使用

    前言 Android Studio的安装配置及使用篇终于来啦~ 废话不多说,以下针对JDK正确安装(及其环境变量配置完毕,即Java开发环境下).Android Studio的安装,配置,以及创建工程 ...

  3. 设计模式之 面向对象的养猪厂的故事,C#演示(二)

    (三) 优先使用聚合,而不是继承 有一段时间,养猪场的老板雇用了清洁工人来打扫猪舍.但有一天,老板忽然对自己说"不对啊,既然我有机器人,为什么还要雇人来做这件事情?应该让机器人来打扫宿舍!& ...

  4. AI案例

    https://www.bilibili.com/read/cv830627     到底什么是人工智能?人工智能能做什么?这是大家最关心的问题,但说到真正能够理解的话,还是只小部分专业人士.这篇文章 ...

  5. Android之智能问答机器人

    本文主要利用图灵机器人的接口,所做的一个简单的智能问答机器人 实现 由于发送与接收消息都是不同的listView,所以要用有两个listVeiw的布局文件 接收消息布局文件 <?xml vers ...

  6. jquery 仿手机屏幕切换界面效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 网站繁简切换的JS遇到的一个BUG

    公司打算进入台湾市场,最近开发了繁体版本的网站,数据库里的信息全是简体,除了网页上固定的文字手动翻译了,文章内容标题都不是繁体. 于是在网上找了一段比较流行的繁简切换的JS实现了,不过后来却发现,有些 ...

  8. 解决Activity启动黑屏和设置android:windowIsTranslucent不兼容activity切换动画的问题

    在该项目中遇到开Activity之后,黑屏问题,解决的办法是在网上通过设置发现theme和style特性,可以实现. http://www.cnblogs.com/sunzn/p/3407078.ht ...

  9. vue-miniQQ——基于Vue2实现的仿手机QQ单页面应用(接入了聊天机器人,能够进行正常对话)

    使用Vue2进行的仿手机QQ的webapp的制作,作品由个人独立开发,源码中进行了详细的注释. 由于自己也是初学Vue2,所以注释写的不够精简,请见谅. 项目地址 https://github.com ...

随机推荐

  1. javafx点击鼠标出现弹窗,demo

    在学习javafx的过程中,不知道怎么出现一个弹窗,如,点击一个按钮出现一个修改信息的列表选项 终于在javafx文档示例中发现了类似的东西,记录一下,备忘package demo9_button; ...

  2. ***LANMP镜像手册(Apache&Nginx)-lanmp-oneinstack

    LANMP镜像手册(Apache&Nginx) Version PHP7.0.26  转自:http://docs.websoft9.com/xdocs/lanmp-oneinstack-im ...

  3. 数据流分段下载(Http之 Range)

    public FileStreamResult StreamUploadedSongs(int id) { byte[] song = db.UploadedSongs.Where(x => x ...

  4. 购物车的实现(jsp的session+Java的Map的结合)

    1:电商如此发达的现在,作为一个web开发程序猿,如果不会写购物车,真是有点不好意思找工作.所以抓紧练习啊,从上篇博客中抽离出如何实现购物车的功能. 2:首先需要理解购物车实现的一些基本步骤. 2.1 ...

  5. Python字符串相加以及字符串格式化

    1.在Python中字符串a占用一块内存地址,字符串b也占用一块内存地址,当字符串a+b时,又会在内存空间中开辟一块新的地址用来存放a+b. a 地址一 b 地址二 a+b 地址三 因此内存中就占了三 ...

  6. HDU3336 Count the string KMP 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU3336 题意概括 给T组数据,每组数据给一个长度为n的字符串s.求字符串每个前缀出现的次数和,结果mo ...

  7. 【noip模拟赛7】足球比赛 树

    描述 在2009的中国城市足球比赛中,在2^N支队中,有一些队在开赛前宣布了退出比赛.比赛采取的是淘汰赛.比如有4支队伍参加,那么1队和2队比赛,3队和4队赛,然后1队和2队的胜者与3队和4队的胜者争 ...

  8. Map的知识点梳理(不包含collections工具类)

    一:基础公共方法(map不再是简单的加索引,可以直接命名key,通过key进行遍历) 1.常见的map子类 HashTable:底层是哈希表结构.不允许null键和null值,线程同步 HashMap ...

  9. Scrapy爬虫学习笔记 - windows \ linux下搭建开发环境2

    四.虚拟环境的安装和配置 virtualenv可以搭建虚拟且独立的python运行环境, 使得单个项目的运行环境与其它项目独立起来. virtualenv本质上是个python包 虚拟环境可以将开发环 ...

  10. 数据摘要 MD5

    数据一样,摘要一样  (摘要即MD5) 摘要一样,数据一样 摘要是用于检验数据的完整性的技术(比如验证下载的东西是否完整,迅雷就是这样), 查看文件的MD5: Linux         :  md5 ...