package org.myrobotlab.kinematics;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.myrobotlab.logging.LoggerFactory;
import org.slf4j.Logger;
public class DHRobotArmTest {
public final static Logger log = LoggerFactory.getLogger(DHRobotArmTest.class);
// @Test
public void testDHArm() {
// distance to common normal
double d = 0.4;
// comon normal lenght (sometimes called "a"
double r = 0.2;
// angle between X and X-1 axis
double alpha = 90.0 * Math.PI / 180.0;
// angle between Z and Z-1 axis
double theta = 45.0 * Math.PI / 180.0;
DHLink link1 = new DHLink(null, d, r, theta, alpha);
// double d1=0;
// double r1=0;
// double theta1=0.0 * Math.PI / 180.0;
// double alpha1=0.0 * Math.PI / 180.0;
//
// DHLink link2 = new DHLink(d1, r1, theta1, alpha1);
DHRobotArm arm = new DHRobotArm();
arm.addLink(link1);
// arm.addLink(link2);
// TODO: validate forward kinematcis
Point coord = arm.getPalmPosition();
// System.out.println("Theta = " + theta);
// System.out.println(coord);
//
// double angle = 90;
// link1.moveToAngle(angle);
// you want to know where the hand is.
// coord = arm.getPalmPosition();
log.info("" + coord);
// assertEquals(coord.toString(),"(2.0, 1.0, 1.0)" );
assertEquals("(x=0.141421, y=0.141421, z=0.400000)", coord.toString());
}
@Test
public void testJacobian() {
log.info("testJacobian");
DHRobotArm testArm = createInMoovLeftArm();
Matrix jInverse = testArm.getJInverse();
System.out.println(jInverse);
// now, the deltaPosition array has the delta x,y,z coordinates
// what's the instantaneous rate of change for each of those
// compute the rate of change for this
// ok.
testArm.moveToGoal(new Point(50, 50, 50, 0, 0, 0));
int i = 0;
for (DHLink link : testArm.getLinks()) {
i++;
log.info("Link : " + i + " " + link.getThetaDegrees());
}
}
public DHRobotArm createArm() {
log.info("createArm");
DHRobotArm arm = new DHRobotArm();
// d , r, theta , alpha
DHLink link1 = new DHLink(null, 0, 1, 45 * Math.PI / 180, 0);
arm.addLink(link1);
DHLink link2 = new DHLink(null, 0.0, 0.2, 45 * Math.PI / 180, 90 * Math.PI / 180);
arm.addLink(link2);
return arm;
}
public double degToRad(double degrees) {
return degrees * Math.PI / 180.0;
}
public DHRobotArm createInMoovLeftArm() {
log.info("createInMoovLeftArm");
DHRobotArm arm = new DHRobotArm();
// d , r, theta , alpha
DHLink link1 = new DHLink(null, 200, 100, degToRad(0), degToRad(90));
DHLink link2 = new DHLink(null, 0, 100, degToRad(-66), degToRad(-90));
DHLink link3 = new DHLink(null, 50, 1, degToRad(47), degToRad(90));
DHLink link4 = new DHLink(null, 100, 0, degToRad(-148), degToRad(90));
DHLink link5 = new DHLink(null, 0, 100, degToRad(22), degToRad(180));
arm.addLink(link1);
arm.addLink(link2);
arm.addLink(link3);
arm.addLink(link4);
arm.addLink(link5);
return arm;
}
}