最近在学习赵虚左老师的ROS2课程,为此记录学习过程
实现方法和C++的类似,就不多做赘述了
服务接口使用的是之前c++的接口,所以不用修改
服务端代码
不用声明变量,比c++方便多了
#包含头文件
import rclpy
from rclpy.node import Node
from base_interfaces_demo.srv import AddInts
# 自定义节点
class AddIntServer(Node):
def __init__(self):
super().__init__("add_int_server_node")
self.get_logger().info("服务端创建成功")
self.server = self.create_service(AddInts,"add_ints",self.add_callback)
def add_callback(self,request,response):
response.sum = request.num1 + request.num2
self.get_logger().info("%d + %d = %d" %(request.num1,request.num2,response.sum))
return response
def main():
# 初始化客户端
rclpy.init()
# 调用spin传入节点对象
rclpy.spin(AddIntServer())
# 释放资源
rclpy.shutdown()
if __name__=='__main__':
main()
之后编译运行,然后开启另一个新的中断,依次调用下面两个指令进行测试,如果返回结果,说明代码正确
source install/setup.bash
ros2 service call /add_ints base_interfaces_demo/srv/AddInts "{'num1': 10,'num2': 15}"
客户端代码
#包含头文件
import rclpy
from rclpy.node import Node
from base_interfaces_demo.srv import AddInts
import sys
from rclpy.logging import get_logger
# 自定义节点
class AddIntClient(Node):
def __init__(self):
super().__init__("add_int_client_node")
self.get_logger().info("创建客户端")
self.client = self.create_client(AddInts,"add_ints")
while not self.client.wait_for_service(1.0):
self.get_logger().info("等待连接中")
def send_request(self):
requset = AddInts.Request()
requset.num1 = int(sys.argv[1])
requset.num2 = int(sys.argv[2])
self.future = self.client.call_async(requset)
def main():
if(len(sys.argv) != 3 ):
get_logger("rclpy").error("请提交两个数据")
return
# 初始化客户端
rclpy.init()
client = AddIntClient()
client.send_request()
rclpy.spin_until_future_complete(client,client.future)
try:
response = client.future.result()
client.get_logger().info("响应结果:sum = %d" % response.sum)
except Exception:
client.get_logger().error("服务响应失败")
# 释放资源
rclpy.shutdown()
if __name__=='__main__':
main()