一、概述
ROS是機器人操作系統,是一個開源的、靈活的、分散式的軟體平台,可以幫助我們快速開發機器人應用程序。ROS中的通信是機器人應用程序開發中最重要的部分之一,它是實現多模塊協作和互聯的關鍵。ROS提供了多種通信方式來支持不同類型的應用場景,包括如下:
- Publisher/Subscriber方式:發布者和訂閱者模式,用於實時傳輸數據。
- Service/Client方式:客戶端和服務端模式,用於請求和響應一個計算任務。
- Action Server/Action Client方式: 提供了對連續和非同步處理的支持。
二、Publisher/Subscriber方式
Publisher/Subscriber(發布者和訂閱者)方式是ROS中最常用的通信方式,它是基於消息傳遞的。通過這種方式,我們可以在一個節點中發布消息,而在其他節點中訂閱這個消息。它的原理類似於生產者-消費者模型,其中Publisher(發布者)是生產者,而Subscriber(訂閱者)是消費者。
下面是Python代碼示例
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def callback(data):
rospy.loginfo("I heard %s",data.data)
def listener():
rospy.init_node('listener', anonymous=True)
rospy.Subscriber("chatter", String, callback)
rospy.spin()
if __name__ == '__main__':
listener()
這段代碼創建了一個名為「listener」的節點,它訂閱名為「chatter」的消息。回調函數callback()是Subscriber()從ROS Master獲取到信息後需要執行的任務。在此示例中,Subscriber將從話題「chatter」讀取消息,並在終端窗口中列印它。
三、Service/Client方式
Service/Client(服務端和客戶端)方式是RPC(Remote Procedure Call)風格的模式,可以像調用本地函數一樣調用遠程計算機上的函數。其中,Service Server提供一個服務,而Service Client向Service Server發送請求。一旦Service Server收到請求,它將計算請求並將結果發送回Service Client。
下面是Python代碼示例:
#!/usr/bin/env python
from beginner_tutorials.srv import AddTwoInts,AddTwoIntsResponse
import rospy
def handle_add_two_ints(req):
result = req.a + req.b
rospy.loginfo("Returning [%s + %s = %s]", req.a, req.b, result)
return AddTwoIntsResponse(result)
def add_two_ints_server():
rospy.init_node('add_two_ints_server')
s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)
rospy.loginfo("Ready to add two ints.")
rospy.spin()
if __name__ == "__main__":
add_two_ints_server()
在此示例中,代碼定義了一個名為「add_two_ints」的服務。handle_add_two_ints()函數是處理「AddTwoInts」服務請求的回調函數,它將兩個整數相加並返回結果。add_two_ints_server()函數初始化ROS節點並創建一個服務,當它收到請求時,它調用handle_add_two_ints()函數處理請求,並將其響應返回給Service Client。
四、Action Server/Action Client方式
Action Server/Action Client方式提供了對連續和非同步處理的支持。在ROS中,Action是一個新的消息類型,相對於ROS中的其他消息類型來說,它保留了更多的信息,比如跟蹤Action調用的進度等。Action Server等待Action Client發送請求,一旦收到請求,就可以在內部執行類似於後台進程的操作。
下面是Python代碼示例:
#!/usr/bin/env python
import rospy
import actionlib
from beginner_tutorials.msg import FibonacciAction, FibonacciGoal, FibonacciResult
class FibonacciActionServer(object):
_feedback = FibonacciFeedback()
_result = FibonacciResult()
def __init__(self):
self._as = actionlib.SimpleActionServer("fibonacci", FibonacciAction, self.goal_callback, False)
self._as.start()
def fibonacci(self, n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return self.fibonacci(n-1) + self.fibonacci(n-2)
def goal_callback(self, goal):
r = rospy.Rate(1)
success = True
for i in range(1, goal.order+1):
if self._as.is_preempt_requested():
rospy.loginfo('Goal was Preempted')
self._as.set_preempted()
success = False
break
self._feedback.sequence.append(self.fibonacci(i))
self._as.publish_feedback(self._feedback)
r.sleep()
if success:
self._result.sequence = self._feedback.sequence
rospy.loginfo('Goal was successfully completed')
self._as.set_succeeded(self._result)
if __name__ == '__main__':
rospy.init_node('fibonacci_action_server')
server = FibonacciActionServer()
rospy.spin()
在此示例中,代碼定義了一個名為「fibonacci」的Action。FibonacciActionServer()類是Action Server,它等待Action Client發送請求。goal_callback()函數是執行操作的回調函數。在這裡,它通過計算斐波那契數列來演示操作的執行。在此過程中,它將生成的數據(響應)發送給Action Client。如果Action Client的請求被取消,它將發布Preempted(已取消)狀態,如果操作成功完成,它將發布Succeeded(成功)狀態,並帶上最終響應。
原創文章,作者:JUXVI,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/372883.html