一、rclcpp::ok
在rclcpp中,rclcpp::ok()
是一个非常常用的函数,它检测节点是否需要继续运行。我们可以在多个地方调用这个函数,例如在传感器数据处理代码中,以确定是否需要继续接收数据。在大多数情况下,这个函数不需要额外的参数,因为它将使用默认的上下文。代码示例:
#include <rclcpp/rclcpp.hpp>
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 <rclcpp/rclcpp.hpp>
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 <rclcpp/rclcpp.hpp>
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 <rclcpp/rclcpp.hpp>
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 <rclcpp/rclcpp.hpp>
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
时间(即距离上一个循环所经过的时间)并输出了消息。