Drake 中 ROS 类服务通信的最佳实践

Best Practice for ROS-Service-like Communication in Drake

想象一下垃圾箱拣选场景:

我想实现抓取检测程序,它会不时被调用一次。这意味着该过程在等待调用时将保持空闲状态,什么也不做。在 ROS 中,我可能会使用 ROS-Service 来实现这一点。我想征求在 Drake 框架中执行此操作的最佳实践建议。

我也考虑了一些设计,但都没有满足我的要求。

P.S。这可能与主题没有直接关系。但是为了在上述设置中实现测试的确定性行为,我是否更正

好的。谢谢你的澄清。在单个进程中,时序语义最简单、最清晰。我更喜欢先把这些做对,然后引入 LCM/ROS 只是作为跨多个进程拆分计算的一种手段(为了性能,或者为设备驱动程序使用不同的编译单元,等等)。

您可以将控制器编写为连续时间或离散时间(如 tutorials). In the vast amount of cases, these will be the right semantics. I believe you are imagining a case where you have an occasional event (e.g. "a new object was detected" or "I need to replan") which would often appear as an RPC service call in ROS. We do have provisions for these in Drake (see e.g. "declare forced events" in LeafSystem 中所示),但简单地实现它们通常更清晰,例如一个简单的离散时间系统,检查其导入端口,并且仅在输入端口值发生变化以触发 activity 时才工作。这种方式的开销非常小,语义更简单的好处是可以使用更多工具进行日志分析、规划、控制、验证等

我希望能解决问题。如果您有不适合的特定案例,请告诉我们。