一、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/n/363920.html