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,轮子停止转动。
总结
请遵循控制系统的概念,设计自己的控制器。
- 本文固定链接: http://www.rosrobot.cn/?id=123
- 转载请注明: znjrobot 于 北京智能佳科技有限公司 发表
《本文》有 0 条评论