1. 自定义srv消息

1.1 创建package(创建过可省略)

  1. ros2 pkg create --build-type ament_cmake msg_srv

可以修改package.xml文件如下信息

  1. <description>C++ client server tutorial</description>
  2. <maintainer email="you@email.com">Your Name</maintainer>
  3. <license>Apache License 2.0</license>

1.2 在工程下创建srv文件夹,创建AddThreeInts.srv并填写如下内容

  1. int64 a
  2. int64 b
  3. int64 c
  4. ---
  5. int64 sum

1.3 配置cmake

  1. find_package(rosidl_default_generators REQUIRED)
  2. rosidl_generate_interfaces(${PROJECT_NAME}
  3. ...
  4. "srv/AddThreeInts.srv"
  5. )

1.4 配置package.xml文件

  1. <build_depend>rosidl_default_generators</build_depend>
  2. <exec_depend>rosidl_default_runtime</exec_depend>
  3. <member_of_group>rosidl_interface_packages</member_of_group>

1.5 编译工程

  1. colcon build --packages-select msg_srv

1.6 显示消息详情

  1. ros2 interface show msg_srv/srv/AddThreeInts

2. 使用自定义的srv消息

client

  1. import rclpy
  2. from rclpy.node import Node
  3. from msg_srv.srv import AddThreeInts
  4. class MyNode(Node):
  5. def __init__(self):
  6. super(MyNode, self).__init__('client_py')
  7. self.cli = self.create_client(AddThreeInts,'py_service')
  8. while not self.cli.wait_for_service(timeout_sec=1.0):
  9. self.get_logger().info('service not available,waiting again...')
  10. self.req = AddThreeInts.Request()
  11. def send_request(self,a,b,c):
  12. self.req.a = int(a)
  13. self.req.b = int(b)
  14. self.req.c = int(c)
  15. self.future = self.cli.call_async(self.req)
  16. def main():
  17. rclpy.init()
  18. node = MyNode()
  19. # send request
  20. node.send_request(10,20,30)
  21. while rclpy.ok():
  22. rclpy.spin_once(node)
  23. if node.future.done():
  24. try:
  25. response = node.future.result()
  26. except Exception as e:
  27. node.get_logger().info(f'servie error:{e}')
  28. else:
  29. node.get_logger().info(f'result:{response.sum}')
  30. break
  31. node.destroy_node()
  32. rclpy.shutdown()
  33. if __name__ == '__main__':
  34. main()

server

  1. from msg_srv.srv import AddThreeInts
  2. import rclpy
  3. from rclpy.node import Node
  4. class MyServer(Node):
  5. def __init__(self):
  6. super(MyServer, self).__init__('py_server')
  7. self.service = self.create_service(AddThreeInts, 'py_service', self.call_back)
  8. def call_back(self, req, res):
  9. res.sum = req.a + req.b + req.c
  10. return res
  11. def main():
  12. rclpy.init()
  13. node = MyServer()
  14. rclpy.spin(node)
  15. rclpy.shutdown()
  16. if __name__ == '__main__':
  17. main()

package.xml配置

  1. <depend>msg_srv</depend>

setup.py配置

  1. entry_points={
  2. 'console_scripts': [
  3. ...
  4. 'client_srv = py_srvcli.client_srv:main',
  5. 'server_srv = py_srvcli.server_srv:main',
  6. ],
  7. },

编译工程

  1. colcon build

运行节点

  1. ros2 run py_srvcli client_srv
  2. ros2 run py_srvcli server_srv