编程开发
为了方便大家使用,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
+关注
关注
1文章
276浏览量
16966
发布评论请先 登录
相关推荐
使用banana PI 作为管道机器人控制及数据传输
使用banana PI 作为管道机器人控制及数据传输转自 lemaker 版权保护banana pi 成功应用在管道机器人上.用于控制及视频数据传输管道
发表于 08-09 21:21
智能救援机器人的功能和作用
智能机器人配有许多能够识别环境参数的ADM238LJR传感器,可以采集蒸汽成分、现场图像界面、障碍物等信息。该无线数据传输控制模块能够在上位机软件中友好地将准确的自然环境信息内容显示在现场,并
发表于 11-30 15:10
数据传输指令
一、数据传输指令───────────────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.
发表于 07-27 07:18
stm32的几种数据传输总结
引言在一般的项目开发过程中,往往需要两块或以上单片机进行通信完成数据传输,例如四旋翼无人机在飞行过程中无线传输数据回到地面站,治疗仪器需要实时将患者和
发表于 08-23 07:32
如何进行零拷贝性能测试
10 -s 1 -m Array4m -r 100 -- max -runtime 30 #未开启 开启零拷贝数据传输: $ ros2 run performance_test perf_test
评论