python - 在单个 Docker 容器中开发 ROS 节点?
问题描述
我目前正在计划一个相当大的 ROS 项目,该项目将包含 15 个以上的节点,这些节点使用 Python2.x 或 C++ 开发,相互通信。我们将尝试将不同的任务隔离为单个节点,以保证单元可测试性和模块化,并提高未来项目的可重用性。
问题是为每个单独的节点创建一个 docker 容器是否值得努力,是否有任何缺点。最大的好处是我们可以拥有完全不同的系统,从开发人员个人电脑到构建机器,然后是节点部署到的设备。Docker 将依赖项和环境配置保存在一个可管理的位置,并解决了许多障碍。
但是这个想法有什么明显的缺点吗?在这种情况下,docker 是否存在显着的性能损失或其他障碍?
解决方案
在 docker 容器中创建隔离的 ROS 节点并不复杂,之前已经完成:
由于工作量没有那么高,我认为如果这些点在您的项目中得到解决,那么测试、可重用性、集成、交付等方面的改进是绝对值得商榷的。
由于 CPU 性能在 Docker 中没有缺点,因此您应该仔细研究 ROS 节点的通信,这意味着在您的容器化 ROS 节点之间传递消息。在这里你可以找到你应该知道的两个缺点:
Socket 通信: 正如你在Networking with Docker: Don't meet the defaults中看到的,Docker 中的网络访问是通过额外的接口完成的,这会影响 ROS 消息的 TCP 传输。但对Docker 网络性能的性能分析显示影响很小。
Nodelet 使用: 由于nodelet加载在现有的主机 ROS 节点中,因此 ROS 节点之间的通信可以大大提高。使用 Docker,将无法使用 nodelet。
总而言之,您必须考虑在您的 ROS 节点之间传输哪些消息以及传输多少消息。如果传输了许多图像或其他大型消息,则绝对建议进行进一步分析。除了对节点进行更复杂的处理外,我找不到与在分离的 Docker 容器中使用 ROS 节点的概念相反的值得注意的点。
推荐阅读
- python - Seaborn:如何使用 PairGrid 获取 distplot 的 y 轴计数
- javascript - Onchange sessionStorage.clear() 不工作
- makefile - 为什么目标“mykernel.bin”的配方失败了?
- mysql - 如何通过sql查询获取本月在数据库中发送的平均电子邮件数
- angular - 无法在 Angular 5 的 tsconfig 中使用模块 esnext 进行动态模块导入
- c# - 获取调用方法的属性
- javascript - Aurelia:@autoinject 不注入元素
- asp.net-mvc - Asp 验证小数未正确绑定
- javascript - 删除数组对象内的字段-javascript
- jquery - jquery在onclick函数中淡入淡出div不起作用