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

    4.5.3 修改其他节点的参数

    已定时 已固定 已锁定 已移动
    动手学ROS2
    节点参数 main调用函数
    2
    3
    249
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 4
      开心
      最后由 编辑

      遇到问题:
      在PatrolClient类中写入更新服务参数函数update_server_param_k,在main函数中调用(node->update_server_param_k(1.5);)code代码报错:
      函数 "PatrolClient::update_server_param_k" (已声明 所在行数:77) 不可访问,我没有找到代码的毛病,请求老师帮助
      代码如下:

      #include <chrono>
      #include <cstdlib>
      #include <ctime>
      #include "rclcpp/rclcpp.hpp"
      #include "chapt4_interfaces/srv/patrol.hpp"
      #include "rcl_interfaces/msg/parameter.hpp"
      #include "rcl_interfaces/msg/parameter_value.hpp"
      #include "rcl_interfaces/msg/parameter_type.hpp"
      #include "rcl_interfaces/srv/set_parameters.hpp"
      using SetP = rcl_interfaces::srv::SetParameters;
      
      using namespace std::chrono_literals;
      using Patrol = chapt4_interfaces::srv::Patrol;
      
      class PatrolClient : public rclcpp::Node
      {
          public:
           PatrolClient() : Node("patrol_client") {
              patrol_client_ = this->create_client<Patrol>("patrol");
              timer_ = this->create_wall_timer(10s,
              std::bind(&PatrolClient::timer_callback, this));
              srand(time(NULL));
           }
          void timer_callback() {
              while (!patrol_client_->wait_for_service(std::chrono::seconds(1)))
              {
                  if(!rclcpp::ok()) {
                      RCLCPP_ERROR(this->get_logger(),"等待服务端过程中被打断...");
                      return;
                  }
                  RCLCPP_INFO(this->get_logger(),"等待服务端上线中");
              }
              
              auto request = std::make_shared<Patrol::Request>();
              request->target_x = rand() % 15;
              request->target_y = rand() % 15;
              RCLCPP_INFO(this->get_logger(), "请求巡逻:(%f,%f)",request->target_x,
              request->target_y);
              patrol_client_->async_send_request(
                  request,
                  [&](rclcpp::Client<Patrol>::SharedFuture result_future) -> void {
                      auto response = result_future.get();
                      if (response->result == Patrol::Response::SUCCESS) {
                          RCLCPP_INFO(this->get_logger(), "目标点处理成功");
                      } else if (response->result == Patrol::Response::FALL) {
                          RCLCPP_INFO(this->get_logger(), "目标点处理失败");
                      }
                  });
      
          }
      
          private:
           rclcpp::TimerBase::SharedPtr timer_;
           rclcpp::Client<Patrol>::SharedPtr patrol_client_;
      
          std::shared_ptr<SetP::Response> call_set_parameters(
              rcl_interfaces::msg::Parameter &parameter) {
                  auto param_client = 
                  this->create_client<SetP>("/turtle_controller/set_parameters");
                  while (!param_client->wait_for_service(std::chrono::seconds(1)))
                  {
                      if (!rclcpp::ok())
                      {
                       RCLCPP_ERROR(this->get_logger(),"等待服务的过程中被打断...");
                       return nullptr;
                      }
                      RCLCPP_INFO(this->get_logger(),"等待参数设置服务端上线中");
                  }
                  auto request = std::make_shared<SetP::Request>();
                  request->parameters.push_back(parameter);
                  auto future = param_client->async_send_request(request);
                  rclcpp::spin_until_future_complete(this->get_node_base_interface(), future);
                  auto response = future.get();
                  return response;
               }
      
               void update_server_param_k(double k) {
                  auto param = rcl_interfaces::msg::Parameter();
                  param.name = "k";
                  auto param_value = rcl_interfaces::msg::ParameterValue();
                  param_value.type = rcl_interfaces::msg::ParameterType::PARAMETER_DOUBLE;
                  param_value.double_value = k;
                  param.value = param_value;
                  auto response = call_set_parameters(param);
                  if (response == nullptr) {
                      RCLCPP_WARN(this->get_logger(),"参数修改失败");
                      return;
                  } else {
                      for (auto result : response->results) {
                          if (result.successful) {
                              RCLCPP_INFO(this->get_logger(),"参数k已修改为:%f", k);
                          } else {
                              RCLCPP_WARN(this->get_logger(),"参数k失败原因:%s", result.reason.c_str());
                          }
                      }
                  }
               }
      
      };
      
      int main(int argc, char **argv) {
          rclcpp::init(argc, argv);
          auto node = std::make_shared<PatrolClient>();
          node->update_server_param_k(1.5);
          rclcpp::spin(node);
          rclcpp::shutdown();
          return 0;
      
      }
      
      小鱼小 1 条回复 最后回复 回复 引用 0
      • 小鱼小
        小鱼 技术大佬 @43996173
        最后由 编辑

        @43996173 在 4.5.3 修改其他节点的参数 中说:

        private:
        rclcpp::TimerBase::SharedPtr timer_;
        rclcpp::Client<Patrol>::SharedPtr patrol_client_;

        std::shared_ptr<SetP::Response> call_set_parameters(
            rcl_interfaces::msg::Parameter &parameter) {
                auto param_client = 
                this->create_client<SetP>("/turtle_controller/set_parameters");
                while (!param_client->wait_for_service(std::chrono::seconds(1)))
                {
                    if (!rclcpp::ok())
                    {
                     RCLCPP_ERROR(this->get_logger(),"等待服务的过程中被打断...");
                     return nullptr;
                    }
                    RCLCPP_INFO(this->get_logger(),"等待参数设置服务端上线中");
                }
                auto request = std::make_shared<SetP::Request>();
                request->parameters.push_back(parameter);
                auto future = param_client->async_send_request(request);
                rclcpp::spin_until_future_complete(this->get_node_base_interface(), future);
                auto response = future.get();
                return response;
             }
        
             void update_server_param_k(double k) {
        

        注意这里的private,表示私有成员,不能通过对象.函数名字访问,请将其修改为public,这是一个基础的C++类的语法问题,请注意。

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

        4 1 条回复 最后回复 回复 引用 0
        • 4
          开心 @小鱼
          最后由 编辑

          @小鱼 收到,谢谢,

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