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: CircularBuffer Servo Terminal mbed Radio
Revision 22:9cf770fb12f8, committed 2014-09-30
- Comitter:
- pclary
- Date:
- Tue Sep 30 07:31:07 2014 +0000
- Parent:
- 21:c00567cbe6cc
- Commit message:
- Hacked together a better demonstration
Changed in this revision
| RobotLeg.cpp | Show annotated file Show diff for this revision Revisions of this file |
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/RobotLeg.cpp Tue May 28 04:20:23 2013 +0000
+++ b/RobotLeg.cpp Tue Sep 30 07:31:07 2014 +0000
@@ -9,9 +9,9 @@
setAngleOffsets(0.0f, 0.0f, 0.0f);
state = neutral;
- stepTime = 0.4f;
+ stepTime = 0.35f;
stepDelta = 3.141593f / stepTime;
- stepHeight = 0.05f;
+ stepHeight = 0.06f;
}
@@ -175,7 +175,7 @@
{
newPosition.x = stepA.x + (stepB.x - stepA.x)*0.5f*(1 - cos(stepDelta*t));
newPosition.y = stepA.y + (stepB.y - stepA.y)*0.5f*(1 - cos(stepDelta*t));
- newPosition.z = stepA.z + (stepB.z - stepA.z)*stepDelta*t + stepHeight*sin(stepDelta*t);
+ newPosition.z = stepA.z + (stepB.z - stepA.z)*stepDelta*t + stepHeight*pow(sin(stepDelta*t), 0.1f);
}
else
{
--- a/main.cpp Tue May 28 04:20:23 2013 +0000
+++ b/main.cpp Tue Sep 30 07:31:07 2014 +0000
@@ -17,7 +17,7 @@
#define DIM_D 0.0275f
#define CIRCLE_X 0.095f
#define CIRCLE_Y 0.095f
-#define CIRCLE_Z -0.12f
+#define CIRCLE_Z -0.125f
#define CIRCLE_R 0.09f
#define PERIOD 0.005f
@@ -90,6 +90,16 @@
void resetLegs();
float calcStability(vector3 p1, vector3 p2);
+enum MovementState {
+ ms_none,
+ ms_forward,
+ ms_backward,
+ ms_right,
+ ms_left,
+ ms_ccw,
+ ms_cw
+};
+
int main()
@@ -119,6 +129,8 @@
matrix4 TMat;
+ MovementState mstate = ms_none;
+
// Start timer
deltaTimer.start();
@@ -131,6 +143,70 @@
float yaxis = -0.0078125f * deadzone((int8_t)((radio.rx_controller>>8)&0xff), 8);
float turnaxis = -0.0078125f * deadzone((int8_t)((radio.rx_controller>>16)&0xff), 8);
+ // Quantize controller input into movement states
+ MovementState mstatenew = mstate;
+ const float xythresh = 0.3f;
+ const float turnthresh = 0.3f;
+ if (xaxis > xythresh && abs(xaxis) >= abs(yaxis))
+ mstatenew = ms_forward;
+ else if (xaxis < -xythresh && abs(xaxis) >= abs(yaxis))
+ mstatenew = ms_backward;
+ else if (yaxis > xythresh)
+ mstatenew = ms_right;
+ else if (yaxis < -xythresh)
+ mstatenew = ms_left;
+ else if (turnaxis > turnthresh)
+ mstatenew = ms_ccw;
+ else if (turnaxis < -turnthresh)
+ mstatenew = ms_cw;
+ else
+ mstatenew = ms_none;
+
+ switch (mstatenew) {
+ case ms_none:
+ xaxis = 0.f;
+ yaxis = 0.f;
+ turnaxis = 0.f;
+ break;
+ case ms_forward:
+ xaxis = 1.f;
+ yaxis = 0.f;
+ turnaxis = 0.f;
+ break;
+ case ms_backward:
+ xaxis = -1.f;
+ yaxis = 0.f;
+ turnaxis = 0.f;
+ break;
+ case ms_right:
+ xaxis = 0.f;
+ yaxis = 1.f;
+ turnaxis = 0.f;
+ break;
+ case ms_left:
+ xaxis = 0.f;
+ yaxis = -1.f;
+ turnaxis = 0.f;
+ break;
+ case ms_ccw:
+ xaxis = 0.f;
+ yaxis = 0.f;
+ turnaxis = 1.f;
+ break;
+ case ms_cw:
+ xaxis = 0.f;
+ yaxis = 0.f;
+ turnaxis = -1.f;
+ break;
+ }
+
+ // Don't move while stepping
+ if (legA.getStepping() || legB.getStepping() || legC.getStepping() || legD.getStepping()) {
+ xaxis = 0.f;
+ yaxis = 0.f;
+ turnaxis = 0.f;
+ }
+
// Reset legs to sane positions when 'A' button is pressed
if ((radio.rx_controller>>25)&0x1) resetLegs();
@@ -147,6 +223,11 @@
processMovement(TMat);
+ if (mstatenew != mstate && mstatenew != ms_none)
+ resetLegs();
+
+ mstate = mstatenew;
+
} // while (true)
} // main()
@@ -193,22 +274,22 @@
}
else
{
- if (stability[i] > borderMin)
+ //if (stability[i] > borderMin)
{
// If stable, step
- leg[i]->reset(0.8);
+ leg[i]->reset(1.0f);
stepping = true;
}
- else
+ /*else
{
// // If unstable, move towards a stable position
// vector3 n;
// n.x = point2[i].y - point1[i].y;
// n.y = point1[i].x - point2[i].x;
-// n = n.unit() * MAXSPEED * PERIOD;
+// n = n.unit() * -MAXSPEED * PERIOD;
// TMat.identity().translate(n).inverse();
// return false;
- }
+ }*/
}
}
}
@@ -238,7 +319,7 @@
// vector3 n;
// n.x = point2[next].y - point1[next].y;
// n.y = point1[next].x - point2[next].x;
-// n = n.unit() * MAXSPEED * PERIOD;
+// n = n.unit() * -MAXSPEED * PERIOD;
// TMat.identity().translate(n).inverse();
// return false;
}
@@ -249,10 +330,14 @@
}
// Debug info
- led1 = stability[0] > borderMin;
- led2 = stability[1] > borderMin;
- led3 = stability[2] > borderMin;
- led4 = stability[3] > borderMin;
+// led1 = stability[0] > borderMin;
+// led2 = stability[1] > borderMin;
+// led3 = stability[2] > borderMin;
+// led4 = stability[3] > borderMin;
+ led1 = legA.getStepping();
+ led2 = legB.getStepping();
+ led3 = legC.getStepping();
+ led4 = legD.getStepping();
return true;
}
@@ -300,7 +385,7 @@
legA.setAngleOffsets(0.7853982f, 0.0f, 0.0f);
legB.setAngleOffsets(0.7853982f, 0.0f, 0.0f);
legC.setAngleOffsets(0.7853982f, 0.0f, 0.0f);
- legD.setAngleOffsets(0.7853982f, 0.0f, 0.0f);
+ legD.setAngleOffsets(0.7853982f, 0.1f, 0.0f);
legA.setStepCircle(CIRCLE_X, CIRCLE_Y, CIRCLE_Z, CIRCLE_R);
legB.setStepCircle(CIRCLE_X, CIRCLE_Y, CIRCLE_Z, CIRCLE_R);
legC.setStepCircle(CIRCLE_X, CIRCLE_Y, CIRCLE_Z, CIRCLE_R);