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控制系统例子
- 图示控制系统:
- 有多个程序,要想控制Kobuki的运动,多路复用器允许平行使用所有这些命令。
- 示例多路复用器优先级配置,可能如下:
- 3 (highest priority): safety controller (安全控制)
- 2: keyboard teleop (键盘遥控)
- 1: android teleop (Android 遥控)
- 0 (lowest priority): navi stack teleop (导航包遥控)
- 在一般情况下,大部分时间都是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,轮子停止转动。
总结
- 请遵循控制系统的概念,设计自己的控制器。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号