ROS:最佳做法?


14

我将构建一个小型机器人系统,似乎ROS提供了一个不错的框架来控制和编程系统。

但是,我想知道哪种是管理机器人组件的最佳实践。

  • 将所有传感器放在一个节点上有意义吗?

  • 我应该只将同一类型的传感器放在一个节点中还是将一个节点用于一个传感器更好?

  • 拥有某种处理程序节点是一种好习惯,该处理程序节点从传感器获取输入并操纵相应的执行器,或者执行器节点和传感器节点应该直接通信吗?


  1. 融合了传感器节点和执行器节点的执行器 1.将传感器节点和执行器节点与处理程序融合

  2. 带处理程序的单个传感器和执行器节点 在此处输入图片说明

  3. 直接沟通 在此处输入图片说明

对我来说,最好是拥有某种处理程序,该处理程序处理传感器和执行器之间的通信,并为机器人的每个元素提供一个节点(如图2所示),因为系统以这种方式松散耦合并可以轻松扩展,但是我想知道您的意见。

Answers:


15

很短的答案:2


感测器

关于是从传感器中读取所有数据,还是在一个节点中或分别读取,您应该问自己一个问题:

传感器是否没有其他意义?

该问题询问传感器是否紧密耦合。例如,假设您有一个对温度敏感的传感器(您需要对其进行补偿)。您添加温度传感器主要是为了固定另一个传感器的值。在这种情况下,同时读取两个值是有意义的,因为它们是紧密耦合的。实际上,如果没有温度传感器的读数,原始传感器的读数就没有用。

另一方面,如果传感器单独有用,则一定要将它们放在单独的节点中。这有很多好处:

  • 节点可以在单独的处理器上运行
  • 这些节点可以在未来的机器人中重用
  • 与一个节点的通信失败不会使整个系统瘫痪
  • 从有故障的传感器板上重新开始采集可以与其他操作分开进行

实际上,如果您需要上述任何好处,即使传感器紧密耦合,也必须使用单独的节点,但这通常不会发生。

执行器

这是类似的。

没有其他执行器就没有意义吗?

例如,如果您要设计一个具有机械手腱的手腕,对于每个肌腱(无论出于何种原因),两个电动机负责同时朝一个方向或另一个方向移动关节,那么在同一节点中使用它们会产生更多的作用感觉比分开。

另一方面,在执行器是独立的情况下(常见情况),每个执行器都有一个节点是有意义的。在那种情况下,每个都可以放在不同的节点中。除了与传感器完全相同的好处外,还有以下好处:

  • 如果一个执行器停转(出于某种原因),其他执行器仍然起作用。如果存在多余的自由度,他们甚至可以完全补偿它。

这有一个含义。如果需要执行器协调工作,则将它们放在同一节点中。这不仅是因为通信失败,还因为不同的节点意味着不同的延迟。在分布式系统上,每个节点位于网络的不同部分,因此延迟有所不同;在集中式系统上,由于每个进程的运气不好,在高CPU负载下会发生不同的延迟。

应该有处理程序吗?

即使答案是“取决于”,也存在一种具有许多优点的通用方法。让我们更改名称并将其称为“控制器”。方法是“是的,应该有一个控制器”。

拥有控制器的优点有很多:

  • 解耦处理:每个节点负责一件事情,这意味着:
    • 简单性:这意味着
      • 更容易开发
      • 更容易调试
      • 错误更少
      • 更少的失败机会
    • 可重用性:因为如果具有相同的功能(即消息和服务格式),则同一控制器可以与不同的传感器节点一起使用。
  • 在单独的硬件上执行:每个节点都可以在网络中移动。例如,传感器和执行器节点可以移动到专用微控制器(例如,Arduino(我不建议这样做))和PC上的控制器。
  • 避免极端的丑陋:如果传感器想直接影响执行器,结果就是一团糟。假设没有控制器,让我们看一下每种情况:
    • 一个传感器节点:基本上,这意味着传感器节点和控制器放在同一节点中。还不错,但是非常不必要。
    • 许多传感器节点:这是一团糟。这意味着控制器分布在传感器节点之间。因此,所有传感器节点必须彼此对话以知道如何控制其相关联的致动器。想象一下通信失败或各种延迟,您会发现它变得多么困难。鉴于这完全没有必要,因此没有理由这样做!

这些说,也有弊端。具有更多节点(任何节点,而不仅仅是控制器)意味着:

  • 浪费更多的通信:数据必须通过网络或共享内存以标准格式(如此进行序列化和反序列化)移动,ROS内核必须查看它们并决定将数据传递给谁,等等。总之,浪费了一些系统资源在沟通中。如果所有节点合而为一,则该成本可能为零。
  • 故障的可能性更高:如果由于某种原因网络链路断开或节点死亡,则表明系统存在故障。如果您没有做好准备,那么它可能会破坏整个系统。现在,一般来说,丢失部分系统而不是全部丢失(正常降级)实际上是一件好事,但是在某些应用程序中,应尽可能避免这种情况。减少通信并将所有代码放在一个节点中实际上有助于提高系统稳定性。不利的一面当然是,系统要么运行正常,要么突然完全消失。
  • 时序混乱:每个节点都独立运行。消息到达其他消息所花费的时间是不确定的,并且每次运行都不同。除非您的节点为每条消息加上时间戳(作为旁注:您需要在一定程度上使时钟同步,而ROS则没有),并且除非每个接收节点都可以考虑延迟并据此进行控制(这是一项非常困难的任务)本身),那么拥有多个节点就意味着数据寿命的高度不确定性。实际上,这是大多数机器人运动如此之慢的原因之一。它们的控制回路必须足够慢,以确保所有数据都与当前周期相对应。延迟越大,控制回路越慢。

在所有上述缺点中,解决方案是减少节点的数量,最好减少到单个节点。请稍等,这不再使用ROS!究竟。

总结一下:

  • 将ROS用于可能会偶尔引起延迟的非实时系统。在这种情况下,可以随意拥有任意多个ROS节点。实际上,让每个ROS节点做件事件事是非常好的做法。这样,它们变得非常简单,并且可以高度重用。
  • 另一方面,对于实时系统,一定要避免ROS。为此,有像EtherCAT这样的原始语言和技术,以及更多的是临时解决方案。

最后,在实践中,ROS很好。不是很好,但是很好。通常,系统不是很关键,并且故障的机会很小,以至于不时地重新启动并不是什么大问题。这就是鸵鸟算法


1
哇,非常详细的答案!非常感谢您
抽出宝贵的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.