編程開(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;
}
-
機(jī)器人
+關(guān)注
關(guān)注
213文章
29735瀏覽量
212854 -
通信
+關(guān)注
關(guān)注
18文章
6206瀏覽量
137810 -
編程
+關(guān)注
關(guān)注
88文章
3689瀏覽量
95245 -
ROS
+關(guān)注
關(guān)注
1文章
288瀏覽量
17742
發(fā)布評(píng)論請(qǐng)先 登錄
使用banana PI 作為管道機(jī)器人控制及數(shù)據(jù)傳輸
自己開(kāi)發(fā)的機(jī)器人圖形化編程軟件
智能救援機(jī)器人的功能和作用
工業(yè)機(jī)器人應(yīng)用編程考核設(shè)備分享
數(shù)據(jù)傳輸指令
stm32的幾種數(shù)據(jù)傳輸總結(jié)
機(jī)器人與編程的區(qū)別
Motoman機(jī)器人離線編程
Modem數(shù)據(jù)傳輸標(biāo)準(zhǔn)
數(shù)據(jù)傳輸,數(shù)據(jù)傳輸的工作方式有哪些?
數(shù)據(jù)傳輸速率是什么意思
什么是零拷貝技術(shù)

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

評(píng)論