On Sat, May 22, 2010 at 5:59 AM, Andrew Harris wrote: >   I'm interested in implementing a client library in language X. > I've read the below "Implementing Client Libraries" page, and it's > quite informative.  I know that a ros node has to have an XMLRPC > server running as well as an additional TCP socket to handle incoming > topic connection requests and that the node also has to support a > commandline API.  The thing I am not so sure about is all of the > marshalling and demarshalling stuff that is created automatically for, > for example, the rospy client.  I define my new messages in a YAML > file and there is some magic that creates python functions to do the > marshalling and demarshalling.  That implies that I must also write > functions in some language (not necessarily language X) that reads > YAML files and outputs marshalling and demarshalling routines in > language X?  And it has to integrate with cmake?  This is the part > that I am not so sure about. hi Andrew, Marshaling code is produced by language-specific code generators. They parse the .msg and .srv files (the syntax is C-like, not YAML) and produce bindings for each language. We've recently reorganized the code used by rospy to make it easier to write new generators. You can see the first example of this new way of writing generators in roscpp (in the unstable 1.1.x series), specifically src/roscpp/msg_gen.py, scripts/genmsg_cpp.py, and scripts/gensrv_cpp.py. The two scripts are called during the build with .msg or .srv files as command-line arguments. As for integration with CMake, each client library should declare a dependency on `roslang` and export a cmake file to roslang. You can see this is in, for example, roscpp/manifest.xml. The exported cmake file will be included automatically by the build system. That exported file should set up the targets necessary to invoke the code generators. There is not any documentation on writing that cmake file, but you should be able to figure it out by looking at the existing examples (e.g., roscpp/cmake/roscpp.cmake, rospy/cmake/rospy.cmake, roslisp/cmake/roslisp.cmake). Other than that, you just need to implement the transport(s) that you want to support. The first one should be TCPROS. brian.