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. String中的toCharArray:将此字符串转换为新的字符数组,并统计次数

    package stringyiwen; public class StringTestToCharArray { public static void main(String[] args) { S ...

  2. 变量 构造函数 New 关键字

    变量:脚本必须暂时地存储一些完成工作所需的信息,可以将这些数据存储在变量中.可将变量看作短暂记忆. 变量可以用来表示脚本代码中随时可能变化的值.通过使用存储在变量中的数据,可以计算出想要的结果. 声明 ...

  3. 使用 Nuget安装DLL

    使用Nuget安装Mysql https://www.nuget.org/packages/MySql.Data 安装NewtonJson https://www.nuget.org/packages ...

  4. Android strings.xml中定义字符串显示空格

    <string name="str">字 符 串</string> 其中   就表示空格.如果直接在里面键入空格,无论多少空格都只会显示一个. 用的XML转 ...

  5. python第三方包安装方法(两种方法)

    具体有以下两种方法: 第一种方法(不使用pip或者easy_install): Step1:在网上找到的需要的包,下载下来.eg. rsa-3.1.4.tar.gz Step2:解压缩该文件. Ste ...

  6. 简易图书管理系统(主要是jsp的练习)

    1:首先设计用户表和图书表,设计的字段和类型如下图所示 1.1:用户表user 1.2:图书表book 2:第二写实体类user.java和book.java package com.bie.po; ...

  7. [Wc]Dface双面棋盘()

    题解: 一道维护奇怪信息的线段树... 我刚开始看了标签想的是删去图上一个点后求连通性 发现不会 于是退化成一般图支持删除 插入 维护连通性 发现有2两种做法 1.lct维护 按照结束顺序先后排序,给 ...

  8. 定制库到maven库

    有一些jar不支持maven,这个时候就可以使用下面的处理方式. kaptcha,它是一个流行的第三方Java库,它被用来生成 “验证码” 的图片,以阻止垃圾邮件,但它不在 Maven 的中央仓库中. ...

  9. work工作消息队列Round-robin与Fair dispatch

    一:介绍 1.模型 有两种情形,分别是轮训分发与公平分发. 2.出现的场景 考虑到simple queue中的缺点. 因为生产者发送消息后,消费者消费要花费时间,这个会造成消息的堆积. 二:Round ...

  10. 匿名函数 lambda

    lambda 参数 :  程序体 1. filter 与匿名函数结合运用 2. map与匿名函数结合运用