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. ruby学习-字符串

    字符串 1.创建字符1:new用来创建新字符,empty?检验字符是否为空 title = String.new #=> "" title.empty? #=>true ...

  2. 《剑指offer》-和为S的正整数序列

    双指针问题.似曾相识. /* 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括 ...

  3. Ext.js项目(二)

    人事管理模块: 1.机构管理 2.部门管理 3.人员管理 一:用例图

  4. 异构平台同步(mysql-->oracle)

    https://www.cnblogs.com/andy6/p/6159060.html

  5. python小知识-__call__和类装饰器的结合使用,数据描述符__get__\__set__\__delete__(描述符类是Python中一种用于储存类属性值的对象)

    class Decorator(): def __init__(self, f): print('run in init......') self.f = f def __call__(self, a ...

  6. Sea Battle CodeForces - 729D

    题意: 有n个格子,a条船,每条船占b个格子.事先已经射击了k个格子,且这k次射击不会射到船上,求再射击几次可以射到某一条船的某一部分 思路: 观察样例可以发现,如果五个0,船的长度是3,那么这五个0 ...

  7. 《Gradle权威指南》--Android Gradle插件

    No1: Android Gradle插件分类 App插件id:com.android.application Library插件id:com.android.library Test插件id:com ...

  8. QT学习之第一个程序

    QT学习之第一个程序 目录 手动创建主窗口 居中显示 添加窗口图标 显示提示文本 Message Box的应用 手动连接信号与槽 手动创建主窗口 窗口类型 QMainWindow: 可以包含菜单栏.工 ...

  9. python模块——PrettyTable

    python模块——PrettyTable 一. 简介 Python通过prettytable模块将输出内容如表格方式整齐输出,可用来生成美观的ASCII格式的表格,十分实用. python本身并不内 ...

  10. centos6.8 yum安装mysql 5.6 (完整)

    一.检查系统是否安装其他版本的MYSQL数据 #yum list installed | grep mysql #yum -y remove mysql-libs.x86_64 二.安装及配置 # w ...