ROS交流群
ROS Group 产品服务
Product Service 开源代码库
Github 官网
Official website 技术交流
Technological exchanges 激光雷达
LIDAR ROS教程
ROS Tourials 深度学习
Deep Learning 机器视觉
Computer Vision
ROS Group 产品服务
Product Service 开源代码库
Github 官网
Official website 技术交流
Technological exchanges 激光雷达
LIDAR ROS教程
ROS Tourials 深度学习
Deep Learning 机器视觉
Computer Vision
ROS2如何设置和获取其他节点的参数
-
在ROS1中参数全部都在一个Parameter Server上面,任意节点都可以随意的设置和读取其他节点的参数。但是在ROS2中,这部分发生了很大变化。首先由于ROS2没有了中心节点,所以也不存在一个Parameter Server了。每个节点的参数由节点本身去维护。所以要设置或获取其他节点的参数就要用调用服务的方法去调用其他节点设置参数,获取参数服务。下面是一个具体的例子
单个节点获取和设置自己的参数
import rclpy node = None def get_params(): global node node.get_logger().info(node.get_parameter("test").get_parameter_value().string_value) def main(): global node rclpy.init() node = rclpy.create_node("get_params_node") # 声明参数,所有参数在使用之前都要声明一下 node.declare_parameter("test", "default") # 设置参数 node.set_parameters([rclpy.Parameter("test", rclpy.Parameter.Type.STRING, "hello world")]) node.create_timer(1, get_params) rclpy.spin(node) if __name__ == "__main__": main()
正常运行后输出如下
[INFO] [1677133156.500033082] [get_params_node]: hello world [INFO] [1677133157.492551064] [get_params_node]: hello world [INFO] [1677133158.492387209] [get_params_node]: hello world [INFO] [1677133159.492404149] [get_params_node]: hello world [INFO] [1677133160.492420371] [get_params_node]: hello world
设置其他节点的参数
import rclpy from rcl_interfaces.srv import SetParameters from rcl_interfaces.msg import Parameter, ParameterValue, ParameterType index = 0 set_params = None def get_params(): global set_params, index index += 1 # 创建设置参数请求 req = SetParameters.Request() # 设置参数数据 req.parameters = [Parameter(name="test", value=ParameterValue(string_value=f"{index}",type=ParameterType.PARAMETER_STRING))] # 发送请求 set_params.call_async(req) def main(): global set_params rclpy.init() node = rclpy.create_node("set_params_node") # 创建设置参数服务客户端 set_params = node.create_client(SetParameters, "/get_params_node/set_parameters") # 等待服务 set_params.wait_for_service(1) node.create_timer(1, get_params) rclpy.spin(node) if __name__ == "__main__": main()
总结
可以看到设置其他节点的参数相对于ROS1要复杂了很多。在ROS2的设计文档中提到了要做一个类似参数服务器的东西。但是目前这个东西还没有实现。
-
@小助理 测试一下
-
weijiz说:
测试一下
没问题,可以尝试一下。
-
@小助理 ROS2如何设置和获取其他节点的参数
-
weijiz说:
ROS2如何设置和获取其他节点的参数
ROS2使用参数服务器来存储和管理参数。可以使用
ros2 param
命令行工具来设置和获取其他节点的参数。下面是一个示例,该示例将设置一个节点的参数值:
ros2 param set /my_node my_parameter true
上面的示例将在节点/my_node上设置一个参数名为my_parameter,值为true。
要获取节点/my_node上的参数值,可以使用以下命令:
ros2 param get /my_node my_parameter
上面的命令将返回/my_node上的参数值。
-
此回复已被删除! -
此回复已被删除! -
此回复已被删除! -
此回复已被删除! -
@小助理 如果用python和c++怎么实现
-
weijiz说:
ROS2如何设置和获取其他节点的参数
对于Python,可以使用rclpy库来设置和获取其他节点的参数。以下是其中一个示例:
import rclpy from rclpy.parameter import ParameterValue from rcl_interfaces.msg import ParameterDescriptor, ParameterType # 创建参数并设置值 value = ParameterValue(value="my_value",type=ParameterType.PARAMETER_STRING) desc = ParameterDescriptor(description="my_description") param = rclpy.parameter.Parameter(name="my_parameter", value=value, descriptor=desc) # 创建节点并添加参数 node = rclpy.create_node("my_node") node.declare_parameter(param.name, param.value, param.descriptor) # 获取参数值 my_param = node.get_parameter(param.name) print(my_param.value) # 设置参数值 new_value = ParameterValue(value="new_value",type=ParameterType.PARAMETER_STRING) node.set_parameters([rclpy.parameter.Parameter(name=param.name, value=new_value)])
对于C++,可以使用rclcpp库来设置和获取其他节点的参数。以下是其中一个示例:
#include #include int main(int argc, char **argv) { // 创建节点 rclcpp::init(argc, argv); auto node = std::make_shared("my_node"); // 创建参数并设置值 auto param = std::make_shared("my_parameter", "my_value"); // 添加参数到节点中 node->declare_parameter(param->get_name(), param->get_value()); // 获取参数值 auto my_param = node->get_parameter("my_parameter"); RCLCPP_INFO(node->get_logger(), "Parameter value: %s", my_param.value_to_string().c_str()); // 设置参数值 node->set_parameter(rclcpp::Parameter("my_parameter", "new_value")); // 关闭节点 rclcpp::shutdown(); return 0; }
需要注意的是,配置文件和启动文件也会影响节点的参数。可以使用yaml文件来设置节点的参数,然后通过启动文件加载该yaml文件以设置节点参数。