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

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


将所有传感器放在一个节点中有意义吗?
我应该只将相同类型的传感器放在一个节点中还是更好?一个传感器只有一个节点?
拥有某种处理程序节点是一种好习惯,该处理程序节点从传感器获取输入并操纵相应的执行器,或者执行器节点和传感器节点应该直接通信吗?
带有处理程序的传感器节点和执行器节点融合在一起

带处理程序的传感器和执行器节点融合在一起/>对我而言,我认为最好的方法是使用某种处理程序,该处理程序处理传感器和执行器之间的通信,并为机器人的每个元素提供一个节点(如图2所示),因为这种方式的系统很松耦合并且可以轻松扩展,但是我想知道您的意见。

#1 楼

非常简短的答案:2


传感器

关于从传感器中读取是在一个节点中还是单独读取,您应该问自己以下问题:

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

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


节点可以在单独的处理器上运行
节点可以在将来的机器人中重用
与一个节点通信失败降低整个系统
可以从发生故障的传感器板上重新开始采集,可以与其他传感器分开进行

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

执行器

这是类似的。

例如,如果您设计的机器人手腕具有机械手的肌腱,则每个肌腱(无论出于何种原因)两个电机都负责同时使一个或多个关节运动另一个方向,然后将它们提供给同一个节点比分开分配更有意义。 h执行器。在那种情况下,每个都可以放在不同的节点中。除了与传感器完全相同的好处外,还有以下额外好处:


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

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

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

拥有控制器的优点有很多:负责一件事,它意味着:


简单性:这意味着


更容易开发
更容易调试
更少错误
出现故障的可能性很小


可重用性:因为如果具有相同的功能(例如消息和服务格式),则同一控制器可以用于不同的传感器节点。 >

在单独的硬件上执行:每个节点都可以在网络中移动。例如,传感器和执行器节点可以移至专用微控制器(例如,Arduino(我不建议这样做)),并将控制器移至PC上。结果简直是一团糟。假设没有控制器,让我们看一下每种情况:


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

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

总结:


将ROS用于非实时系统,其中延迟可能会偶尔增加。在这种情况下,可以随意拥有任意多个ROS节点。实际上,让每个ROS节点做一件事和做一件事是非常好的做法。这样,它们变得非常简单,并且变得高度可重用。
另一方面,对于实时系统,无论如何都要避免ROS。为此,存在像EtherCAT这样的原始语言和技术,并且经常使用临时解决方案。不是很好,但是很好。通常,系统不是很关键,并且故障的机会很小,以至于不时地重启并不大。这是鸵鸟算法!

评论


$ \ begingroup $
哇,非常详细的答案!非常感谢您的宝贵时间 ;)
$ \ endgroup $
–manf
14年6月16日在12:31

$ \ begingroup $
这是一个很好的答案,并且在今天仍然有用。这应该在官方ROS Wiki的教程页面上!
$ \ endgroup $
– h3ct0r
20年8月2日在20:40