00001
00002
00003
00004
00005
00006 #include <sbpl_arm_planner/pr2/sbpl_math.h>
00007
00008
00009
00010
00011
00012
00013 void multiply(double* C, double* A, int mrows, int ncols, double* B, int pcols) {
00014
00015 int i,j,k;
00016
00017 for(i=0; i<mrows; i++) {
00018 for(j=0; j<pcols; j++) {
00019 C[i+mrows*j]=0;
00020 for(k=0; k<ncols; k++) {
00021 C[i+mrows*j]+=A[i+mrows*k]*B[k+ncols*j];
00022 }
00023 }
00024 }
00025 }
00026
00027
00028 void scalar_multiply(double* B, double*A, int mrows, int ncols, double num ) {
00029
00030 int i, j;
00031
00032 for(i=0; i<mrows; i++) {
00033 for(j=0; j<ncols; j++) {
00034 B[i+mrows*j]=num*A[i+mrows*j];
00035 }
00036 }
00037 }
00038
00039
00040 void equate(double* B, double* A, int m, int n) {
00041
00042 int i,j;
00043
00044 for(i=0; i<m; i++) {
00045 for(j=0; j<n; j++) {
00046 B[i+m*j]=A[i+m*j];
00047 }
00048 }
00049 }
00050
00051
00052 void matrix_add(double* C, double* A, double* B, int m, int n) {
00053
00054 int i, j;
00055 for(i=0; i<m; i++) {
00056 for(j=0; j<n; j++) {
00057 C[i+m*j]=A[i+m*j]+B[i+m*j];
00058 }
00059 }
00060 }
00061
00062
00063 void subtract(double* C, double* A, double* B, int m, int n) {
00064
00065 int i, j;
00066 for(i=0; i<m; i++) {
00067 for(j=0; j<n; j++) {
00068 C[i+m*j]=A[i+m*j]-B[i+m*j];
00069 }
00070 }
00071 }
00072
00073
00074 void transpose(double* B, double* A, int m, int n) {
00075
00076 int i,j;
00077
00078 for(i=0; i<m; i++) {
00079 for(j=0; j<n; j++) {
00080 B[j+m*i]=A[i+m*j];
00081 }
00082 }
00083 }
00084
00085
00086
00087
00088
00089
00090 double dot_product(double* A, double* B, int n) {
00091 double dp;
00092 int i;
00093
00094 dp=0;
00095 for(i=0; i<n; i++) {
00096 dp+=A[i]*B[i];
00097 }
00098
00099 return dp;
00100 }
00101
00102
00103 void cross_product(double* C, double* A, double* B) {
00104
00105 C[0]=A[1]*B[2]-A[2]*B[1];
00106 C[1]=A[2]*B[0]-A[0]*B[2];
00107 C[2]=A[0]*B[1]-A[1]*B[0];
00108 }
00109
00110
00111 double vect_norm(double* A, int n) {
00112 int i;
00113 double nm;
00114
00115 nm=0;
00116 for(i=0; i<n; i++) {
00117 nm+=pow(A[i],2);
00118 }
00119 nm=sqrt(nm);
00120 return nm;
00121 }
00122
00123
00124
00125 double vect_divide(double* A, double* B, int n) {
00126 double ratio;
00127
00128 if(dot_product(A,B,n)>=0) {
00129 ratio=vect_norm(A,n)/vect_norm(B,n);
00130 }
00131 else {
00132 ratio=-vect_norm(A,n)/vect_norm(B,n);
00133 }
00134
00135 return ratio;
00136 }
00137
00138
00139
00140 bool check_equality(double* A, double* B, int n) {
00141 int i;
00142 bool flag = 1;
00143 for(i=0; i<n; i++) {
00144 if(A[i]!=B[i]) {
00145 flag=0;
00146 break;
00147 }
00148 }
00149 return flag;
00150 }
00151
00152
00153
00154
00155
00156
00157 void create_rotation_matrix(double* A, double yaw, double pitch, double roll) {
00158
00159 double phi=yaw;
00160 double theta=pitch;
00161 double psi=roll;
00162
00163 double temp1[9];
00164 double temp2[9];
00165 double temp3[9];
00166 double temp4[9];
00167
00168 temp1[0]=cos(phi); temp1[3]=-sin(phi); temp1[6]=0;
00169 temp1[1]=sin(phi); temp1[4]=cos(phi); temp1[7]=0;
00170 temp1[2]=0; temp1[5]=0; temp1[8]=1;
00171
00172 temp2[0]=cos(theta); temp2[3]=0; temp2[6]=-sin(theta);
00173 temp2[1]=0; temp2[4]=1; temp2[7]=0;
00174 temp2[2]=sin(theta); temp2[5]=0; temp2[8]=cos(theta);
00175
00176 temp3[0]=1; temp3[3]=0; temp3[6]=0;
00177 temp3[1]=0; temp3[4]=cos(psi); temp3[7]=-sin(psi);
00178 temp3[2]=0; temp3[5]=sin(psi); temp3[8]=cos(psi);
00179
00180 multiply(temp4,temp2,3,3,temp3,3);
00181 multiply(A,temp1,3,3,temp4,3);
00182 }
00183
00184
00185 void rotate_vector(double (&result)[3], double* vect, double* axis, double angle) {
00186
00187 double identity[] = {1, 0, 0, 0, 1, 0, 0, 0, 1};
00188 double w_hat[] = {0, *(axis+2), -*(axis+1), -*(axis+2), 0, *(axis+0), *(axis+1), -*(axis+0), 0};
00189
00190 double temp[9], temp2[9], temp3[9];
00191
00192 scalar_multiply(temp, w_hat, 3, 3, sin(angle));
00193 multiply(temp2, w_hat, 3, 3, w_hat, 3);
00194 scalar_multiply(temp3, temp2, 3, 3, 1-cos(angle));
00195
00196 matrix_add(temp2, identity, temp, 3, 3);
00197 matrix_add(temp, temp2, temp3, 3, 3);
00198
00199 multiply(result, temp, 3, 3, vect, 1);
00200 }
00201
00202
00203 double distance_between(double* A, double* B, int dim) {
00204 double distance = 0;
00205 for (int i = 0; i < dim; i++) {
00206 distance += pow(*(A+i) - *(B+i), 2);
00207 }
00208 distance = sqrt(distance);
00209 return distance;
00210 }
00211
00212 double distance_between(std::vector<double> A, double* B, int dim) {
00213 double distance = 0;
00214 for (int i = 0; i < dim; i++) {
00215 distance += pow(A[i] - *(B+i), 2);
00216 }
00217 distance = sqrt(distance);
00218 return distance;
00219 }
00220