0

我有一个常见问题的节点,并且该节点中有一个参数。当这个参数发生变化时,它怎么能戳到其他节点来感知呢?

例如:我有一个停止机器人的服务。当我调用这个服务时,其他节点应该知道因为一些问题,例如等待、整理、取消计划。

首先,我尝试在节点中创建具有相同名称的服务,但它不起作用。只有,最后一次运行的服务才有效。然后,我尝试使用参数服务。这时候其他节点应该一直监听参数服务并检查。我不想使用这种方法来解决执行问题。最后,我尝试使用动态重新配置。不幸的是,动态重新配置仅与特定节点相关。

我对这种情况有另一种看法,那就是 Signal & Slot 机制。但是,我不想使用 QT 或任何其他 3rd 方框架。

我知道,我很精致 :) 我想学习你的方法。有什么轻巧的方法吗?

谢谢!

4

1 回答 1

0

我要把它扔在那里,对于 ros 中的大多数信息通信事情,消息和回调是要走的路,95% 的时间。在那之后,动作比服务有更多有效的用例/更好的集成;动态重新配置是一个糟糕的选择,通常来自糟糕的设计。

ros参数服务器只有在节点请求时才获取参数,所以如果在参数服务器中更改了值,默认不会抓取新的值。参数服务器最好用在启动文件中,用于在执行前更改运行时条件,但不强制重新编译。

最简单和最清晰的解决方案是使用主题来发送任何更改,并为此在所有其他节点中进行回调。这个事件驱动的回调系统正是你所要求的:当事件发生时,做某事;这就是 ros 的设计理念。

如果这是代码重复,您可以将多余的回调/代码提取到单独的文件中以包含/导入。如果您发现自己有多个同时更改的值,您可以制作自己的消息(类型)来发送捆绑的值,或者您可以使用多个主题。

于 2020-10-01T17:11:13.783 回答