导航

    蓝鲸ROS机器人论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 热门
    ROS交流群
    ROS Group
    产品服务
    Product Service
    开源代码库
    Github
    官网
    Official website
    技术交流
    Technological exchanges
    激光雷达
    LIDAR
    ROS教程
    ROS Tourials
    深度学习
    Deep Learning
    机器视觉
    Computer Vision

    ROS2如何设置和获取其他节点的参数

    ROS教程
    ros2 设置参数
    2
    11
    3138
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • weijiz
      weijiz 最后由 编辑

      在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 1 条回复 最后回复 回复 引用 0
      • weijiz
        weijiz @weijiz 最后由 编辑

        @小助理 测试一下

        小助理 1 条回复 最后回复 回复 引用 0
        • 小助理
          小助理 @weijiz 最后由 编辑

          weijiz说:

          测试一下

          没问题,可以尝试一下。

          weijiz 1 条回复 最后回复 回复 引用 0
          • weijiz
            weijiz @小助理 最后由 编辑

            @小助理 ROS2如何设置和获取其他节点的参数

            小助理 1 条回复 最后回复 回复 引用 0
            • 小助理
              小助理 @weijiz 最后由 编辑

              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上的参数值。

              weijiz 1 条回复 最后回复 回复 引用 0
              • weijiz
                weijiz @小助理 最后由 编辑

                此回复已被删除!
                小助理 1 条回复 最后回复 回复 引用 0
                • 小助理
                  小助理 @weijiz 最后由 编辑

                  此回复已被删除!
                  1 条回复 最后回复 回复 引用 0
                  • weijiz
                    weijiz 最后由 编辑

                    此回复已被删除!
                    1 条回复 最后回复 回复 引用 0
                    • weijiz
                      weijiz 最后由 编辑

                      此回复已被删除!
                      1 条回复 最后回复 回复 引用 0
                      • weijiz
                        weijiz 最后由 编辑

                        @小助理 如果用python和c++怎么实现

                        小助理 1 条回复 最后回复 回复 引用 0
                        • 小助理
                          小助理 @weijiz 最后由 编辑

                          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文件以设置节点参数。

                          1 条回复 最后回复 回复 引用 0
                          • 1 / 1
                          • First post
                            Last post
                          Copyright © 2015-2023 BlueWhale community