国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ROS2從入門到精通1-2:詳解ROS2服務(wù)通信機(jī)制與自定義服務(wù)

這篇具有很好參考價(jià)值的文章主要介紹了ROS2從入門到精通1-2:詳解ROS2服務(wù)通信機(jī)制與自定義服務(wù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

0 專欄介紹

本專欄旨在通過對(duì)ROS2的系統(tǒng)學(xué)習(xí),掌握ROS2底層基本分布式原理,并具有機(jī)器人建模和應(yīng)用ROS2進(jìn)行實(shí)際項(xiàng)目的開發(fā)和調(diào)試的工程能力。

??詳情:《ROS2從入門到精通》


1 服務(wù)通信模型

服務(wù)是 ROS 圖中節(jié)點(diǎn)之間的另一種通信方法。服務(wù)基于服務(wù)器-客戶端模型,不同于話題的發(fā)布者-訂閱者模型。話題允許節(jié)點(diǎn)訂閱數(shù)據(jù)流并獲取持續(xù)更新,而服務(wù)只在客戶端特別調(diào)用時(shí)才提供數(shù)據(jù)。二者更詳細(xì)的對(duì)比請(qǐng)參考第5節(jié)

ROS2從入門到精通1-2:詳解ROS2服務(wù)通信機(jī)制與自定義服務(wù),ROS2從入門到精通,人工智能,ROS,機(jī)器人,自動(dòng)駕駛,ROS2

ROS2從入門到精通1-2:詳解ROS2服務(wù)通信機(jī)制與自定義服務(wù),ROS2從入門到精通,人工智能,ROS,機(jī)器人,自動(dòng)駕駛,ROS2

2 服務(wù)模型實(shí)現(xiàn)(C++)

實(shí)驗(yàn)?zāi)繕?biāo):客戶端提交請(qǐng)求給turtlesim功能包的/spawn服務(wù),在界面上生成新的烏龜。

  • 服務(wù)器

    本實(shí)驗(yàn)中無需編程,為turtlesim::Spawn定義的/spwan服務(wù)

  • 客戶端

    void OnResultCallBack(rclcpp::Client<turtlesim::srv::Spawn>::SharedFuture result) {
        auto response = result.get();
        RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Request service successfully! [turtle id: %s]", response->name.c_str());
    }
    
    void request() {
        auto spawn = std::make_shared<turtlesim::srv::Spawn::Request>();          
        spawn->name = "winter_turtle";
        spawn->x = 1.0;
        spawn->y = 1.0;
        spawn->theta = 1.57;
    
        while (!client_->wait_for_service(std::chrono::seconds(1))) {                                                   
            if (!rclcpp::ok()) {
                RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Interrupted while waiting for the service. Exiting.");
                return;
            }
            RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "service not available, waiting again...");
        }
    
        auto result = client_->async_send_request(spawn, std::bind(&ClientNode::OnResultCallBack, this, std::placeholders::_1));
    }
    

服務(wù)通信的效果如下所示:

ROS2從入門到精通1-2:詳解ROS2服務(wù)通信機(jī)制與自定義服務(wù),ROS2從入門到精通,人工智能,ROS,機(jī)器人,自動(dòng)駕駛,ROS2

3 服務(wù)模型實(shí)現(xiàn)(Python)

實(shí)驗(yàn)?zāi)繕?biāo):客戶端提交請(qǐng)求給turtlesim功能包的/spawn服務(wù),在界面上生成新的烏龜。

  • 服務(wù)器

    本實(shí)驗(yàn)中無需編程,為turtlesim::Spawn定義的/spwan服務(wù)

  • 客戶端

    class ClientNode(Node):
        def __init__(self, name):
            super().__init__(name)
            self.client = self.create_client(Spawn, '/spawn') 
    
            while not self.client.wait_for_service(timeout_sec=1.0):
                self.get_logger().info('service not available, waiting again...') 
            self.request = Spawn.Request()
                        
        def sendRequest(self):
            self.request.name = "winter_turtle"
            self.request.x = 1.0
            self.request.y = 1.0
            self.request.theta = 1.57
            self.future = self.client.call_async(self.request)
    

服務(wù)通信的效果如下所示:

ROS2從入門到精通1-2:詳解ROS2服務(wù)通信機(jī)制與自定義服務(wù),ROS2從入門到精通,人工智能,ROS,機(jī)器人,自動(dòng)駕駛,ROS2

4 自定義服務(wù)

自定義服務(wù)的通用流程如下:

  • 功能包下新建srv文件夾,在其中添加自定義服務(wù)xxx.srv,注意請(qǐng)求和響應(yīng)數(shù)據(jù)結(jié)構(gòu)使用---分割
  • 功能包package.xml中添加編譯依賴與執(zhí)行依賴
    <buildtool_depend>rosidl_default_generators</buildtool_depend>
    <exec_depend>rosidl_default_runtime</exec_depend>
    <member_of_group>rosidl_interface_packages</member_of_group>
    
  • 功能包CMakeLists.txt中添加編譯消息相關(guān)依賴
    find_package(rosidl_default_generators REQUIRED)
    rosidl_generate_interfaces(${PROJECT_NAME}
    	"xxx.srv"
    	DEPENDENCIES xxx_srvs
    )
    
    ament_export_dependencies(rosidl_default_runtime)
    
  • 編譯自定義消息,在install/<pkg_name>/include中生成由xxx.srv編譯的C++可識(shí)別的xxx.hpp頭文件
  • 引入xxx.hpp即可調(diào)用自定義服務(wù)

下面給出一個(gè)實(shí)例

添加如下自定義服務(wù)實(shí)現(xiàn)一個(gè)加法服務(wù),并按上面步驟配置依賴

# client
int32 a
int32 b
---
# server
int32 sum

定義一個(gè)服務(wù)器、一個(gè)客戶端,限于篇幅只貼出部分代碼,完整代碼見文末。

  • 服務(wù)器
    class ServerNode : public rclcpp::Node
    {
        public:
            ServerNode() : Node("lab_srv_server_own") {
                server_ = create_service<own_srv_lab::srv::Add>(
                    "/add_service",
                    std::bind(&ServerNode::OnAddSrvCallBack, this, std::placeholders::_1, std::placeholders::_2)
                ); 
            }
    
        private:
            rclcpp::Service<own_srv_lab::srv::Add>::SharedPtr server_;
    
            void OnAddSrvCallBack(
                const std::shared_ptr<own_srv_lab::srv::Add::Request> request, 
                std::shared_ptr<own_srv_lab::srv::Add::Response> response
            ) {
                response->sum = request->a + request->b;
                RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Incoming request\na: %d" " b: %d", request->a, request->b);
                RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "sending back response: [%d]", response->sum);
            }
    };
    
  • 客戶端
    ClientNode() : Node("lab_srv_client_own") {
        client_ = create_client<own_srv_lab::srv::Add>("/add_service"); 
    }
    
    void request(int a, int b) {
        auto add_srv = std::make_shared<own_srv_lab::srv::Add::Request>();
        add_srv->a = a;          
        add_srv->b = b;
    
        while (!client_->wait_for_service(std::chrono::seconds(1))) {                                                   
            if (!rclcpp::ok()) {
                RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Interrupted while waiting for the service. Exiting.");
                return;
            }
            RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "service not available, waiting again...");
        }
    
        auto result = client_->async_send_request(add_srv, std::bind(&ClientNode::OnResultCallBack, this, std::placeholders::_1));
    }
    

服務(wù)通信效果如下所示:

ROS2從入門到精通1-2:詳解ROS2服務(wù)通信機(jī)制與自定義服務(wù),ROS2從入門到精通,人工智能,ROS,機(jī)器人,自動(dòng)駕駛,ROS2

5 話題、服務(wù)通信的異同

對(duì)比 話題 服務(wù)
通信模式 發(fā)布-訂閱 請(qǐng)求-響應(yīng)
同步性 異步 同步
緩沖區(qū)
實(shí)時(shí)性 強(qiáng)
節(jié)點(diǎn)關(guān)系 多對(duì)多 一對(duì)多(1個(gè)server對(duì)應(yīng)一個(gè)服務(wù))
通信格式 .msg .srv
使用場景 連續(xù)高頻的數(shù)據(jù)傳輸,例如激光雷達(dá)、里程計(jì)傳輸數(shù)據(jù) 偶爾調(diào)用的功能,例如圖像識(shí)別

完整代碼通過下方博主名片聯(lián)系獲取


?? 更多精彩專欄文章來源地址http://www.zghlxwxcb.cn/news/detail-844989.html

  • 《ROS從入門到精通》
  • 《Pytorch深度學(xué)習(xí)實(shí)戰(zhàn)》
  • 《機(jī)器學(xué)習(xí)強(qiáng)基計(jì)劃》
  • 《運(yùn)動(dòng)規(guī)劃實(shí)戰(zhàn)精講》

??源碼獲取 · 技術(shù)交流 · 抱團(tuán)學(xué)習(xí) · 咨詢分享 請(qǐng)聯(lián)系??

到了這里,關(guān)于ROS2從入門到精通1-2:詳解ROS2服務(wù)通信機(jī)制與自定義服務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ROS:話題通信機(jī)制詳解

    ROS:話題通信機(jī)制詳解

    話題在ROS中使用最為頻繁,其通信模型也較為復(fù)雜。在ROS中有兩個(gè)節(jié)點(diǎn):一個(gè)是發(fā)布者Talker,另一個(gè)是訂閱著Listener。兩個(gè)節(jié)點(diǎn)分別發(fā)布、訂閱同一個(gè)話題,啟動(dòng)順序沒有強(qiáng)制要求,此處假設(shè)Talker首先啟動(dòng),可分為如下七步分析建立通信的詳細(xì)過程。 0、Talker注冊(cè) Talker啟動(dòng),

    2024年02月11日
    瀏覽(28)
  • ROS學(xué)習(xí)筆記(六)---服務(wù)通信機(jī)制

    ROS學(xué)習(xí)筆記(六)---服務(wù)通信機(jī)制

    在ROS中,服務(wù)通信機(jī)制是一種點(diǎn)對(duì)點(diǎn)的通信方式,用于節(jié)點(diǎn)之間的請(qǐng)求和響應(yīng)。它允許一個(gè)節(jié)點(diǎn)(服務(wù)請(qǐng)求方)向另一個(gè)節(jié)點(diǎn)(服務(wù)提供方)發(fā)送請(qǐng)求,并等待響應(yīng)。 服務(wù)通信機(jī)制在ROS中使用以下兩個(gè)概念: 服務(wù)(Service):服務(wù)是一種在ROS中定義的一對(duì)相關(guān)消息類型,包括

    2024年02月07日
    瀏覽(22)
  • ros2與web通信實(shí)例

    ros2與web通信實(shí)例

    最近需要進(jìn)行ros2與web端進(jìn)行通信操作,目標(biāo)是ros2發(fā)送的消息web端能夠顯示在界面,并且前端能夠發(fā)布數(shù)據(jù),最終實(shí)例如下: 然而網(wǎng)上查的的資料如古月居的: 利用Websocket實(shí)現(xiàn)ROS與Web的交互 https://www.guyuehome.com/5386 包括ros官網(wǎng)上以及目前網(wǎng)上絕大部分資料都是ros1與web交互的

    2024年02月21日
    瀏覽(14)
  • 【ROS2機(jī)器人入門到實(shí)戰(zhàn)】ROS2話題入門

    【ROS2機(jī)器人入門到實(shí)戰(zhàn)】ROS2話題入門

    當(dāng)前平臺(tái)文章匯總地址:ROS2機(jī)器人從入門到實(shí)戰(zhàn) 獲取完整教程及配套資料代碼,請(qǐng)關(guān)注公眾號(hào)魚香ROS獲取 教程配套機(jī)器人開發(fā)平臺(tái):兩驅(qū)版| 四驅(qū)版 為方便交流,搭建了機(jī)器人技術(shù)問答社區(qū):地址 fishros.org.cn 話題是ROS2中最常用的通信方式之一,話題通信采取的是訂閱發(fā)布

    2024年02月04日
    瀏覽(26)
  • 微信小程序和ros2進(jìn)行通信

    微信小程序和ros2進(jìn)行通信

    ??ROS2做為一款優(yōu)秀的機(jī)器人操作系統(tǒng)軟件,其搭載了豐富的機(jī)器人平臺(tái),是目前機(jī)器人領(lǐng)域應(yīng)用最多的軟件。微信做為一個(gè)大型社交軟件,應(yīng)用非常廣泛,其中的小程序直接通過掃二維碼進(jìn)行加載,使用起來非常方便快捷。為了讓手機(jī)端能夠?qū)C(jī)器人進(jìn)行操作,于是通過微

    2024年02月10日
    瀏覽(35)
  • 【ros2】ros2環(huán)境安裝與基礎(chǔ)入門

    【ros2】ros2環(huán)境安裝與基礎(chǔ)入門

    ?? ★,° :.☆( ̄▽ ̄)/$: .°★ ?? 這篇文章主要介紹ros2環(huán)境安裝與基礎(chǔ)入門。 學(xué)其所用,用其所學(xué)?!簡⒊?歡迎來到我的博客,一起學(xué)習(xí),共同進(jìn)步。 喜歡的朋友可以關(guān)注一下,下次更新不迷路?? ROS 2 (Robot Operating System 2)是一個(gè)開源的機(jī)器人操作系統(tǒng),它是ROS(Robot

    2024年02月09日
    瀏覽(23)
  • STM32 使用microros與ROS2通信

    STM32 使用microros與ROS2通信

    本文主要介紹如何在STM32中使用microros與ROS2進(jìn)行通信,在ROS1中標(biāo)準(zhǔn)的庫是rosserial,在ROS2中則是microros,目前網(wǎng)上的資料也有一部分了,但是都沒有提供完整可驗(yàn)證的demo,本文將根據(jù)提供的demo一步步給大家進(jìn)行演示。 1、首先如果你用的不是STM32F4的話,則需要自己去生成 micro_r

    2024年02月08日
    瀏覽(16)
  • 【ROS2機(jī)器人入門到實(shí)戰(zhàn)】2.ROS與ROS2對(duì)比

    【ROS2機(jī)器人入門到實(shí)戰(zhàn)】2.ROS與ROS2對(duì)比

    當(dāng)前平臺(tái)文章匯總地址:ROS2機(jī)器人從入門到實(shí)戰(zhàn) 獲取完整教程及配套資料代碼,請(qǐng)關(guān)注公眾號(hào)魚香ROS獲取 教程配套機(jī)器人開發(fā)平臺(tái):兩驅(qū)版| 四驅(qū)版 為方便交流,搭建了機(jī)器人技術(shù)問答社區(qū):地址 fishros.org.cn 經(jīng)過上一節(jié)的學(xué)習(xí),相信你已經(jīng)對(duì)ROS和ROS2的發(fā)展有了一定的了解

    2024年02月04日
    瀏覽(28)
  • 【ROS2機(jī)器人入門到實(shí)戰(zhàn)】ROS2接口介紹

    【ROS2機(jī)器人入門到實(shí)戰(zhàn)】ROS2接口介紹

    當(dāng)前平臺(tái)文章匯總地址:ROS2機(jī)器人從入門到實(shí)戰(zhàn) 獲取完整教程及配套資料代碼,請(qǐng)關(guān)注公眾號(hào)魚香ROS獲取 教程配套機(jī)器人開發(fā)平臺(tái):兩驅(qū)版| 四驅(qū)版 為方便交流,搭建了機(jī)器人技術(shù)問答社區(qū):地址 fishros.org.cn 本節(jié)小魚將會(huì)帶你學(xué)習(xí)認(rèn)識(shí)一個(gè)新的概念,叫做interface,即接口。

    2024年02月05日
    瀏覽(26)
  • 【ROS2機(jī)器人入門到實(shí)戰(zhàn)】ROS2節(jié)點(diǎn)介紹

    【ROS2機(jī)器人入門到實(shí)戰(zhàn)】ROS2節(jié)點(diǎn)介紹

    當(dāng)前平臺(tái)文章匯總地址:ROS2機(jī)器人從入門到實(shí)戰(zhàn) 獲取完整教程及配套資料代碼,請(qǐng)關(guān)注公眾號(hào)魚香ROS獲取 教程配套機(jī)器人開發(fā)平臺(tái):兩驅(qū)版| 四驅(qū)版 為方便交流,搭建了機(jī)器人技術(shù)問答社區(qū):地址 fishros.org.cn ROS2中每一個(gè)節(jié)點(diǎn)也是只負(fù)責(zé)一個(gè)單獨(dú)的模塊化的功能(比如一個(gè)

    2024年02月06日
    瀏覽(61)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包