ros/ros_control/controller_manager介绍



ros(robot operation system)机器人操作系统中控制管理器(controller_manager)的介绍.

维基翻译,原文:http://wiki.ros.org/controller_manager?distro=indigo 

controller_manager提供硬实时兼容的环来控制的机械手,由一个hardware_interface::RobotHW实例代表(参见hardware_interface包)。该 controller_manager提供了加载,卸载,启动和停止控制器的基本结构。

 

0. 控制器运行的工具( Tools for running controllers)

 

controller state.png


控制器管理器提供的与控制器进行交互的基本结构。根据控制器从启动文件,命令行,或者ROS节点运行,控制管理器提供不同的工具来运行控制器。 

 

1. 命令行工具( Command-line tools) 

1.1 控制管理器(controller_manager)

使用 controller_manager工具与从命令行运行的控制器交互。要与特定的控制器进行交互,可以使用: 

 

$ rosrun controller_manager controller_manager <command> <controller_name>

 

以下命令可用: 

load:加载控制器 (construct and initialize) 

unload:卸载控制器 (destruct) 

start:启动控制器

stop:结束控制器 

spawn:加载并启动控制器 

kill:停止并卸载控制器

 

想获得控制器状态, 用: 

$ rosrun controller_manager controller_manager <command>

 

 

以下命令可用: 

list:根据执行顺序,列出所有控制器,并给出每个控制器的状态 

list-types:列出所有控制器管理知道的控制器类型。如果控制器不在此列表中,将

无法加载并启动。

list-joints: l列出所有控制器管理使用的的关节和驱动器的名称。

reload-libraries:重新加载所有可作为插件的控制器库。当我们正在开发控制器时,

可以方便的测试控制器代码,而不用每次都重新启动机器人。 

reload-libraries --restore:重新加载所有可作为插件的的控制器库,并把所有控制器

恢复到初始状态。 

1.2 加载并启动控制器(spawner)

为了立刻自动加载并启动一系列控制器以及立刻停止并卸载这些控制器,使用 spawner工具: 

$ rosrun controller_manager spawner [--stopped] name1 name2 name3 

 

当运行 spawner时,列表中控制器将被载入和启动(除非指定 --stopped)。 当控制器已开启(controllers are up),spawner将保持运行。当你杀死 spawner进程(CTRL-C),会自动停止并卸载所有它最开始启动的控制器。 

 

1.3 卸载控制器(unspawner)

想要自动停止一组控制器,然后重新启动,可使用 unspawner工具: 

 

$ rosrun controller_manager unspawner name1 name2 name3

 

列表中的控制器将被停止,但没有卸载。一旦 spawner关闭,该控制器将重新启动。 

 

2. 创建启动文件( Creating launch files)

我们可以运行 controller_manager,从启动文件(launch file)内启动控制器。然而,即使启动文件被撤下,控制器仍会保持。而 spawner工具会从启动文件中自动加载,启动,停止和卸载控制器。当启动 spawn工具时,它会加载并启动控制器。当你停止 spawner(当启动文件被撤下),它将停止并卸载控制器。启动文件可能如下: 

 

<launch> 

<node pkg="controller_manager" 

type="spawner" 

args="controller_name1 controller_name2" /> 

</launch>

 

或者,只是想加载控制器,但是还没有启动: 

 

<launch> 

 

<node pkg="controller_manager" 

 

type="spawner" 

 

args="--stopped controller_name1 controller_name2" /> 

</launch> 

 

3. 图形工具( Graphical tools) 

rqt_controller_manager是一个 rqt插件,该插件以图形化方式加载,卸载,启动和停止控制器;同时用来显示加载的控制器的信息。 

 

4. Ros应用程序接口( ROS API)

为了与另一个 ROS节点的控制器交互,控制管理器提供了五种服务调用: 

 

4.1 控制管理器(controller_manager) 

4.1.1 服务(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 )将会失败并导致空操作(noop)。 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(robot operation system)机器人操作系统中控制管理器(controller_manager)的介绍.

维基翻译,原文:http://wiki.ros.org/controller_manager?distro=indigo 

controller_manager提供硬实时兼容的环来控制的机械手,由一个hardware_interface::RobotHW实例代表(参见hardware_interface包)。该 controller_manager提供了加载,卸载,启动和停止控制器的基本结构。

 

0. 控制器运行的工具( Tools for running controllers)

 

controller state.png


控制器管理器提供的与控制器进行交互的基本结构。根据控制器从启动文件,命令行,或者ROS节点运行,控制管理器提供不同的工具来运行控制器。 

 

1. 命令行工具( Command-line tools) 

1.1 控制管理器(controller_manager)

使用 controller_manager工具与从命令行运行的控制器交互。要与特定的控制器进行交互,可以使用: 

 

$ rosrun controller_manager controller_manager <command> <controller_name>

 

以下命令可用: 

load:加载控制器 (construct and initialize) 

unload:卸载控制器 (destruct) 

start:启动控制器

stop:结束控制器 

spawn:加载并启动控制器 

kill:停止并卸载控制器

 

想获得控制器状态, 用: 

$ rosrun controller_manager controller_manager <command>

 

 

以下命令可用: 

list:根据执行顺序,列出所有控制器,并给出每个控制器的状态 

list-types:列出所有控制器管理知道的控制器类型。如果控制器不在此列表中,将

无法加载并启动。

list-joints: l列出所有控制器管理使用的的关节和驱动器的名称。

reload-libraries:重新加载所有可作为插件的控制器库。当我们正在开发控制器时,

可以方便的测试控制器代码,而不用每次都重新启动机器人。 

reload-libraries --restore:重新加载所有可作为插件的的控制器库,并把所有控制器

恢复到初始状态。 

1.2 加载并启动控制器(spawner)

为了立刻自动加载并启动一系列控制器以及立刻停止并卸载这些控制器,使用 spawner工具: 

$ rosrun controller_manager spawner [--stopped] name1 name2 name3 

 

当运行 spawner时,列表中控制器将被载入和启动(除非指定 --stopped)。 当控制器已开启(controllers are up),spawner将保持运行。当你杀死 spawner进程(CTRL-C),会自动停止并卸载所有它最开始启动的控制器。 

 

1.3 卸载控制器(unspawner)

想要自动停止一组控制器,然后重新启动,可使用 unspawner工具: 

 

$ rosrun controller_manager unspawner name1 name2 name3

 

列表中的控制器将被停止,但没有卸载。一旦 spawner关闭,该控制器将重新启动。 

 

2. 创建启动文件( Creating launch files)

我们可以运行 controller_manager,从启动文件(launch file)内启动控制器。然而,即使启动文件被撤下,控制器仍会保持。而 spawner工具会从启动文件中自动加载,启动,停止和卸载控制器。当启动 spawn工具时,它会加载并启动控制器。当你停止 spawner(当启动文件被撤下),它将停止并卸载控制器。启动文件可能如下: 

 

<launch> 

<node pkg="controller_manager" 

type="spawner" 

args="controller_name1 controller_name2" /> 

</launch>

 

或者,只是想加载控制器,但是还没有启动: 

 

<launch> 

 

<node pkg="controller_manager" 

 

type="spawner" 

 

args="--stopped controller_name1 controller_name2" /> 

</launch> 

 

3. 图形工具( Graphical tools) 

rqt_controller_manager是一个 rqt插件,该插件以图形化方式加载,卸载,启动和停止控制器;同时用来显示加载的控制器的信息。 

 

4. Ros应用程序接口( ROS API)

为了与另一个 ROS节点的控制器交互,控制管理器提供了五种服务调用: 

 

4.1 控制管理器(controller_manager) 

4.1.1 服务(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 )将会失败并导致空操作(noop)。 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) 


欢迎大家批评,指正,交流!

联系方式:

emai:  tongzhuodenilove@163.com
<think>好的,我现在要解决用户的问题:在ROS中某个topic未被发布,需要排查原因。首先,我需要回忆一下ROS的基本架构和相关工具,特别是与controller_manager相关的部分,因为用户提到了这个组件。 用户已经提供了一些引用内容,其中涉及到controller_manager的命令、spawn_entity的问题以及安装相关包的解决方案。我需要结合这些信息,逐步分析可能的原因。 首先,topic未被发布可能有几个原因:节点没有正确启动,话题名称拼写错误,或者节点配置错误。另外,控制器可能没有正确加载,导致相关话题无法发布。 根据引用[1],controller_manager用于管理控制器,比如启动或停止。用户可能需要检查控制器是否被正确加载和启动。如果控制器没有运行,那么它自然不会发布话题。用户可以通过命令`rosrun controller_manager controller_manager list`来查看控制器状态,确认目标控制器是否在运行列表中。 引用[3]提到安装ros-controlros-controllers包,如果用户的环境缺少这些依赖,可能会导致控制器无法启动,进而影响话题发布。因此,检查这些包是否安装正确是必要的步骤。 接下来,用户需要确认节点是否正常运行。使用`rosnode list`查看相关节点是否存在,如果节点崩溃或未启动,话题自然不会发布。例如,如果controller_manager的节点没有运行,那么对应的控制器可能未被加载。 然后,检查话题列表,使用`rostopic list`确认话题是否存在。如果话题确实未被发布,可能需要查看节点的日志信息。引用[2]提到使用rqt_console来查看日志,用户可以通过`ros2 run rqt_console rqt_console`(如果是ROS1的话可能需要调整命令)来检查是否有错误信息,比如加载控制器失败或依赖缺失。 此外,配置文件的问题也不能忽视。比如,控制器的配置文件是否正确,参数是否设置正确。引用[3]中的move_baseConfig等可能涉及配置文件的正确性,需要用户检查相关配置文件,确保控制器正确配置。 还有可能是消息类型不匹配,虽然这种情况较少,但可以尝试手动发布一个虚拟的消息,看看是否能够接收,以排除消息类型或发布频率的问题。 总结下来,步骤大致是:检查控制器状态→确认节点运行→查看话题列表→检查日志→验证依赖和配置→手动测试。这些步骤应该能帮助用户逐步定位问题所在。</think>### 排查ROS中Topic未被发布的步骤 #### 1. **确认控制器是否加载并运行** - 使用`controller_manager`命令检查控制器状态: ```bash $ rosrun controller_manager controller_manager list ``` 若目标控制器未显示在运行列表中,需重新加载控制器: ```bash $ rosrun controller_manager controller_manager load <controller_name> $ rosrun controller_manager controller_manager start <controller_name> ``` 引用[1]中提到的`controller_manager`命令是管理控制器的核心工具[^1]。 #### 2. **检查节点是否正常运行** - 使用`rosnode list`确认相关节点(如控制器节点、发布者节点)是否存活。 - 若节点未运行,检查启动文件(`.launch`文件)或命令行参数是否遗漏节点启动逻辑。 #### 3. **验证Topic是否存在** - 使用`rostopic list`查看当前所有活跃Topic。 - 若Topic未列出,可能是节点未正确初始化发布者,或存在命名冲突(例如命名空间错误)。 #### 4. **查看日志信息** - 通过`rqt_console`检查节点日志,定位启动错误或运行时警告: ```bash $ rosrun rqt_console rqt_console ``` 引用[2]提到`rqt_console`是ROS中查看日志的关键工具[^2]。 #### 5. **检查依赖和配置** - 确保ROS包依赖已正确安装,例如`ros-control`和`ros-controllers`: ```bash $ sudo apt-get install ros-<distro>-ros-control ros-<distro>-ros-controllers ``` 引用[3]指出依赖缺失是控制器无法加载的常见原因[^3]。 - 检查控制器配置文件(如`controller_managerConfig`、`move_baseConfig`),确认Topic名称和发布逻辑正确。 #### 6. **手动触发Topic发布测试** - 尝试通过命令行手动发布测试消息: ```bash $ rostopic pub /<topic_name> <msg_type> "data: <value>" ``` 若手动发布成功,则需排查节点内部发布逻辑。 --- ### 可能原因总结 | 原因类型 | 排查方法 | 解决方案 | |--------------------|-----------------------------------|-----------------------------| | 控制器未启动 | `controller_manager list` | 加载并启动控制器 | | 节点崩溃 | `rosnode list` + `rqt_console` | 修复节点代码或配置 | | 依赖缺失 | 检查安装日志或包管理器 | 安装缺失ROS包[^3] | | Topic名称错误 | `rostopic list`比对代码 | 修正代码中的Topic名称 | ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值