Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Diff: Robot.h
- Revision:
- 5:f1613df66ceb
- Parent:
- 4:208f5279143a
- Child:
- 6:477382219bcf
--- a/Robot.h Sat Mar 23 19:46:09 2019 +0000
+++ b/Robot.h Mon Mar 25 22:42:31 2019 +0000
@@ -4,24 +4,24 @@
int static const numberOfSamples = 100;
int static const numberOfSensors = 6;
//attenuation factor
- float static const AF = 1.0f;
-
- LWheel* leftWheel;
- RWheel* rightWheel;
+ float static const AF = 0.8f;
+ Wheel* leftWheel;
+ Wheel* rightWheel;
lineSensor* sensorArray[numberOfSensors];
- PID controller;
+ PID2 controller;
float lineVoltages[numberOfSamples];
int lvIndex;
int sensorNumber;
Ticker updater;
+ int endOfLineDetection;
float RoboticAngularVelocity;
public:
- Robot(LWheel* LW, RWheel* RW, lineSensor* SA[]) : controller(1.0f,0.0f,0.0f,0.1f)
+ Robot(Wheel* LW, Wheel* RW, lineSensor* SA[]) : controller(10000.0f, 0.0f, 0.0f, 0.0003f)
{
- lvIndex = 1;
+ lvIndex = 0;
sensorNumber = 0;
sensorArray[0] = SA[0];
sensorArray[1] = SA[1];
@@ -34,13 +34,13 @@
lineVoltages[lvIndex] = 0.0f;
//controller will output a value between +- max speed of wheels
- controller.setOutputLimits(-1.0f*AF*rightWheel->returnMaxAngularVel(),AF*(leftWheel->returnMaxAngularVel()));
- controller.setInputLimits(-1980.0f,1980.0f);
+
+ controller.assignLimitAddress(rightWheel->returnMinAVptr(),leftWheel->returnMaxAVptr());
+ controller.setInputLimits(-300.0f,300.0f);
controller.setSetPoint(0.0f);
- updater.attach(callback(this, &Robot::robotUpdates),0.1f);
+ updater.attach(callback(this, &Robot::robotUpdates),0.00005f);
};
-
float calculateTranslationalVelocity()
{
return ((leftWheel->returnAngularVelocity() + rightWheel->returnAngularVelocity())/2.0f);
@@ -60,54 +60,51 @@
//attempts to modify the angular velocity of the buggy
void adjustAngularVelocity(float W)
{
- float temp = W - RoboticAngularVelocity;
//negative is a right turn
if (W < 0)
{
- //leftWheel a smaller number depending on difference
- leftWheel->adjustAngularVelocity((leftWheel->returnAngularVelocity()+(temp+(rightWheel->returnMaxAngularVel()-rightWheel->returnAngularVelocity()))*AF));
- //right Wheel on maximum
- rightWheel->adjustAngularVelocity(rightWheel->returnMaxAngularVel()*AF);
+ rightWheel->adjustAngularVelocity(rightWheel->returnMaxAngularVel()*AF);
+ leftWheel->adjustAngularVelocity((rightWheel->returnMaxAngularVel()+W)*AF);
}
else
{
- rightWheel->adjustAngularVelocity((rightWheel->returnAngularVelocity()-(temp-(leftWheel->returnMaxAngularVel()-leftWheel->returnAngularVelocity()))*AF));
leftWheel->adjustAngularVelocity(leftWheel->returnMaxAngularVel()*AF);
+ rightWheel->adjustAngularVelocity((leftWheel->returnMaxAngularVel()-W)*AF);
}
}
void robotUpdates(void) //sampling rate the ticker is attached I.E the wheel speed is updated everytime this function is called
{
float ambientLight;
+ ambientLight = sensorArray[sensorNumber]->calcLineVoltage();
+ sensorArray[sensorNumber]->sample();
sensorArray[sensorNumber]->calcLineVoltage();
- ambientLight = sensorArray[sensorNumber]->returnLineVoltage();
- sensorArray[sensorNumber]->sample();
switch (sensorNumber)
{
case 0:
- lineVoltages[lvIndex] += (sensorArray[sensorNumber]->returnLineVoltage() - ambientLight) * -400.0f;
+ lineVoltages[lvIndex%numberOfSamples] = ((sensorArray[sensorNumber]->returnLineVoltage() - ambientLight) * -400.0f);
break;
case 1:
- lineVoltages[lvIndex] += (sensorArray[sensorNumber]->returnLineVoltage() - ambientLight) * -200.0f;
+ lineVoltages[lvIndex%numberOfSamples] = lineVoltages[lvIndex%numberOfSamples]+((sensorArray[sensorNumber]->returnLineVoltage() - ambientLight) * -200.0f);
break;
case 2:
- lineVoltages[lvIndex] += (sensorArray[sensorNumber]->returnLineVoltage() - ambientLight) * -100.0f;
+ lineVoltages[lvIndex%numberOfSamples] = lineVoltages[lvIndex%numberOfSamples]+((sensorArray[sensorNumber]->returnLineVoltage() - ambientLight) * -100.0f);
break;
case 3:
- lineVoltages[lvIndex] += (sensorArray[sensorNumber]->returnLineVoltage() - ambientLight) * 100.0f;
+ lineVoltages[lvIndex%numberOfSamples] = lineVoltages[lvIndex%numberOfSamples]+((sensorArray[sensorNumber]->returnLineVoltage() - ambientLight) * 100.0f);
break;
- case 4:
- lineVoltages[lvIndex] += (sensorArray[sensorNumber]->returnLineVoltage() - ambientLight) * 200.0f;
+ case 4:
+ lineVoltages[lvIndex%numberOfSamples] = lineVoltages[lvIndex%numberOfSamples]+((sensorArray[sensorNumber]->returnLineVoltage() - ambientLight) * 200.0f);
break;
case 5:
- lineVoltages[lvIndex] += (sensorArray[sensorNumber]->returnLineVoltage() - ambientLight) * 400.0f;
+ lineVoltages[lvIndex%numberOfSamples] = lineVoltages[lvIndex%numberOfSamples]+((sensorArray[sensorNumber]->returnLineVoltage() - ambientLight) * 400.0f);
break;
}
sensorNumber ++;
- if (sensorNumber >= 4)
+ if (sensorNumber >= numberOfSensors)
{
- sensorNumber = 1;
- adjustAngularVelocity(controller.compute(lineVoltages[lvIndex]));
+ sensorNumber = 0;
+ adjustAngularVelocity(lineVoltages[lvIndex%numberOfSamples]);
lvIndex++;
}
}
@@ -117,6 +114,16 @@
leftWheel->adjustAngularVelocity(0);
rightWheel->adjustAngularVelocity(0);
}
+
+ float returnLineVoltage()
+ {
+ return lineVoltages[lvIndex%numberOfSamples];
+ }
+
+ void rbtInit()
+ {
+
+ }
};