ROS学习-controller_manager
controller_manager
提供硬实时兼容的环来控制的机械手,由一个hardware_interface::RobotHW
实例代表(参见hardware_interface
包).该controller_manager
提供了加载,卸载,启动和停止控制器的基本结构.
当加载一个控制器时,controller_manager
将使用控制器名作为所有控制器特定参数的root
,最重要的是,type
用于标识要加载哪个插件.
控制器运行的工具(Tools for running controllers
)
控制器管理器提供的与控制器进行交互的基本结构.根据控制器从启动文件,命令行,或者ROS
节点运行,控制管理器提供不同的工具来运行控制器.
命令行工具(Command-line tools
)
控制管理器(controller_manager
)
使用controller_manager
工具与从命令行运行的控制器交互.要与特定的控制器进行交互,可以使用:
1 | $ rosrun controller_manager controller_manager <command> <controller_name> |
以下命令可用:
load : |
加载控制器 (construct and initialize) |
unload : |
卸载控制器 (destruct) |
start : |
启动控制器 |
stop : |
结束控制器 |
spawn : |
加载并启动控制器 |
kill : |
停止并卸载控制器 |
想获得控制器状态, 用:
1 | $ rosrun controller_manager controller_manager <command> |
以下命令可用:
list : |
根据执行顺序,列出所有控制器,并给出每个控制器的状态 |
list-types : |
列出所有控制器管理知道的控制器类型.如果控制器不在此列表中,将无法加载并启动. |
list-joints : |
列出所有控制器管理使用的的关节和驱动器的名称. |
reload-libraries : |
重新加载所有可作为插件的控制器库.当我们正在开发控制器时,可以方便的测试控制器代码,而 不用每次都重新启动机器人. |
reload-libraries --restore : |
重新加载所有可作为插件的的控制器库,并把所有控制器恢复到初始状态. |
加载并启动控制器(spawner
)
为了立刻自动加载并启动一系列控制器以及立刻停止并卸载这些控制器,使用spawner
工具:
1 | $ rosrun controller_manager spawner [--stopped] name1 name2 name3 |
当运行spawner
时,列表中控制器将被载入和启动(除非指定--stopped
). 当控制器已开启(controllers are up
),spawner
将保持运行.当你杀死spawner
进程(CTRL-C
),会自动停止并卸载所有它最开始启动的控制器.
卸载控制器(unspawner
)
想要自动停止一组控制器,然后重新启动,可使用unspawner
工具:
1 | $ rosrun controller_manager unspawner name1 name2 name3 |
列表中的控制器将被停止,但没有卸载.一旦spawner
关闭,该控制器将重新启动.
控制器组(controller_group
)
controller_group
允许开发者在运行时切换控制器,但是出于一些特殊意图,当你想从一组控制器切换到另一组时,这就不是很方便.controller_group
脚本对于那些在ROS parameter controller_groups
已经定义的分组的切换就很容易实现.它知道所有包含的控制器,当它切换控制器组时,控制器需要被停止或者被启动.所以,不同的控制器组可以共享某些控制器.
controller_groups
的一个例子:
1 | controller_groups: |
启动controller_groups
的脚本:
1 | $ rosrun controller_manager controller_group <command> <args> |
以下命令可用:
list : |
列出所有能在controler_groups 参数中找到的组定义 |
spawn <group> : |
载入和启动所有包含在名称为<group> 组内的所有控制器,通常在ROS launch 文件中使用 |
switch <group> : |
切换到<group> 组.这意味着将停止其他组内正在运行的控制器,但是定在在本组内的不会被停止,然后启动在本组内的未运行的控制器器 |
创建启动文件(Creating launch files
)
我们可以运行controller_manager
,从启动文件(launch file
)内启动控制器.然而,即使启动文件被撤下,控制器仍会保持.而spawner
工具会从启动文件中自动加载,启动,停止和卸载控制器.当启动spawner
工具时,它会加载并启动控制器.当你停止spawner
(当启动文件被撤下),它将停止并卸载控制器.启动文件可能如下:
1 | <node pkg="controller_manager" type="spawner" args="controller_name1 controller_name2" /> |
或者,只是想加载控制器,但是还没有启动:
1 | <launch> |
图形工具(Graphical tools)
rqt_controller_manager
是一个rqt
插件,该插件以图形化方式加载,卸载,启动和停止控制器;同时用来显示加载的控制器的信息.
它可以从rqt
的Plugin
菜单中启动,或者通过命令行单独执行:
1 | rosrun rqt_controller_manager rqt_controller_manager |
ROS
应用程序接口(ROS API
)
为了与另一个ROS
节点的控制器交互,控制管理器提供了五种服务调用:
控制管理器 (controller_manager
)
服务(Services)
controller_manager/load_controller (controller_manager_msgs/LoadController)
服务请求包含了要加载的控制器的名字,响应包含了一个表示成功或失败的布尔值.
controller_manager/unload_controller (controller_manager_msgs/UnloadController)
服务请求中包含要卸载的控制器的名称,响应包含了一个表示成功或失败的布尔值.控制器只能在当其处于停止状态的时候被卸载.
controller_manager/switch_controller (controller_manager_msgs/SwitchController)
服务请求包含了要开始的控制器的名称列表,要停止的控制器名称列表和一个表明规范性 (
strictness: BEST_EFFORT or STRICT
)的整型值(int
).STRICT
表示如果出现任何错误(无效的控制器名称,控制器启动失败,etc
),控制器的切换(switching
)将会失败并导致空操作(no-op
).BEST_EFFORT
表示,即使控制器出现了一些问题,该服务仍然会尝试启动/停止余下的控制器.服务响应包含了一个表示成功或失败的布尔值.如果只是停止或者只是启动控制器,控制器启动或停止的列表可能为空.
controller_manager/list_controllers (controller_manager_msgs/ListControllers)
该服务返回所有当前加载的控制器.响应包括以下信息:控制器的名称,状态(运行或停止),类型,硬件接口,和占用的资源.
controller_manager/list_controller_types (controller_manager_msgs/ListControllerTypes)
该服务返回
controller_manager
已知的所有控制器类型.只有已知的控制器类型可以构建.
controller_manager/reload_controller_libraries (controller_manager_msgs/ReloadControllerLibraries)
服务重新加载所有可作为插件的控制器库.当我们正在开发控制器时,无需每次重新启动机器人 就可以方便的测试控制器代码.此服务只在控制器没有加载情况下工作.
Translated by Ms Wang 2014-8-19
Wiki: controller_manager (last edited 2014-03-10 15:22:46 by AdolfoRodriguez)
参考来源:
本文标题:ROS学习-controller_manager
文章作者:xwnb
发布时间:2019-10-26
最后更新:2023-04-17
原始链接:https://xwnb.github.io/posts/1366633795/
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!并保留本声明。感谢您的阅读和支持!
分享