了解了通信接口的概念,接下來我們再從代碼實現的角度,研究下如何定義以及使用一個接口。
在之前服務概念講解的課程中,我們編寫了這樣一個例程,我們再來回顧下。

有三個節點:
第一個驅動相機發布圖像話題;
第二個是機器視覺識別節點,封裝了一個服務的服務端對象,提供目標識別位置的查詢服務;
第三個節點在需要目標位置的時候,就可以發送請求,收到位置進行使用了。

接口定義
在這個例程中,我們使用GetObjectPosition.srv定義了服務通信的接口:
learning_interface/srv/GetObjectPosition.srv
bool get # 獲取目標位置的指令---int32 x # 目標的X坐標int32 y # 目標的Y坐標
定義中有兩個部分,上邊是獲取目標位置的指令,get為true的話,就表示我們需要一次位置,服務端就會反饋這個x、y坐標了。
完成定義后,還需要在功能包的CMakeLists.txt中配置編譯選項,讓編譯器在編譯過程中,根據接口定義,自動生成不同語言的代碼:
...find_package(rosidl_default_generators REQUIRED)rosidl_generate_interfaces(${PROJECT_NAME} "srv/GetObjectPosition.srv")...
功能包的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 > ...
程序調用
我們在代碼中再來重點看下接口的使用方法。
客戶端接口調用
learning_service/service_object_client.py
#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居@說明: ROS2服務示例-請求目標識別,等待目標位置應答"""import rclpy # ROS2 Python接口庫from rclpy.node import Node # ROS2 節點類from learning_interface.srv import GetObjectPosition # 自定義的服務接口class objectClient(Node): def __init__(self, name): super().__init__(name) # ROS2節點父類初始化 self.client = self.create_client(GetObjectPosition, 'get_target_position') while not self.client.wait_for_service(timeout_sec=1.0): self.get_logger().info('service not available, waiting again...') self.request = GetObjectPosition.Request() def send_request(self): self.request.get = True self.future = self.client.call_async(self.request)def main(args=None): rclpy.init(args=args) # ROS2 Python接口初始化 node = objectClient("service_object_client") # 創建ROS2節點對象并進行初始化 node.send_request() while rclpy.ok(): rclpy.spin_once(node) if node.future.done(): try: response = node.future.result() except Exception as e: node.get_logger().info( 'Service call failed %r' % (e,)) else: node.get_logger().info( 'Result of object position:n x: %d y: %d' % (response.x, response.y)) break node.destroy_node() # 銷毀節點對象 rclpy.shutdown() # 關閉ROS2 Python接口
服務端接口調用
learning_service/service_object_server.py
#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居(www.guyuehome.
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
通信接口
+關注
關注
3文章
264瀏覽量
31914 -
服務端
+關注
關注
0文章
69瀏覽量
7364 -
ROS
+關注
關注
1文章
293瀏覽量
18728
發布評論請先 登錄
相關推薦
熱點推薦
ROS通信接口機制介紹
ROS通信接口 接口可以讓程序之間的依賴降低,便于我們使用別人的代碼,也方便別人使用我們的代碼,這就是ROS的核心目標,減少重復造輪子。 ROS有三種常用的通信機制,分別是話題、
fpga仿真器接口定義
FPGA(Field-Programmable Gate Array,現場可編程門陣列)仿真器接口的定義主要依賴于仿真器的具體設計和所支持的通信協議。在FPGA的設計和仿真過程中,接口
服務通信接口的定義與使用
評論