0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

机器人零拷贝数据传输编程开发

麦辣鸡腿堡 来源:古月居 作者:古月居 2023-11-27 16:55 次阅读

编程开发

为了方便大家使用,TogetherROS针对零拷贝功能进行了封装,风格类似ROS2话题通信接口,还是话题通信一样的流程,我们只需要修改几个函数就可以实现啦。

图片

运行例程

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

图片

代码解析

发布者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) {
    // 创建publisher_hbmem,topic为"topic",QOS为KEEPLAST(10),以及默认的可靠传输
    publisher_ = this- >create_publisher_hbmem< hbmem_pubsub::msg::SampleMessage >(
        "topic", 10);


    // 定时器,每隔40毫秒调用一次timer_callback进行消息发送
    timer_ = this- >create_wall_timer(
        40ms, std::bind(&MinimalHbmemPublisher ::timer_callback, this));
  }


 private:
  // 定时器回调函数
  void timer_callback() {
    // 获取要发送的消息
    auto loanedMsg = publisher_- >borrow_loaned_message();
    // 判断消息是否可用,可能出现获取消息失败导致消息不可用的情况
    if (loanedMsg.is_valid()) {
      // 引用方式获取实际的消息
      auto& msg = loanedMsg.get();


      // 获取当前时间,单位为us
      auto time_now =
          std::chrono::duration_cast< std::chrono::microseconds >(
              std::chrono::steady_clock::now().time_since_epoch()).count();


      // 对消息的index和time_stamp进行赋值
      msg.index = count_;
      msg.time_stamp = time_now;


      // 打印发送消息
      RCLCPP_INFO(this- >get_logger(), "message: %d", msg.index);
      publisher_- >publish(std::move(loanedMsg));
      // 注意,发送后,loanedMsg已不可用
      // 计数器加一
      count_++;
    } else {
      // 获取消息失败,丢弃该消息
      RCLCPP_INFO(this- >get_logger(), "Failed to get LoanMessage!");
    }
  }


  // 定时器
  rclcpp::TimerBase::SharedPtr timer_;


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


  // 计数器
  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") {
    // 创建subscription_hbmem,topic为"sample",QOS为KEEPLAST(10),以及默认的可靠传输
    // 消息回调函数为topic_callback
    subscription_ =
        this- >create_subscription_hbmem< hbmem_pubsub::msg::SampleMessage >(
            "topic", 10,
            std::bind(&MinimalHbmemSubscriber ::topic_callback, this,
                      std::placeholders::_1));
  }


 private:
  // 消息回调函数
  void topic_callback(
      const hbmem_pubsub::msg::SampleMessage::SharedPtr msg) const {
    // 注意,msg只能在回调函数中使用,回调函数返回后,该消息就会被释放
    // 获取当前时间
    auto time_now =
        std::chrono::duration_cast< std::chrono::microseconds >(
            std::chrono::steady_clock::now().time_since_epoch())
            .count();
    // 计算延时并打印出来
    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;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器人
    +关注

    关注

    210

    文章

    28205

    浏览量

    206521
  • 通信
    +关注

    关注

    18

    文章

    5971

    浏览量

    135855
  • 编程
    +关注

    关注

    88

    文章

    3592

    浏览量

    93594
  • ROS
    ROS
    +关注

    关注

    1

    文章

    276

    浏览量

    16966
收藏 人收藏

    评论

    相关推荐

    使用banana PI 作为管道机器人控制及数据传输

    使用banana PI 作为管道机器人控制及数据传输转自 lemaker 版权保护banana pi 成功应用在管道机器人上.用于控制及视频数据传输管道
    发表于 08-09 21:21

    自己开发机器人图形化编程软件

    自己开发机器人图形化编程软件从2005年起就开始搞机器人教学了,至今每年夏天都举行机器人夏令营。10年来一直尝试做一款简单稳定好用的
    发表于 07-02 20:15

    智能救援机器人的功能和作用

      智能机器人配有许多能够识别环境参数的ADM238LJR传感器,可以采集蒸汽成分、现场图像界面、障碍物等信息。该无线数据传输控制模块能够在上位机软件中友好地将准确的自然环境信息内容显示在现场,并
    发表于 11-30 15:10

    工业机器人应用编程考核设备分享

    ZNH-KH01工业机器人应用编程考核设备一、概述工业机器人应用编程考核设备能满足工业机器人应用编程
    发表于 07-01 11:06

    数据传输指令

    一、数据传输指令───────────────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.
    发表于 07-27 07:18

    stm32的几种数据传输总结

    引言在一般的项目开发过程中,往往需要两块或以上单片机进行通信完成数据传输,例如四旋翼无人机在飞行过程中无线传输数据回到地面站,治疗仪器需要实时将患者和
    发表于 08-23 07:32

    机器人编程的区别

    在前一篇文章中讲了机器人编程的区别,但总感觉讲的比较空泛,这篇文章继续讲讲那些区别。计算机编程机器人编程最大的区别就是一个是控制虚拟的,
    发表于 09-01 07:12

    Motoman机器人离线编程

    欢迎关注Jungle的Motoman机器人离线编程专栏系列文章:Motoman机器人离线编程——Motocom32开发简介Motoman
    发表于 09-07 07:33

    数据传输

    通信工程丛书--数据传输 这资料还是不错的,可供参考学习哦!
    发表于 03-25 00:53 29次下载

    Modem数据传输标准

     Modem数据传输标准 数据传输标准是指MODEM的
    发表于 12-28 13:29 1010次阅读

    数据传输,数据传输的工作方式有哪些?

    数据传输,数据传输的工作方式有哪些? 将数据从一个地方传输到另一个地方的方法多得令人难以置信。 数
    发表于 03-18 14:41 6010次阅读

    数据传输速率是什么意思

    数据传输速率是什么意思 数据传输速率是通过信道每秒可传输的数字信息量的量度。数据传输速率也称为吞吐率。数据传输速率由很
    发表于 03-18 14:45 4986次阅读

    XtremIO 集成拷贝数据管理 (iCDM)

    XtremIO 集成拷贝数据管理 (iCDM)
    发表于 12-25 00:31 0次下载

    什么是拷贝技术

    在传统操作系统的数据传输过程中,系统内部会在磁盘、内存、缓存中多次进行数据拷贝,每次都会占用CPU的资源,数据量小的时候还好。 随着数据量的
    的头像 发表于 11-27 16:20 435次阅读
    什么是<b class='flag-5'>零</b><b class='flag-5'>拷贝</b>技术

    如何进行拷贝性能测试

    10 -s 1 -m Array4m -r 100 -- max -runtime 30 #未开启 开启拷贝数据传输: $ ros2 run performance_test perf_test
    的头像 发表于 11-27 16:51 408次阅读
    如何进行<b class='flag-5'>零</b><b class='flag-5'>拷贝</b>性能测试