当前位置:   article > 正文

ROS2参数服务(Python)_python ros2的服务

python ros2的服务
1.参数服务端

功能包py04_param的py04_param目录下,新建Python文件demo01_param_server_py.py,并编辑文件,输入如下内容:

  1. """
  2. 需求:编写参数服务端,设置并操作参数。
  3. 步骤:
  4. 1.导包;
  5. 2.初始化 ROS2 客户端;
  6. 3.定义节点类;
  7. 3-1.声明参数;
  8. 3-2.查询参数;
  9. 3-3.修改参数;
  10. 3-4.删除参数。
  11. 4.创建节点对象,调用参数操作函数,并传递给spin函数;
  12. 5.释放资源。
  13. """
  14. # 1.导包;
  15. import rclpy
  16. from rclpy.node import Node
  17. # 3.定义节点类;
  18. class MinimalParamServer(Node):
  19. def __init__(self):
  20. super().__init__("minimal_param_server",allow_undeclared_parameters=True)
  21. self.get_logger().info("参数演示")
  22. # 3-1.声明参数;
  23. def declare_param(self):
  24. self.declare_parameter("car_type","Tiger")
  25. self.declare_parameter("height",1.50)
  26. self.declare_parameter("wheels",4)
  27. self.p1 = rclpy.Parameter("car_type",value = "Mouse")
  28. self.p2 = rclpy.Parameter("undcl_test",value = 100)
  29. self.set_parameters([self.p1,self.p2])
  30. # 3-2.查询参数;
  31. def get_param(self):
  32. self.get_logger().info("--------------查-------------")
  33. # 判断包含
  34. self.get_logger().info("包含 car_type 吗?%d" % self.has_parameter("car_type"))
  35. self.get_logger().info("包含 width 吗?%d" % self.has_parameter("width"))
  36. # 获取指定
  37. car_type = self.get_parameter("car_type")
  38. self.get_logger().info("%s = %s " % (car_type.name, car_type.value))
  39. # 获取所有
  40. params = self.get_parameters(["car_type","height","wheels"])
  41. self.get_logger().info("解析所有参数:")
  42. for param in params:
  43. self.get_logger().info("%s ---> %s" % (param.name, param.value))
  44. # 3-3.修改参数;
  45. def update_param(self):
  46. self.get_logger().info("--------------改-------------")
  47. self.set_parameters([rclpy.Parameter("car_type",value = "horse")])
  48. param = self.get_parameter("car_type")
  49. self.get_logger().info("修改后: car_type = %s" %param.value)
  50. # 3-4.删除参数。
  51. def del_param(self):
  52. self.get_logger().info("--------------删-------------")
  53. self.get_logger().info("删除操作前包含 car_type 吗?%d" % self.has_parameter("car_type"))
  54. self.undeclare_parameter("car_type")
  55. self.get_logger().info("删除操作后包含 car_type 吗?%d" % self.has_parameter("car_type"))
  56. def main():
  57. # 2.初始化 ROS2 客户端;
  58. rclpy.init()
  59. # 4.创建节点对象,调用参数操作函数,并传递给spin函数;
  60. param_server = MinimalParamServer()
  61. param_server.declare_param()
  62. param_server.get_param()
  63. param_server.update_param()
  64. param_server.del_param()
  65. rclpy.spin(param_server)
  66. # 5.释放资源。
  67. rclpy.shutdown()
  68. if __name__ == "__main__":
  69. main()
2.参数客户端

ROS2的Python客户端暂时没有提供参数客户端专用的API,但是参数服务的底层是基于服务通信的,所以可以通过服务通信操作参数服务端的参数。

3.编辑配置文件
1.package.xml

在创建功能包时,所依赖的功能包已经自动配置了,配置内容如下:

<depend>rclpy</depend>
2.setup.py

entry_points字段的console_scripts中添加如下内容:

  1. entry_points={
  2. 'console_scripts': [
  3. 'demo01_param_server_py = py04_param.demo01_param_server_py:main'
  4. ],
  5. },
4.编译

终端中进入当前工作空间,编译功能包:

colcon build --packages-select py04_param
5.执行

当前工作空间下,启动两个终端,终端1执行参数服务端程序,终端2执行参数客户端程序(使用2.5.3中的C++实现)。

终端1输入如下指令:

  1. . install/setup.bash
  2. ros2 run py04_param demo01_param_server_py

终端2输入如下指令:

  1. . install/setup.bash
  2. ros2 run cpp04_param demo02_param_client

最终运行结果与案例类似。


资料:

以服务通信方式操作参数服务端示例代码:

  1. # 1.导包
  2. import rclpy
  3. from rclpy.node import Node
  4. from rcl_interfaces.srv import ListParameters
  5. from rcl_interfaces.srv import GetParameters
  6. from rcl_interfaces.srv import SetParameters
  7. from rcl_interfaces.msg import ParameterType
  8. from rcl_interfaces.msg import Parameter
  9. from rcl_interfaces.msg import ParameterValue
  10. from ros2param.api import get_parameter_value
  11. class MinimalParamClient(Node):
  12. def __init__(self):
  13. super().__init__('minimal_param_client_py')
  14. def list_params(self):
  15. # 3-1.创建客户端;
  16. cli_list = self.create_client(ListParameters, '/minimal_param_server/list_parameters')
  17. # 3-2.等待服务连接;
  18. while not cli_list.wait_for_service(timeout_sec=1.0):
  19. self.get_logger().info('列出参数服务连接中,请稍候...')
  20. req = ListParameters.Request()
  21. future = cli_list.call_async(req)
  22. rclpy.spin_until_future_complete(self,future)
  23. return future.result()
  24. def get_params(self,names):
  25. # 3-1.创建客户端;
  26. cli_get = self.create_client(GetParameters, '/minimal_param_server/get_parameters')
  27. # 3-2.等待服务连接;
  28. while not cli_get.wait_for_service(timeout_sec=1.0):
  29. self.get_logger().info('列出参数服务连接中,请稍候...')
  30. req = GetParameters.Request()
  31. req.names = names
  32. future = cli_get.call_async(req)
  33. rclpy.spin_until_future_complete(self,future)
  34. return future.result()
  35. def set_params(self):
  36. # 3-1.创建客户端;
  37. cli_set = self.create_client(SetParameters, '/minimal_param_server/set_parameters')
  38. # 3-2.等待服务连接;
  39. while not cli_set.wait_for_service(timeout_sec=1.0):
  40. self.get_logger().info('列出参数服务连接中,请稍候...')
  41. req = SetParameters.Request()
  42. p1 = Parameter()
  43. p1.name = "car_type"
  44. # v1 = ParameterValue()
  45. # v1.type = ParameterType.PARAMETER_STRING
  46. # v1.string_value = "Pig"
  47. # p1.value = v1
  48. p1.value = get_parameter_value(string_value="Pig")
  49. p2 = Parameter()
  50. p2.name = "height"
  51. v2 = ParameterValue()
  52. v2.type = ParameterType.PARAMETER_DOUBLE
  53. v2.double_value = 0.3
  54. p2.value = v2
  55. # p2.value = get_parameter_value(string_value="0.3")
  56. req.parameters = [p1, p2]
  57. future = cli_set.call_async(req)
  58. rclpy.spin_until_future_complete(self,future)
  59. return future.result()
  60. def main():
  61. # 2.初始化 ROS2 客户端;
  62. rclpy.init()
  63. # 4.创建对象并调用其功能;
  64. client = MinimalParamClient()
  65. # 获取参数列表
  66. client.get_logger().info("---------获取参数列表---------")
  67. response = client.list_params()
  68. for name in response.result.names:
  69. client.get_logger().info(name)
  70. client.get_logger().info("---------获取参数---------")
  71. names = ["height","car_type"]
  72. response = client.get_params(names)
  73. # print(response.values)
  74. for v in response.values:
  75. if v.type == ParameterType.PARAMETER_STRING:
  76. client.get_logger().info("字符串值:%s" % v.string_value)
  77. elif v.type == ParameterType.PARAMETER_DOUBLE:
  78. client.get_logger().info("浮点值:%.2f" % v.double_value)
  79. client.get_logger().info("---------设置参数---------")
  80. response = client.set_params()
  81. results = response.results
  82. client.get_logger().info("设置了%d个参数" % len(results))
  83. for result in results:
  84. if not result.successful:
  85. client.get_logger().info("参数设置失败")
  86. rclpy.shutdown()
  87. if __name__ == "__main__":
  88. main()
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/982353
推荐阅读
相关标签
  

闽ICP备14008679号