我有一个例程,它接受联合参数d、theta、a和alpha作为输入,并产生相应的4x4齐次矩阵作为输出。我已经测试了我的矩阵乘法,它工作得很好。我将从输入中获得5个矩阵,它们将全部相乘,产生$t^0_5$。测试用例是here。我的输出与结果完全不同。下面是我的代码:
首先,我们将数据输入到使用DH parameter tables的矩阵中
//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;
}main中我得到结果的部分,数据来自this table
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);
};发布于 2011-10-13 04:43:34
有几个问题,一个是在您展示的代码中,另一个不是。
问题1:这可能不是问题的根源,但是double pi = 3.14159;对于浮点数来说是很好的,但是对于doubles就不行了。你应该至少有16个位置的圆周率。更好的是,使用<math.h>中的M_PI,这是许多编译器中的一个常见扩展。如果你的编译器没有定义M_PI,可以使用3.14159265358979323846264338327950288这样的代码。
问题2:你没有给你的代码展示你做乘法的地方,所以这可能也不是你的问题的来源。问题是旋转组是不可交换的: A*B不等于B*A。你必须非常小心这里的乘法约定。举个例子:拿起一本书,把它平放,使封面朝上,书脊向左。将书本绕指向文本行方向的轴旋转+90度。现在绕着从页面底部指向顶部的轴旋转90度。你的书的方向应该是你可以把它放在书架上(书脊垂直朝向你)。现在将书放回原来的方向,并重复旋转,但顺序相反。这一次,你会看到一幅截然不同的图景。
发布于 2011-10-13 04:42:54
你的索引肯定是错的?而不是
//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);https://stackoverflow.com/questions/7746056
复制相似问题