During the last few weeks I have been working with Microsoft Robotics Developer Studio, it incorporates a very powerful simulation environment that enables you to visualize your robot and even program it even before actually building it.
By default a lot of simulated entities, basic for robotics, are provided: Simulated IR Distance Sensor, Simulated Sonar, Simulated Webcam, Simulated GPS Sensor, Simulated Laser Range Finder, etc...
But I was missing another basic entity often used by robots: A Stereo Camera. After reading some posts at MRDS forum I could not find a suitable solution (easy and fast to implement), so I just built my own solution.
If you want to simulate a stereo camera on Microsoft Robotics Developer Studio, you can follow this 3 steps:
Step 1- Add this class to your project:
public class StereoCameraEntity { public CameraEntity leftCam; public CameraEntity rightCam; public StereoCameraEntity() { } public StereoCameraEntity( String parentEntityName,// The name of the parent entity (used to generate a unique name) int viewSizeX, //Image width int viewSizeY, //Image height float viewAngle,//View angle of the camera in degrees Vector3 position,//Position of the center of the stereo camera float baseLine,//Distance between the center of the cameras in centimeters bool isRealTime)//Renders every frame { //Initialize left camera leftCam = new CameraEntity( viewSizeX, viewSizeY, (float)(viewAngle * Math.PI / 180.0)); leftCam.State.Name = parentEntityName + "_LeftCam"; leftCam.IsRealTimeCamera = isRealTime; leftCam.State.Pose.Position = new Vector3( position.X - (baseLine / 100.0f) / 2.0f , position.Y, position.Z); //Initialize right camera rightCam = new CameraEntity( viewSizeX, viewSizeY, (float)(viewAngle * Math.PI / 180.0)); rightCam.State.Name = parentEntityName + "_RightCam"; rightCam.IsRealTimeCamera = isRealTime; rightCam.State.Pose.Position = new Vector3( position.X + (baseLine / 100.0f) / 2.0f , position.Y, position.Z); } }
This class is just a wrapper for CameraEntity. When calling the constructor for the new class that you just created you need to provide:
- parentEntityName: A string containing the name of the parent entity (It will be used to create a unique name for the cameras)
- viewSizeX: An integer for the horizontal resolution of the cameras (In pixels).
- viewSizeY: An integer for the vertical resolution of the cameras (In pixels).
- viewAngle: A float for the view angle of the cameras (in degrees).
- position: A Vector3 containing the position of the stereo camera (in meters).
- baseLine: The separation between the cameras (in centimeters).
- isRealTime: True to render every frame.
Step 2- Inside the constructor of your entity create a new StereoCameraEntity and insert it as a child:
StereoCameraEntity stereoCam = new StereoCameraEntity( name, 320, 240, 30.0f, new Vector3( xLocation, yLocation, zLocation), 10.0f, true); InsertEntityGlobal(stereoCam.leftCam); InsertEntityGlobal(stereoCam.rightCam);
This creates a new stereo camera with a resolution of 320x240 pixels, a field of view of 30 degrees, a base line of 10 centimeters, located at the point (xLocation, yLocation, zLocation) and rendering every frame.
Step 3- Modify the manifest of your project to include this:
<servicerecordtype> <dssp:contract>http://schemas.microsoft.com/2006/09/simulatedwebcam.html</dssp:contract> <dssp:service>http://localhost/MyRobot/LeftCam</dssp:service> <dssp:partnerlist> <dssp:partner> <dssp:service>http://localhost/MyRobot_LeftCam</dssp:service> <dssp:name>simcommon:Entity</dssp:name> </dssp:partner> </dssp:partnerlist> </servicerecordtype> <servicerecordtype> <dssp:contract>http://schemas.microsoft.com/2006/09/simulatedwebcam.html</dssp:contract> <dssp:service>http://localhost/MyRobot/RightCam</dssp:service> <dssp:partnerlist> <dssp:partner> <dssp:service>http://localhost/MyRobot_RightCam</dssp:service> <dssp:name>simcommon:Entity</dssp:name> </dssp:partner> </dssp:partnerlist> </servicerecordtype>
And that's it. This is the result of the simulation of a modified Corobot with stereo camera:
2 comments:
It would be easier to just use Artificial Robotic's AR Express.
hummm I wasn't aware of that software. It looks really nice. Thanks for the tip!
Post a Comment