ROS2 - 检查节点是否还活着

问题描述 投票:0回答:2

这个问题类似于 ROS - 检查节点是否还活着(@Potaito),但现在这个问题是针对 ROS 2(准确地说是 Foxy)的。

简而言之解释我的问题。我正在尝试检查另一个发布者节点的客户端是否仍然存在。 rclcpp_lifecycle 可能是解决此问题的一种有趣方法,但它是为节点“正确”关闭或更改状态而设计的。我正在寻找一种更强大的方式,例如以防节点崩溃。因此,如果节点崩溃,发布者知道并且可以停止发布。

我发现更新到ROS 2的bondcpp库不能正常运行。
此外,仅通过函数

std::vector<std::string> rclcpp::Node::get_node_names() const
检查节点是否仍然存在可以工作,但速度太慢。从节点列表中删除死节点需要一段时间(~10-20 秒)。
这就是为什么我正在寻找替代方案。

这个问题还有其他解决方案吗?

c++ nodes communication ros2
2个回答
0
投票

ROS2 堆栈中本机 不存在此功能。你需要某种看门狗,你绝对可以在不做太多工作的情况下实现你自己的解决方案。

bondcpp should 为此工作。一个普遍使用 bond 的示例项目是 Nav2.

但是,

bondcpp
也会产生大量网络开销。

您还可以考虑实施自己的“心跳”主题,使用“按主题手动”Liveliness QoS,然后在计时器上断言活动节点内的活跃度。然后让观察者订阅“活力丢失”QoS 事件,以便在其他节点死亡或锁定时执行操作。

您可能还想看看software_watchdogs


0
投票

解决方案 1: 您可以使用 rclcpp 方法 get_subscriptions_info_by_topic 并检查特定主题的任何订阅者。这是一种可靠、强大的本机方式来实现您想要的。

解决方案 2: 另一种可能更通用(?)但肮脏的方法是检查节点的进程 ID。

C++ 而非 ROS2 检索 PID 的特定代码是:

#include <unistd.h>  
std::cout << "pid= " << getpid() << std::endl;

然后您可以将 PID 发送到必须检查它是否存在的节点。为此,您可以向进程发送 kill(0) 调用并检查返回值。通过使用回调计时器,您可以同步检查。但是请注意,您的进程可能会终止,而其他东西可能会占用其进程 ID。

#include <signal.h>
int kill(pid_t pid, int sig);
© www.soinside.com 2019 - 2024. All rights reserved.