1

Dependencies:   CircularBuffer Radio Servo Terminal mbed

Fork of WalkingRobot by Patrick Clary

main.cpp

Committer:
pclary
Date:
2013-01-13
Revision:
5:475f67175510
Parent:
3:6fa07ceb897f
Child:
6:0163f2737cc6

File content as of revision 5:475f67175510:

#include "mbed.h"
#include "RobotLeg.h"
#include "Matrix.h"
#include "CircularBuffer.h"
#include "Radio.h"
#include "commands.h"
#include <cstring>



CircularBuffer<float,16> dataLog;
float radius, speed;
RobotLeg legA(p26, p29, p30);
RobotLeg legB(p13, p14, p15);
RobotLeg legC(p12, p11, p8);
RobotLeg legD(p23, p24, p25);
Radio radio(p5, p6, p7, p17, p19, p20);



int main()
{
    Timer deltaTimer;
    Timer cycleTimer;
    float angle, arc;
    vector3 v;
    matrix4 T;
    matrix4 PA, QA;
    matrix4 PB, QB; 
    matrix4 PC, QC; 
    matrix4 PD, QD; 
    Terminal terminal;
    
    terminal.addCommand("log", &log);
    terminal.addCommand("speed", &setspeed);
    terminal.addCommand("radius", &setradius);
    terminal.addCommand("read", &read);
    
    // Set leg parameters
    legA.setDimensions(0.11f, 0.125f, -0.006f, 0.020f);
    legB.setDimensions(0.11f, 0.125f, -0.006f, 0.020f);
    legC.setDimensions(0.11f, 0.125f, -0.006f, 0.020f);
    legD.setDimensions(0.11f, 0.125f, -0.006f, 0.020f);
    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);
    legA.setStepCircle(0.12, 0.11, -0.15, 0.11);
    legB.setStepCircle(0.12, 0.11, -0.15, 0.11);
    legC.setStepCircle(0.12, 0.11, -0.15, 0.11);
    legD.setStepCircle(0.12, 0.11, -0.15, 0.11);
    legA.theta.calibrate(1000, 2000, 45.0f, -45.0f);
    legA.phi.calibrate(1000, 2000, 70.0f, -45.0f);
    legA.psi.calibrate(2000, 1000, 80.0f, -45.0f);
    legB.theta.calibrate(1000, 2000, 45.0f, -45.0f);
    legB.phi.calibrate(1000, 2000, 70.0f, -45.0f);
    legB.psi.calibrate(2000, 1000, 80.0f, -45.0f);
    legC.theta.calibrate(2000, 1000, 45.0f, -45.0f);
    legC.phi.calibrate(2000, 1000, 70.0f, -45.0f);
    legC.psi.calibrate(1000, 2000, 80.0f, -45.0f);
    legD.theta.calibrate(2000, 1000, 45.0f, -45.0f);
    legD.phi.calibrate(2000, 1000, 70.0f, -45.0f);
    legD.psi.calibrate(1000, 2000, 80.0f, -45.0f);

    // Create matrices to change base from robot coordinates to leg coordinates
    QA.translate(vector3(0.1f, 0.1f, 0.0f));
    PA = QA.inverse();
    QB.translate(vector3(-0.1f, -0.1f, 0.0f));
    QB.a11 = -1.0f; QB.a22 = -1.0f;
    PB = QB.inverse();
    QC.translate(vector3(0.1f, -0.1f, 0.0f));
    QC.a11 = -1.0f;
    PC = QC.inverse();
    QD.translate(vector3(-0.1f, 0.1f, 0.0f));
    QD.a22 = -1.0f;
    PD = QD.inverse();

    // Go to initial position
    legA.reset(-0.5f);
    legB.reset(0.0f);
    legC.reset(0.5f);
    legD.reset(1.0f);
    
    // Set radius and speed to go straight forward
    radius = 0.0f; // meters
    speed = 0.0f; // m/s
    
    deltaTimer.start();
    cycleTimer.start();
    
    /*
    // Dump debug info 
    sprintf(output, "T =\t%f\t%f\t%f\t%f\n\t%f\t%f\t%f\t%f\n\t%f\t%f\t%f\t%f\n\t0\t\t0\t\t0\t\t1\n",
            T.a11, T.a12, T.a13, T.a14,
            T.a21, T.a22, T.a23, T.a24,
            T.a31, T.a32, T.a33, T.a34);
    terminal.write(output); */
    
    
    while(true)
    {
        // Get arc length of movement delta
        arc = speed*deltaTimer.read();
        dataLog.push(deltaTimer.read());
        deltaTimer.reset();
        
        if (radius == 0)
        {
            angle = 0.0f;
            v.x = 0.0f;
            v.y = arc;
            v.z = 0.0f;
        }
        else
        {
            angle = -arc/radius;
            v.x = radius*(1 - cos(-angle));
            v.y = radius*sin(-angle);
            v.z = 0.0f;
        }
        
        // Compute movement transformation in robot coordinates
        T.identity().rotateZ(angle).translate(v).inverse();
    
        legA.update(PA*T*QA);
        legB.update(PB*T*QB);
        legC.update(PC*T*QC);
        legD.update(PD*T*QD);
    }
}