Матрица математики с косинусом / грехом - PullRequest
1 голос
/ 13 октября 2011

У меня есть подпрограмма, которая принимает параметры соединения d, theta, a и alpha в качестве входных данных и создает соответствующую однородную матрицу 4x4 в качестве выходных данных. Я проверил умножение матриц, и оно работает нормально. Я получу 5 матриц из входных данных, которые будут умножены вместе, что приведет к $ t ^ 0_5 $. Тестовые случаи здесь . Мой вывод не похож на результат. Вот мой код:

Сначала матрица, в которую мы вводим данные, в мартикс, использующий таблицы параметров DH :

 //Kinematics
Matrix44 Matrix44::kinematics(double d, double theta, double a, double alpha)const {
     Matrix44 result;

     double pi = 3.14159;
     double radstheta = theta*(pi/180);
     double radsalpha = alpha*(pi/180);
     //row1
     result.element[0][0] = cos(radstheta);
     result.element[0][3] = -cos(radsalpha)*sin(radstheta);
     result.element[0][4] = sin(radsalpha)*sin(radstheta);
     result.element[0][3] = a*cos(radstheta);
     //row2
     result.element[1][0] = sin(radstheta);
     result.element[1][5] = cos(radsalpha)*cos(radstheta);
     result.element[1][6] = -sin(radsalpha)*cos(radstheta);
     result.element[1][3] = a*sin(radstheta);
     //row3
     result.element[2][0] = 0;
     result.element[2][7] = sin(radsalpha);
     result.element[2][8] = cos(radsalpha);
     result.element[2][3] = d;
     //row4
     result.element[3][0] = 0;
     result.element[3][9] = 0;
     result.element[3][10] = 0;
     result.element[3][3] = 1;

     return result;
}

Часть в основном, где я получаю результат, данные поступают из этой таблицы :

          Matrix44 a,b,c,d,e;
            //in order (d,theta,a,alpha)
    //all data is static and given except for theta which changes, see link for cases
        a = a.kinematics(27.2,0, 0, 90);
        b = b.kinematics(0,0,19.2,180);
        c = c.kinematics(0,0,19.2,0);
        d = d.kinematics(0,0+90,0,90);
        e = e.kinematics(10.5,0,0,0);
       //anyone know how to format this nicely? The operator is overload to print a matrix
//
        cout << left <<setw(20) << a*b*c*d*e;

Тета и альфа - это углы, а D и A - расстояния.

Код для вывода / ввода:

   //User Input
  istream& operator>> (istream& s, Matrix44& t) {
    for (int i=0; i<4; i++)
      for (int j=0; j<4; j++)
        s >> t.element[i][j];
    if (!s) { cerr << "Error reading Matrix from stream";  exit(0); }
    return s;
  }
  //User Output
  ostream& operator<< (ostream& s, const Matrix44& t) {
    for (int i=0; i<4; i++) {
      for (int j=0; j<4; j++)
        s << t.element[i][j] << "   ";
      s << endl;
    }
    if (!s) { cerr << "Error writing Matrix to stream";  exit(0); }
    return s;
  }

Матрица:

    class Matrix44 {
private:
    double element[4][4];
    friend class Point;
public:
    Matrix44(void);
    Matrix44 transpose(void) const;
    Matrix44 inverse(Matrix44 x) const;
    Matrix44 kinematics(double d, double theta, double a, double alpha) const;
    friend istream& operator>>(istream& s, Matrix44& t);
    friend ostream& operator<<(ostream& s, const Matrix44& t);
    Matrix44 operator *(Matrix44 b);
    Point operator*(const Point & P);
};

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Пара проблем, одна в коде, который вы показали, другая нет.

Проблема 1: Возможно, это не источник вашей проблемы, но double pi = 3.14159; подходит для поплавков, ноне для двоих.У вас должно быть пи как минимум до 16 мест.Еще лучше использовать M_PI из <math.h>, распространенное расширение во многих компиляторах.Если ваш компилятор не определяет M_PI, используйте что-то вроде 3.14159265358979323846264338327950288.

Проблема 2. Вы не показывали свой код, где выполняете умножение, поэтому это может не быть источником вашей проблемы,или.Проблема в том, что группа вращения не коммутативна: A * B не равно B * A.Вы должны быть очень осторожны с соглашением умножения здесь.Пример. Поднимите книгу, держите ее ровно, чтобы передняя крышка была обращена вверх, а позвоночник - влево.Поверните книгу на 90 градусов вокруг оси, которая указывает в направлении строки текста.Теперь поверните на 90 градусов вокруг оси, которая указывает от нижней части страницы к верхней.Ваша книга должна быть ориентирована так, чтобы ее можно было положить на полку (позвоночник ориентирован вертикально, лицом к вам).Теперь верните книгу в исходное положение и повторите повороты, но в обратном порядке.На этот раз вы увидите совершенно другую картину.

0 голосов
/ 13 октября 2011

Конечно, ваша индексация не так? Вместо

//row1
 result.element[0][0] = cos(radstheta);
 result.element[0][3] = -cos(radsalpha)*sin(radstheta);
 result.element[0][4] = sin(radsalpha)*sin(radstheta);
 result.element[0][3] = a*cos(radstheta);

должно быть

//row1
 result.element[0][0] = cos(radstheta);
 result.element[0][1] = -cos(radsalpha)*sin(radstheta);
 result.element[0][2] = sin(radsalpha)*sin(radstheta);
 result.element[0][3] = a*cos(radstheta);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...