使用yocs_cmd_vel_mux进行机器人速度控制切换
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进行机器人速度控制切换的更多相关文章
- 使用yocs_velocity_smoother对机器人速度进行限制
yocs_velocity_smoother是一个速度.加速度限制器,用来防止robot navigation的速度/转速过快,加速度/快减速过大.Bound incoming velocity me ...
- Android Studio安装配置、环境搭建详细步骤及基本使用
前言 Android Studio的安装配置及使用篇终于来啦~ 废话不多说,以下针对JDK正确安装(及其环境变量配置完毕,即Java开发环境下).Android Studio的安装,配置,以及创建工程 ...
- 设计模式之 面向对象的养猪厂的故事,C#演示(二)
(三) 优先使用聚合,而不是继承 有一段时间,养猪场的老板雇用了清洁工人来打扫猪舍.但有一天,老板忽然对自己说"不对啊,既然我有机器人,为什么还要雇人来做这件事情?应该让机器人来打扫宿舍!& ...
- AI案例
https://www.bilibili.com/read/cv830627 到底什么是人工智能?人工智能能做什么?这是大家最关心的问题,但说到真正能够理解的话,还是只小部分专业人士.这篇文章 ...
- Android之智能问答机器人
本文主要利用图灵机器人的接口,所做的一个简单的智能问答机器人 实现 由于发送与接收消息都是不同的listView,所以要用有两个listVeiw的布局文件 接收消息布局文件 <?xml vers ...
- jquery 仿手机屏幕切换界面效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 网站繁简切换的JS遇到的一个BUG
公司打算进入台湾市场,最近开发了繁体版本的网站,数据库里的信息全是简体,除了网页上固定的文字手动翻译了,文章内容标题都不是繁体. 于是在网上找了一段比较流行的繁简切换的JS实现了,不过后来却发现,有些 ...
- 解决Activity启动黑屏和设置android:windowIsTranslucent不兼容activity切换动画的问题
在该项目中遇到开Activity之后,黑屏问题,解决的办法是在网上通过设置发现theme和style特性,可以实现. http://www.cnblogs.com/sunzn/p/3407078.ht ...
- vue-miniQQ——基于Vue2实现的仿手机QQ单页面应用(接入了聊天机器人,能够进行正常对话)
使用Vue2进行的仿手机QQ的webapp的制作,作品由个人独立开发,源码中进行了详细的注释. 由于自己也是初学Vue2,所以注释写的不够精简,请见谅. 项目地址 https://github.com ...
随机推荐
- 2018-2019-2 网络对抗技术 20165333 Exp4 恶意代码分析
2018-2019-2 网络对抗技术 20165333 Exp4 恶意代码分析 原理与实践说明 1.实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析Exp2或E ...
- [SDOI2012]拯救小云公主
题解: 是一个不错的题目 首先我们可以考虑二分答案 然后变成判定性问题 对于每个画一个圆 当其会被阻断时就是答案 阻断有四种情况 左下 上下 左右 右上 但是这样是n^2a(n)*logn的 考虑直接 ...
- C# Winform OpenFileDialog 控件
OpenFileDialog控件又称打开文件对话框,主要用来弹出Windows中标准的[打开文件]对话框. OpenFileDialog控件的常用属性如下. (1)Title属性:用来获取或设置对话框 ...
- mac 回车键、空格键失灵(非物理原因)解决方法
1.关机2.按住shift+control+option+开关机键,大概10秒左右,观察键盘电源灯是否变色,确定是否硬件故障,不变色表正常.3.先按下开关机键后,放开.然后同时按住option+com ...
- HDU 5391 Zball in Tina Town【威尔逊定理】
<题目链接> Zball in Tina Town Problem Description Tina Town is a friendly place. People there care ...
- NDK官方下载链接
注:本文转载于成江海:<Android各个版本的NDK官方下载链接 > NDK官方网站:https://developer.android.google.cn/ndk/downloads/ ...
- C#并行编程(1):理解并行
什么是并行 并行是指两个或者多个事件在同一时刻发生. 在程序运行中,并行指多个CPU核心同时执行不同的任务:对于单核心CPU,严格来说是没有程序并行的.并行是为了提高任务执行效率,更快的获取结果. 与 ...
- hashCode方法的作用?
(1)前言,想要明白hashCode的作用,你必须要先知道Java中的集合. Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重复 ...
- bzoj4337: BJOI2015 树的同构 树哈希判同构
题目链接 bzoj4337: BJOI2015 树的同构 题解 树哈希的一种方法 对于每各节点的哈希值为hash[x] = hash[sonk[x]] * p[k]; p为素数表 代码 #includ ...
- HDU.1848.Fibonacci again and again(博弈论 Nim)
题目链接 //求三堆石子的SG函数,异或起来就是整个游戏的SG值 #include <cstdio> #include <cstring> const int N=1005; ...