一、rclcpp::ok
在rclcpp中,rclcpp::ok()是一個非常常用的函數,它檢測節點是否需要繼續運行。我們可以在多個地方調用這個函數,例如在感測器數據處理代碼中,以確定是否需要繼續接收數據。在大多數情況下,這個函數不需要額外的參數,因為它將使用默認的上下文。代碼示例:
#include int main(int argc, char ** argv) { rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("my_node_name"); while (rclcpp::ok()) { // do something here } rclcpp::shutdown(); return 0; }
上面的代碼展示了如何在rclcpp中使用rclcpp::ok()函數來檢測節點是否需要繼續運行。它將在一個無限循環中運行,直到節點被關閉或拉起。在這個例子中,我們創建了一個名為”my_node_name”的節點,並在其中運行代碼。最後一定要調用rclcpp::shutdown()函數,釋放節點的所有資源。
二、rclcpp::spin
rclcpp::spin()函數是另一個在rclcpp中非常有用的函數。它會一直阻塞線程,直到節點被關閉或拉起。當它返回時,rclcpp::shutdown()函數也將自動被調用以釋放節點的所有資源。
#include int main(int argc, char ** argv) { rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("my_node_name"); // create subscriber, publisher or service here rclcpp::spin(node); return 0; }
在上面的例子中,我們使用了rclcpp::spin()函數,使節點保持運行狀態,並在節點運行時創建了許多不同的ROS組件(例如subscribers、publishers或services)。
三、rclcpp_info
rclcpp_info()是在ROS2中列印信息的一種方式。我們可以使用它來向終端輸出有用的調試信息或狀態信息。rclcpp_info()函數接受兩個參數,第一個參數是節點的指針,第二個參數是您想要列印的消息。
#include int main(int argc, char ** argv) { rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("my_node_name"); RCLCPP_INFO(node->get_logger(), "Hello, ROS2!"); rclcpp::shutdown(); return 0; }
在上述例子中,我們使用rclcpp_info()函數,向終端輸出「Hello, ROS2!」。我們向函數傳遞了node->get_logger()參數,以獲取當前節點的日誌記錄器,並向其發送消息。
四、rclcpp::init
rclcpp::init()是在rclcpp中初始化節點的函數。為了使節點能夠正常工作,必須在任何其他rclcpp函數之前調用它。如果在程序中有多個節點,每個節點都必須調用該函數來進行初始化。代碼示例:
#include int main(int argc, char ** argv) { rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("my_node_name"); // do something here rclcpp::shutdown(); return 0; }
在上述例子中,我們使用rclcpp::init()函數進行節點的初始化,並在節點運行時執行一些操作。最後,我們使用rclcpp::shutdown()函數來釋放所有節點資源。
五、rclcpp::Time
rclcpp::Time是在ROS2中處理時間的函數之一。它可以通過在生命周期中不斷調用函數(例如rclcpp::spin()或rclcpp::ok())來自己更新。我們可以使用它來記錄節點數據的時間戳,或者在程序中進行有關時間的測量。
#include int main(int argc, char ** argv) { rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("my_node_name"); rclcpp::WallTimer timer = node->create_wall_timer( std::chrono::milliseconds(1000), [](){RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Timer callback!");}); rclcpp::Time last_time = node->now(); while (rclcpp::ok()) { rclcpp::Duration elapsed = node->now() - last_time; last_time = node->now(); // do something here RCLCPP_INFO(node->get_logger(), "Elapsed time since last loop iteration: [%.6f] s", elapsed.seconds()); } rclcpp::shutdown(); return 0; }
在上面的例子中,我們使用了rclcpp::Time函數來記錄程序中某些操作的時間。我們聲明了兩個rclcpp::Time對象, last_time記錄單次循環的開始時間, node->now()記錄當前時間。我們還聲明了一個計時器(每1000ms觸發一次)並在其回調中輸出一條消息。最後,在每個循環中,我們計算了elapsed時間(即距離上一個循環所經過的時間)並輸出了消息。
原創文章,作者:LIDKT,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/363920.html