c++ 从另一个节点设置Ros2参数

j2cgzkjk  于 2023-05-30  发布在  其他
关注(0)|答案(2)|浏览(232)

我在C++中有两个节点使用相同的参数。如果我想通过rqt重新配置node1的parameter_x,如果node2的parameter_x也自动更改,那就太好了。有这种可能性吗?
我尝试了node1:

auto node = rclcpp::Node::make_shared("node2");
node->set_parameter(rclcpp::Parameter("parameter_x", 50));
7xzttuei

7xzttuei1#

我找到了解决办法:

auto parameter = rcl_interfaces::msg::Parameter();
auto request = std::make_shared<rcl_interfaces::srv::SetParametersAtomically::Request>();

client = this->create_client<rcl_interfaces::srv::SetParametersAtomically>(serviceName); // E.g.: serviceName = "/turtlesim/set_parameters_atomically"

parameter.name = parameter_name;  // E.g.: parameter_name = "background_b"
parameter.value.type = 1          //  bool = 1,    int = 2,        float = 3,     string = 4
parameter.value.bool_value = true // .bool_value, .integer_value, .double_value, .string_value

request->parameters.push_back(parameter);

while (!client->wait_for_service(1s)) {
    if (!rclcpp::ok()) {
    RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Interrupted while waiting for the service. Exiting.");
    return;
    }
    RCLCPP_INFO_STREAM(this->get_logger(), "service " << serviceName <<" not available, waiting again..."); 
}
auto result = client->async_send_request(request);
cngwdvgl

cngwdvgl2#

不能在节点内部使用set_parameters,而是使用Service调用。可拨打两次服务电话

相关问题