
Abstract
The purpose of this project was to design and implement an experimental robot, which could determine its current position in a room and can go to the desired coordinate location. The motivations for this were two-fold. The first being that robotics is an excellent synthesis of hardware & software technology. Secondly the integration of Electronics Hardware coupled with high-level object oriented programming languages like JAVA & the fusion of basic fundamentals of mechanics & automation overall provide one the finest viewer-experience of a robotic device. A possible extension to this robot can prove to be very useful in enhancing the role of automation & software into the industry & common world around us.
The targeted design goal of this project is to construct a portable, reusable & multipurpose robotic device that is capable of guiding a visually impaired person around a room and help in transfer of material from one location to another
Vagabond
The purpose of Project Vagabond is a robot that after determining its current coordinates in a room travels to the desired coordinate location. The robot meets its objective as per the following:
· Establishing its current coordinates using three light sources attached to the wall of a room and a light sensor installed on the robot.
· Calculate the inclination and distance between its current and desired location.
· Move towards the desired coordinates.
· Constantly check its general direction of approach and make the required changes in its trajectory.
The Vagabond is useful in a wide range of applications such as:
Ø To guide a visually impaired person to a particular location in a room
Ø To perform ambulatory functions on behalf of a motor disabled person.
Ø To carry miscellaneous articles for bed ridden patients.
Ø To help in transfer of materials from one work station to another
Features of Vagabond:
Þ On-line determination of its current location
Þ Uses only three light sources attached to the wall
Þ Only one light sensor sufficient to detect the light sources.
Þ Independent motors for rotary and linear motions
Þ Needs only one rotation sensor to calculate its angle of rotation and linear distance traveled.
Þ The robot can calculate the coordinates of each location and the information can be stored in a database for future use.
Þ The RCX is separate from the robot and the destination coordinates can be fed from the database via the InfraRed
Hardware Used
RCX
2 Motors
Motor A-Controlling the rotational movement of the Vagabond
Motor B- Controlling the linear movement of the robot
Light Sensor: To detect the light sources and calculate its current coordinates.
Rotation Sensor-It is used to the angle of rotation and linear distance covered by the robot.
· Differential Gear
2 Worm Gears
Slip Clutch (24 teeth)
Bevel and Crown Gears
Spur Gears
Lego Building Blocks
Step-by-Step Approach
Approach / Problem Faced and Solution
· A mechanism should enable the robot to move in a perfectly straight trajectory.
PF:Two independent motors were used to drive each wheel, but they never produced the same speed and hence the robot never moved completely straight.
Soln: Both the wheels had to be connected to a single shaft driven by a single motor.
· A rotation mechanism should enable the robot to rotate while detecting the light
sources and also to incline itself at the desired angle.
Soln: One wheel of the robot was kept stationery while the other was rotated.
PF: The friction resulted in the rotation of the other wheel thus precluding the possibility of a single axis of rotation.
PF: Another problem was that the wheels were connected to the same shaft and thus it was impossible for them to rotate in opposite directions need rotation.
Soln: The wheels had to be connected to two different shafts.
· The wheels should move in opposite direction but with the same speed.
Soln: The only possibility was to use a differential gear. The characteristic of a differential gear is that the angular speedof its main body is the average of angular speeds of the two shafts connected at its end.
PF: The robot was constantly changing its axis of rotation as the speed of the two shafts connected to the differential and the main body of the differential could not be controlled.
Soln: The main body of the differential had to be kept stationery. As a result when one shaft of the differential gear was rotated at a particular speed, the other rotated at the same speed but in opposite direction as required.
PF: The body of the differential had to kept stationery during the rotation but had to be given motion when the robot moves linearly.
Soln: A motor short-circuited port and a gear combination was used. The purpose of short-circuiting the port was to make it difficult to rotate and thus serve the function of stopping the main body of the differential gear while the robot is rotating.
PF: The mechanism didn’t completely removed the possibility of the rotationof the main body of the differential
.
Soln: A Worm gear was used that has the property which enables it to allow the transfer of power in only one direction, thus during the rotary motion, the worm gear prevented the movement of the main body of the differential gear, while during
the linear motion the worm gear itself drives the differential gear.
. The robot has to move straight with the two wheels connected to different shafts.
PF: Only one rotation sensor was available which had to measure both the rotary and linear motions of the robot.
Soln: the same motor using the same gear ratio drove the two shafts connected to the two wheels. The worm gear meshing with the main body of the differential resulted in a gear ratio of 1:24. Thus the other shaft also had to be driven by the same gear ratio (1:24)
using a second worm gear.
PF: The presence of second worm gear precludes the possibility of the rotation of the shaft during the rotation of the robot.
Soln: A slip clutch was used which allows the rotation of the shaft passing through it without its own rotation. (Once the torque exceeded 2.5-5Nm) The slip clutch was prevented from rotating due to the presence of worm gear, which in turn rotated the slip clutch having 24 teeth and thus maintaining the same gear ratio of 1:24
How It Runs
The 3 light sources are fixed on the wall at known distances and are switched on. The Vagabond is placed at any position in the room and the program is run. Vagabond rotates on its central axis, records the intensity at each count of rotation and communicates this information to the PC via the Infra Red. The PC in turn calculates the angle between the light sources, the current coordinates of the robot and prompts the user to input the destination coordinates. The PC calculates the rotational and linear counts of the rotational sensor to reach the desired coordinates, which is passed on to the robot again via the Infra Red, which. then travels the required distance.
· The light sources are fixed at known distances on the wall and switched on.
· The linear distance moved by the robot per count of rotation is measured and is
termed as Linear Count
· The Vagabond is placed at any position in the room.
· Now the Vagabond rotates on its central axis completing more than 720 degrees
· The light sensor mounted on the robot records the intensity of light at each count of the
rotation sensor.
· After completion of the rotations the recorded intensities are communicated to the PC via
the Infra Red.
· The Vagabond continues its rotation till it reaches the first light source. This is
necessary in order to align the robot according to the new X,Y coordinate
system.
· An algorithm running at the PC calculates the average values of five successive readings
staring from the third reading to reduce the chances of error.
· A sudden increase in the intensity is detected as peak and the corresponding value of the
rotation sensor is noted.
· The process is continued for the first six peaks thus obtaining two peaks for each light
source encountered once in every rotation.
· The difference of the first and fourth peak, second and fifth peak and the third and the
sixth peak is noted as each represents the number of rotations corresponding to 360
degrees.
· The averages of the differences are calculated . We divide 360 degrees by the
average of the differences to get the Least Count which represents the
degree of rotation for each count of the rotation sensor.
· The user is prompted to input the destination coordinates
· The computer aligns the new X,Y coordinate according to the current inclination of
the Vagabond and calculates the linear distances required in new X,Y coordinate
system to reach the destination.
· The number of counts of the rotation sensor required to move the desired
distances is calculated by dividing the distances by Linear Count.
· The number of counts required to move 90 degrees is also calculated by dividing it by
Least Count
· The three counts are fed back to the RCX via the Infra Red
· The robot moves the number of rotations in the X axis, rotates by 90 degrees and again
moves the required distance in Y axis

Calculation of Current Coordinates
Sin(a) /len 1 = Sin (q+a) / r
Sin(a+b) / (len 1+len 2) = Sin(a+b+q) / r
Current X coordinate = r * Cos ( q )
Current Y coordinate = r* Sin ( q )

Transformation of Axis
X1 = Current X-Coordinate ( w.r.t. Original Coordinate System),
Y1 = Current Y-Coordinate ( w.r.t. Original Coordinate System),
X2 = Destination X-Coordinate ( w.r.t. Original Coordinate System),
Y2 = Destination Y-Coordinate( w.r.t. Original Coordinate System)
X = X-Coordinate in New Coordinate System
Y = Y-Coordinate in New Coordinate System
deltay=Y2-Y1
deltax=X2-X1
ratio = (X1 / Y1)
angle = tan-1(ratio)
X = deltax * cos(angle) – deltay * sin(angle)
Y = deltax * sin(angle) + deltay * cos(angle)
Program:
The Program consists of two parts:
Part I : The software running at the PC end.
Part II: The software running at the robot end.
Part I:
import java.io.*;
import josx.rcxcomm.*;
import java.lang.*;
public class DetectPC
{
RCXPort port;// Port to send and receive data from RCX
int[] value;
int[] diff;
double[] rot;//stores the value of 3 max light sources
double alpha,beta,theta,thetad;
double mfactor;//overall mfactor
double first;//stores the value of the light source at the origin
double mfactor1;//mfactor for first light source used to send robot to origin
double y1,y2,x1,x2;
InputStreamReader stdin;//input stream from console i.e the user input
BufferedReader console;//converts the inputstream from console to BufferReader
int move;//counts the number of count to move to reach approx the origin;
int moveToXaxis;//counts to align along X axis
int moveToYaxis;
int moveY;//number of counts to move along Y axis
int moveX;// number of counts to move along X axis
DataOutputStream out;
public DetectPC()
{
value=new int[240];
diff=new int[239];
rot=new double[6];
try
{
port=new RCXPort();
this.stdin =new InputStreamReader(System.in);
this.console =new BufferedReader(this.stdin);
}catch(IOException ie){}
}
public static void main(String[] args)
{
DetectPC pc=new DetectPC();
pc.receive();
pc.difference();
pc.detect();
pc.calculateMFactor();//calculates the multiplying factor
pc.calculateAngle();
pc.display();
pc.currentXY();
pc.targetXY();//input from the user the destination x,y coordinate
pc.sendOrigin();
pc.getTransform();//shifts origin to the current x,y coordinates & calculates
//target x,y according to the new coordinate axis
pc.getY();//calculates the count along Y axis
pc.getX();//calculates the count along X axis
pc.sendRCX();
}
private void receive()
{
DataInputStream dis;
dis=new DataInputStream(port.getInputStream());
try
{
for(int i=0;i<240;i++)>
{
value[i]=dis.readInt();
System.out.println(value[i]);
} }catch(IOException ie){} }
private void difference()
{ System.out.println("Diffences in magnitude:");
int j;
for(j=0;j<=238;j++)
{
diff[j]=value[j+1]-value[j];
} }
private void detect()
{ int count=0; int i=0; int j,num=1; int temp; boolean detect;//checks whether any difference is more than 1 or not
float sum,avg;
while((count<6)&&((i+5)<239))>
{ detect=false;
sum=0;
for(j=0;j<5;j++)>
sum+=(float)(value[i+j]);
avg=sum/5; //System.out.println("Average at "+i+" is :"+avg);
if((value[i+1]>(avg+1.5))(value[i+2]>(avg+1.5))(value[i+3]>(avg+1.5)))
{
//detect=true;
//rot[count]=i+1;
if(value[i+2]>=value[i+1])
{
rot[count]=i+2;
detect=true;
}
if((value[i+3]>=value[i+2])&&amp;amp;(value[i+3]>=value[i+1]))
{
rot[count]=i+3;
detect=true;
}
if((value[i+4]>=value[i+3])&&(value[i+4]>=value[i+1])&&(value[i+4]>=value[i+2]))//(value[i+5]>value[i+3])&&(value[i+5]>=value[i+1])&&(value[i+5]>=value[i+2])&&(value[i+5]>=value[i+4]))
detect=false;
if(detect)
{
if(count!=0)
{
if((rot[count]==rot[count-1])(rot[count]==rot[count-1]+1)(rot[count]==rot[count-1]-1))//(rot[count]==rot[count-1]+2)(rot[count]==rot[count-1]-2))
--count;
}
++count;
}
}
++i;
}
}
private void display()
{
for(int i=0;i<6;i++)>
{ System.out.println("Light at:"+rot[i]); }
System.out.println("Alpha:"+alpha); System.out.println("Beta:"+beta); System.out.println("Theta:"+theta); }
private void calculateAngle() { if(((rot[1]-rot[0])*mfactor)>180)
{
alpha=(float)(rot[2]-rot[1])*mfactor;
theta=(float)(rot[1]-rot[0])*mfactor;
beta=360-alpha-theta;
first=rot[4];
mfactor1=(float)(360/(rot[4]-rot[1]));
}
else
{
if(((rot[2]-rot[1])*mfactor)>180)
{
beta=(float)(rot[1]-rot[0])*mfactor;
theta=(float)(rot[2]-rot[1])*mfactor;
alpha=360-theta-beta;
first=rot[5];
mfactor1=(float)(360/(rot[5]-rot[2]));
}
else
{
if(((rot[3]-rot[2])*mfactor)>180)
{
alpha=(float)(rot[1]-rot[0])*mfactor;
beta=(float)(rot[2]-rot[1])*mfactor;
theta=360-alpha-beta;
first=rot[3];
mfactor1=(float)(360/(rot[3]-rot[0]));
}
}
}
}
private void calculateMFactor()
{
float temp=0;
for(int i=0;i<1;i++)>
temp+=(float)(360/(rot[i+3]-rot[i]));
mfactor=temp;
System.out.println("Mfactor:"+mfactor); }
private void currentXY()
{ double len1=0,len2=0,radius; double temp,tant; double thetar; double alphar=Math.toRadians(alpha);
double betar=Math.toRadians(beta);
System.out.println(" Alpha in radians ="+alphar);
System.out.println(" Beta in radians ="+betar);
String s;
try { System.out.println("Enter length one:");
s=console.readLine();
len1=Double.parseDouble(s);
System.out.println(" length one ="+len1);
System.out.println("Enter lenght two:");
s=console.readLine();
len2=Double.parseDouble(s);
System.out.println(" length two ="+len2);
}catch(IOException ioex) { System.out.println("Input error"); System.exit(1); } temp=(Math.sin(alphar+betar)*len1)/((len1+len2)*Math.sin(alphar)); System.out.println("value of const :"+temp);
tant=(Math.sin(alphar+betar)-temp*Math.sin(alphar))/(temp*Math.cos(alphar)-Math.cos(alphar+betar));
System.out.println("The value of Tan theta: "+tant);
thetar=Math.atan(tant);
System.out.println("The value of theta in radians: "+thetar); thetad=Math.toDegrees(thetar);
System.out.println("The value of theta in degrees :"+thetad);
radius=(len1*Math.sin(thetar+alphar))/Math.sin(alphar);
System.out.println("The value of radius is :"+radius);
x1=radius*Math.cos(thetar);
y1=radius*Math.sin(thetar);
System.out.println("Current x:"+x1);
System.out.println("Current y:"+y1); } private void targetXY()// User input
function to input Target value of x,y
{
String s2;
try {
System.out.println("Enter the Target x coordinate:");
s2=console.readLine();
x2=Double.parseDouble(s2);
System.out.println(" target x coordinate ="+x2);
System.out.println("Enter the target y coordinate:");
s2=console.readLine();
y2=Double.parseDouble(s2);
System.out.println(" target y coordinate ="+y2);
console.close();
} catch(IOException ioex) { System.out.println("Input error"); System.exit(1); } }
private void getTransform()// Calculates the angle between the current and target point in Radians
{ double deltay=y2-y1; double deltax=x2-x1; double ratio=(x1/y1); System.out.println(" Ratio of ^x/^y: ="+ratio);
double angle=Math.atan(ratio);
System.out.println("angle:"+angle);
double degree=Math.toDegrees(angle);
System.out.println("Angle in degrees :"+degree);
x2=deltax*Math.cos(angle)-deltay*Math.sin(angle);
y2=deltax*Math.sin(angle)+deltay*Math.cos(angle);
System.out.println("New X coordinate:"+x2);
System.out.println("New Y coordinate:"+y2); }
private void getY()
{double deltay=y2-y1;
double countd=y2/0.383858268;//Where 19.5cm = 20counts 39cm=40 counts Long countl=new Long(Math.round(countd));//converts from double to rounded long moveY=0-countl.intValue();
if(moveY>0)
{
countd=(float)(0/mfactor);
countl=new Long(Math.round(countd));//converts from double to rounded long
moveToYaxis=countl.intValue();
System.out.println("No. of rotation to reach new Y axis:"+moveToYaxis);
}
else
{
countd=(float)(180/mfactor);
countl=new Long(Math.round(countd));//converts from double to rounded long
moveToYaxis=countl.intValue();
System.out.println("No. of rotation to reach new Y axis:"+moveToYaxis);
moveY=0-moveY;
}
System.out.println("Counts to reach target Y coordinate:"+moveY);
}
private void getX()
{
//double deltax=x2-x1;
double countd=x2/0.383858268;//Where 19.5cm = 20counts 39cm=40 counts
Long countl=new Long(Math.round(countd));//converts from double to rounded long
moveX=countl.intValue();
if((x2>=0)&&amp;amp;(y2<=0)) countd=(float)(90/mfactor); else { if((x2<=0)&&amp;amp;(y2>=0))
{
countd=(float)(90/mfactor);
moveX=0-moveX;
}
else
{
if((x2>=0)&&amp;amp;(y2>=0))
{
countd=(float)(270/mfactor);
}
else
{
countd=(float)(270/mfactor);
moveX=0-moveX;
}
}
}
System.out.println("Counts to reach target X coordinate:"+moveX);
countl=new Long(Math.round(countd));//converts from double to rounded long
moveToXaxis=countl.intValue();
System.out.println("No. of rotation to reach new X axis:"+moveToXaxis);
}
private void sendOrigin()
{
while((first+(360/mfactor1))<240)>
first+=360/mfactor1;
System.out.println("Mfactor for Ist light source"+mfactor1);
System.out.println("First light source at:"+first);
double countd=first+(float)(360/mfactor1)-15-240;//sending it approx to the first light source
Long countl=new Long(Math.round(countd));//converts from double to rounded long move=countl.intValue();
if(move<1) move="0;">
System.out.println("No. of rotation to move for approximation i.e (move-15):"+move);
out=new DataOutputStream(port.getOutputStream());
}
private void sendRCX()
{
try
{ out.writeInt(move);
out.writeInt(moveToYaxis);
out.writeInt(moveToXaxis);
out.writeInt(moveY);
out.writeInt(moveX);
}catch(IOException ie){} } }
Part II:
import josx.platform.rcx.*;
import josx.rcxcomm.*;
import josx.robotics.*;
import java.io.*;
class Rotate
{ static int counter;// keeps an account of the number of array entries Servo servo;
public Rotate()
{ RCX.value=new int[240];
Rotate.counter=-1;
RCX.rcom=true;
Sensor.S1.setPreviousValue(0);
servo=new Servo(Sensor.S1,Motor.A);
action();
}
private void action()
{ boolean check=false;
while(check==false)
{ check=servo.rotateTo(240); } } }
class Send {
DataOutputStream out;
public Send() {
out=new DataOutputStream(RCX.port.getOutputStream());
action(); }
private void action() {
int j=0;
LCD.showNumber(1111);
while(RCX.move==false) {
//LCD.showNumber(RCX.value[i]);
try {
LCD.showNumber(j);
out.writeInt(RCX.value[j++]);
}catch(IOException ie){}
if(j==240)
RCX.move=true; } } }
class Move {
DataInputStream in;
private int angle,dist;//angle calculates the count for angle & dist for distance boolean isCountToY,isCountToX,isCountToXaxis,isCountToOrigin,isCountToYaxis;//checks whether angle or distance has been moved or not Servo servo; static int light1,light2;//light1 stores the value of previous light source & light2 second int origin,Ymove,Xmove,Xaxis,Yaxis;//takes the count for origin,count of movement on Y,x & to reach Y axis static boolean move,negative;// checks whether move function is running boolean check;
public Move() {
servo=new Servo(Sensor.S1,Motor.A);
in=new DataInputStream(RCX.port.getInputStream());
isCountToY=false;
isCountToX=false;
isCountToXaxis=false;
isCountToOrigin=false;
isCountToYaxis=false;
origin=-1; Ymove=-1; Xmove=-1; Xaxis=-1; Move.negative=false; action(); }
private void action() {
check=false; int dist=0; LCD.showNumber(5000);
Sensor.S1.setPreviousValue(0);
rcxoperation();
moveToOrigin();
try { Thread.sleep(5000); }catch(InterruptedException ie){}
reachOrigin();
Move.move=false;
try { Thread.sleep(5000); }catch(InterruptedException ie){}
operation();//once all the inputs are read from the PC begin their execution }
private void reachOrigin() {
check=false;
Move.move=true;
while(check==false) {
Move.light1=Sensor.S3.readValue(); servo.rotateTo(1);
if((Move.light2-Move.light1)>=2)
check=true;
Sensor.S1.setPreviousValue(0);
//Motor.A.backward();
}
Motor.A.stop();
}
private void rcxoperation()
{
try
{
while(!(isCountToOrigin))// the while loop scans the input stream & calls the
// appropriate function after getting all the values
{
origin=in.readInt();
if(origin>-1)
isCountToOrigin=true;
}
while(!(isCountToYaxis))// the while loop scans the input stream & calls the
// appropriate function after getting all the values
{
Yaxis=in.readInt();
if(Yaxis>-1)
isCountToYaxis=true;
}
while(!(isCountToXaxis))// the while loop scans the input stream & calls the
// appropriate function after getting all the values
{
Xaxis=in.readInt();
if(Xaxis>-1)
isCountToXaxis=true;
}
while(!(isCountToY))
{
Ymove=in.readInt();
//if(Ymove>-1)
isCountToY=true;
}
while(!(isCountToX))
{
Xmove=in.readInt();
//if(Xmove>-1)
isCountToX=true;
}
}catch(IOException ie)
{
LCD.showNumber(8888);
}
try
{
in.close();
}catch(IOException ie){}
}
private void operation()
{
try
{
Button.RUN.waitForPressAndRelease();
}catch(InterruptedException e) {}
moveToYaxis();//sets along new Y axis
moveY();// moves along new y axis;
try
{
Thread.sleep(5000);
}catch(InterruptedException ie){}
moveToXaxis();//sets along new x axis
try
{
Thread.sleep(5000);
}catch(InterruptedException ie){}
moveX();//moves along new X axis
}
private void moveToOrigin()
{
Motor.A.setPower(0);
Sensor.S1.setPreviousValue(0);
check=false;
while(check==false)
{
check=servo.rotateTo(origin);
}
}
private void moveToYaxis()
{
Motor.A.setPower(0);
Sensor.S1.setPreviousValue(0);
check=false;
while(check==false)
{
check=servo.rotateTo(Yaxis);
}
}
private void moveToXaxis()
{
Motor.A.setPower(0);
Sensor.S1.setPreviousValue(0);
check=false;
while(check==false)
{
check=servo.rotateTo(Xaxis);
}
}
private void moveY()
{
boolean check=false;
Sensor.S1.setPreviousValue(0);
Motor.C.setPower(7);
Servo servo3=new Servo(Sensor.S1,Motor.C);
if(Ymove<0) negative="true;">
while(check==false) {
check=servo3.rotateTo(Ymove); }
Move.negative=false;
}
private void moveX()
{ boolean check=false;
Sensor.S1.setPreviousValue(0);
Motor.C.setPower(7);
Servo servo3=new Servo(Sensor.S1,Motor.C);
if(Xmove<0)>
Move.negative=true;
while(check==false)
{ check=servo3.rotateTo(Xmove); } } }
public class RCX {
static boolean rcom;//keeps track whether rotation has finished before rcx sends array to computer true means still under rotation static boolean move;//value is false while robot is rotating & true when robot moves linear distance
static int value[];// an array which stores the value of light sensor static RCXPort port;
public static void main(String[] args) {
try {
RCX.port = new RCXPort(); }catch(IOException ie){}
Move.move=false;
Slistener slist=new Slistener();
Rotate r = new Rotate();
Send s = new Send();
Move m = new Move(); } }
class Slistener implements SensorListener { public Slistener() {
RCX.rcom=true;
Sensor.S1.setTypeAndMode(SensorConstants.SENSOR_TYPE_ROT,SensorConstants.SENSOR_MODE_ANGLE); Motor.A.setPower(0); Sensor.S3.setTypeAndMode(SensorConstants.SENSOR_TYPE_LIGHT,SensorConstants.SENSOR_MODE_PCT); Sensor.S3.activate(); Sensor.S1.addSensorListener(this); } public void stateChanged(Sensor aSource,int Old,int New) { if(RCX.rcom) { LCD.showNumber(Sensor.S1.readValue());
if(aSource==Sensor.S1) RCX.value[++Rotate.counter]=Sensor.S3.readValue();
if(Rotate.counter==239) RCX.rcom=false; }
else if(Move.move==true) {
Move.light2=Sensor.S3.readValue();
LCD.showNumber(Sensor.S3.readValue()); }
else { if(Move.negative==true) LCD.showNumber(1000+New);
else LCD.showNumber(New); }
//LCD.showNumber(New); }}
SAMPLE READING
Actual Location X: 90
Actual Location Y: 65
Diffences in magnitude:
Mfactor:3.076923131942749
Light at:12.0
Light at:100.0
Light at:112.0
Light at:129.0
Light at:221.0
Light at:233.0
Alpha:36.92307758331299
Beta:52.3076868057251
Theta:270.7692356109619
Alpha in radians =0.6444292737981225
Beta in radians =0.9129413588618984
Enter length one:
72
length one =72.0
Enter lenght two:
72
length two =72.0
value of const :0.8322286618682035
The value of Tan theta: 0.7669268728062841
The value of theta in radians: 0.6542465845289498
The value of theta in degrees :37.485568054357884
The value of radius is :115.44156079086733
Current x:91.60364651744949
Current y:70.2532981612798
Enter the Target x coordinate: 50
target x coordinate =50.0
Enter the target y coordinate:40
target y coordinate =40.0
Ratio of ^x/^y: =1.3039052815307817
angle:0.9165497422659469
Angle in degrees :52.51443194564212
New X coordinate:-1.3121873231462189
New Y coordinate:-51.423765105378635
Mfactor for Ist light source2.9752066135406494
First light source at:221.0
No. of rotation to move for approximation i.e (move-15):77
Counts to reach target Y coordinate:134
Counts to reach target X coordinate:-3
No. of rotation to reach X axis:29



























