鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    ros2_control中,如何通过controller_manager 控制台命令(CLI)或其他方法调用hardware_interface中已经实现的on_deactivate() 方法

    已定时 已固定 已锁定 已移动 已解决
    综合问题
    ros2 control 生命周期 controlmanager
    2
    6
    980
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 4379854374
      龍魂
      最后由 编辑

      背景:

      我在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()方法?

      小鱼小 4379854374 2 条回复 最后回复 回复 引用 0
      • 4379854374
        龍魂 @437985437
        最后由 编辑

        @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

        小鱼小 1 条回复 最后回复 回复 引用 0
        • 小鱼小
          小鱼 技术大佬 @437985437
          最后由 编辑

          @437985437 应该和你的代码有关系,建议将代码上传进一步检查

          新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

          4379854374 2 条回复 最后回复 回复 引用 0
          • 4379854374
            龍魂 @小鱼
            最后由 编辑

            @小鱼
            这个接口是模仿官方 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...");

            1 条回复 最后回复 回复 引用 0
            • 4379854374
              龍魂 @小鱼
              最后由 编辑

              @小鱼
              我在官网上找到了硬件(hardware_interface)生命周期相关的描述,似乎目前还没有实现管理硬件生命周期的接口,而硬件生命周期和控制器(controllers)生命周期相互独立,关闭控制器不会影响硬件接口的实现库的运行

              238b58e7-b4ee-4a3c-8292-39d7865629ef-image.png

              1 条回复 最后回复 回复 引用 0
              • 4379854374
                龍魂 @437985437
                最后由 编辑

                @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

                小鱼小 1 条回复 最后回复 回复 引用 0
                • 4379854374 437985437 将这个主题标记为已解决,在
                • 小鱼小
                  小鱼 技术大佬 @437985437
                  最后由 编辑

                  @437985437 看样子是 CLI 没有实现,👍

                  新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                  1 条回复 最后回复 回复 引用 0
                  • 第一个帖子
                    最后一个帖子
                  皖ICP备16016415号-7
                  Powered by NodeBB | 鱼香ROS