how ros abstract away the underlying hardware and work with generic messages instead
I read the below passage on book, ROS-by-Example Vol1,CH4.14
Once you get used to this style of programming, there are some significant advantages. As we have already mentioned, many nodes can be reused without modification in other applications. Indeed, some ROS applications are little more than launch files combining existing nodes in new ways or using different values for the parameters. Furthermore, many of the nodes in a ROS application can run on different robots without modification. For example, the TurtleBot follower application can run on any robot that uses a depth camera and a mobile base. This is because ROS allows us to abstract away the underlying hardware and work with more generic messages instead.
I think this situation might only be suitable for something like artibox-powered robot, which is well supported by ROS thanks to packages like artibox_python, other than other controller-powered robot without ros package's support, am I right?
If so, then if I want to build a real robot, do I have to purchase artibox driver or sth like that in avoid to write low-lever code to control servo on my own?
I think I might be wrong because missing some basic concept about how ros controls a real robot in a low-level not a simulated one. Any recommended link? I really want to know more about how the last sentence in the above passage works.