Difference between revisions of "Calico ROS"
From IPRE Wiki
Doug Blank (Talk | contribs) (→Calico) |
Doug Blank (Talk | contribs) (→Calico) |
||
Line 102: | Line 102: | ||
# In another terminal, start Calico: | # In another terminal, start Calico: | ||
# StartCalico | # StartCalico | ||
− | # Run sample code | + | # Run sample Python code (below) |
+ | # In another terminal, run rostopic | ||
+ | # rostopic echo DummyTopic | ||
<pre> | <pre> |
Revision as of 16:25, 14 October 2012
This page describes creating a ROS/Calico connection.
ROS
ROS is the Robot Operating System. Here we assume a standard ROS install.
RosCS
RosCS is a ROS package which creates a connection between Mono and ROS. It takes a C# file and dynamically builds all of the needed links into a set of dynamic link libraries (DLL).
First, we need a local copy of ROS. We are using the current version of ROS (called "fuerte"):
- source /opt/ros/fuerte/setup.bash
- mkdir ~/ros
- rosws init ~/ros /opt/ros/fuerte
- source ~/ros/setup.bash
- roscd
Next, we need to install the package RosCS:
- rosws set cn-roscs-ros-pkg --git https://code.google.com/p/cn-roscs-ros-pkg/
- source ~/ros/setup.sh
- rosws update cn-roscs-ros-pkg
- [remove <rosdep name="mono"> from ~/ros/cn-roscs-ros-pkg/roscs/manifest.xml]
- rosdep install roscs
Finally, we create a C# file and build the DLLs:
- mkdir sandbox
- rosws set ~/ros/sandbox
- source ~/ros/setup.sh
- cd sandbox
- roscreate-pkg ROS std_msgs rospy roscpp roscs
- Create a C# file in ROS/src/hello.cs (see below)
- Edit ROS/CMakeLists.txt to add text (see below)
- roscd ROS
- rosmake
If it compiles without errors, then you can copy the .dll and .so files from lib to Calico/modules/
- cd lib
- cp *.dll *.so ~/Calico/trunk/modules/
The next section explores using these libraries.
hello.cs:
using System; using System.Threading; using RosCS; public class RosCsExample { Node node; Publisher pub; public RosCsExample() { this.node = Node.MainNode; this.pub = new Publisher(this.node,"DummyTopic",RosCS.std_msgs.String.TypeId,1); this.node.Subscribe("DummyTopic",OnMessage,6); } public void OnMessage(RosCS.std_msgs.String msg) { Console.WriteLine("Got message: "+msg.Data); } public void Run() { int i = 0; while(RosSharp.Ok()) { RosCS.std_msgs.String msg = new RosCS.std_msgs.String(); msg.Data ="Hello "+i; this.pub.Send(msg); i++; Thread.Sleep(1000); } } public static void Main(string[] args) { RosSharp.Init("NodeName",args); RosCsExample rce = new RosCsExample(); rce.Run(); } }
Add to bottom of CMakeLists.txt:
rosbuild_include(roscs cncs) rosbuild_gen_cs_msg() rosbuild_gensrv() CSHARP_ADD_TARGET_DEPENDENCY(hello Mono.C5) CSHARP_ADD_EXE(hello src/hello.cs)
Calico
- In a terminal, run roscore:
- source ~/ros/setup.bash
- roscore
- In another terminal, start Calico:
- StartCalico
- Run sample Python code (below)
- In another terminal, run rostopic
- rostopic echo DummyTopic
import System import RosCS # First we initialize the root (NodeName) and get the node: RosCS.RosSharp.Init("NodeName", System.Array[str]([])) node = RosCS.Node.MainNode # Next, we create a publisher to post on a topic, here DummyTopic: publisher = RosCS.Publisher(node, "DummyTopic", RosCS.std_msgs.String.TypeId, 1) # It is setup to receive string messages # Next, we setup a receiver callback: def OnMessage(msg): ## msg is RosCS.std_msgs.String print("Got message: " + msg.Data); # Directly calling the Subscribe doesn't work because signature is based on type: # node.Subscribe("DummyTopic", OnMessage, 6) # So, we get the overload by type: Subscribe = node.Subscribe.Overloads[str, RosCS.OnString, int] # and call it: Subscribe("DummyTopic", OnMessage, 6) # And now we start sending and receiving messages: i = 0 while RosCS.RosSharp.Ok() and i < 10: # Create a string message: msg = RosCS.std_msgs.String() msg.Data = "Hello " + str(i) # Send it: publisher.Send(msg) # Wait for a second, and continue: i += 1 System.Threading.Thread.Sleep(1000)
Issues
- does it shutdown correctly?
- can we package this up so that it callable from other languages?