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

    在类的成员函数中发送服务请求,rclcpp::spin_until_future_complete函数的第一个参数问题?

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    服务请求 类的成员函数 等待请求返回
    4
    7
    1.2k
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 凌云凌
      凌云
      最后由 编辑

      在类中定义一个成员函数,在成员函数内部通过某些机制触发,发送一个服务请求,会有如下代码:
      auto result = clientCmd_->async_send_request(requestCmd);
      if(rclcpp::spin_until_future_complete(node, result) != rclcpp::FutureReturnCode::SUCCESS)
      {
      RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Failed to call service 'command(query)'");
      }
      else
      {
      ...
      }
      在类的成员函数中放入该段代码,会报错,spin_until_future_complete()函数的第一个参数有问题。但不像官方例程,这里没有node的定义,是在成员函数内部的,改为spin_until_future_complete(this, result)也编译失败。

      请问这种类内成员函数中进行服务请求的情况,这里的spin_until_future_complete()函数第一个参数应该如何填写呢?
      谢谢!查了fishros主页的动手学ROS2,并没有这种情况的实例程序。

      小鱼小 LorryL 13013501501 3 条回复 最后回复 回复 引用 0
      • 小鱼小
        小鱼 技术大佬 @凌云
        最后由 编辑

        @凌云 在 在类的成员函数中发送服务请求,rclcpp::spin_until_future_complete函数的第一个参数问题? 中说:

        spin_until_future_complete(this, result)

        不应该用这句话,应该用回调函数接收数据

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

        1 条回复 最后回复 回复 引用 0
        • LorryL
          Lorry @凌云
          最后由 编辑

          @凌云 可以用回调函数,也可以result.wait_for的方法进行等待response。不过还是推荐回调的方法,不会出错

          凌云凌 1 条回复 最后回复 回复 引用 1
          • 凌云凌
            凌云 @Lorry
            最后由 编辑

            @Lorry 谢谢指点。
            客户端的回调函数怎么写?类似服务器端的写法,像下面这样吗?

            类的构造函数初始化中:
            clientCmd_ = this->create_client<pack_a::srv::Int8>("command", std::bind(&ControlExecutor::Callback_Client, this, _1);

            回调函数:
            void ControlExecutor::Callback_Client(const std::shared_ptr<pack_a::srv::Int8::Response> response)
            {
            ...
            }

            LorryL 1 条回复 最后回复 回复 引用 0
            • LorryL
              Lorry @凌云
              最后由 编辑

              @凌云

              // 3.发送异步请求,然后等待返回,返回时调用回调函数
                  client_->async_send_request(
                    request, std::bind(&ServiceClient01::result_callback_, this,
                                       std::placeholders::_1));
                };
              

              详情可以参考小鱼的动手学ros2

              (上周有点事情,希望回复的不晚)

              凌云凌 1 条回复 最后回复 回复 引用 0
              • 凌云凌
                凌云 @Lorry
                最后由 编辑

                @Lorry 感谢,我来试试。

                1 条回复 最后回复 回复 引用 0
                • 13013501501
                  随便取个名字算了 @凌云
                  最后由 编辑

                  @凌云 rclcpp::spin_until_future_complete(this->get_node_base_interface(), result) 可以试试

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