Examples of good ROS boundaries
I'm working on converting a system to ROS, and have been looking for best practices for how to minimize the coupling between ROS and our core logic. Of course, everybody says to write a ROS-agnostic class and use a thin ROS wrapper to integrate it into your system. However, my search for documentation about what's considered "best practices" hasn't been rewarding.
So, I'm looking for examples of real modules that you think do this really well. I'm particularly interested in logging, actionlib and tf integration, since patterns for keeping them cleanly separate seem less obvious than pub/sub and parameters.
(So far, I've been looking at smach a fair bit - huge props to bohren for making that usable without ROS, though I'd like other examples. For example, I don't love how it handles the switch between ROS and non-ROS logging; the answers to this question hint at a better way.)