ROS通信

一、概述

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
JUXVI的頭像JUXVI
上一篇 2025-04-25 15:26
下一篇 2025-04-25 15:26

相關推薦

  • 跨域通信浮標——實現客戶端之間的跨域通信

    本文將介紹跨域通信浮標的使用方法,該浮標可以實現客戶端之間的跨域通信,解決了瀏覽器同源策略的限制,讓開發者能夠更加方便地進行跨域通信。 一、浮標的原理 跨域通信浮標的原理是基於浮動…

    編程 2025-04-27
  • 通信專業Python和Java的開發技巧

    本文旨在介紹通信專業Python和Java的開發技巧,為讀者提供實用且可操作的思路和方法。 一、Python在通信領域中的應用 Python是一種優秀的程序設計語言,因其易學易用、…

    編程 2025-04-27
  • 使用ROS-OpenRAVE在機器人控制中的應用

    本文主要介紹ROS-OpenRAVE在機器人控制中的應用。ROS-OpenRAVE是一個功能強大的機器人操作系統,並且它提供了許多方便的工具,可以幫助我們快速開發和測試我們的機器人…

    編程 2025-04-27
  • ROS Gmapping演算法分析

    一、gmapping介紹 gmapping是一種在ROS(Robot Operating System)中使用的開源SLAM(simultaneous localization a…

    編程 2025-04-25
  • Python 進程通信

    當需要在不同進程之間進行通信時,Python 提供了幾種方法來實現進程間通信。這些方法包括隊列,管道,共享內存以及套接字。 1. 隊列 Python 隊列是進程安全的,並且可以很方…

    編程 2025-04-24
  • TIPC:多節點通信的高效解決方案

    一、TIPC概述 TIPC是一個Linux內核中的通信協議,在多節點通信場景下擁有出色的表現,被許多公司使用。 TIPC協議支持傳輸層的連接管理、擁塞控制、流量調整等高級特性,對於…

    編程 2025-04-24
  • c#串口通信數據讀取

    一、基礎概念 串口通信是指通過串口進行數據交換的過程。串口是指COM口,COM口是計算機硬體設備之一,其可進行非同步數據傳輸,因此能方便地進行數據收發,被廣泛應用於各種領域中。 串口…

    編程 2025-04-24
  • ROS串口通信詳解

    一、ROS介紹 ROS(Robot Operating System)是一個開源的機器人操作系統,為機器人軟體開發提供了很多功能包,如導航、定位、感知等。 ROS主要基於發布/訂閱…

    編程 2025-04-24
  • Vue組件之間的通信方式

    在Vue.js中,組件是構建應用程序的基本單元。每個Vue組件都是一個自包含的功能模塊,它可以通過props和事件在父組件和子組件之間進行通信。以下是幾種在Vue組件之間進行通信的…

    編程 2025-04-23
  • 可靠傳輸:保障通信的基礎

    在網路通信中,可靠傳輸是非常重要的一環。它保證了數據的完整性、可靠性和正確性,使得通信雙方能夠實現穩定、高效、準確的信息交換。從以下幾個方面來闡述可靠傳輸的實現過程和實現方法。 一…

    編程 2025-04-23

發表回復

登錄後才能評論