編程開發
為了方便大家使用,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文章
28198瀏覽量
206514 -
通信
+關注
關注
18文章
5970瀏覽量
135853 -
編程
+關注
關注
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
評論