Orchestration services
Orchestration is a type of automated system arrangement, coordination and 
management of Complex computer systems and middleware as well. Middleware is 
actually software components and their applications. It allows interaction among 
number of processes which are running either on different machines. It is found 
in the middle between software working on different operating systems. It 
connects two applications and allows transfer of data between them. It enables 
users to access data of one database through another. Web Services Orchestration 
(WSO) is a process of collaborating web services, first interactions are done at 
different levels and then on the basis of those interactions web services are 
collaborated on those pre-defined patterns. This WSO is executed via 
'orchestration scripts'. In this article we will use C# to create reusable 
orchestration services. We are using Microsoft Robotics Developer Studio (RDS),It 
provides a reusable design for writing services It actually allows us to write a 
service once to a common hardware specification and then we can use that service 
across different platforms.
![]() 
 
We just have to
right click orchestration and select start 
Requirements:
Hardware:
As we have discussions about Hardware components in our article, we need a robot 
with microcontroller and sensor. Here we can use Infrared sensors. We require to 
keep sensors on front and rear part. We also require motors two motors in a two 
wheeled differential drive configuration. Do all the necessary connections.
Software:
     We can use Microsoft 
visual for this case
- 
	
	Microsoft Visual C# Express Edition. 
- 
	
	Microsoft Visual Studio Standard, Professional, or Team Edition.
Others?
Web Browser, We can use any web browser for this application.
Steps:
First of all, we will check out an existing service installed in 
samples\Robotics Tutorials\Tutorial(name)\CSharp.Load RoboticsTutorial.cjproj 
file. The service uses common definitions in RoboticsCommon.Proxy.dll.The Dll 
exists as a project reference.
C#
using contactsensor = 
Microsoft.Robotics.Services.ContactSensor.Proxy;
using drive = 
Microsoft.Robotics.Services.Drive.Proxy;
Using motor = 
Microsoft.Robotics.Services.Motor.Proxy;
Drive command to turn and move
As its name 
suggest, the Turn and move method does the following steps:
1.   
Reverse direction and move for 1500ms. 
2.   
Apply equal magnitude, but opposite polarity, power to the two motors in 
each wheel of the drive service.
This rotates the robot. 
3.   
Apply equal power to both motors for a random period of time to move the 
robot. 
C# 
Random 
_randomGen = new Random();
// <summary>
///create 
motion in robot
///
</summary>
///
<param 
="polarity">1 
for going forward, -1 for going backwards</param>
///
<returns></returns>
IEnumerator<ITask> 
BackUpTurnAndMove(double polarity)
{
// 
First backup a little
yield return 
Arbiter.Receive(false,
StartMove(0.4*polarity),
delegate(bool result) { });
// 
wait
yield return 
Arbiter.Receive(false, TimeoutPort(1500),
delegate(DateTime t) { });
// 
now Turn
yield return 
Arbiter.Receive(false,
StartTurn(),
delegate(bool result) { });
// 
wait
yield return 
Arbiter.Receive(false, TimeoutPort(1500),
delegate(DateTime t) { });
// now reverse direction and keep moving straight
yield return 
Arbiter.Receive(false,
StartMove(_randomGen.NextDouble()*polarity),
delegate(bool result) { });
// 
done
yield break;
}
Port<bool> StartTurn()
{
Port<bool> result = 
new Port<bool>()
// 
start a turn
SpawnIterator<Port<bool>>(result, 
RandomTurn);
return result;
}
Port<bool> 
StartMove(double powerLevel)
{
Port<bool> result = 
new Port<bool>();
// 
start movement
SpawnIterator<Port<bool>,
double>(result, powerLevel, MoveStraight);
return result;
}
IEnumerator<ITask> RandomTurn(Port<bool> done)
{
//motors commands are used to take turns, reverse polarity for right-left
double randomPower = _randomGen.NextDouble();
drive.SetDrivePowerRequest setPower = new 
drive.SetDrivePowerRequest(randomPower, -randomPower);
bool success = false;
yield return
Arbiter.Choice(
_drivePort.SetDrivePower(setPower),
delegate(DefaultUpdateResponseType rsp) { 
success = true; },
delegate(W3C.Soap.Fault failure)
{
//if 
error, then report
// try to do the same step even it results in failure
LogError("Failed 
setting drive power");
});
done.Post(success);
yield break;
}
IEnumerator<ITask> MoveStraight(Port<bool> 
done, double powerLevel)
{
drive.SetDrivePowerRequest setPower = new 
drive.SetDrivePowerRequest(powerLevel, powerLevel);
yield return
Arbiter.Choice(
_drivePort.SetDrivePower(setPower),
delegate(DefaultUpdateResponseType success) { done.Post(true); 
},
delegate(W3C.Soap.Fault failure)
{
//If 
error, then report           
//  try to do the next step even if it results in failure
LogError("Failed 
setting drive power");
done.Post(false);
});
}