一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

機(jī)器人零拷貝數(shù)據(jù)傳輸編程開(kāi)發(fā)

麥辣雞腿堡 ? 來(lái)源:古月居 ? 作者:古月居 ? 2023-11-27 16:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

編程開(kāi)發(fā)

為了方便大家使用,TogetherROS針對(duì)零拷貝功能進(jìn)行了封裝,風(fēng)格類似ROS2中話題通信接口,還是話題通信一樣的流程,我們只需要修改幾個(gè)函數(shù)就可以實(shí)現(xiàn)啦。

圖片

運(yùn)行例程

$ source /opt/tros/local_setup.bash
$ source install/local_setup.bash
$ ros2 run hbmem_pubsub talker
$ ros2 run hbmem_pubsub listener

圖片

代碼解析

發(fā)布者publisher_hbmem.cpp:

#include < chrono >
#include < functional >
#include < memory >
#include < string >


#include "rclcpp/rclcpp.hpp"
#include "hbmem_pubsub/msg/sample_message.hpp"


using namespace std::chrono_literals;




class MinimalHbmemPublisher  : public rclcpp::Node {
 public:
  MinimalHbmemPublisher () : Node("minimal_hbmem_publisher"), count_(0) {
    // 創(chuàng)建publisher_hbmem,topic為"topic",QOS為KEEPLAST(10),以及默認(rèn)的可靠傳輸
    publisher_ = this- >create_publisher_hbmem< hbmem_pubsub::msg::SampleMessage >(
        "topic", 10);


    // 定時(shí)器,每隔40毫秒調(diào)用一次timer_callback進(jìn)行消息發(fā)送
    timer_ = this- >create_wall_timer(
        40ms, std::bind(&MinimalHbmemPublisher ::timer_callback, this));
  }


 private:
  // 定時(shí)器回調(diào)函數(shù)
  void timer_callback() {
    // 獲取要發(fā)送的消息
    auto loanedMsg = publisher_- >borrow_loaned_message();
    // 判斷消息是否可用,可能出現(xiàn)獲取消息失敗導(dǎo)致消息不可用的情況
    if (loanedMsg.is_valid()) {
      // 引用方式獲取實(shí)際的消息
      auto& msg = loanedMsg.get();


      // 獲取當(dāng)前時(shí)間,單位為us
      auto time_now =
          std::chrono::duration_cast< std::chrono::microseconds >(
              std::chrono::steady_clock::now().time_since_epoch()).count();


      // 對(duì)消息的index和time_stamp進(jìn)行賦值
      msg.index = count_;
      msg.time_stamp = time_now;


      // 打印發(fā)送消息
      RCLCPP_INFO(this- >get_logger(), "message: %d", msg.index);
      publisher_- >publish(std::move(loanedMsg));
      // 注意,發(fā)送后,loanedMsg已不可用
      // 計(jì)數(shù)器加一
      count_++;
    } else {
      // 獲取消息失敗,丟棄該消息
      RCLCPP_INFO(this- >get_logger(), "Failed to get LoanMessage!");
    }
  }


  // 定時(shí)器
  rclcpp::TimerBase::SharedPtr timer_;


  // hbmem publisher
  rclcpp::PublisherHbmem< hbmem_pubsub::msg::SampleMessage >::SharedPtr publisher_;


  // 計(jì)數(shù)器
  size_t count_;
};


int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared< MinimalHbmemPublisher >());
  rclcpp::shutdown();
  return 0;
}

訂閱者subscriber_hbmem.cpp:

#include < memory >


#include "rclcpp/rclcpp.hpp"
#include "hbmem_pubsub/msg/sample_message.hpp"




class MinimalHbmemSubscriber  : public rclcpp::Node {
 public:
  MinimalHbmemSubscriber () : Node("minimal_hbmem_subscriber") {
    // 創(chuàng)建subscription_hbmem,topic為"sample",QOS為KEEPLAST(10),以及默認(rèn)的可靠傳輸
    // 消息回調(diào)函數(shù)為topic_callback
    subscription_ =
        this- >create_subscription_hbmem< hbmem_pubsub::msg::SampleMessage >(
            "topic", 10,
            std::bind(&MinimalHbmemSubscriber ::topic_callback, this,
                      std::placeholders::_1));
  }


 private:
  // 消息回調(diào)函數(shù)
  void topic_callback(
      const hbmem_pubsub::msg::SampleMessage::SharedPtr msg) const {
    // 注意,msg只能在回調(diào)函數(shù)中使用,回調(diào)函數(shù)返回后,該消息就會(huì)被釋放
    // 獲取當(dāng)前時(shí)間
    auto time_now =
        std::chrono::duration_cast< std::chrono::microseconds >(
            std::chrono::steady_clock::now().time_since_epoch())
            .count();
    // 計(jì)算延時(shí)并打印出來(lái)
    RCLCPP_INFO(this- >get_logger(), "msg %d, time cost %dus", msg- >index,
                time_now - msg- >time_stamp);
  }


  // hbmem subscription
  rclcpp::SubscriptionHbmem< hbmem_pubsub::msg::SampleMessage >::SharedPtr
      subscription_;
};




int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared< MinimalHbmemSubscriber >());
  rclcpp::shutdown();
  return 0;
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 機(jī)器人
    +關(guān)注

    關(guān)注

    213

    文章

    29735

    瀏覽量

    212854
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    6206

    瀏覽量

    137810
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95245
  • ROS
    ROS
    +關(guān)注

    關(guān)注

    1

    文章

    288

    瀏覽量

    17742
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    使用banana PI 作為管道機(jī)器人控制及數(shù)據(jù)傳輸

    使用banana PI 作為管道機(jī)器人控制及數(shù)據(jù)傳輸轉(zhuǎn)自 lemaker 版權(quán)保護(hù)banana pi 成功應(yīng)用在管道機(jī)器人上.用于控制及視頻數(shù)據(jù)傳輸管道
    發(fā)表于 08-09 21:21

    自己開(kāi)發(fā)機(jī)器人圖形化編程軟件

    自己開(kāi)發(fā)機(jī)器人圖形化編程軟件從2005年起就開(kāi)始搞機(jī)器人教學(xué)了,至今每年夏天都舉行機(jī)器人夏令營(yíng)。10年來(lái)一直嘗試做一款簡(jiǎn)單穩(wěn)定好用的
    發(fā)表于 07-02 20:15

    智能救援機(jī)器人的功能和作用

      智能機(jī)器人配有許多能夠識(shí)別環(huán)境參數(shù)的ADM238LJR傳感器,可以采集蒸汽成分、現(xiàn)場(chǎng)圖像界面、障礙物等信息。該無(wú)線數(shù)據(jù)傳輸控制模塊能夠在上位機(jī)軟件中友好地將準(zhǔn)確的自然環(huán)境信息內(nèi)容顯示在現(xiàn)場(chǎng),并
    發(fā)表于 11-30 15:10

    工業(yè)機(jī)器人應(yīng)用編程考核設(shè)備分享

    ZNH-KH01工業(yè)機(jī)器人應(yīng)用編程考核設(shè)備一、概述工業(yè)機(jī)器人應(yīng)用編程考核設(shè)備能滿足工業(yè)機(jī)器人應(yīng)用編程
    發(fā)表于 07-01 11:06

    數(shù)據(jù)傳輸指令

    一、數(shù)據(jù)傳輸指令───────────────────────────────────────它們?cè)诖尜A器和寄存器、寄存器和輸入輸出端口之間傳送數(shù)據(jù).1. 通用數(shù)據(jù)傳送指令.MOV 傳送字或字節(jié).MOVSX 先符號(hào)擴(kuò)展,再傳送.
    發(fā)表于 07-27 07:18

    stm32的幾種數(shù)據(jù)傳輸總結(jié)

    引言在一般的項(xiàng)目開(kāi)發(fā)過(guò)程中,往往需要兩塊或以上單片機(jī)進(jìn)行通信完成數(shù)據(jù)傳輸,例如四旋翼無(wú)人機(jī)在飛行過(guò)程中無(wú)線傳輸數(shù)據(jù)回到地面站,治療儀器需要實(shí)時(shí)將患者和
    發(fā)表于 08-23 07:32

    機(jī)器人編程的區(qū)別

    在前一篇文章中講了機(jī)器人編程的區(qū)別,但總感覺(jué)講的比較空泛,這篇文章繼續(xù)講講那些區(qū)別。計(jì)算機(jī)編程機(jī)器人編程最大的區(qū)別就是一個(gè)是控制虛擬的,
    發(fā)表于 09-01 07:12

    Motoman機(jī)器人離線編程

    歡迎關(guān)注Jungle的Motoman機(jī)器人離線編程專欄系列文章:Motoman機(jī)器人離線編程——Motocom32開(kāi)發(fā)簡(jiǎn)介Motoman
    發(fā)表于 09-07 07:33

    數(shù)據(jù)傳輸

    通信工程叢書(shū)--數(shù)據(jù)傳輸 這資料還是不錯(cuò)的,可供參考學(xué)習(xí)哦!
    發(fā)表于 03-25 00:53 ?29次下載

    Modem數(shù)據(jù)傳輸標(biāo)準(zhǔn)

     Modem數(shù)據(jù)傳輸標(biāo)準(zhǔn) 數(shù)據(jù)傳輸標(biāo)準(zhǔn)是指MODEM的
    發(fā)表于 12-28 13:29 ?1137次閱讀

    數(shù)據(jù)傳輸,數(shù)據(jù)傳輸的工作方式有哪些?

    數(shù)據(jù)傳輸,數(shù)據(jù)傳輸的工作方式有哪些? 將數(shù)據(jù)從一個(gè)地方傳輸到另一個(gè)地方的方法多得令人難以置信。 數(shù)
    發(fā)表于 03-18 14:41 ?6072次閱讀

    數(shù)據(jù)傳輸速率是什么意思

    數(shù)據(jù)傳輸速率是什么意思 數(shù)據(jù)傳輸速率是通過(guò)信道每秒可傳輸的數(shù)字信息量的量度。數(shù)據(jù)傳輸速率也稱為吞吐率。數(shù)據(jù)傳輸速率由很
    發(fā)表于 03-18 14:45 ?5089次閱讀

    XtremIO 集成拷貝數(shù)據(jù)管理 (iCDM)

    XtremIO 集成拷貝數(shù)據(jù)管理 (iCDM)
    發(fā)表于 12-25 00:31 ?0次下載

    什么是拷貝技術(shù)

    在傳統(tǒng)操作系統(tǒng)的數(shù)據(jù)傳輸過(guò)程中,系統(tǒng)內(nèi)部會(huì)在磁盤(pán)、內(nèi)存、緩存中多次進(jìn)行數(shù)據(jù)拷貝,每次都會(huì)占用CPU的資源,數(shù)據(jù)量小的時(shí)候還好。 隨著數(shù)據(jù)量的
    的頭像 發(fā)表于 11-27 16:20 ?725次閱讀
    什么是<b class='flag-5'>零</b><b class='flag-5'>拷貝</b>技術(shù)

    如何進(jìn)行拷貝性能測(cè)試

    10 -s 1 -m Array4m -r 100 -- max -runtime 30 #未開(kāi)啟 開(kāi)啟拷貝數(shù)據(jù)傳輸: $ ros2 run performance_test perf_test
    的頭像 發(fā)表于 11-27 16:51 ?720次閱讀
    如何進(jìn)行<b class='flag-5'>零</b><b class='flag-5'>拷貝</b>性能測(cè)試