首页 > 学习Kobuki入门教程 > Kobuki入门教程-Kobuki控制系统
2019
01-18

Kobuki入门教程-Kobuki控制系统

Kobuki入门教程-Kobuki控制系统

说明

  • 介绍kobuki控制系统的概念

  • 介绍控制系统不同的组件及之间如何交互

介绍Nodelets

  • Nodelets在kobuki控制系统中被大量使用,相比一般的节点有诸多优点。

  • 其最重要的是避免消息在TCP/IP传输中进行序列化和反序列化。

  • 它通过将指针传递给消息而不是消息本身来完成的,这意味着信息更快的处理和传输。

  • 当使用大的消息,如点云,这也可以显着降低了处理器的消耗。

  • 这就是为什么我们实现控制器和Kobuki的控制系统的其他对速度敏感的部分都作为nodelets使用

控制系统概念

  • 组件

    • kobuki_node:(又叫mobile base)实际是一个nodelet,封装了与Kobuki通讯的C++驱动。

    • cmd_vel_mux:是一种速度命令多路复用器(即开关,它根据配置的优先级管理多个传入的速度命令。

    • Kobuki controller:是一个nodelet类型的控制器,能用于各种应用;一个例子是kobuki_safety_controller,监控机器人的保险杠,悬崖和落轮传感器和相应的行为。使用此控制器可实现您自己的控制器。

    • velocity smoother: yocs_velocity_smoother,这个工具是可选的,但高度推荐使用。如果一个节点发布速度命令不能保证其平滑度,在节点和cmd_vel_mux之间增加这个平滑器。

  • 工作原理

    • 上面介绍的三个组件是在一个小层次结构中使用的。

    • 启动自底向上的,有移动的基础,它监听命令(LED,声音,速度),并发布传感器信息。

    • 最重要的是我们用cmd_vel_mux,确保每次只有一个速度命令传送到移动基站。

    • 上层我们有一个或多个控制器和其他程序,如键盘teleop和导航包。

    • 在有些情况下,我们想平稳的速度(例如Keyop)和在某些情况,我们没用safety controller时候就要使用速度平滑。

  • Kobuki控制系统例子

    • 3 (highest priority): safety controller (安全控制)

    • 2: keyboard teleop (键盘遥控)

    • 1: android teleop (Android 遥控)

    • 0 (lowest priority): navi stack teleop (导航包遥控)

    • 图示控制系统:
      请输入图片描述

    • 有多个程序,要想控制Kobuki的运动,多路复用器允许平行使用所有这些命令。

    • 示例多路复用器优先级配置,可能如下:

    • 在一般情况下,大部分时间都是navi包控制机器人。

    • 但是通过Android遥控app或键盘遥控触发命令,可以重写navi包的命令

    • 如果两个都发出命令,那么会优先使用键盘的遥控命令。

    • 当保险杠、悬崖或落轮传感器激活,触发safety controller的命令时,则又会重写上面所有的速度命令。

    • 这样就保证三个工具下能实现安全驾驶。

差的Kobuki控制

  • 通过修改launch文件来增加一个不希望的行为,看会导致什么问题。

  • 差的Kobuki控制,调整kobuki_node/keyop.launch, 引入4个不同的不好的行为:

  • 注释multiplexer,name="cmd_vel_mux"一行的node

[...]
<launch>
<!--   <node pkg="nodelet" type="nodelet" name="cmd_vel_mux" args="load cmd_vel_mux/CmdVelMuxNodelet kobuki"> -->
<!--     <param name="subscribers_cfg_file" value="$(find kobuki_node)/param/keyop_mux.yaml"/> -->
<!--     <remap from="cmd_vel_mux/mux_cmd_vel" to="mobile_base/commands/velocity"/> -->
<!--   </node> -->
[...]
  • 重新映射安全控制的速度命令,为了直接发送命令给移动底盘的nodelet:

[...]
  <node pkg="nodelet" type="nodelet" name="kobuki_safety_controller" args="load kobuki_safety_controller/SafetyControllerNodelet kobuki">
<!--     <remap from="kobuki_safety_controller/cmd_vel" to="cmd_vel_mux/safety_controller"/> -->
    <remap from="kobuki_safety_controller/cmd_vel" to="mobile_base/commands/velocity"/>
[...]
  • 重新映射键盘的速度命令

<node pkg="kobuki_keyop" type="keyop" name="keyop" output="screen">
    <remap from="keyop/enable" to="mobile_base/enable"/>
    <remap from="keyop/disable" to="mobile_base/disable"/>
<!--     <remap from="keyop/cmd_vel" to="cmd_vel_mux/keyboard_teleop"/> -->
    <remap from="keyop/cmd_vel" to="mobile_base/commands/velocity"/>
[...]
  • 查看效果:

#新终端打开
$ roslaunch kobuki_node minimal.launch --screen
#新终端打开
$ roslaunch kobuki_node keyop.launch --screen
  • 首先,让Kobuki开车到障碍物。你会注意到,Kobuki开始颤抖(在障碍物处快速来回移动)。

  • 现在,稍微拎起kobuki。一但防跌落传感器触发,安全控制器将停止Kobuki。你会注意到轮会颤抖和缓慢前行。

  • 上面的行为是由于Kobuki同时接收来自Keyop和安全控制器执行速度指令。

好的Kobuki控制

  • 注释的代码重新开启

  • 你会注意到,现在Kobuki撞到障碍物时,后移动几厘米。另外,当你提起Kobuki,轮子停止转动。

总结

  • 请遵循控制系统的概念,设计自己的控制器。


本文》有 0 条评论

留下一个回复