You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

137 lines
4.3 KiB

/*=================================================================
* crustcrawler.cpp
*
* This example is the C++ version of mexatexit.c. It demonstrates
* how to write strings to a data file using a C++ static class
* contructor. In this example, we do not need to use a mexatexit
* function to close the data file. This is because in C++ when you
* instantiate a static class constructor, the destructor for that
* static class gets called automatically when the MEX-file is cleared
* or exited.
*
* The input to the MEX-file is a string. You may continue calling
* the function with new strings to add to the data file
* matlab.data. The data file will not be closed until the MEX-file is
* cleared or MATLAB is exited.
* This is a MEX-file for MATLAB.
* Copyright 1984-2006 The MathWorks, Inc.
* All rights reserved.
*=================================================================*/
/* $Revision: 1.2.6.2 $ */
#include <stdio.h>
#include <string.h> /* strlen */
#include "mex.h"
// CTY arm project
#include "ArmControl.hpp"
// Boost
#include <boost/numeric/ublas/vector.hpp>
using namespace boost::numeric;
SSC32Controller *ssc;
ArmControl *ctl;
/*
* crustcrawler('init', serialport, baudrate) open the link
* crustcrawler('stop') stop motion
* crustcrawler('park') park the robot
* crustcrawler('move', q, time) move to joint angles
* q = crustcrawler('get') get joint angles
*/
void
mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
char *str;
/* Check for proper number of input and output arguments */
if (nrhs == 0) {
mexPrintf("Open connection to robot");
//SSC32Controller ssc(port);
ssc = new SSC32Controller("/dev/tty.usbserial-00001104", SSC32Controller::B_9600);
ctl = new ArmControl(*ssc);
ctl->setRateLimit(500);
ublas::vector<double> angle_limits(ublas::vector<double>(NUM_JOINTS));
// max limits
angle_limits(0) = 3.0/8.0 * M_PI;
angle_limits(1) = M_PI_2;
angle_limits(2) = M_PI - .70; // off arm brace
angle_limits(3) = M_PI_2;
mexPrintf("set max limits\n");
ctl->setMaxAngle(angle_limits);
// min limits
angle_limits(0) = -3.0/8.0 * M_PI;
angle_limits(1) = -M_PI_2 + 0.35; // off spring pedestal
// angle_limits(2) = 0;
angle_limits(2) = -50.0*2.0*M_PI/360.0;
angle_limits(3) = -M_PI_2;
ctl->setMinAngle(angle_limits);
mexPrintf("set min limits\n");
} else if (nrhs > 0) {
if (!(mxIsChar(prhs[0]))) {
mexErrMsgTxt("Input must be of type string.\n.");
}
str=mxArrayToString(prhs[0]);
if (strcmp(str, "stop") == 0) {
mexPrintf("STOP\n");
ctl->stop();
} else if (strcmp(str, "park") == 0) {
mexPrintf("PARK\n");
ctl->park();
} else if (strcmp(str, "home") == 0) {
mexPrintf("HOME\n");
ctl->home();
} else if (strcmp(str, "move") == 0) {
if (nrhs != 3)
mexErrMsgTxt("Three arguments for move command\n.");
ublas::vector<double> new_position(NUM_JOINTS);
if (mxGetNumberOfElements(prhs[1]) != 4)
mexErrMsgTxt("Joint vector must have 4 elements\n.");
double *q = mxGetPr(prhs[1]);
double time = mxGetScalar(prhs[2]);
for (int i = 0; i < 4; i++ )
new_position(i) = q[i];
ctl->moveToPosition(new_position, (int) time);
} else if (strcmp(str, "gripper") == 0) {
if (nrhs != 2)
mexErrMsgTxt("Two arguments for gripper command\n.");
if (mxGetScalar(prhs[1]) == 0)
ctl->grabMarker();
else
ctl->openGrip();
} else if (strcmp(str, "get") == 0) {
if (nlhs < 1)
mexErrMsgTxt("No output argument for return value\n.");
mxArray *m = mxCreateDoubleMatrix(5, 1, mxREAL);
double *q = mxGetPr(m);
for (int i = 0; i < 4; i++ )
q[i] = ctl->position(i);
plhs[0] = m;
}
mxFree(str);
}
if (nlhs > 1){
mexErrMsgTxt("Too many output arguments.");
}
return;
}