[ros-users] communicating with windows
Klaus Petersen
petersen at vftb.com
Tue Jun 15 16:56:28 UTC 2010
I found the ros / ice combination quite ideal. ice works on a very broad
range of operating systems (windows, linux, osx etc.) and languages
(c++, c#, java etc.). It shares with ros the feature, that it is very
easy to use and very quickly to setup (especially if you want to do
something simple). As long as ros is not natively cross-platform to
windows, this seems a very nice solution to reach from a ros node to
windows pcs on the network. I didnt check to many other middlewares
though, only ACE, OpenRTM and Yarp (and these are all quite different
pairs of shoes as well). Compared to these ice was definitely the
easiest and performance-wise strongest choice. At least from my perspective.
I will see that I post some example code from my application tomorrow.
Klaus
Ken Conley さんは書きました:
> I would second what Klaus recommends (i.e. find some glue and use it).
>
> To answer your C# question, you can implement the communication layer of
> ROS. It will probably take a couple of weeks, though I imagine C# is
> harder. Of the other clients, only rospy and roscpp were implemented
> from scratch. The rest were implemented on top of roscpp. The hard part
> is that you'll have to write a message generator. Our format is simple,
> but serializers take time to get right, and the lack of a ROS build
> toolchain on Windows will probably make your workflow painful. The wire
> protocol itself is very simple and couple be done in a day or so if
> you're trying to do something simple.
>
> However, there are a lot of middlewares out there, like ICE, and you
> just figure out what can bridge between C# on Windows and C++/Python on
> Linux. It will probably save you a lot of time and effort. ROS is more
> about the integration of a packaging system, online tools, and coding
> community -- not middleware. Until we get a more complete toolchain
> running on Windows, you might as well take a shortcut.
>
> - Ken
>
>
> On Tue, Jun 15, 2010 at 9:15 AM, Klaus Petersen <petersen at vftb.com
> <mailto:petersen at vftb.com>> wrote:
>
> Hi Aaron,
>
> I have done both, using the python framework to communicate from windows
> c++ with ros nodes on linux, and checked proprietary solutions. I will
> re-post what I think the easiest way is to communicate in the python way
> below. However, in the end I came to prefer to communicate between
> windows and ros using ice (www.zeroc.com <http://www.zeroc.com>) If
> you just need to pass some
> data, this is very easy to set up. Check the documentation, they have
> some examples for basic remote message calling for c# as well. Ice has
> of course a different scope than ros and can not substitute its
> functionality (except if you build your own framework around it), but as
> I said for quickly passing data it is excellent.
>
> Klaus
>
>
> The former post regarding windows / python / vc++ (not c# anyway):
>
> To receive ros standard messages (Float32 in this example) in vc++
> (thats what I checked it with) I did something like this:
>
> #undef _DEBUG
> #include <Python.h>
>
> // the method that gets embedded into python
> static PyObject* ros_indirect_callback(PyObject *self, PyObject *args)
> {
> double double_data;
>
> if (!PyArg_ParseTuple(args, "d", &double_data))
> return NULL;
>
> printf("Do something with the data %f here.\n", double_data);
>
> return Py_BuildValue("i", 0);
> }
>
> // some data in order to register the method
> static PyMethodDef embedded_methods[] =
> {
> {
> "ros_indirect_callback",
> ros_indirect_callback,
> METH_VARARGS,
> ""
> },
> {
> NULL,
> NULL,
> 0,
> NULL
> }
> };
>
> // thread that runs the ros node (gets locked after calling spin())
> void ros_thread::run(void)
> {
> Py_Initialize();
> Py_InitModule("ros_win", embedded_methods);
>
> PySys_SetArgv(0, argv);
>
> PyRun_SimpleString("import ros_win\n"
> "import roslib\n"
> "import rospy\n"
> "from std_msgs.msg import Float32" );
>
> PyRun_SimpleString("def callback(data):\n"
> " ros_win.ros_indirect_callback(data.data)\n" );
>
> PyRun_SimpleString("rospy.init_node('listener',
> anonymous=True)\n"
> "rospy.Subscriber('chatter', Float32, callback)\n"
> "rospy.spin()\n" );
> }
>
>
> To send messages:
>
> #undef _DEBUG
> #include <Python.h>
>
> #include <string>
> #include <boost/lexical_cast.hpp>
>
> using namespace std;
>
> void send_double_data(double v)
> {
> Py_Initialize();
> PySys_SetArgv(0, argv);
>
> string s_str = "str = " + boost::lexical_cast<std::string>(v);
> PyRun_SimpleString(s_str.c_str());
>
> PyRun_SimpleString("rospy.loginfo(str)\n"
> "pub.publish(Float32(str))\n");
> }
>
>
> For reference:
> http://www.ros.org/wiki/Windows
> http://docs.python.org/extending/index.html
> http://www.boost.org/doc/libs/1_42_0/libs/python/doc/index.html
>
>
> Aaron Solochek さんは書きました:
> > Yeah, I've read that. It addresses getting ROS running on windows,
> > which is not what I want to do. I don't need a complete ROS
> environment
> > on windows. All I need is to communicate with a ROS network.
> >
> > My question is whether it will be fairly straight forward to
> emulate a a
> > very simple ROS node on windows (capable of sending joystick
> commands),
> > or if that will be complicated enough that I'm better off doing
> > something proprietary for the windows<->ROS communication link.
> >
> > To be clear, I'm talking about trying to implement the bare minimum
> > required to appear as a ROS node to roscore (running on another
> machine)
> > from scratch in C#.
> >
> > -Aaron
> >
> >
> >
> > On 6/14/2010 5:18 PM, Ken Conley wrote:
> >> This wiki page has all the currently known ways of getting
> running on
> >> Windows:
> >>
> >> http://www.ros.org/wiki/Windows
> >>
> >> - Ken
> >>
> >> On Mon, Jun 14, 2010 at 11:18 AM, Aaron Solochek
> >> <aarons-ros at aberrant.org <mailto:aarons-ros at aberrant.org>
> <mailto:aarons-ros at aberrant.org <mailto:aarons-ros at aberrant.org>>>
> wrote:
> >>
> >> The system I'm working on uses ROS on the backend for a
> variety of
> >> control stuff, but has a user interface that is going to be
> written
> >> in C#.
> >>
> >> What is the recommended way to get some 2-way communication
> going
> >> between this windows program and ROS? Should I make a node
> on the linux
> >> box that speaks some proprietary thing with the windows
> program, or
> >> should I try to implement a ROS node in C#?
> >>
> >> Better yet, has anyone already done something I can use for
> this? :)
> >>
> >> Any advice would be appreciated, and please copy me on
> replies since I'm
> >> only getting the daily digest of this list.
> >>
> >> Thanks,
> >>
> >> -Aaron
> >> _______________________________________________
> >> ros-users mailing list
> >> ros-users at code.ros.org <mailto:ros-users at code.ros.org>
> <mailto:ros-users at code.ros.org <mailto:ros-users at code.ros.org>>
> >> https://code.ros.org/mailman/listinfo/ros-users
> >>
> >>
> >> !DSPAM:4c169cd0309315323969998!
> >
> > _______________________________________________
> > ros-users mailing list
> > ros-users at code.ros.org <mailto:ros-users at code.ros.org>
> > https://code.ros.org/mailman/listinfo/ros-users
> >
>
> _______________________________________________
> ros-users mailing list
> ros-users at code.ros.org <mailto:ros-users at code.ros.org>
> https://code.ros.org/mailman/listinfo/ros-users
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> ros-users mailing list
> ros-users at code.ros.org
> https://code.ros.org/mailman/listinfo/ros-users
More information about the ros-users
mailing list