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

编程开发
为了方便大家使用,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 #include #include #include #include rclcpp/rclcpp.hpp#include hbmem_pubsub/msg/sample_message.hppusing 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( 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::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::sharedptr publisher_; // 计数器 size_t count_;};int main(int argc, char * argv[]){ rclcpp::init(argc, argv); rclcpp::spin(std::make_shared()); rclcpp::shutdown(); return 0;}订阅者subscriber_hbmem.cpp:
#include #include rclcpp/rclcpp.hpp#include hbmem_pubsub/msg/sample_message.hppclass minimalhbmemsubscriber : public rclcpp::node { public: minimalhbmemsubscriber () : node(minimal_hbmem_subscriber) { // 创建subscription_hbmem,topic为sample,qos为keeplast(10),以及默认的可靠传输 // 消息回调函数为topic_callback subscription_ = this- >create_subscription_hbmem( 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::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::sharedptr subscription_;};int main(int argc, char * argv[]){ rclcpp::init(argc, argv); rclcpp::spin(std::make_shared()); rclcpp::shutdown(); return 0;}

PCB布局时去耦电容安装在哪里比较好
蓝牙耳机怎么用
ADI携最新低功耗主动降噪芯片亮相蓝牙耳机展
中商北斗和币安中国区块链研究院合作 助力中国数字经济发展
盘古大模型和混元模型的区别
机器人零拷贝数据传输编程开发
华勤H8230 4U8卡AI服务器,助力企业数字化转型价值提升
踏歌智行参编的《智能化矿山数据融合共享规范》正式发布
CNR插槽
英菲尼迪将推首款纯电动跑车 使用新平台打造
“新基建”的东风已到来,国产IP将振翅高飞
HTC再次压注VR/AR技术 VR/AR将进入千家万户
外接再生电阻器时容量的设定分析
芯片解密人工智能未来的应用会有哪些
图解组装笔记本全过程(DIY很简单)
突发:OPPO关停哲库(ZEKU)业务!自研芯片要终止?
区块链在医疗保健中的应用有什么优点
纵享越级驾乘体验!第三代H6 DHT-PHEV带来更加平稳舒适的驾乘质感
Statek发布医疗遥测应用的微型晶体
AWE2018智能电视功能参数介绍