小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
ros2_control中,如何通过controller_manager 控制台命令(CLI)或其他方法调用hardware_interface中已经实现的on_deactivate() 方法
-
背景:
我在ros2_control中实现了一个硬件接口,并在
on_deactivate()
方法中添加了释放硬件资源的代码。调试过程:
当我尝试使用命令
ros2 control set_controller_state diffbot_base_controller inactive
停止控制器节点并尝试释放硬件时,on_deactivate()
没有被调用。与预期的不同:
在排查时发现,没有找到
on_deactivate()
方法中的控制台输出,而且read()
、write()
方法仍在被持续调用。与切换状态前相比,变化只有 hw_command_数组中的值变为0。ros2_control官方文档中没有找到控制器节点生命周期切换相关的内容(有重启节点相关的介绍,但没有解释上述的疑问)
问题
请问是否有ros2_control控制器节点生命周期的解释和相关介绍?
如何调用控制器hardwate_interface中的on_deactivate()
方法? -
@437985437
问题已解决,参考这个问答:
controller manager - About Lifecycle, And how to call `on_deactivate()` in `hardware_interface` of ros2_control by controller_manager CLI or other method? - Robotics Stack Exchange控制ros2_control的硬件生命周期的方式是通过调用controller_manager节点的service。
# 查询运行中的ros2_control硬件节点 ros2 service call /controller_manager/list_hardware_components controller_manager_msgs/srv/ListHardwareComponents # 设置硬件节点(name参数需要根据情况修改, label参数 参考下面的节点生命周期相关链接) ros2 service call /controller_manager/set_hardware_component_state controller_manager_msgs/srv/SetHardwareComponentState " name: DiffBot target_state: id: 0 label: inactive"
节点生命周期概念参考链接:Managed nodes
-
@437985437 应该和你的代码有关系,建议将代码上传进一步检查
-
@小鱼
这个接口是模仿官方 ros2_control_demos 的 humble分支 项目中第二个示例创建的,配置文件、描述文件和源码完全与示例一致,仅仅更改了包名称。并且为了排查问题,我在官方示例的源码工作空间中做了同样的调试:尝试使用
ros2 control
相关的控制台命令,使控制器失效,企图调用on_deactivate()
方法:ros2 control switch_controllers --deactivate diffbot_base_controller
ros2 control set_controller_state diffbot_base_controller inactive
使切换命令后,控制台返回
Successfully deactivated diffbot_base_controller
的响应,表示切换成功但回到启动示例二的控制台(
ros2 launch motor_hw_interface diffbot.launch.py
)中,仍然在刷出read/write
方法中的输出(原来有值的 hw_commands_输出变为了0),并显示:[ros2_control_node-1] [WARN] [1698132012.054576029] [diffbot_base_controller]: Can't accept new commands. subscriber is inactive
奇怪的是,没有输出
on_deactivate()
方法中,官方示例中输出的相关内容:RCLCPP_INFO(rclcpp::get_logger("DiffBotSystemHardware"), "Deactivating ...please wait...");
-
@小鱼
我在官网上找到了硬件(hardware_interface)生命周期相关的描述,似乎目前还没有实现管理硬件生命周期的接口,而硬件生命周期和控制器(controllers)生命周期相互独立,关闭控制器不会影响硬件接口的实现库的运行 -
@437985437
问题已解决,参考这个问答:
controller manager - About Lifecycle, And how to call `on_deactivate()` in `hardware_interface` of ros2_control by controller_manager CLI or other method? - Robotics Stack Exchange控制ros2_control的硬件生命周期的方式是通过调用controller_manager节点的service。
# 查询运行中的ros2_control硬件节点 ros2 service call /controller_manager/list_hardware_components controller_manager_msgs/srv/ListHardwareComponents # 设置硬件节点(name参数需要根据情况修改, label参数 参考下面的节点生命周期相关链接) ros2 service call /controller_manager/set_hardware_component_state controller_manager_msgs/srv/SetHardwareComponentState " name: DiffBot target_state: id: 0 label: inactive"
节点生命周期概念参考链接:Managed nodes
-
-
@437985437 看样子是 CLI 没有实现,