假设,我有一只或多只机器海龟,每只机器海龟都有一个左轮和一个右轮,左右轮上都有一个编码器。车轮可能具有PID控制的电机。在像ROS这样的系统中,人们可以通过分层命名系统访问系统和子系统:即/turtle_1/lwheel/pid/kp来设置左轮PID控制器的Kp参数,或者/turtle_3/lwheel/encoder来获取车轮的编码器读数。 海龟将是局域网上的节点。
由于 Erlang 具有用于注册进程的平面命名空间,因此应该如何实现这样的分层视图? 我想可以为层次结构中的每个级别注册一个进程,其名称是子系统的完整限定名称,如 (/turtle_1 表示顶级进程,/turtle_1/lwheel 表示控制轮子的进程,/turtle_1/lwheel_1/pid 等。是否有使用全局模块维护分层视图的最佳实践?
解决此问题的最简单方法是引入路由进程或路由映射,它可以将层次结构绑定到Pid
。您有以下几种选择:
-
gproc
提供了基于 ETS 的注册表表 - 实现层次结构并最终在 LAN 上进行转发的进程
- 全局 - 它采用任意术语作为名称,因此可以在命名空间中注册一个元组,这相当于具有树顺序命名空间。
- 更新 ETS 表的过程,以便路由决策本身位于邮件发件人中。
最佳方法取决于您在分布式设置中达成共识的需求和/或路由查找所需的速度。此外,无论是否,您都可以缓存路由查找。