1. 自定义srv消息
1.1 创建package(创建过可省略)
ros2 pkg create --build-type ament_cmake msg_srv
可以修改package.xml文件如下信息
<description>C++ client server tutorial</description><maintainer email="you@email.com">Your Name</maintainer><license>Apache License 2.0</license>
1.2 在工程下创建srv文件夹,创建AddThreeInts.srv并填写如下内容
int64 aint64 bint64 c---int64 sum
1.3 配置cmake
find_package(rosidl_default_generators REQUIRED)rosidl_generate_interfaces(${PROJECT_NAME}..."srv/AddThreeInts.srv")
1.4 配置package.xml文件
<build_depend>rosidl_default_generators</build_depend><exec_depend>rosidl_default_runtime</exec_depend><member_of_group>rosidl_interface_packages</member_of_group>
1.5 编译工程
colcon build --packages-select msg_srv
1.6 显示消息详情
ros2 interface show msg_srv/srv/AddThreeInts
2. 使用自定义的srv消息
client
import rclpyfrom rclpy.node import Nodefrom msg_srv.srv import AddThreeIntsclass MyNode(Node):def __init__(self):super(MyNode, self).__init__('client_py')self.cli = self.create_client(AddThreeInts,'py_service')while not self.cli.wait_for_service(timeout_sec=1.0):self.get_logger().info('service not available,waiting again...')self.req = AddThreeInts.Request()def send_request(self,a,b,c):self.req.a = int(a)self.req.b = int(b)self.req.c = int(c)self.future = self.cli.call_async(self.req)def main():rclpy.init()node = MyNode()# send requestnode.send_request(10,20,30)while rclpy.ok():rclpy.spin_once(node)if node.future.done():try:response = node.future.result()except Exception as e:node.get_logger().info(f'servie error:{e}')else:node.get_logger().info(f'result:{response.sum}')breaknode.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()
server
from msg_srv.srv import AddThreeIntsimport rclpyfrom rclpy.node import Nodeclass MyServer(Node):def __init__(self):super(MyServer, self).__init__('py_server')self.service = self.create_service(AddThreeInts, 'py_service', self.call_back)def call_back(self, req, res):res.sum = req.a + req.b + req.creturn resdef main():rclpy.init()node = MyServer()rclpy.spin(node)rclpy.shutdown()if __name__ == '__main__':main()
package.xml配置
<depend>msg_srv</depend>
setup.py配置
entry_points={'console_scripts': [...'client_srv = py_srvcli.client_srv:main','server_srv = py_srvcli.server_srv:main',],},
编译工程
colcon build
运行节点
ros2 run py_srvcli client_srvros2 run py_srvcli server_srv
