Вы пытаетесь сделать экспоненциальную матрицу $ axis_skewed [3] [3], для которой Родригес является укороченной формой.
Я предлагаю вам просто использовать функцию OpenCV cv :: Rodrigues, если вы помещаете это в C ++ ...
cv :: Mat axis_skewed;
..... // помещаем значения в axis_skewed
cv :: Mat R; // будет 3х3, когда закончим
cv :: Rodgrigues (axis_skewed, R)
сделано ...
// вот Родригес
$ R = $ eye3 + sin ($ angle) * $ axis_skewed + (1-cos ($ angle)) * $ axis_skewed * $ axis_skewed;
Это просто сокращение для: R = exponential_of_matrix (axis_skewed)
например. в Matlab вы бы использовали expm (axis_skewed). Есть просто аналитическая формула, чтобы записать ответ; В качестве альтернативы вы можете сделать R = I + axis_skewed + axis_skewed / 2 + ... + axis_skewed ^ N / (N factorial) для нескольких терминов и получить тот же ответ.
Тогда, конечно, Википедия немного расширит математику: http://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula
OpenCV-версия вашего кода выше, на C ++ / C, с https://code.ros.org/svn/opencv/trunk/opencv/modules/calib3d/src/calibration.cpp
const double I[] = { 1, 0, 0, 0, 1, 0, 0, 0, 1 };
double c = cos(theta);
double s = sin(theta);
double c1 = 1. - c;
double itheta = theta ? 1./theta : 0.;
rx *= itheta; ry *= itheta; rz *= itheta;
double rrt[] = { rx*rx, rx*ry, rx*rz, rx*ry, ry*ry, ry*rz, rx*rz, ry*rz, rz*rz };
double _r_x_[] = { 0, -rz, ry, rz, 0, -rx, -ry, rx, 0 };
double R[9];
CvMat matR = cvMat( 3, 3, CV_64F, R );
// R = cos(theta)*I + (1 - cos(theta))*r*rT + sin(theta)*[r_x]
// where [r_x] is [0 -rz ry; rz 0 -rx; -ry rx 0]
for( k = 0; k < 9; k++ )
R[k] = c*I[k] + c1*rrt[k] + s*_r_x_[k];
Я предлагаю вам svn оформить заказ OpenCV, скомпилировать его, затем выполнить тест для себя, чтобы убедиться, что cv :: Rodrigues дает вам тот же ответ, что и ваш другой код, а затем перенести функцию в ваш проект C ++. Было бы еще проще просто ссылаться на opencv, но, возможно, вы не хотите этого делать.